[Pkg-cli-libs-commits] [taoframework] 90/91: Imported Upstream version 2.1.svn20090801

Jo Shields directhex at moszumanska.debian.org
Mon Sep 22 08:33:27 UTC 2014


This is an automated email from the git hooks/post-receive script.

directhex pushed a commit to branch master
in repository taoframework.

commit 6e34c82febe986eb96f33d6e5398a7d0aaa94ba8
Author: Jo Shields <jo.shields at xamarin.com>
Date:   Mon Sep 22 09:32:01 2014 +0100

    Imported Upstream version 2.1.svn20090801
---
 .auto/install-sh                                   |   519 +
 .auto/missing                                      |   367 +
 AUTHORS                                            |    14 +
 Assembly.am                                        |    43 +
 COPYING                                            |    22 +
 ChangeLog                                          |   128 +
 INSTALL                                            |    71 +
 Makefile.am                                        |    27 +
 Makefile.in                                        |   633 +
 NEWS                                               |   107 +
 Program.am                                         |    23 +
 README                                             |    26 +
 TODO                                               |     4 +
 aclocal.m4                                         |   794 +
 bootstrap                                          |   129 +
 build-debug.bat                                    |     2 +
 build-debug.sh                                     |     2 +
 build.bat                                          |     2 +
 build.sh                                           |     2 +
 buildmono-debug.bat                                |     2 +
 buildmono.bat                                      |     2 +
 clean.bat                                          |     8 +
 clean.sh                                           |     7 +
 configure                                          |  4525 ++
 configure.ac                                       |   182 +
 examples/CgExamples/COPYING                        |    22 +
 examples/CgExamples/CgExamples.Designer.cs         |   106 +
 examples/CgExamples/CgExamples.cs                  |    82 +
 examples/CgExamples/CgExamples.csproj              |   144 +
 examples/CgExamples/CgExamples.resx                |   163 +
 examples/CgExamples/CgExamples.sh                  |     2 +
 examples/CgExamples/Gl_01_vertex_program.cs        |   186 +
 .../Gl_02_vertex_and_fragment_program.cs           |   244 +
 .../CgExamples/Gl_06_vertex_twisting_program.cs    |   345 +
 examples/CgExamples/Gl_14_bulge_program.cs         |   817 +
 examples/CgExamples/Makefile.am                    |    30 +
 examples/CgExamples/Makefile.in                    |   378 +
 examples/CgExamples/Program.cs                     |    47 +
 examples/CgExamples/Properties/AssemblyInfo.cs     |    51 +
 examples/CgExamples/README                         |    23 +
 examples/DevIlExamples/COPYING                     |    22 +
 examples/DevIlExamples/DevIlExamples.csproj        |   102 +
 examples/DevIlExamples/DevIlExamples.sh            |     2 +
 examples/DevIlExamples/Makefile.am                 |    14 +
 examples/DevIlExamples/Makefile.in                 |   360 +
 examples/DevIlExamples/Properties/AssemblyInfo.cs  |    51 +
 examples/DevIlExamples/README                      |    23 +
 examples/DevIlExamples/SimpleExample.cs            |   168 +
 examples/FFmpegExamples/AudioStream.cs             |   184 +
 examples/FFmpegExamples/COPYING                    |    22 +
 examples/FFmpegExamples/Decoder.cs                 |   246 +
 examples/FFmpegExamples/FFmpegExamples.csproj      |   141 +
 examples/FFmpegExamples/FFmpegExamples.sh          |     2 +
 examples/FFmpegExamples/Makefile.am                |    31 +
 examples/FFmpegExamples/Makefile.in                |   380 +
 examples/FFmpegExamples/Player.Designer.cs         |   150 +
 examples/FFmpegExamples/Player.cs                  |    90 +
 examples/FFmpegExamples/Player.resx                |   166 +
 examples/FFmpegExamples/Program.cs                 |    47 +
 examples/FFmpegExamples/Properties/AssemblyInfo.cs |    60 +
 .../Properties/Resources.Designer.cs               |    63 +
 examples/FFmpegExamples/Properties/Resources.resx  |   121 +
 examples/FFmpegExamples/README                     |    11 +
 examples/FreeGlutExamples/COPYING                  |    22 +
 examples/FreeGlutExamples/FreeGlutExamples.csproj  |   107 +
 examples/FreeGlutExamples/FreeGlutExamples.sh      |     2 +
 examples/FreeGlutExamples/Makefile.am              |    16 +
 examples/FreeGlutExamples/Makefile.in              |   363 +
 examples/FreeGlutExamples/One.cs                   |   355 +
 .../FreeGlutExamples/Properties/AssemblyInfo.cs    |    59 +
 examples/FreeGlutExamples/README                   |    23 +
 examples/FtGlScrolling/FtGlScrolling.cs            |   207 +
 examples/FtGlScrolling/FtGlScrolling.csproj        |   158 +
 examples/FtGlScrolling/FtGlScrolling.sh            |     2 +
 examples/FtGlScrolling/Makefile.am                 |    14 +
 examples/FtGlScrolling/Makefile.in                 |   360 +
 examples/FtGlScrolling/Properties/AssemblyInfo.cs  |    57 +
 examples/FtGlSimple/FtGlSimple.cs                  |   472 +
 examples/FtGlSimple/FtGlSimple.csproj              |   158 +
 examples/FtGlSimple/FtGlSimple.sh                  |     2 +
 examples/FtGlSimple/Makefile.am                    |    14 +
 examples/FtGlSimple/Makefile.in                    |   360 +
 examples/FtGlSimple/Properties/AssemblyInfo.cs     |    57 +
 examples/GeWangExamples/COPYING                    |    22 +
 examples/GeWangExamples/ClippingPlanes.cs          |   427 +
 examples/GeWangExamples/GeWangExamples.Designer.cs |   106 +
 examples/GeWangExamples/GeWangExamples.cs          |    82 +
 examples/GeWangExamples/GeWangExamples.csproj      |   145 +
 examples/GeWangExamples/GeWangExamples.resx        |   163 +
 examples/GeWangExamples/GeWangExamples.sh          |     2 +
 examples/GeWangExamples/Lorenz3d.cs                |   454 +
 examples/GeWangExamples/Makefile.am                |    31 +
 examples/GeWangExamples/Makefile.in                |   379 +
 examples/GeWangExamples/Mirror.cs                  |   403 +
 examples/GeWangExamples/Program.cs                 |    47 +
 examples/GeWangExamples/Properties/AssemblyInfo.cs |    60 +
 examples/GeWangExamples/README                     |    27 +
 examples/GeWangExamples/Shadow.cs                  |   433 +
 examples/GeWangExamples/Starfield.cs               |   409 +
 examples/GeWangExamples/Xform.cs                   |   505 +
 examples/GlfwExamples/Boing.cs                     |   670 +
 examples/GlfwExamples/COPYING                      |    22 +
 examples/GlfwExamples/Cube.cs                      |   222 +
 examples/GlfwExamples/Gears.cs                     |   448 +
 examples/GlfwExamples/GlfwExamples.Designer.cs     |   106 +
 examples/GlfwExamples/GlfwExamples.cs              |    82 +
 examples/GlfwExamples/GlfwExamples.csproj          |   151 +
 examples/GlfwExamples/GlfwExamples.resx            |   163 +
 examples/GlfwExamples/GlfwExamples.sh              |     2 +
 examples/GlfwExamples/GlslLesson01.cs              |    48 +
 examples/GlfwExamples/KeyTest.cs                   |   324 +
 examples/GlfwExamples/ListModes.cs                 |   115 +
 examples/GlfwExamples/Makefile.am                  |    33 +
 examples/GlfwExamples/Makefile.in                  |   381 +
 examples/GlfwExamples/Pong.cs                      |   919 +
 examples/GlfwExamples/Program.cs                   |    47 +
 examples/GlfwExamples/Properties/AssemblyInfo.cs   |    59 +
 examples/GlfwExamples/README                       |    26 +
 examples/GlfwExamples/Triangle.cs                  |   169 +
 examples/LuaFunctions/COPYING                      |    22 +
 examples/LuaFunctions/Functions.cs                 |    98 +
 examples/LuaFunctions/LuaFunctions.csproj          |   148 +
 examples/LuaFunctions/LuaFunctions.sh              |     2 +
 examples/LuaFunctions/Makefile.am                  |    14 +
 examples/LuaFunctions/Makefile.in                  |   360 +
 examples/LuaFunctions/Properties/AssemblyInfo.cs   |    60 +
 examples/LuaFunctions/README                       |    13 +
 examples/LuaSimple/COPYING                         |    22 +
 examples/LuaSimple/LuaSimple.csproj                |   148 +
 examples/LuaSimple/LuaSimple.sh                    |     2 +
 examples/LuaSimple/Makefile.am                     |    14 +
 examples/LuaSimple/Makefile.in                     |   360 +
 examples/LuaSimple/Properties/AssemblyInfo.cs      |    84 +
 examples/LuaSimple/README                          |    13 +
 examples/LuaSimple/Simple.cs                       |    84 +
 examples/Makefile.am                               |    18 +
 examples/Makefile.in                               |   500 +
 examples/NateRobins/Area.cs                        |   161 +
 examples/NateRobins/COPYING                        |    22 +
 examples/NateRobins/Maiden.cs                      |   719 +
 examples/NateRobins/Makefile.am                    |    38 +
 examples/NateRobins/Makefile.in                    |   386 +
 examples/NateRobins/MultiView.cs                   |   285 +
 examples/NateRobins/NateRobins.Designer.cs         |    79 +
 examples/NateRobins/NateRobins.cs                  |    82 +
 examples/NateRobins/NateRobins.csproj              |   166 +
 examples/NateRobins/NateRobins.resx                |   163 +
 examples/NateRobins/NateRobins.sh                  |     2 +
 examples/NateRobins/Nii.cs                         |   396 +
 examples/NateRobins/Node.cs                        |    46 +
 examples/NateRobins/Null.cs                        |   155 +
 examples/NateRobins/Point.cs                       |    40 +
 examples/NateRobins/Program.cs                     |    47 +
 examples/NateRobins/Properties/AssemblyInfo.cs     |    60 +
 examples/NateRobins/Qix.cs                         |   427 +
 examples/NateRobins/README                         |    24 +
 examples/NateRobins/Rotate.cs                      |   192 +
 examples/NateRobins/Starfield.cs                   |   265 +
 examples/NateRobins/Strip.cs                       |   208 +
 examples/NateRobins/Texture.cs                     |   142 +
 examples/NateRobins/Voronoi.cs                     |   231 +
 examples/NeHe/COPYING                              |    22 +
 examples/NeHe/Lesson01.cs                          |   518 +
 examples/NeHe/Lesson02.cs                          |   529 +
 examples/NeHe/Lesson03.cs                          |   533 +
 examples/NeHe/Lesson04.cs                          |   541 +
 examples/NeHe/Lesson05.cs                          |   586 +
 examples/NeHe/Lesson06.cs                          |   652 +
 examples/NeHe/Lesson07.cs                          |   725 +
 examples/NeHe/Lesson08.cs                          |   746 +
 examples/NeHe/Lesson09.cs                          |   684 +
 examples/NeHe/Lesson10.cs                          |   829 +
 examples/NeHe/Lesson11.cs                          |   664 +
 examples/NeHe/Lesson12.cs                          |   706 +
 examples/NeHe/Lesson13.cs                          |   595 +
 examples/NeHe/Lesson14.cs                          |   611 +
 examples/NeHe/Lesson15.cs                          |   693 +
 examples/NeHe/Lesson16.cs                          |   746 +
 examples/NeHe/Lesson17.cs                          |   738 +
 examples/NeHe/Lesson18.cs                          |   788 +
 examples/NeHe/Lesson19.cs                          |   807 +
 examples/NeHe/Lesson20.cs                          |   703 +
 examples/NeHe/Lesson21.cs                          |   516 +
 examples/NeHe/Lesson23.cs                          |   789 +
 examples/NeHe/Lesson25.cs                          |   796 +
 examples/NeHe/Lesson26.cs                          |   757 +
 examples/NeHe/Lesson34.cs                          |   715 +
 examples/NeHe/Makefile.am                          |    51 +
 examples/NeHe/Makefile.in                          |   399 +
 examples/NeHe/NeHe.Designer.cs                     |   106 +
 examples/NeHe/NeHe.cs                              |    82 +
 examples/NeHe/NeHe.csproj                          |   207 +
 examples/NeHe/NeHe.resx                            |   163 +
 examples/NeHe/NeHe.sh                              |     2 +
 examples/NeHe/Program.cs                           |    47 +
 examples/NeHe/Properties/AssemblyInfo.cs           |    60 +
 examples/NeHe/README                               |    20 +
 examples/OdeExamples/Basic.cs                      |   129 +
 examples/OdeExamples/COPYING                       |    22 +
 examples/OdeExamples/Makefile.am                   |    18 +
 examples/OdeExamples/Makefile.in                   |   365 +
 examples/OdeExamples/OdeExamples.csproj            |   143 +
 examples/OdeExamples/OdeExamples.sh                |     2 +
 examples/OdeExamples/Properties/AssemblyInfo.cs    |    59 +
 examples/OdeExamples/README                        |    17 +
 examples/OpenAlExamples/Boxes.cs                   |   317 +
 examples/OpenAlExamples/COPYING                    |    22 +
 examples/OpenAlExamples/Lesson01.cs                |   229 +
 examples/OpenAlExamples/Lesson02.cs                |   229 +
 examples/OpenAlExamples/Lesson03.cs                |   308 +
 examples/OpenAlExamples/Lesson05.cs                |   371 +
 examples/OpenAlExamples/Makefile.am                |    33 +
 examples/OpenAlExamples/Makefile.in                |   381 +
 examples/OpenAlExamples/OpenAlExamples.Designer.cs |    79 +
 examples/OpenAlExamples/OpenAlExamples.cs          |    82 +
 examples/OpenAlExamples/OpenAlExamples.csproj      |   153 +
 examples/OpenAlExamples/OpenAlExamples.resx        |   163 +
 examples/OpenAlExamples/OpenAlExamples.sh          |     2 +
 examples/OpenAlExamples/Program.cs                 |    47 +
 examples/OpenAlExamples/Properties/AssemblyInfo.cs |    60 +
 examples/OpenAlExamples/README                     |    29 +
 examples/OpenAlExamples/Sound.cs                   |   173 +
 examples/OpenAlExamples/Waterfall.cs               |   568 +
 examples/PhysFsExamples/COPYING                    |    22 +
 examples/PhysFsExamples/Makefile.am                |    14 +
 examples/PhysFsExamples/Makefile.in                |   360 +
 examples/PhysFsExamples/PhysFsExamples.csproj      |   102 +
 examples/PhysFsExamples/PhysFsExamples.sh          |     2 +
 examples/PhysFsExamples/Properties/AssemblyInfo.cs |    59 +
 examples/PhysFsExamples/README                     |    20 +
 examples/PhysFsExamples/Simple.cs                  |   145 +
 examples/Redbook/Aaindex.cs                        |   216 +
 examples/Redbook/Aapoly.cs                         |   230 +
 examples/Redbook/Aargb.cs                          |   212 +
 examples/Redbook/Accanti.cs                        |   238 +
 examples/Redbook/Accpersp.cs                       |   302 +
 examples/Redbook/Alpha.cs                          |   211 +
 examples/Redbook/Alpha3d.cs                        |   241 +
 examples/Redbook/Anti.cs                           |   180 +
 examples/Redbook/Bezcurve.cs                       |   176 +
 examples/Redbook/Bezmesh.cs                        |   203 +
 examples/Redbook/Bezsurf.cs                        |   196 +
 examples/Redbook/COPYING                           |    22 +
 examples/Redbook/Checker.cs                        |   205 +
 examples/Redbook/CheckerOld.cs                     |   196 +
 examples/Redbook/Clip.cs                           |   161 +
 examples/Redbook/Colormat.cs                       |   212 +
 examples/Redbook/Cube.cs                           |   154 +
 examples/Redbook/DepthCue.cs                       |   174 +
 examples/Redbook/Dof.cs                            |   309 +
 examples/Redbook/Double.cs                         |   179 +
 examples/Redbook/Drawf.cs                          |   162 +
 examples/Redbook/Feedback.cs                       |   234 +
 examples/Redbook/Fog.cs                            |   234 +
 examples/Redbook/FogIndex.cs                       |   192 +
 examples/Redbook/FogIndexOld.cs                    |   201 +
 examples/Redbook/FogOld.cs                         |   273 +
 examples/Redbook/Font.cs                           |   227 +
 examples/Redbook/Hello.cs                          |   145 +
 examples/Redbook/Image.cs                          |   218 +
 examples/Redbook/Jitter.cs                         |   293 +
 examples/Redbook/Light.cs                          |   167 +
 examples/Redbook/Lines.cs                          |   195 +
 examples/Redbook/List.cs                           |   183 +
 examples/Redbook/Makefile.am                       |    94 +
 examples/Redbook/Makefile.in                       |   442 +
 examples/Redbook/Material.cs                       |   340 +
 examples/Redbook/Mipmap.cs                         |   237 +
 examples/Redbook/Model.cs                          |   179 +
 examples/Redbook/MoveLight.cs                      |   205 +
 examples/Redbook/Nurbs.cs                          |   276 +
 examples/Redbook/PickDepth.cs                      |   263 +
 examples/Redbook/PickSquare.cs                     |   276 +
 examples/Redbook/Plane.cs                          |   222 +
 examples/Redbook/Planet.cs                         |   178 +
 examples/Redbook/PolyOff.cs                        |   261 +
 examples/Redbook/Polys.cs                          |   191 +
 examples/Redbook/Program.cs                        |    47 +
 examples/Redbook/Properties/AssemblyInfo.cs        |    60 +
 examples/Redbook/Quadric.cs                        |   231 +
 examples/Redbook/README                            |    23 +
 examples/Redbook/Redbook.Designer.cs               |   106 +
 examples/Redbook/Redbook.cs                        |    82 +
 examples/Redbook/Redbook.csproj                    |   334 +
 examples/Redbook/Redbook.resx                      |   163 +
 examples/Redbook/Redbook.sh                        |     2 +
 examples/Redbook/Robot.cs                          |   183 +
 examples/Redbook/Scene.cs                          |   181 +
 examples/Redbook/SceneBlueAmbient.cs               |   180 +
 examples/Redbook/SceneColorLight.cs                |   182 +
 examples/Redbook/SceneFlat.cs                      |   181 +
 examples/Redbook/Select.cs                         |   294 +
 examples/Redbook/Smooth.cs                         |   161 +
 examples/Redbook/Stencil.cs                        |   247 +
 examples/Redbook/Stroke.cs                         |   312 +
 examples/Redbook/Surface.cs                        |   234 +
 examples/Redbook/SurfaceOld.cs                     |   280 +
 examples/Redbook/TeaAmbient.cs                     |   195 +
 examples/Redbook/Teapots.cs                        |   255 +
 examples/Redbook/Tess.cs                           |   279 +
 examples/Redbook/TessWind.cs                       |   375 +
 examples/Redbook/TexBind.cs                        |   231 +
 examples/Redbook/TexGen.cs                         |   244 +
 examples/Redbook/TexProx.cs                        |   154 +
 examples/Redbook/TexSub.cs                         |   244 +
 examples/Redbook/TextureSurf.cs                    |   221 +
 examples/Redbook/Torus.cs                          |   224 +
 examples/Redbook/Trim.cs                           |   245 +
 examples/Redbook/UnProject.cs                      |   162 +
 examples/Redbook/Varray.cs                         |   252 +
 examples/Redbook/Wrap.cs                           |   233 +
 examples/SdlExamples/COPYING                       |    22 +
 examples/SdlExamples/GfxPrimitives.cs              |   119 +
 examples/SdlExamples/Makefile.am                   |    27 +
 examples/SdlExamples/Makefile.in                   |   375 +
 examples/SdlExamples/Program.cs                    |    47 +
 examples/SdlExamples/Properties/AssemblyInfo.cs    |    51 +
 examples/SdlExamples/README                        |    11 +
 examples/SdlExamples/Rectangles.cs                 |   258 +
 examples/SdlExamples/SdlExamples.Designer.cs       |   106 +
 examples/SdlExamples/SdlExamples.cs                |    82 +
 examples/SdlExamples/SdlExamples.csproj            |   131 +
 examples/SdlExamples/SdlExamples.resx              |   163 +
 examples/SdlExamples/SdlExamples.sh                |     2 +
 examples/SdlExamples/SmpegPlayer.cs                |   173 +
 m4/Makefile.am                                     |     8 +
 m4/Makefile.in                                     |   331 +
 m4/acx_pthread.m4                                  |   233 +
 m4/acx_version.m4                                  |     8 +
 m4/ax_check_gl.m4                                  |    91 +
 m4/ax_check_glu.m4                                 |    67 +
 m4/ax_check_glut.m4                                |    75 +
 other/Tao_Logos/TaoButton.jpg                      |   Bin 0 -> 13424 bytes
 other/Tao_Logos/TaoPill.gif                        |   Bin 0 -> 8016 bytes
 other/Tao_Logos/tao.ico                            |   Bin 0 -> 2238 bytes
 other/Tao_Logos/yinyangblue.gif                    |   Bin 0 -> 11916 bytes
 other/win32installer/TaoFramework.nsi              |   430 +
 other/win32installer/runtime.ini                   |    28 +
 src/Makefile.am                                    |    38 +
 src/Makefile.in                                    |   550 +
 src/Tao.Cg/AUTHORS                                 |     0
 src/Tao.Cg/COPYING                                 |    22 +
 src/Tao.Cg/Cg.cs                                   |  6460 +++
 src/Tao.Cg/CgGl.cs                                 |  2136 +
 src/Tao.Cg/ChangeLog                               |     0
 src/Tao.Cg/INSTALL                                 |     0
 src/Tao.Cg/Makefile.am                             |    19 +
 src/Tao.Cg/Makefile.in                             |   415 +
 src/Tao.Cg/NEWS                                    |     0
 src/Tao.Cg/Properties/AssemblyInfo.cs              |    53 +
 src/Tao.Cg/README                                  |    18 +
 src/Tao.Cg/Tao.Cg.csproj                           |   101 +
 src/Tao.Cg/Tao.Cg.dll.config                       |     9 +
 src/Tao.Cg/Tao.Cg.snk                              |   Bin 0 -> 596 bytes
 src/Tao.Cg/tao-cg.pc.in                            |    10 +
 src/Tao.DevIl/AUTHORS                              |     0
 src/Tao.DevIl/COPYING                              |    22 +
 src/Tao.DevIl/ChangeLog                            |     0
 src/Tao.DevIl/INSTALL                              |     0
 src/Tao.DevIl/Il.cs                                |  2108 +
 src/Tao.DevIl/Ilu.cs                               |   805 +
 src/Tao.DevIl/Ilut.cs                              |  1077 +
 src/Tao.DevIl/Makefile.am                          |    20 +
 src/Tao.DevIl/Makefile.in                          |   416 +
 src/Tao.DevIl/NEWS                                 |     0
 src/Tao.DevIl/Properties/AssemblyInfo.cs           |    53 +
 src/Tao.DevIl/README                               |    18 +
 src/Tao.DevIl/Tao.DevIl.csproj                     |   104 +
 src/Tao.DevIl/Tao.DevIl.dll.config                 |    13 +
 src/Tao.DevIl/Tao.DevIl.snk                        |   Bin 0 -> 596 bytes
 src/Tao.DevIl/tao-devil.pc.in                      |     9 +
 src/Tao.FFmpeg/AUTHORS                             |     1 +
 src/Tao.FFmpeg/AVCodec.cs                          |  5252 ++
 src/Tao.FFmpeg/AVFormat.cs                         |  1896 +
 src/Tao.FFmpeg/AVSWScale.cs                        |   214 +
 src/Tao.FFmpeg/AVUtil.cs                           |   427 +
 src/Tao.FFmpeg/COPYING                             |    22 +
 src/Tao.FFmpeg/ChangeLog                           |     0
 src/Tao.FFmpeg/INSTALL                             |     0
 src/Tao.FFmpeg/Makefile.am                         |    21 +
 src/Tao.FFmpeg/Makefile.in                         |   417 +
 src/Tao.FFmpeg/NEWS                                |     0
 src/Tao.FFmpeg/Properties/AssemblyInfo.cs          |    53 +
 src/Tao.FFmpeg/README                              |    15 +
 src/Tao.FFmpeg/Tao.FFmpeg.csproj                   |   104 +
 src/Tao.FFmpeg/Tao.FFmpeg.dll.config               |    17 +
 src/Tao.FFmpeg/Tao.FFmpeg.snk                      |   Bin 0 -> 596 bytes
 src/Tao.FFmpeg/tao-ffmpeg.pc.in                    |     9 +
 src/Tao.FreeGlut/AUTHORS                           |     0
 src/Tao.FreeGlut/COPYING                           |    22 +
 src/Tao.FreeGlut/ChangeLog                         |     0
 src/Tao.FreeGlut/Glut.cs                           |  8783 ++++
 src/Tao.FreeGlut/INSTALL                           |     0
 src/Tao.FreeGlut/Makefile.am                       |    18 +
 src/Tao.FreeGlut/Makefile.in                       |   414 +
 src/Tao.FreeGlut/NEWS                              |     0
 src/Tao.FreeGlut/Properties/AssemblyInfo.cs        |    53 +
 src/Tao.FreeGlut/README                            |    14 +
 src/Tao.FreeGlut/Tao.FreeGlut.csproj               |   103 +
 src/Tao.FreeGlut/Tao.FreeGlut.dll.config           |     5 +
 src/Tao.FreeGlut/Tao.FreeGlut.snk                  |   Bin 0 -> 596 bytes
 src/Tao.FreeGlut/tao-freeglut.pc.in                |     9 +
 src/Tao.FreeType/AUTHORS                           |     0
 src/Tao.FreeType/COPYING                           |    22 +
 src/Tao.FreeType/ChangeLog                         |     0
 src/Tao.FreeType/FreeType.cs                       |  2484 +
 src/Tao.FreeType/INSTALL                           |     0
 src/Tao.FreeType/Makefile.am                       |    18 +
 src/Tao.FreeType/Makefile.in                       |   414 +
 src/Tao.FreeType/NEWS                              |     0
 src/Tao.FreeType/Properties/AssemblyInfo.cs        |    62 +
 src/Tao.FreeType/README                            |    11 +
 src/Tao.FreeType/TODO                              |     4 +
 src/Tao.FreeType/Tao.FreeType.csproj               |    98 +
 src/Tao.FreeType/Tao.FreeType.dll.config           |     5 +
 src/Tao.FreeType/Tao.FreeType.snk                  |   Bin 0 -> 596 bytes
 src/Tao.FreeType/tao-freetype.pc.in                |     9 +
 src/Tao.FtGl/AUTHORS                               |     2 +
 src/Tao.FtGl/COPYING                               |    22 +
 src/Tao.FtGl/ChangeLog                             |     2 +
 src/Tao.FtGl/FtGl.cs                               |   903 +
 src/Tao.FtGl/INSTALL                               |     0
 src/Tao.FtGl/Makefile.am                           |    18 +
 src/Tao.FtGl/Makefile.in                           |   414 +
 src/Tao.FtGl/NEWS                                  |     0
 src/Tao.FtGl/Properties/AssemblyInfo.cs            |    57 +
 src/Tao.FtGl/README                                |    10 +
 src/Tao.FtGl/Tao.FtGl.csproj                       |   104 +
 src/Tao.FtGl/Tao.FtGl.dll.config                   |     5 +
 src/Tao.FtGl/Tao.FtGl.snk                          |   Bin 0 -> 596 bytes
 src/Tao.FtGl/tao-ftgl.pc.in                        |     9 +
 src/Tao.GlBindGen/AUTHORS                          |     0
 src/Tao.GlBindGen/COPYING                          |   340 +
 src/Tao.GlBindGen/ChangeLog                        |    63 +
 src/Tao.GlBindGen/INSTALL                          |     1 +
 src/Tao.GlBindGen/Makefile.am                      |     1 +
 src/Tao.GlBindGen/Makefile.in                      |   327 +
 src/Tao.GlBindGen/NEWS                             |     0
 src/Tao.GlBindGen/README                           |    38 +
 src/Tao.GlBindGen/TODO                             |     4 +
 src/Tao.Glfw/AUTHORS                               |     0
 src/Tao.Glfw/COPYING                               |    22 +
 src/Tao.Glfw/ChangeLog                             |     0
 src/Tao.Glfw/Glfw.cs                               |  2213 +
 src/Tao.Glfw/INSTALL                               |     0
 src/Tao.Glfw/Makefile.am                           |    18 +
 src/Tao.Glfw/Makefile.in                           |   414 +
 src/Tao.Glfw/NEWS                                  |     0
 src/Tao.Glfw/Properties/AssemblyInfo.cs            |    53 +
 src/Tao.Glfw/README                                |    17 +
 src/Tao.Glfw/Tao.Glfw.csproj                       |   103 +
 src/Tao.Glfw/Tao.Glfw.dll.config                   |     5 +
 src/Tao.Glfw/Tao.Glfw.snk                          |   Bin 0 -> 596 bytes
 src/Tao.Glfw/tao-glfw.pc.in                        |     9 +
 src/Tao.Lua/AUTHORS                                |     0
 src/Tao.Lua/COPYING                                |    22 +
 src/Tao.Lua/ChangeLog                              |     0
 src/Tao.Lua/INSTALL                                |     0
 src/Tao.Lua/Lua.cs                                 |  2731 ++
 src/Tao.Lua/Makefile.am                            |    18 +
 src/Tao.Lua/Makefile.in                            |   414 +
 src/Tao.Lua/NEWS                                   |     0
 src/Tao.Lua/Properties/AssemblyInfo.cs             |    57 +
 src/Tao.Lua/README                                 |     0
 src/Tao.Lua/Tao.Lua.csproj                         |    98 +
 src/Tao.Lua/Tao.Lua.dll.config                     |     5 +
 src/Tao.Lua/Tao.Lua.snk                            |   Bin 0 -> 596 bytes
 src/Tao.Lua/tao-lua.pc.in                          |     9 +
 src/Tao.Ode/AUTHORS                                |     9 +
 src/Tao.Ode/COPYING                                |    22 +
 src/Tao.Ode/ChangeLog                              |     0
 src/Tao.Ode/INSTALL                                |     0
 src/Tao.Ode/Makefile.am                            |    18 +
 src/Tao.Ode/Makefile.in                            |   414 +
 src/Tao.Ode/NEWS                                   |     0
 src/Tao.Ode/Ode.cs                                 |  7442 +++
 src/Tao.Ode/Properties/AssemblyInfo.cs             |    53 +
 src/Tao.Ode/README                                 |    33 +
 src/Tao.Ode/TODO                                   |    23 +
 src/Tao.Ode/Tao.Ode.csproj                         |    98 +
 src/Tao.Ode/Tao.Ode.dll.config                     |     5 +
 src/Tao.Ode/Tao.Ode.snk                            |   Bin 0 -> 596 bytes
 src/Tao.Ode/tao-ode.pc.in                          |     8 +
 src/Tao.OpenAl/ALDelegates.cs                      |   247 +
 src/Tao.OpenAl/AUTHORS                             |     4 +
 src/Tao.OpenAl/Al.cs                               |  6196 +++
 src/Tao.OpenAl/Alc.cs                              |  1004 +
 src/Tao.OpenAl/Alut.cs                             |   736 +
 src/Tao.OpenAl/COPYING                             |    22 +
 src/Tao.OpenAl/ChangeLog                           |     2 +
 src/Tao.OpenAl/INSTALL                             |     1 +
 src/Tao.OpenAl/Makefile.am                         |    21 +
 src/Tao.OpenAl/Makefile.in                         |   417 +
 src/Tao.OpenAl/NEWS                                |     0
 src/Tao.OpenAl/Properties/AssemblyInfo.cs          |    53 +
 src/Tao.OpenAl/README                              |    15 +
 src/Tao.OpenAl/Tao.OpenAl.csproj                   |   105 +
 src/Tao.OpenAl/Tao.OpenAl.dll.config               |     9 +
 src/Tao.OpenAl/Tao.OpenAl.snk                      |   Bin 0 -> 596 bytes
 src/Tao.OpenAl/tao-openal.pc.in                    |     8 +
 src/Tao.OpenGl/AUTHORS                             |     0
 src/Tao.OpenGl/COPYING                             |    22 +
 src/Tao.OpenGl/ChangeLog                           |     0
 src/Tao.OpenGl/GLCore.cs                           |  1763 +
 src/Tao.OpenGl/GLDelegates.cs                      |  4601 ++
 src/Tao.OpenGl/GLEnums.cs                          |  3246 ++
 src/Tao.OpenGl/Gl.cs                               | 43430 +++++++++++++++++
 src/Tao.OpenGl/GlExtensionLoader.cs                |   498 +
 src/Tao.OpenGl/GlHelper.cs                         |   554 +
 src/Tao.OpenGl/Glu.cs                              | 48360 +++++++++++++++++++
 src/Tao.OpenGl/INSTALL                             |     0
 src/Tao.OpenGl/Makefile.am                         |    24 +
 src/Tao.OpenGl/Makefile.in                         |   420 +
 src/Tao.OpenGl/NEWS                                |     0
 src/Tao.OpenGl/Properties/AssemblyInfo.cs          |    53 +
 src/Tao.OpenGl/README                              |    66 +
 src/Tao.OpenGl/Tao.OpenGl.csproj                   |   117 +
 src/Tao.OpenGl/Tao.OpenGl.dll.config               |     9 +
 src/Tao.OpenGl/Tao.OpenGl.snk                      |   Bin 0 -> 596 bytes
 src/Tao.OpenGl/tao-opengl.pc.in                    |    10 +
 src/Tao.PhysFs/AUTHORS                             |     0
 src/Tao.PhysFs/COPYING                             |    22 +
 src/Tao.PhysFs/ChangeLog                           |     0
 src/Tao.PhysFs/Fs.cs                               |  1602 +
 src/Tao.PhysFs/INSTALL                             |     0
 src/Tao.PhysFs/Makefile.am                         |    18 +
 src/Tao.PhysFs/Makefile.in                         |   414 +
 src/Tao.PhysFs/NEWS                                |     0
 src/Tao.PhysFs/Properties/AssemblyInfo.cs          |    52 +
 src/Tao.PhysFs/README                              |    21 +
 src/Tao.PhysFs/Tao.PhysFs.csproj                   |    98 +
 src/Tao.PhysFs/Tao.PhysFs.dll.config               |     5 +
 src/Tao.PhysFs/Tao.PhysFs.snk                      |   Bin 0 -> 596 bytes
 src/Tao.PhysFs/tao-physfs.pc.in                    |     9 +
 src/Tao.Platform.Windows/AUTHORS                   |     0
 src/Tao.Platform.Windows/COPYING                   |    22 +
 src/Tao.Platform.Windows/ChangeLog                 |     0
 src/Tao.Platform.Windows/Gdi.cs                    |  1786 +
 src/Tao.Platform.Windows/INSTALL                   |     0
 src/Tao.Platform.Windows/IlasmAttribute.cs         |    53 +
 src/Tao.Platform.Windows/Kernel.cs                 |  1744 +
 src/Tao.Platform.Windows/Makefile.am               |    32 +
 src/Tao.Platform.Windows/Makefile.in               |   429 +
 src/Tao.Platform.Windows/NEWS                      |     0
 .../Properties/AssemblyInfo.cs                     |    53 +
 src/Tao.Platform.Windows/README                    |    13 +
 src/Tao.Platform.Windows/SimpleOpenGlControl.cs    |   516 +
 .../Tao.Platform.Windows.csproj                    |   144 +
 .../Tao.Platform.Windows.dll.config                |     2 +
 src/Tao.Platform.Windows/Tao.Platform.Windows.snk  |   Bin 0 -> 596 bytes
 src/Tao.Platform.Windows/User.cs                   |  1102 +
 src/Tao.Platform.Windows/Wgl.cs                    |  2882 ++
 src/Tao.Platform.Windows/WglCore.cs                |    86 +
 src/Tao.Platform.Windows/WglDelegates.cs           |   308 +
 src/Tao.Platform.Windows/WglEnums.cs               |   211 +
 src/Tao.Platform.Windows/WglHelper.cs              |   287 +
 src/Tao.Platform.Windows/WinNt.cs                  |   411 +
 src/Tao.Platform.Windows/Winmm.cs                  |  1473 +
 .../tao-platform-windows.pc.in                     |    10 +
 src/Tao.Platform.X11/API.cs                        |  1069 +
 src/Tao.Platform.X11/AUTHORS                       |     0
 src/Tao.Platform.X11/COPYING                       |    22 +
 src/Tao.Platform.X11/ChangeLog                     |     0
 src/Tao.Platform.X11/Functions.cs                  |   344 +
 src/Tao.Platform.X11/Glx.cs                        |  1509 +
 src/Tao.Platform.X11/INSTALL                       |     0
 src/Tao.Platform.X11/Makefile.am                   |    24 +
 src/Tao.Platform.X11/Makefile.in                   |   421 +
 src/Tao.Platform.X11/NEWS                          |     0
 src/Tao.Platform.X11/Properties/AssemblyInfo.cs    |    53 +
 src/Tao.Platform.X11/README                        |    10 +
 src/Tao.Platform.X11/Structs.cs                    |  1745 +
 src/Tao.Platform.X11/Tao.Platform.X11.csproj       |   120 +
 src/Tao.Platform.X11/Tao.Platform.X11.dll.config   |     2 +
 src/Tao.Platform.X11/Tao.Platform.X11.snk          |   Bin 0 -> 596 bytes
 src/Tao.Platform.X11/tao-platform-x11.pc.in        |    10 +
 src/Tao.Sdl/AUTHORS                                |     1 +
 src/Tao.Sdl/COPYING                                |    22 +
 src/Tao.Sdl/ChangeLog                              |     2 +
 src/Tao.Sdl/INSTALL                                |     0
 src/Tao.Sdl/Makefile.am                            |    24 +
 src/Tao.Sdl/Makefile.in                            |   420 +
 src/Tao.Sdl/NEWS                                   |     0
 src/Tao.Sdl/Properties/AssemblyInfo.cs             |    53 +
 src/Tao.Sdl/README                                 |    19 +
 src/Tao.Sdl/Sdl.cs                                 | 13290 +++++
 src/Tao.Sdl/SdlGfx.cs                              |  2411 +
 src/Tao.Sdl/SdlImage.cs                            |  1396 +
 src/Tao.Sdl/SdlMixer.cs                            |  3341 ++
 src/Tao.Sdl/SdlNet.cs                              |  2320 +
 src/Tao.Sdl/SdlTtf.cs                              |  1830 +
 src/Tao.Sdl/Smpeg.cs                               |  1072 +
 src/Tao.Sdl/Tao.Sdl.csproj                         |   115 +
 src/Tao.Sdl/Tao.Sdl.dll.config                     |    29 +
 src/Tao.Sdl/Tao.Sdl.snk                            |   Bin 0 -> 596 bytes
 src/Tao.Sdl/tao-sdl.pc.in                          |    10 +
 src/Tao.source                                     |     4 +
 tao.build                                          |   284 +
 taoframework.spec.suse.example                     |   174 +
 template.pc                                        |     8 +
 tests/Makefile.am                                  |     2 +
 tests/Makefile.in                                  |   483 +
 tests/Ode/COPYING                                  |    22 +
 tests/Ode/Makefile.am                              |    18 +
 tests/Ode/Makefile.in                              |   414 +
 tests/Ode/Matrix3Marshalling.cs                    |   155 +
 tests/Ode/Properties/AssemblyInfo.cs               |    86 +
 tests/Ode/Tao.Ode.Tests.csproj                     |   147 +
 tests/Ode/tao-ode-tests.pc.in                      |     8 +
 tests/Sdl/COPYING                                  |    22 +
 tests/Sdl/Makefile.am                              |    24 +
 tests/Sdl/Makefile.in                              |   420 +
 tests/Sdl/Properties/AssemblyInfo.cs               |    86 +
 tests/Sdl/SdlTest.cs                               |  1120 +
 tests/Sdl/SdlTestGfx.cs                            |   913 +
 tests/Sdl/SdlTestImage.cs                          |   476 +
 tests/Sdl/SdlTestMixer.cs                          |   968 +
 tests/Sdl/SdlTestTtf.cs                            |   647 +
 tests/Sdl/SdlTestVideo.cs                          |   773 +
 tests/Sdl/SmpegTest.cs                             |   160 +
 tests/Sdl/Tao.Sdl.Tests.csproj                     |   123 +
 tests/Sdl/tao-sdl-tests.pc.in                      |    10 +
 622 files changed, 289090 insertions(+)

diff --git a/.auto/install-sh b/.auto/install-sh
new file mode 100755
index 0000000..a5897de
--- /dev/null
+++ b/.auto/install-sh
@@ -0,0 +1,519 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2006-12-25.00
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/.auto/missing b/.auto/missing
new file mode 100755
index 0000000..1c8ff70
--- /dev/null
+++ b/.auto/missing
@@ -0,0 +1,367 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2006-05-10.23
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
+#   Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake at gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case $1 in
+  lex|yacc)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $1 in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit 1
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case $firstarg in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case $firstarg in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..b6c7b80
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,14 @@
+Stephen Apostolopoulos, Vladimir Vukicevic, Randy Ridge - Tao.OpenGl
+David Hudson - Tao.Sdl
+Randy Ridge - Tao.FreeGlut
+Randy Ridge - Tao.Platform.Windows
+Randy Ridge - Tao.PostProcess
+Randy Ridge and David Hudson - Tao.OpenAl
+Randy Ridge - Tao.Glfw
+Rob Loach - Tao.Lua
+Rob Loach - Tao.PhysFs
+Randy Ridge, 'cody', Terry Triplett and David Hudson - Tao.Ode
+C.J. Adams-Collier, David Hudson and Sam Hocevar - autotools and build system
+Chris McGuirk and David Hudson - Tao.Cg
+Chris McGuirk and Randy Ridge - Tao.DevIl
+tzehaw huang - Tao.FFmpeg
diff --git a/Assembly.am b/Assembly.am
new file mode 100644
index 0000000..cc22b4a
--- /dev/null
+++ b/Assembly.am
@@ -0,0 +1,43 @@
+# Generic assembly building automake rules
+
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..4e5095d
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2007 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..4d9db2d
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,128 @@
+2008-05-01T00:00 
+	* Tao.Sdl - fixed SDL_overlay struct.
+	* Tao.Sdl - Added non-CLS compliant methods
+	* Tao.Sdl - updated to SDL 1.2.13
+	* Tao.Cg - Updated to Cg 2.0
+	* Added Tao.FFmpeg, Tao.FreeType, Tao.Platform.X11
+	* Fixed uninstall issues with the Windows Installer.
+	* Added make build system.
+	* Removed prebuild from the build system (still used for GAC functionality).
+	* Examples are now OSX bundles.
+	* Sdl, OpenGl, Cg, FreeGlut (GLUT actually) work on OSX but the others do not have installers. OpenAl has partial support.
+	* Tao.Lua - Updated to 5.1.3
+	* Added TaoMediaPlayer as an example for Tao.FFmpeg.
+	* Tao.Ode - updated to 0.9.
+	* Tao.OpenGl - Optimized cold boot time, by using reflection to reduce jitted LOC. 
+	* Tao.OpenGl - Simplified and optimized extension loading (now works on OSX, too). 
+	* Tao.OpenGl - Improved call speed for functions that take typed arrays as parameters (e.g. int[], short[], etc.) 
+	* Tao.OpenGl - Added ref/out overloads for functions taking pointers. 
+	* Tao.OpenGl - Added non-CLS compliant overloads for functions with unsigned parameters (e.g. uint, ushort etc.) 
+	* Tao.OpenGl - Reduced the total number of overloads by simplifying the generation process. 
+	* Tao.OpenGl - Fixed several bugs in the typemaps (GLbool -> bool, void* (return) -> IntPtr). 
+	* NAnt build extended with install function (previously just for package building)
+	* pkg-config files (important for distro's! since for example OpenSUSE uses Tao.OpenGL.pc, while Debian uses tao-opengl.pc, hopefully everyone will now start using the later one)
+	* OpenAL EFX support
+	* WGl extensions repaired
+
+2007-04-10T14:52  C.J. Adams-Collier <cjac at colliertech.org>
+	* other/Prebuild/Prebuild.exe, other/Prebuild/prebuild-1.7.xsd
+	* updated to new binary from Prebuild-cjac
+
+2007-02-10T06:00  David Hudson <jendave at yahoo.com>
+	* Updated Tao.Sdl to Sdl_gfx 2.0.16
+
+2007-01-18T18:30  Rob Loach <http://www.robloach.net>
+	* Tao.Lua updated to Lua 5.1.1
+	* Glfw.glfwGetJoystickPos argument fix
+	* Documentation
+
+2006-11-04T00:26  C.J. Adams-Collier  <cjcollier at colliertech.org>
+	* other/Prebuild/Prebuild.exe
+	- new version places AssemblyInfo.cs into Properties/ directory
+	* src/Tao.OpenAl/prebuild.xml
+	- added regex to skip AssemblyInfo.cs, since it's now auto-included
+	* src/Tao.OpenGl/prebuild.xml
+	- moved examples to ../Examples
+	* src/Examples/prebuild.xml
+	- this is where the examples now live
+	* src/Examples/Properties/AssemblyInfo.cs
+	- generated AssemblyInfo.cs for those who don't generate their own
+	* prebuild.xml
+	- now including src/Examples/prebuild.xml
+
+2006-11-03T18:36  C.J. Adams-Collier  <cjcollier at colliertech.org>
+	* make.sh
+	- Added install-data-local so that the .dlls get installed; hacky
+	* src/Tao.(GlBindGen,OpenAl)/(INSTALL,COPYING)
+	- Added.  empty	
+	* src/Tao.OpenGl/Tao.OpenAl.snk
+	- symlink to src/Tao.OpenAl/Tao.OpenAl.snk
+
+2006-11-03T18:04  C.J. Adams-Collier  <cjcollier at colliertech.org>
+	* prj2make.sh
+	- removed GlGenerator
+	* src/Tao.OpenAl/AUTHORS
+	- added Randy, Rob, Dave and myself
+	* src/Tao.OpenAl/prebuild.xml
+	- created.  You'll see more of these as I pull the non-OpenGl bits
+	out of OpenGl's prebuild.xml file
+	* src/Tao.OpenAl/(NEWS, README)
+	* created; empty
+	- src/Tao.(DevIl,Lua,OpenGl,Ode)/prebuild.xml
+	* removed XmlDocFile from its comment
+	- src/Tao.OpenGl/prebuild.xml
+	* not matching AssemblyInfo.cs from non-self packages
+	- prebuild.xml
+	* Added Tao.OpenAl
+	
+
+
+2006-10-08  C.J. Adams-Collier  <cjcollier at colliertech.org>
+	* prj2make.sh
+	- added this file.  This will be used by the build verification
+	  tests (http://taobvt.colliertech.org) to verify the msvc build
+	- note that the build currently fails.  This is better than the
+	  "always fail" case that's currently happening, though.
+	
+2006-10-07  C.J. Adams-Collier  <cjcollier at colliertech.org>
+	* src/Tao.DevIl/prebuild.xml, src/Tao.Ode/prebuild.xml,
+	  src/Tao.OpenGl/prebuild.xml, src/Tao.Lua/prebuild.xml -
+	  commented <KeyFile> and <XmlDocFile> elements that were causing
+	  nant build failure * build.sh - removed GlGenerator from the
+	  list to build due to a "File Not Found" error - removed copy
+	  commands for builds and docs that are broken
+	
+2006-10-05  C.J. Adams-Collier  <cjcollier at colliertech.org>
+	* clean.sh - created - supposedly reverses make.sh *
+	CodingStandards - A place for proposed coding standards (patch
+	formats, etc)
+
+2006-09-28  C.J. Adams-Collier  <cjcollier at colliertech.org>
+	* make.sh
+	- cleared up directory changing stuff
+	* src/Tao.OpenGl/prebuild.xml
+	- commented out examples that don't build due to marshaling errors
+
+2006-09-28T16:20  C.J. Adams-Collier  <cjcollier at colliertech.org>
+	* make.sh
+	- cleaned up some of the repetition
+	- fixed a case error
+
+2006-09-28T12:53  C.J. Adams-Collier  <cjcollier at colliertech.org>
+	* make.sh
+	- configure now uses args passed to "./make.sh"
+
+2006-09-28  C.J. Adams-Collier  <cjcollier at colliertech.org>
+        turned on exec bit for shell scripts, got rid of \r\n newlines
+
+
+Tao.Ode 0.6.0.0 - July 25, 2006:
+	Update to ODE 0.6 and conversion to .NET 2.0 essentially complete.
+	The ODE 0.6 release consists of many bug fixes and
+	improvements since the 0.5 release.
+	There are also many documented and undocumented changes in the API.
+	Notable changes: CCylinder renamed to Capsule
+			 Support for geom offsets added
+	This update also includes a patch from Markus Ewald to fix a bug in
+	dGeomSetRotation and inspired related changes.  Thanks Markus.
+
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..0d98979
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,71 @@
+
+** For the latest information, please visit http://taoframework.com
+
+There are two ways of building Tao; one requiring NAnt and one using the 
+autotools tools. 
+
+1. Using NAnt
+=============
+Building the Tao Framework with NAnt is rather easy. Just go to your favorite
+shell and issue (in Tao's main directory):
+
+$ nant build-release
+
+to build all binaries for the current framework. In order to install Tao into  
+the Global Assembly Cache and create pkg-config files on unix, this should be  
+followed by:                                                                   
+
+# nant install
+
+On Windows you probably need to do this on the Visual Studio or .NET SDK
+command prompt.
+You can change the location for the GAC by adding -D:gacdir=/yourdir
+You can change the location of pkg-config files by adding -D:pkgconfig=/yourdir
+
+Alternatively you can also build a full zip package with documentation and     
+source using:                                                                  
+
+$ nant package
+
+2. Using Autotools
+==================
+To generate the autotools build scripts, you need to bootstrap the package:
+
+$ ./bootstrap
+
+Once done, just run configure and make to build the Tao Framework:
+
+$ ./configure
+$ make
+
+To install the assemblies and register them in the GAC, run as root:
+
+# make install
+
+You should now have:
+ * tao-opengl.pc in /usr/local/lib/pkgconfig/
+ * Tao.OpenGl.dll in /usr/local/lib/cli/tao-opengl-<version>/
+ * Tao.OpenGl in your GAC
+
+You can now run something like this:
+
+$ pkg-config --modversion tao-opengl
+2.1.0.4
+
+You can now add a dependence on Tao.OpenGl into your application by adding     
+something like the following to your configure.ac:                             
+
+TAO_OPENGL_REQUIRED_VERSION=2.1.0
+PKG_CHECK_MODULES(TAO_OPENGL_DEPENDENCIES,
+                  tao-opengl >= $TAO_OPENGL_REQUIRED_VERSION,
+                  has_tao_opengl=yes,
+                  has_tao_opengl=no)
+
+if test "x$has_tao_opengl" = "xno"; then
+  AC_MSG_WARN([Tao.OpenGl not detected; examples will not be built])
+else
+  AC_MSG_NOTICE([Tao.OpenGl found; examples will be built])
+fi
+
+AM_CONDITIONAL(HAS_TAO_OPENGL, test x$has_tao_opengl = xyes)
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..2d03299
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,27 @@
+
+AUTOMAKE_OPTIONS = dist-bzip2
+SUBDIRS = src tests examples
+DIST_SUBDIRS = $(SUBDIRS) m4
+
+ACLOCAL_AMFLAGS = -I m4
+
+EXTRA_DIST = \
+    bootstrap \
+    build.bat \
+    build.sh \
+    build-debug.bat \
+    build-debug.sh \
+    buildmono.bat \
+    buildmono-debug.bat \
+    clean.bat \
+    clean.sh \
+    other/win32installer/runtime.ini \
+    other/win32installer/TaoFramework.nsi \
+    other/Tao_Logos/TaoButton.jpg \
+    other/Tao_Logos/tao.ico \
+    other/Tao_Logos/TaoPill.gif \
+    other/Tao_Logos/yinyangblue.gif \
+    taoframework.spec.suse.example \
+    template.pc \
+    tao.build
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..eebd330
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,633 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(top_srcdir)/configure .auto/install-sh \
+	.auto/missing AUTHORS COPYING ChangeLog INSTALL NEWS TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d $(distdir) \
+    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = dist-bzip2
+SUBDIRS = src tests examples
+DIST_SUBDIRS = $(SUBDIRS) m4
+ACLOCAL_AMFLAGS = -I m4
+EXTRA_DIST = \
+    bootstrap \
+    build.bat \
+    build.sh \
+    build-debug.bat \
+    build-debug.sh \
+    buildmono.bat \
+    buildmono-debug.bat \
+    clean.bat \
+    clean.sh \
+    other/win32installer/runtime.ini \
+    other/win32installer/TaoFramework.nsi \
+    other/Tao_Logos/TaoButton.jpg \
+    other/Tao_Logos/tao.ico \
+    other/Tao_Logos/TaoPill.gif \
+    other/Tao_Logos/yinyangblue.gif \
+    taoframework.spec.suse.example \
+    template.pc \
+    tao.build
+
+all: all-recursive
+
+.SUFFIXES:
+am--refresh:
+	@:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+	      cd $(srcdir) && $(AUTOMAKE) --foreign  \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d $(distdir) || mkdir $(distdir)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r $(distdir)
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && cd $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@cd $(distuninstallcheck_dir) \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am am--refresh check check-am clean clean-generic \
+	ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
+	dist-lzma dist-shar dist-tarZ dist-zip distcheck distclean \
+	distclean-generic distclean-tags distcleancheck distdir \
+	distuninstallcheck dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
+	tags-recursive uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..3d4f85a
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,107 @@
+2.1.0
+Tao Library versions
+Tao.OpenGl 2.1.0.12, Tao.Platform.Windows 1.0.0.5,
+Tao.FreeGlut 2.4.0.2, Tao.OpenAl 1.1.0.1, Tao.Cg 2.0.0.0, Tao.DevIl 1.6.8.3,
+Tao.Lua 5.1.3.0, Tao.Sdl 1.2.13.0, Tao.PhysFs 1.0.1.2, Tao.Ode 0.9.0.0,
+Tao.Glfw 2.6.0.0, Tao.FFmpeg 0.4.9.0, Tao.FreeType 2.3.5.0, Tao.Platform.X11 1.0.0.0
+
+- Tao.Sdl - fixed SDL_overlay struct.
+- Tao.Sdl - Added non-CLS compliant methods
+- Tao.Sdl - updated to SDL 1.2.13
+- Tao.Cg - Updated to Cg 2.0
+- Added Tao.FFmpeg, Tao.FreeType, Tao.Platform.X11
+- Fixed uninstall issues with the Windows Installer.
+- Added make build system.
+- Removed prebuild from the build system (still used for GAC functionality).
+- Examples are now OSX bundles.
+- Sdl, OpenGl, Cg, FreeGlut (GLUT actually) work on OSX but the others do not have installers. OpenAl has partial support.
+- Tao.Lua - Updated to 5.1.3
+- Added TaoMediaPlayer as an example for Tao.FFmpeg.
+- Tao.Ode - updated to 0.9.
+- Tao.OpenGl - Optimized cold boot time, by using reflection to reduce jitted LOC. 
+- Tao.OpenGl - Simplified and optimized extension loading (now works on OSX, too). 
+- Tao.OpenGl - Improved call speed for functions that take typed arrays as parameters (e.g. int[], short[], etc.) 
+- Tao.OpenGl - Added ref/out overloads for functions taking pointers. 
+- Tao.OpenGl - Added non-CLS compliant overloads for functions with unsigned parameters (e.g. uint, ushort etc.) 
+- Tao.OpenGl - Reduced the total number of overloads by simplifying the generation process. 
+- Tao.OpenGl - Fixed several bugs in the typemaps (GLbool -> bool, void* (return) -> IntPtr). 
+- NAnt build extended with install function (previously just for package building)
+- pkg-config files (important for distro's! since for example OpenSUSE uses Tao.OpenGL.pc, while Debian uses tao-opengl.pc, hopefully everyone will now start using the later one)
+- OpenAL EFX support
+- WGl extensions repaired
+
+2.0
+Tao library versions
+Tao.OpenGl 2.1.0.3, Tao.Platform.Windows 1.0.0.3,
+Tao.FreeGlut 2.4.0.1, Tao.OpenAl 1.1.0.0, Tao.Cg 1.4.1.1, Tao.DevIl 1.6.8.2,
+Tao.Lua 5.1.1.0, Tao.Sdl 1.2.11.1, Tao.PhysFs 1.0.1.0, Tao.Ode 0.6.0.3,
+Tao.Glfw 2.5.0.0.
+
+All libraries are compiled for .NET 2.0. 
+Since they use features not in .NET 1.1, the libraries cannot be recompiled for .NET 1.1.
+
+The Tao.OpenGl binding has been completely revamped.
+
+Conslidated most examples into easy-to-use browser apps.
+
+Added simple scripts to ease execution of examples on Mono.
+
+Downloads are available at: 
+https://sourceforge.net/project/showfiles.php?group_id=170616
+
+
+1.3.0
+Tao library versions
+Tao.OpenGl 1.5.0.3, Tao.Platform.Windows 1.0.0.3, Tao.FreeGlut 2.4.0.0,
+Tao.OpenAl 1.1.0.0, Tao.Cg 1.4.1.0, Tao.DevIl 1.6.7.0,
+Tao.Sdl 1.2.11.0, Tao.PhysFs 1.0.1.0, Tao.Ode 0.5.0.3, Tao.Glfw 2.5.0.0.
+
+For Tao.Sdl
+* Now binds with SDL 1.2.11, SDL_image 1.2.5, SDL_mixer 1.2.7, 
+smpeg 0.4.5, SDL_ttf 2.0.8, SDL_net 1.2.6
+* SDL_SetVideoMode() now accepts 0 for width or height and will
+use the current video mode (or the desktop mode if no mode has been set.) 
+* Added current_w and current_h to the SDL_VideoInfo structure,
+which is set to the desktop resolution during video intialization, 
+and then set to the current resolution when a video mode is set. 
+* SDL_GL_LoadLibrary() will load the system default OpenGL 
+library if it is passed NULL as a parameter. 
+* Added SDL_GL_SWAP_CONTROL to wait for vsync in OpenGL applications. 
+* Added SDL_GL_ACCELERATED_VISUAL to guarantee hardware acceleration. 
+* SDL_WM_SetCaption() now officially takes UTF-8 title and icon
+strings, and displays international characters on supported platforms. 
+* Added SDL_GetKeyRepeat() to query the key repeat settings. 
+
+For Tao.Cg
+* Now binds with Cg 1.4.1
+
+For Tao.OpenAl
+* Now binds with OpenAl 1.1.0
+
+For Tao.PhysFs
+* Now binds with PhysFs 1.0.1
+
+For Tao.Ode
+* Various bug fixes and changes made over the recent months, 
+including a dGeomSetRotation bug fix submitted by Markus Ewald.
+The collision callbacks should now be working.
+
+For Tao.Glfw
+* Now binds with Glfw 2.5.0
+
+For Tao.FreeGlut
+* Now binds with FreeGLUT 2.4.0
+
+For Tao
+* Updated Prebuild and all prebuild files. Added NAnt target.
+* Reduced many of the XML doc messages generated during a build.
+* Mono build now includes MSDN-Style HTML docs.
+
+
+1.2.0
+Initial Release
+Tao Library Versions
+The Tao library versions follow the version of the underlying library.
+Tao.OpenGl 1.5.0.3, Tao.Platform.Windows 1.0.0.3, Tao.FreeGlut 2.2.0.0,
+Tao.OpenAl 1.0.0.2, Tao.Cg 1.2.1.3, Tao.DevIl 1.6.7.0,
+Tao.Sdl 1.2.8.1, Tao.Ode 0.5.0.1, Tao.Glfw 2.4.2.1.
diff --git a/Program.am b/Program.am
new file mode 100644
index 0000000..73cf242
--- /dev/null
+++ b/Program.am
@@ -0,0 +1,23 @@
+# Generic program building automake rules
+
+noinst_DATA = $(PROGRAM).exe
+
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+
diff --git a/README b/README
new file mode 100644
index 0000000..6650088
--- /dev/null
+++ b/README
@@ -0,0 +1,26 @@
+The Tao Framework for .NET is a collection of bindings to facilitate
+cross-platform game-related development utilizing the .NET platform.
+
+Currently included bindings are OpenGL 2.1, GLU 1.3, FreeGLUT 2.4.0, WGL,
+various GL and WGL-related extensions, OpenAL 1.1, Cg 2.0.0, DevIL 1.6.8 RC2,
+SDL 1.2.13, PhysFs 1.0.1, ODE 0.9.0, GLFW 2.6.1, Lua 5.1.3, FreeType 2.3.5 
+and FFmpeg 0.4.9.
+
+These bindings all function in a cross-platform and cross-runtime manner
+using Microsoft's .NET 2.0 runtime on Windows and the Mono runtime
+on Windows and Linux.  Other platforms and runtimes have not been tested,
+but, would most likely work with a minimal amount of changes.
+
+The bindings are also CLS-compliant, meaning that they can be used by any
+.NET language, including C# and Visual Basic .NET, amongst others.
+
+The Tao Framework bindings and example applications are free for commercial
+and non-commercial usage and all source code is provided under the very
+liberal MIT-X11 license.  However, any source code and documentation changes,
+corrections, improvements, and additions are requested for the good of all
+Tao Framework users.
+
+For more information and resources, visit the Tao Framework web site.
+
+The Tao Framework Team
+http://www.taoframework.com
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..960e1e2
--- /dev/null
+++ b/TODO
@@ -0,0 +1,4 @@
+- add library Post-process support (for use on windows)
+
+- Generate .config files at configure time (sam)
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..2fd748e
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,794 @@
+# generated automatically by aclocal 1.10.2 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],,
+[m4_warning([this file was generated for autoconf 2.63.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# 
+# Copyright © 2004 Scott James Remnant <scott at netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=m4_default([$1], [0.9.0])
+	AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		AC_MSG_RESULT([yes])
+	else
+		AC_MSG_RESULT([no])
+		PKG_CONFIG=""
+	fi
+		
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$PKG_CONFIG"; then
+    if test -n "$$1"; then
+        pkg_cv_[]$1="$$1"
+    else
+        PKG_CHECK_EXISTS([$3],
+                         [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+			 [pkg_failed=yes])
+    fi
+else
+	pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
+        else 
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+	ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+		[AC_MSG_RESULT([no])
+                $4])
+elif test $pkg_failed = untried; then
+	ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
+		[$4])
+else
+	$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+	$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+	ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.10'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.10.2], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.10.2])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 13
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.60])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                  [_AM_DEPENDENCIES(OBJC)],
+                  [define([AC_PROG_OBJC],
+                          defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode is disabled by default
+  AC_ARG_ENABLE(maintainer-mode,
+[  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer],
+      USE_MAINTAINER_MODE=$enableval,
+      USE_MAINTAINER_MODE=no)
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/acx_version.m4])
diff --git a/bootstrap b/bootstrap
new file mode 100755
index 0000000..c8084e5
--- /dev/null
+++ b/bootstrap
@@ -0,0 +1,129 @@
+#! /bin/sh
+# $Id: bootstrap 1966 2008-02-17 08:29:51Z sam $
+
+# bootstrap: generic bootstrap/autogen.sh script for autotools projects
+#
+# Copyright (c) 2002-2008 Sam Hocevar <sam at zoy.org>
+#
+#    This program is free software. It comes without any warranty, to
+#    the extent permitted by applicable law. You can redistribute it
+#    and/or modify it under the terms of the Do What The Fuck You Want
+#    To Public License, Version 2, as published by Sam Hocevar. See
+#    http://sam.zoy.org/wtfpl/COPYING for more details.
+#
+# The latest version of this script can be found at the following place:
+#   http://sam.zoy.org/autotools/
+
+# Die if an error occurs
+set -e
+
+# Guess whether we are using configure.ac or configure.in
+if test -f configure.ac; then
+  conffile="configure.ac"
+elif test -f configure.in; then
+  conffile="configure.in"
+else
+  echo "$0: could not find configure.ac or configure.in"
+  exit 1
+fi
+
+# Check for needed features
+auxdir="`sed -ne 's/^[ \t]*A._CONFIG_AUX_DIR *([[ ]*\([^] )]*\).*/\1/p' $conffile`"
+libtool="`grep -q '^[ \t]*A._PROG_LIBTOOL' $conffile && echo yes || echo no`"
+header="`grep -q '^[ \t]*A._CONFIG_HEADER' $conffile && echo yes || echo no`"
+aclocalflags="`sed -ne 's/^[ \t]*ACLOCAL_AMFLAGS[ \t]*=//p' Makefile.am`"
+
+# Check for automake
+amvers="no"
+for v in 11 10 9 8 7 6 5; do
+  if automake-1.${v} --version >/dev/null 2>&1; then
+    amvers="-1.${v}"
+    break
+  elif automake1.${v} --version >/dev/null 2>&1; then
+    amvers="1.${v}"
+    break
+  fi
+done
+
+if test "${amvers}" = "no" && automake --version > /dev/null 2>&1; then
+  amvers="`automake --version | sed -e '1s/[^0-9]*//' -e q`"
+  if expr "$amvers" "<" "1.5" > /dev/null 2>&1; then
+    amvers="no"
+  else
+    amvers=""
+  fi
+fi
+
+if test "$amvers" = "no"; then
+  echo "$0: you need automake version 1.5 or later"
+  exit 1
+fi
+
+# Check for autoconf
+acvers="no"
+for v in "" "259" "253"; do
+  if autoconf${v} --version >/dev/null 2>&1; then
+    acvers="${v}"
+    break
+  fi
+done
+
+if test "$acvers" = "no"; then
+  echo "$0: you need autoconf"
+  exit 1
+fi
+
+# Check for libtool
+if test "$libtool" = "yes"; then
+  libtoolize="no"
+  if glibtoolize --version >/dev/null 2>&1; then
+    libtoolize="glibtoolize"
+  else
+    for v in "16" "15" "" "14"; do
+      if libtoolize${v} --version >/dev/null 2>&1; then
+        libtoolize="libtoolize${v}"
+        break
+      fi
+    done
+  fi
+
+  if test "$libtoolize" = "no"; then
+    echo "$0: you need libtool"
+    exit 1
+  fi
+fi
+
+# Remove old cruft
+for x in aclocal.m4 configure config.guess config.log config.sub config.cache config.h.in config.h compile libtool.m4 ltoptions.m4 ltsugar.m4 ltversion.m4 ltmain.sh libtool ltconfig missing mkinstalldirs depcomp install-sh; do rm -f $x autotools/$x; if test -n "$auxdir"; then rm -f "$auxdir/$x"; fi; done
+rm -Rf autom4te.cache
+if test -n "$auxdir"; then
+  if test ! -d "$auxdir"; then
+    mkdir "$auxdir"
+  fi
+  aclocalflags="${aclocalflags} -I $auxdir -I ."
+fi
+
+# Explain what we are doing from now
+set -x
+
+# Bootstrap package
+if test "$libtool" = "yes"; then
+  ${libtoolize} --copy --force
+  if test -n "$auxdir" -a ! "$auxdir" = "." -a -f "ltmain.sh"; then
+    echo "$0: working around a minor libtool issue"
+    mv ltmain.sh "$auxdir/"
+  fi
+fi
+
+aclocal${amvers} ${aclocalflags}
+autoconf${acvers}
+if test "$header" = "yes"; then
+  autoheader${acvers}
+fi
+#add --include-deps if you want to bootstrap with any other compiler than gcc
+#automake${amvers} --add-missing --copy --include-deps
+automake${amvers} --foreign --add-missing --copy
+
+# Remove cruft that we no longer want
+rm -Rf autom4te.cache
+
diff --git a/build-debug.bat b/build-debug.bat
new file mode 100755
index 0000000..0b567bb
--- /dev/null
+++ b/build-debug.bat
@@ -0,0 +1,2 @@
+NAnt.exe net-2.0 package-debug
+pause
diff --git a/build-debug.sh b/build-debug.sh
new file mode 100755
index 0000000..253fb3b
--- /dev/null
+++ b/build-debug.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+nant mono-2.0 package-debug
diff --git a/build.bat b/build.bat
new file mode 100755
index 0000000..1134485
--- /dev/null
+++ b/build.bat
@@ -0,0 +1,2 @@
+NAnt.exe net-2.0 package
+pause
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..bc89c4a
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+nant mono-2.0 package
diff --git a/buildmono-debug.bat b/buildmono-debug.bat
new file mode 100755
index 0000000..58ef8c7
--- /dev/null
+++ b/buildmono-debug.bat
@@ -0,0 +1,2 @@
+call nant mono-2.0 package-debug
+pause
diff --git a/buildmono.bat b/buildmono.bat
new file mode 100755
index 0000000..4a324e7
--- /dev/null
+++ b/buildmono.bat
@@ -0,0 +1,2 @@
+call nant mono-2.0 package
+pause
diff --git a/clean.bat b/clean.bat
new file mode 100755
index 0000000..cfed85d
--- /dev/null
+++ b/clean.bat
@@ -0,0 +1,8 @@
+ at REM Builds the Tao Framework using NAnt 
+
+ at ECHO OFF 
+
+rmdir /s /q dist
+
+ at REM Build Solutions Using NAnt 
+NAnt.exe -t:net-2.0 -buildfile:tao.build clean
diff --git a/clean.sh b/clean.sh
new file mode 100755
index 0000000..69f7f50
--- /dev/null
+++ b/clean.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+# Builds the Tao Framework using both Prebuild and NAnt 
+
+rm -rf dist
+
+# Build Solutions Using NAnt 
+nant -t:mono-2.0 -buildfile:tao.build clean
diff --git a/configure b/configure
new file mode 100755
index 0000000..cbd45eb
--- /dev/null
+++ b/configure
@@ -0,0 +1,4525 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.63 for taoframework 2.1.svn20090801.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&	 (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+	   done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+	 # Try only shells that exist, to save several forks.
+	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+	       as_have_required=yes
+	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+	do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+	done
+	export CONFIG_SHELL
+	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell bug-autoconf at gnu.org about your system,
+  echo including any error possibly output before this message.
+  echo This can help us improve future autoconf versions.
+  echo Configuration will now proceed without shell functions.
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME='taoframework'
+PACKAGE_TARNAME='taoframework'
+PACKAGE_VERSION='2.1.svn20090801'
+PACKAGE_STRING='taoframework 2.1.svn20090801'
+PACKAGE_BUGREPORT=''
+
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+WINBUILD_FALSE
+WINBUILD_TRUE
+ENABLE_MONODOC_FALSE
+ENABLE_MONODOC_TRUE
+MONODOC
+MONODOC_DEPENDENCY_LIBS
+MONODOC_DEPENDENCY_CFLAGS
+MONODOC_REQUIRED_VERSION
+RESGEN1
+RESGEN
+GACUTIL1
+GACUTIL
+LIB_SUFFIX
+LIB_PREFIX
+GMCS
+GMCS2
+CSC
+RUNTIME
+MONO_DEPENDENCY_LIBS
+MONO_DEPENDENCY_CFLAGS
+PKG_CONFIG
+TAOSDL_MAJOR
+TAOSDL_VERSION
+TAOX11_MAJOR
+TAOX11_VERSION
+TAOWINDOWS_MAJOR
+TAOWINDOWS_VERSION
+TAOPHYSFS_MAJOR
+TAOPHYSFS_VERSION
+TAOOPENGL_MAJOR
+TAOOPENGL_VERSION
+TAOOPENAL_MAJOR
+TAOOPENAL_VERSION
+TAOODE_MAJOR
+TAOODE_VERSION
+TAOFTGL_MAJOR
+TAOFTGL_VERSION
+TAOLUA_MAJOR
+TAOLUA_VERSION
+TAOGLFW_MAJOR
+TAOGLFW_VERSION
+TAOFREETYPE_MAJOR
+TAOFREETYPE_VERSION
+TAOFREEGLUT_MAJOR
+TAOFREEGLUT_VERSION
+TAOFFMPEG_MAJOR
+TAOFFMPEG_VERSION
+TAODEVIL_MAJOR
+TAODEVIL_VERSION
+TAOCG_MAJOR
+TAOCG_VERSION
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_maintainer_mode
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+PKG_CONFIG
+MONO_DEPENDENCY_CFLAGS
+MONO_DEPENDENCY_LIBS
+MONODOC_DEPENDENCY_CFLAGS
+MONODOC_DEPENDENCY_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { $as_echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
+   { (exit 1); exit 1; }; } ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { $as_echo "$as_me: error: working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures taoframework 2.1.svn20090801 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/taoframework]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of taoframework 2.1.svn20090801:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer
+
+Some influential environment variables:
+  PKG_CONFIG  path to pkg-config utility
+  MONO_DEPENDENCY_CFLAGS
+              C compiler flags for MONO_DEPENDENCY, overriding pkg-config
+  MONO_DEPENDENCY_LIBS
+              linker flags for MONO_DEPENDENCY, overriding pkg-config
+  MONODOC_DEPENDENCY_CFLAGS
+              C compiler flags for MONODOC_DEPENDENCY, overriding pkg-config
+  MONODOC_DEPENDENCY_LIBS
+              linker flags for MONODOC_DEPENDENCY, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+taoframework configure 2.1.svn20090801
+generated by GNU Autoconf 2.63
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by taoframework $as_me 2.1.svn20090801, which was
+generated by GNU Autoconf 2.63.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  $as_echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  ac_site_file1=$CONFIG_SITE
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test -r "$ac_site_file"; then
+    { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:$LINENO:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:$LINENO:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_aux_dir=
+for ac_dir in .auto "$srcdir"/.auto; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in .auto \"$srcdir\"/.auto" >&5
+$as_echo "$as_me: error: cannot find install-sh or install.sh in .auto \"$srcdir\"/.auto" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+am__api_version='1.10'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+$as_echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+$as_echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if test "${ac_cv_path_mkdir+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+done
+IFS=$as_save_IFS
+
+fi
+
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    test -d ./--version && rmdir ./--version
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:$LINENO: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='taoframework'
+ VERSION='2.1.svn20090801'
+
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+
+{ $as_echo "$as_me:$LINENO: checking how to create a ustar tar archive" >&5
+$as_echo_n "checking how to create a ustar tar archive... " >&6; }
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar plaintar pax cpio none'
+_am_tools=${am_cv_prog_tar_ustar-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      { echo "$as_me:$LINENO: $_am_tar --version" >&5
+   ($_am_tar --version) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } && break
+    done
+    am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x ustar -w "$$tardir"'
+    am__tar_='pax -L -x ustar -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H ustar -L'
+    am__tar_='find "$tardir" -print | cpio -o -H ustar -L'
+    am__untar='cpio -i -H ustar -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_ustar}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5
+   (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    { echo "$as_me:$LINENO: $am__untar <conftest.tar" >&5
+   ($am__untar <conftest.tar) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+if test "${am_cv_prog_tar_ustar+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  am_cv_prog_tar_ustar=$_am_tool
+fi
+
+{ $as_echo "$as_me:$LINENO: result: $am_cv_prog_tar_ustar" >&5
+$as_echo "$am_cv_prog_tar_ustar" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { $as_echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+
+# Find version information for all projects
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.Cg assembly version" >&5
+$as_echo_n "checking for Tao.Cg assembly version... " >&6; }
+  TAOCG_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.Cg/Properties/AssemblyInfo.cs`"
+
+  TAOCG_MAJOR="`echo "$TAOCG_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOCG_MAJOR ($TAOCG_VERSION)" >&5
+$as_echo "$TAOCG_MAJOR ($TAOCG_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.DevIl assembly version" >&5
+$as_echo_n "checking for Tao.DevIl assembly version... " >&6; }
+  TAODEVIL_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.DevIl/Properties/AssemblyInfo.cs`"
+
+  TAODEVIL_MAJOR="`echo "$TAODEVIL_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAODEVIL_MAJOR ($TAODEVIL_VERSION)" >&5
+$as_echo "$TAODEVIL_MAJOR ($TAODEVIL_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.FFmpeg assembly version" >&5
+$as_echo_n "checking for Tao.FFmpeg assembly version... " >&6; }
+  TAOFFMPEG_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.FFmpeg/Properties/AssemblyInfo.cs`"
+
+  TAOFFMPEG_MAJOR="`echo "$TAOFFMPEG_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOFFMPEG_MAJOR ($TAOFFMPEG_VERSION)" >&5
+$as_echo "$TAOFFMPEG_MAJOR ($TAOFFMPEG_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.FreeGlut assembly version" >&5
+$as_echo_n "checking for Tao.FreeGlut assembly version... " >&6; }
+  TAOFREEGLUT_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.FreeGlut/Properties/AssemblyInfo.cs`"
+
+  TAOFREEGLUT_MAJOR="`echo "$TAOFREEGLUT_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOFREEGLUT_MAJOR ($TAOFREEGLUT_VERSION)" >&5
+$as_echo "$TAOFREEGLUT_MAJOR ($TAOFREEGLUT_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.FreeType assembly version" >&5
+$as_echo_n "checking for Tao.FreeType assembly version... " >&6; }
+  TAOFREETYPE_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.FreeType/Properties/AssemblyInfo.cs`"
+
+  TAOFREETYPE_MAJOR="`echo "$TAOFREETYPE_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOFREETYPE_MAJOR ($TAOFREETYPE_VERSION)" >&5
+$as_echo "$TAOFREETYPE_MAJOR ($TAOFREETYPE_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.Glfw assembly version" >&5
+$as_echo_n "checking for Tao.Glfw assembly version... " >&6; }
+  TAOGLFW_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.Glfw/Properties/AssemblyInfo.cs`"
+
+  TAOGLFW_MAJOR="`echo "$TAOGLFW_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOGLFW_MAJOR ($TAOGLFW_VERSION)" >&5
+$as_echo "$TAOGLFW_MAJOR ($TAOGLFW_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.Lua assembly version" >&5
+$as_echo_n "checking for Tao.Lua assembly version... " >&6; }
+  TAOLUA_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.Lua/Properties/AssemblyInfo.cs`"
+
+  TAOLUA_MAJOR="`echo "$TAOLUA_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOLUA_MAJOR ($TAOLUA_VERSION)" >&5
+$as_echo "$TAOLUA_MAJOR ($TAOLUA_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.FtGl assembly version" >&5
+$as_echo_n "checking for Tao.FtGl assembly version... " >&6; }
+  TAOFTGL_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.FtGl/Properties/AssemblyInfo.cs`"
+
+  TAOFTGL_MAJOR="`echo "$TAOFTGL_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOFTGL_MAJOR ($TAOFTGL_VERSION)" >&5
+$as_echo "$TAOFTGL_MAJOR ($TAOFTGL_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.Ode assembly version" >&5
+$as_echo_n "checking for Tao.Ode assembly version... " >&6; }
+  TAOODE_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.Ode/Properties/AssemblyInfo.cs`"
+
+  TAOODE_MAJOR="`echo "$TAOODE_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOODE_MAJOR ($TAOODE_VERSION)" >&5
+$as_echo "$TAOODE_MAJOR ($TAOODE_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.OpenAl assembly version" >&5
+$as_echo_n "checking for Tao.OpenAl assembly version... " >&6; }
+  TAOOPENAL_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.OpenAl/Properties/AssemblyInfo.cs`"
+
+  TAOOPENAL_MAJOR="`echo "$TAOOPENAL_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOOPENAL_MAJOR ($TAOOPENAL_VERSION)" >&5
+$as_echo "$TAOOPENAL_MAJOR ($TAOOPENAL_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.OpenGl assembly version" >&5
+$as_echo_n "checking for Tao.OpenGl assembly version... " >&6; }
+  TAOOPENGL_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.OpenGl/Properties/AssemblyInfo.cs`"
+
+  TAOOPENGL_MAJOR="`echo "$TAOOPENGL_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOOPENGL_MAJOR ($TAOOPENGL_VERSION)" >&5
+$as_echo "$TAOOPENGL_MAJOR ($TAOOPENGL_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.PhysFs assembly version" >&5
+$as_echo_n "checking for Tao.PhysFs assembly version... " >&6; }
+  TAOPHYSFS_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.PhysFs/Properties/AssemblyInfo.cs`"
+
+  TAOPHYSFS_MAJOR="`echo "$TAOPHYSFS_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOPHYSFS_MAJOR ($TAOPHYSFS_VERSION)" >&5
+$as_echo "$TAOPHYSFS_MAJOR ($TAOPHYSFS_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.Platform.Windows assembly version" >&5
+$as_echo_n "checking for Tao.Platform.Windows assembly version... " >&6; }
+  TAOWINDOWS_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.Platform.Windows/Properties/AssemblyInfo.cs`"
+
+  TAOWINDOWS_MAJOR="`echo "$TAOWINDOWS_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOWINDOWS_MAJOR ($TAOWINDOWS_VERSION)" >&5
+$as_echo "$TAOWINDOWS_MAJOR ($TAOWINDOWS_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.Platform.X11 assembly version" >&5
+$as_echo_n "checking for Tao.Platform.X11 assembly version... " >&6; }
+  TAOX11_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.Platform.X11/Properties/AssemblyInfo.cs`"
+
+  TAOX11_MAJOR="`echo "$TAOX11_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOX11_MAJOR ($TAOX11_VERSION)" >&5
+$as_echo "$TAOX11_MAJOR ($TAOX11_VERSION)" >&6; }
+
+
+  { $as_echo "$as_me:$LINENO: checking for Tao.Sdl assembly version" >&5
+$as_echo_n "checking for Tao.Sdl assembly version... " >&6; }
+  TAOSDL_VERSION="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/Tao.Sdl/Properties/AssemblyInfo.cs`"
+
+  TAOSDL_MAJOR="`echo "$TAOSDL_VERSION" | sed 's/[.][0-9]*[.][0-9]*$//'`"
+
+  { $as_echo "$as_me:$LINENO: result: $TAOSDL_MAJOR ($TAOSDL_VERSION)" >&5
+$as_echo "$TAOSDL_MAJOR ($TAOSDL_VERSION)" >&6; }
+
+
+MONO_REQUIRED_VERSION=1.1
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.9.0
+	{ $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	else
+		{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+		PKG_CONFIG=""
+	fi
+
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for MONO_DEPENDENCY" >&5
+$as_echo_n "checking for MONO_DEPENDENCY... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$MONO_DEPENDENCY_CFLAGS"; then
+        pkg_cv_MONO_DEPENDENCY_CFLAGS="$MONO_DEPENDENCY_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"mono >= \$MONO_REQUIRED_VERSION\"") >&5
+  ($PKG_CONFIG --exists --print-errors "mono >= $MONO_REQUIRED_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_MONO_DEPENDENCY_CFLAGS=`$PKG_CONFIG --cflags "mono >= $MONO_REQUIRED_VERSION" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$MONO_DEPENDENCY_LIBS"; then
+        pkg_cv_MONO_DEPENDENCY_LIBS="$MONO_DEPENDENCY_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"mono >= \$MONO_REQUIRED_VERSION\"") >&5
+  ($PKG_CONFIG --exists --print-errors "mono >= $MONO_REQUIRED_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_MONO_DEPENDENCY_LIBS=`$PKG_CONFIG --libs "mono >= $MONO_REQUIRED_VERSION" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        MONO_DEPENDENCY_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "mono >= $MONO_REQUIRED_VERSION"`
+        else
+	        MONO_DEPENDENCY_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "mono >= $MONO_REQUIRED_VERSION"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$MONO_DEPENDENCY_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                has_mono=false
+elif test $pkg_failed = untried; then
+	has_mono=false
+else
+	MONO_DEPENDENCY_CFLAGS=$pkg_cv_MONO_DEPENDENCY_CFLAGS
+	MONO_DEPENDENCY_LIBS=$pkg_cv_MONO_DEPENDENCY_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	has_mono=true
+fi
+if test "x$has_mono" = "xtrue"; then
+  # Extract the first word of "mono", so it can be a program name with args.
+set dummy mono; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_RUNTIME+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $RUNTIME in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_RUNTIME="$RUNTIME" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_RUNTIME="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_RUNTIME" && ac_cv_path_RUNTIME="no"
+  ;;
+esac
+fi
+RUNTIME=$ac_cv_path_RUNTIME
+if test -n "$RUNTIME"; then
+  { $as_echo "$as_me:$LINENO: result: $RUNTIME" >&5
+$as_echo "$RUNTIME" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  # Extract the first word of "csc", so it can be a program name with args.
+set dummy csc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_CSC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $CSC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_CSC="$CSC" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_CSC="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_CSC" && ac_cv_path_CSC="no"
+  ;;
+esac
+fi
+CSC=$ac_cv_path_CSC
+if test -n "$CSC"; then
+  { $as_echo "$as_me:$LINENO: result: $CSC" >&5
+$as_echo "$CSC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test "$CSC" = "no"; then
+    # Extract the first word of "gmcs2", so it can be a program name with args.
+set dummy gmcs2; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_GMCS2+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $GMCS2 in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GMCS2="$GMCS2" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GMCS2="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GMCS2" && ac_cv_path_GMCS2="no"
+  ;;
+esac
+fi
+GMCS2=$ac_cv_path_GMCS2
+if test -n "$GMCS2"; then
+  { $as_echo "$as_me:$LINENO: result: $GMCS2" >&5
+$as_echo "$GMCS2" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    CSC="$GMCS2"
+  fi
+  if test "$CSC" = "no"; then
+    # Extract the first word of "gmcs", so it can be a program name with args.
+set dummy gmcs; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_GMCS+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $GMCS in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GMCS="$GMCS" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GMCS="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GMCS" && ac_cv_path_GMCS="no"
+  ;;
+esac
+fi
+GMCS=$ac_cv_path_GMCS
+if test -n "$GMCS"; then
+  { $as_echo "$as_me:$LINENO: result: $GMCS" >&5
+$as_echo "$GMCS" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    CSC="$GMCS"
+  fi
+  if test `uname -s` = "Darwin"; then
+        LIB_PREFIX=
+        LIB_SUFFIX=.dylib
+  else
+        LIB_PREFIX=.so
+        LIB_SUFFIX=
+  fi
+else
+  # Extract the first word of "csc.exe", so it can be a program name with args.
+set dummy csc.exe; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_CSC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $CSC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_CSC="$CSC" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_CSC="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_CSC" && ac_cv_path_CSC="no"
+  ;;
+esac
+fi
+CSC=$ac_cv_path_CSC
+if test -n "$CSC"; then
+  { $as_echo "$as_me:$LINENO: result: $CSC" >&5
+$as_echo "$CSC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  RUNTIME=
+  LIB_PREFIX=
+  LIB_SUFFIX=
+fi
+if test x$CSC = "xno"; then
+    { { $as_echo "$as_me:$LINENO: error: You need to install either mono or .Net" >&5
+$as_echo "$as_me: error: You need to install either mono or .Net" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+# Extract the first word of "gacutil2", so it can be a program name with args.
+set dummy gacutil2; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_GACUTIL+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $GACUTIL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GACUTIL="$GACUTIL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GACUTIL="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GACUTIL=$ac_cv_path_GACUTIL
+if test -n "$GACUTIL"; then
+  { $as_echo "$as_me:$LINENO: result: $GACUTIL" >&5
+$as_echo "$GACUTIL" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test "$GACUTIL" = "no"; then
+  # Extract the first word of "gacutil", so it can be a program name with args.
+set dummy gacutil; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_GACUTIL1+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $GACUTIL1 in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GACUTIL1="$GACUTIL1" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GACUTIL1="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GACUTIL1" && ac_cv_path_GACUTIL1="no"
+  ;;
+esac
+fi
+GACUTIL1=$ac_cv_path_GACUTIL1
+if test -n "$GACUTIL1"; then
+  { $as_echo "$as_me:$LINENO: result: $GACUTIL1" >&5
+$as_echo "$GACUTIL1" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  GACUTIL="$GACUTIL1"
+fi
+if test "$GACUTIL" = "no" ; then
+  { { $as_echo "$as_me:$LINENO: error: No gacutil tool found" >&5
+$as_echo "$as_me: error: No gacutil tool found" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+# Extract the first word of "resgen2", so it can be a program name with args.
+set dummy resgen2; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_RESGEN+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $RESGEN in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_RESGEN="$RESGEN" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_RESGEN="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+RESGEN=$ac_cv_path_RESGEN
+if test -n "$RESGEN"; then
+  { $as_echo "$as_me:$LINENO: result: $RESGEN" >&5
+$as_echo "$RESGEN" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test "$RESGEN" = "no"; then
+  # Extract the first word of "resgen", so it can be a program name with args.
+set dummy resgen; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_RESGEN1+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $RESGEN1 in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_RESGEN1="$RESGEN1" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_RESGEN1="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_RESGEN1" && ac_cv_path_RESGEN1="no"
+  ;;
+esac
+fi
+RESGEN1=$ac_cv_path_RESGEN1
+if test -n "$RESGEN1"; then
+  { $as_echo "$as_me:$LINENO: result: $RESGEN1" >&5
+$as_echo "$RESGEN1" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  RESGEN="$RESGEN1"
+fi
+if test "$RESGEN" = "no" ; then
+  { { $as_echo "$as_me:$LINENO: error: No resgen tool found" >&5
+$as_echo "$as_me: error: No resgen tool found" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+MONODOC_REQUIRED_VERSION=1.0
+
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for MONODOC_DEPENDENCY" >&5
+$as_echo_n "checking for MONODOC_DEPENDENCY... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$MONODOC_DEPENDENCY_CFLAGS"; then
+        pkg_cv_MONODOC_DEPENDENCY_CFLAGS="$MONODOC_DEPENDENCY_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"monodoc >= \$MONODOC_REQUIRED_VERSION\"") >&5
+  ($PKG_CONFIG --exists --print-errors "monodoc >= $MONODOC_REQUIRED_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_MONODOC_DEPENDENCY_CFLAGS=`$PKG_CONFIG --cflags "monodoc >= $MONODOC_REQUIRED_VERSION" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$MONODOC_DEPENDENCY_LIBS"; then
+        pkg_cv_MONODOC_DEPENDENCY_LIBS="$MONODOC_DEPENDENCY_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"monodoc >= \$MONODOC_REQUIRED_VERSION\"") >&5
+  ($PKG_CONFIG --exists --print-errors "monodoc >= $MONODOC_REQUIRED_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_MONODOC_DEPENDENCY_LIBS=`$PKG_CONFIG --libs "monodoc >= $MONODOC_REQUIRED_VERSION" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        MONODOC_DEPENDENCY_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "monodoc >= $MONODOC_REQUIRED_VERSION"`
+        else
+	        MONODOC_DEPENDENCY_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "monodoc >= $MONODOC_REQUIRED_VERSION"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$MONODOC_DEPENDENCY_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                enable_monodoc=no
+elif test $pkg_failed = untried; then
+	enable_monodoc=no
+else
+	MONODOC_DEPENDENCY_CFLAGS=$pkg_cv_MONODOC_DEPENDENCY_CFLAGS
+	MONODOC_DEPENDENCY_LIBS=$pkg_cv_MONODOC_DEPENDENCY_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	enable_monodoc=yes
+fi
+if test "x$enable_monodoc" = "xyes"; then
+  # Extract the first word of "monodoc", so it can be a program name with args.
+set dummy monodoc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_MONODOC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $MONODOC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_MONODOC="$MONODOC" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_MONODOC="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_MONODOC" && ac_cv_path_MONODOC="no"
+  ;;
+esac
+fi
+MONODOC=$ac_cv_path_MONODOC
+if test -n "$MONODOC"; then
+  { $as_echo "$as_me:$LINENO: result: $MONODOC" >&5
+$as_echo "$MONODOC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test x$MONODOC = xno; then
+    enable_monodoc=no
+  fi
+else
+  MONODOC=
+fi
+
+ if test "x$enable_monodoc" = "xyes"; then
+  ENABLE_MONODOC_TRUE=
+  ENABLE_MONODOC_FALSE='#'
+else
+  ENABLE_MONODOC_TRUE='#'
+  ENABLE_MONODOC_FALSE=
+fi
+
+
+winbuild=no
+case "$host" in
+       *-*-mingw*|*-*-cygwin*)
+               winbuild=yes
+               ;;
+esac
+ if test x$winbuild = xyes; then
+  WINBUILD_TRUE=
+  WINBUILD_FALSE='#'
+else
+  WINBUILD_TRUE='#'
+  WINBUILD_FALSE=
+fi
+
+
+
+ac_config_files="$ac_config_files Makefile m4/Makefile"
+
+ac_config_files="$ac_config_files src/Makefile src/Tao.Cg/Makefile src/Tao.Cg/tao-cg.pc src/Tao.DevIl/Makefile src/Tao.DevIl/tao-devil.pc src/Tao.FFmpeg/Makefile src/Tao.FFmpeg/tao-ffmpeg.pc src/Tao.FreeGlut/Makefile src/Tao.FreeGlut/tao-freeglut.pc src/Tao.FreeType/Makefile src/Tao.FreeType/tao-freetype.pc src/Tao.GlBindGen/Makefile src/Tao.Glfw/Makefile src/Tao.Glfw/tao-glfw.pc src/Tao.Lua/Makefile src/Tao.Lua/tao-lua.pc src/Tao.FtGl/Makefile src/Tao.FtGl/tao-ftgl.pc src/Tao.Ode/Makefi [...]
+
+ac_config_files="$ac_config_files tests/Makefile tests/Ode/Makefile tests/Ode/tao-ode-tests.pc tests/Sdl/Makefile tests/Sdl/tao-sdl-tests.pc"
+
+ac_config_files="$ac_config_files examples/Makefile examples/CgExamples/Makefile examples/DevIlExamples/Makefile examples/FFmpegExamples/Makefile examples/FreeGlutExamples/Makefile examples/GeWangExamples/Makefile examples/GlfwExamples/Makefile examples/LuaFunctions/Makefile examples/LuaSimple/Makefile examples/FtGlSimple/Makefile examples/FtGlScrolling/Makefile examples/NateRobins/Makefile examples/NeHe/Makefile examples/OdeExamples/Makefile examples/OpenAlExamples/Makefile examples/Phy [...]
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[	 `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+	g
+	s/^\n//
+	s/\n/ /g
+	p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  { { $as_echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_MONODOC_TRUE}" && test -z "${ENABLE_MONODOC_FALSE}"; then
+  { { $as_echo "$as_me:$LINENO: error: conditional \"ENABLE_MONODOC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"ENABLE_MONODOC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${WINBUILD_TRUE}" && test -z "${WINBUILD_FALSE}"; then
+  { { $as_echo "$as_me:$LINENO: error: conditional \"WINBUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"WINBUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by taoframework $as_me 2.1.svn20090801, which was
+generated by GNU Autoconf 2.63.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTION]... [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf at gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_version="\\
+taoframework config.status 2.1.svn20090801
+configured by $0, generated by GNU Autoconf 2.63,
+  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { $as_echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+    "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+    "src/Tao.Cg/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.Cg/Makefile" ;;
+    "src/Tao.Cg/tao-cg.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.Cg/tao-cg.pc" ;;
+    "src/Tao.DevIl/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.DevIl/Makefile" ;;
+    "src/Tao.DevIl/tao-devil.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.DevIl/tao-devil.pc" ;;
+    "src/Tao.FFmpeg/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.FFmpeg/Makefile" ;;
+    "src/Tao.FFmpeg/tao-ffmpeg.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.FFmpeg/tao-ffmpeg.pc" ;;
+    "src/Tao.FreeGlut/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.FreeGlut/Makefile" ;;
+    "src/Tao.FreeGlut/tao-freeglut.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.FreeGlut/tao-freeglut.pc" ;;
+    "src/Tao.FreeType/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.FreeType/Makefile" ;;
+    "src/Tao.FreeType/tao-freetype.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.FreeType/tao-freetype.pc" ;;
+    "src/Tao.GlBindGen/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.GlBindGen/Makefile" ;;
+    "src/Tao.Glfw/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.Glfw/Makefile" ;;
+    "src/Tao.Glfw/tao-glfw.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.Glfw/tao-glfw.pc" ;;
+    "src/Tao.Lua/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.Lua/Makefile" ;;
+    "src/Tao.Lua/tao-lua.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.Lua/tao-lua.pc" ;;
+    "src/Tao.FtGl/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.FtGl/Makefile" ;;
+    "src/Tao.FtGl/tao-ftgl.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.FtGl/tao-ftgl.pc" ;;
+    "src/Tao.Ode/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.Ode/Makefile" ;;
+    "src/Tao.Ode/tao-ode.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.Ode/tao-ode.pc" ;;
+    "src/Tao.OpenAl/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.OpenAl/Makefile" ;;
+    "src/Tao.OpenAl/tao-openal.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.OpenAl/tao-openal.pc" ;;
+    "src/Tao.OpenGl/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.OpenGl/Makefile" ;;
+    "src/Tao.OpenGl/tao-opengl.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.OpenGl/tao-opengl.pc" ;;
+    "src/Tao.PhysFs/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.PhysFs/Makefile" ;;
+    "src/Tao.PhysFs/tao-physfs.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.PhysFs/tao-physfs.pc" ;;
+    "src/Tao.Platform.Windows/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.Platform.Windows/Makefile" ;;
+    "src/Tao.Platform.Windows/tao-platform-windows.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.Platform.Windows/tao-platform-windows.pc" ;;
+    "src/Tao.Platform.X11/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.Platform.X11/Makefile" ;;
+    "src/Tao.Platform.X11/tao-platform-x11.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.Platform.X11/tao-platform-x11.pc" ;;
+    "src/Tao.Sdl/Makefile") CONFIG_FILES="$CONFIG_FILES src/Tao.Sdl/Makefile" ;;
+    "src/Tao.Sdl/tao-sdl.pc") CONFIG_FILES="$CONFIG_FILES src/Tao.Sdl/tao-sdl.pc" ;;
+    "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+    "tests/Ode/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Ode/Makefile" ;;
+    "tests/Ode/tao-ode-tests.pc") CONFIG_FILES="$CONFIG_FILES tests/Ode/tao-ode-tests.pc" ;;
+    "tests/Sdl/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Sdl/Makefile" ;;
+    "tests/Sdl/tao-sdl-tests.pc") CONFIG_FILES="$CONFIG_FILES tests/Sdl/tao-sdl-tests.pc" ;;
+    "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
+    "examples/CgExamples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/CgExamples/Makefile" ;;
+    "examples/DevIlExamples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/DevIlExamples/Makefile" ;;
+    "examples/FFmpegExamples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/FFmpegExamples/Makefile" ;;
+    "examples/FreeGlutExamples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/FreeGlutExamples/Makefile" ;;
+    "examples/GeWangExamples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/GeWangExamples/Makefile" ;;
+    "examples/GlfwExamples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/GlfwExamples/Makefile" ;;
+    "examples/LuaFunctions/Makefile") CONFIG_FILES="$CONFIG_FILES examples/LuaFunctions/Makefile" ;;
+    "examples/LuaSimple/Makefile") CONFIG_FILES="$CONFIG_FILES examples/LuaSimple/Makefile" ;;
+    "examples/FtGlSimple/Makefile") CONFIG_FILES="$CONFIG_FILES examples/FtGlSimple/Makefile" ;;
+    "examples/FtGlScrolling/Makefile") CONFIG_FILES="$CONFIG_FILES examples/FtGlScrolling/Makefile" ;;
+    "examples/NateRobins/Makefile") CONFIG_FILES="$CONFIG_FILES examples/NateRobins/Makefile" ;;
+    "examples/NeHe/Makefile") CONFIG_FILES="$CONFIG_FILES examples/NeHe/Makefile" ;;
+    "examples/OdeExamples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/OdeExamples/Makefile" ;;
+    "examples/OpenAlExamples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/OpenAlExamples/Makefile" ;;
+    "examples/PhysFsExamples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/PhysFsExamples/Makefile" ;;
+    "examples/Redbook/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Redbook/Makefile" ;;
+    "examples/SdlExamples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/SdlExamples/Makefile" ;;
+
+  *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   $as_echo "$as_me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr='
'
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\).*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\).*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+  || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
+$as_echo "$as_me: error: could not setup config files machinery" >&2;}
+   { (exit 1); exit 1; }; }
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X "  :F $CONFIG_FILES      "
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
+$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      ac_file_inputs="$ac_file_inputs '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; } ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out" && rm -f "$tmp/out";;
+  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  esac \
+  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+ ;;
+
+
+
+  esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+echo "==="
+echo "Project configuration summary"
+echo "  * installation prefix: $prefix"
+echo "  * compiler:            $CSC"
+echo "  * documentation:       $enable_monodoc ($MONODOC)"
+echo "==="
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..1503ece
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,182 @@
+AC_INIT(taoframework, 2.1.svn20090801)
+AC_CONFIG_AUX_DIR(.auto)
+AM_INIT_AUTOMAKE([no-define tar-ustar])
+AM_MAINTAINER_MODE
+
+AC_SUBST(VERSION)
+
+# Find version information for all projects
+ACX_ASSEMBLY_VERSION(Tao.Cg, TAOCG_MAJOR, TAOCG_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.DevIl, TAODEVIL_MAJOR, TAODEVIL_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.FFmpeg, TAOFFMPEG_MAJOR, TAOFFMPEG_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.FreeGlut, TAOFREEGLUT_MAJOR, TAOFREEGLUT_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.FreeType, TAOFREETYPE_MAJOR, TAOFREETYPE_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.Glfw, TAOGLFW_MAJOR, TAOGLFW_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.Lua, TAOLUA_MAJOR, TAOLUA_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.FtGl, TAOFTGL_MAJOR, TAOFTGL_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.Ode, TAOODE_MAJOR, TAOODE_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.OpenAl, TAOOPENAL_MAJOR, TAOOPENAL_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.OpenGl, TAOOPENGL_MAJOR, TAOOPENGL_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.PhysFs, TAOPHYSFS_MAJOR, TAOPHYSFS_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.Platform.Windows, TAOWINDOWS_MAJOR, TAOWINDOWS_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.Platform.X11, TAOX11_MAJOR, TAOX11_VERSION)
+ACX_ASSEMBLY_VERSION(Tao.Sdl, TAOSDL_MAJOR, TAOSDL_VERSION)
+
+MONO_REQUIRED_VERSION=1.1
+PKG_CHECK_MODULES(MONO_DEPENDENCY, mono >= $MONO_REQUIRED_VERSION,
+                  has_mono=true, has_mono=false)
+if test "x$has_mono" = "xtrue"; then
+  AC_PATH_PROG(RUNTIME, mono, no)
+  AC_PATH_PROG(CSC, csc, no)
+  if test "$CSC" = "no"; then
+    AC_PATH_PROG(GMCS2, gmcs2, no)
+    CSC="$GMCS2"
+  fi
+  if test "$CSC" = "no"; then
+    AC_PATH_PROG(GMCS, gmcs, no)
+    CSC="$GMCS"
+  fi
+  if test `uname -s` = "Darwin"; then
+        LIB_PREFIX=
+        LIB_SUFFIX=.dylib
+  else
+        LIB_PREFIX=.so
+        LIB_SUFFIX=
+  fi
+else
+  AC_PATH_PROG(CSC, csc.exe, no)
+  RUNTIME=
+  LIB_PREFIX=
+  LIB_SUFFIX=
+fi
+if test x$CSC = "xno"; then
+    AC_MSG_ERROR([You need to install either mono or .Net])
+fi
+
+AC_SUBST(LIB_PREFIX)
+AC_SUBST(LIB_SUFFIX)
+AC_SUBST(RUNTIME)
+AC_SUBST(CSC)
+
+AC_PATH_PROG(GACUTIL, gacutil2)
+if test "$GACUTIL" = "no"; then
+  AC_PATH_PROG(GACUTIL1, gacutil, no)
+  GACUTIL="$GACUTIL1"
+fi
+if test "$GACUTIL" = "no" ; then
+  AC_MSG_ERROR([No gacutil tool found])
+fi
+AC_SUBST(GACUTIL)
+
+AC_PATH_PROG(RESGEN, resgen2)
+if test "$RESGEN" = "no"; then
+  AC_PATH_PROG(RESGEN1, resgen, no)
+  RESGEN="$RESGEN1"
+fi
+if test "$RESGEN" = "no" ; then
+  AC_MSG_ERROR([No resgen tool found])
+fi
+AC_SUBST(RESGEN)
+
+MONODOC_REQUIRED_VERSION=1.0
+AC_SUBST(MONODOC_REQUIRED_VERSION)
+PKG_CHECK_MODULES(MONODOC_DEPENDENCY, monodoc >= $MONODOC_REQUIRED_VERSION,
+                  enable_monodoc=yes, enable_monodoc=no)
+if test "x$enable_monodoc" = "xyes"; then
+  AC_PATH_PROG(MONODOC, monodoc, no)
+  if test x$MONODOC = xno; then
+    enable_monodoc=no
+  fi
+else
+  MONODOC=
+fi
+AC_SUBST(MONODOC)
+AM_CONDITIONAL(ENABLE_MONODOC, test "x$enable_monodoc" = "xyes")
+
+winbuild=no
+case "$host" in
+       *-*-mingw*|*-*-cygwin*)
+               winbuild=yes
+               ;;
+esac
+AM_CONDITIONAL(WINBUILD, test x$winbuild = xyes)
+
+dnl
+dnl TODO: put .pc files in there, too
+dnl
+
+AC_CONFIG_FILES(
+  Makefile
+  m4/Makefile
+)
+AC_CONFIG_FILES(
+  src/Makefile
+  src/Tao.Cg/Makefile
+  src/Tao.Cg/tao-cg.pc
+  src/Tao.DevIl/Makefile
+  src/Tao.DevIl/tao-devil.pc
+  src/Tao.FFmpeg/Makefile
+  src/Tao.FFmpeg/tao-ffmpeg.pc
+  src/Tao.FreeGlut/Makefile
+  src/Tao.FreeGlut/tao-freeglut.pc
+  src/Tao.FreeType/Makefile
+  src/Tao.FreeType/tao-freetype.pc
+  src/Tao.GlBindGen/Makefile
+  src/Tao.Glfw/Makefile
+  src/Tao.Glfw/tao-glfw.pc
+  src/Tao.Lua/Makefile
+  src/Tao.Lua/tao-lua.pc
+  src/Tao.FtGl/Makefile
+  src/Tao.FtGl/tao-ftgl.pc
+  src/Tao.Ode/Makefile
+  src/Tao.Ode/tao-ode.pc
+  src/Tao.OpenAl/Makefile
+  src/Tao.OpenAl/tao-openal.pc
+  src/Tao.OpenGl/Makefile
+  src/Tao.OpenGl/tao-opengl.pc
+  src/Tao.PhysFs/Makefile
+  src/Tao.PhysFs/tao-physfs.pc
+  src/Tao.Platform.Windows/Makefile
+  src/Tao.Platform.Windows/tao-platform-windows.pc
+  src/Tao.Platform.X11/Makefile
+  src/Tao.Platform.X11/tao-platform-x11.pc
+  src/Tao.Sdl/Makefile
+  src/Tao.Sdl/tao-sdl.pc
+)
+AC_CONFIG_FILES(
+  tests/Makefile
+  tests/Ode/Makefile
+  tests/Ode/tao-ode-tests.pc
+  tests/Sdl/Makefile
+  tests/Sdl/tao-sdl-tests.pc
+)
+AC_CONFIG_FILES(
+  examples/Makefile
+  examples/CgExamples/Makefile
+  examples/DevIlExamples/Makefile
+  examples/FFmpegExamples/Makefile
+  examples/FreeGlutExamples/Makefile
+  examples/GeWangExamples/Makefile
+  examples/GlfwExamples/Makefile
+  examples/LuaFunctions/Makefile
+  examples/LuaSimple/Makefile
+  examples/FtGlSimple/Makefile
+  examples/FtGlScrolling/Makefile
+  examples/NateRobins/Makefile
+  examples/NeHe/Makefile
+  examples/OdeExamples/Makefile
+  examples/OpenAlExamples/Makefile
+  examples/PhysFsExamples/Makefile
+  examples/Redbook/Makefile
+  examples/SdlExamples/Makefile
+)
+
+AC_OUTPUT
+
+echo "==="
+echo "Project configuration summary"
+echo "  * installation prefix: $prefix"
+echo "  * compiler:            $CSC"
+echo "  * documentation:       $enable_monodoc ($MONODOC)"
+echo "==="
+
diff --git a/examples/CgExamples/COPYING b/examples/CgExamples/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/CgExamples/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/CgExamples/CgExamples.Designer.cs b/examples/CgExamples/CgExamples.Designer.cs
new file mode 100644
index 0000000..cec195b
--- /dev/null
+++ b/examples/CgExamples/CgExamples.Designer.cs
@@ -0,0 +1,106 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+namespace CgExamples
+{
+    partial class CgExamples
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CgExamples));
+            this.lstExamples = new System.Windows.Forms.ListBox();
+            this.btnRun = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // lstExamples
+            // 
+            this.lstExamples.FormattingEnabled = true;
+            this.lstExamples.Location = new System.Drawing.Point(13, 13);
+            this.lstExamples.Name = "lstExamples";
+            this.lstExamples.Size = new System.Drawing.Size(258, 173);
+            this.lstExamples.Sorted = true;
+            this.lstExamples.TabIndex = 0;
+            this.lstExamples.DoubleClick += new System.EventHandler(this.lstExamples_SelectedIndexChanged);
+            // 
+            // btnRun
+            // 
+            this.btnRun.Location = new System.Drawing.Point(94, 192);
+            this.btnRun.Name = "btnRun";
+            this.btnRun.Size = new System.Drawing.Size(95, 23);
+            this.btnRun.TabIndex = 1;
+            this.btnRun.Text = "Run";
+            this.btnRun.UseVisualStyleBackColor = true;
+            this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+            // 
+            // CgExamples
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(283, 224);
+            this.Controls.Add(this.btnRun);
+            this.Controls.Add(this.lstExamples);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "CgExamples";
+            this.Text = "CgExamplesExamples";
+            this.Load += new System.EventHandler(this.frmExamples_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ListBox lstExamples;
+        private System.Windows.Forms.Button btnRun;
+    }
+}
+
diff --git a/examples/CgExamples/CgExamples.cs b/examples/CgExamples/CgExamples.cs
new file mode 100644
index 0000000..b50f99c
--- /dev/null
+++ b/examples/CgExamples/CgExamples.cs
@@ -0,0 +1,82 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace CgExamples
+{
+    public partial class CgExamples : Form
+    {
+        public CgExamples()
+        {
+            InitializeComponent();
+        }
+
+        private void frmExamples_Load(object sender, EventArgs e)
+        {
+            Type[] types = Assembly.GetExecutingAssembly().GetTypes();
+            foreach (Type type in types)
+            {
+                MemberInfo[] runMethods = type.GetMember("Run");
+                foreach (MemberInfo run in runMethods)
+                {
+                    lstExamples.Items.Add(type.Name);
+                }
+                if (lstExamples.Items.Count > 0)
+                {
+                    this.lstExamples.SelectedIndex = 0;
+                }
+            }
+        }
+
+        private void btnRun_Click(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+
+        private void SelectExample()
+        {
+            if (lstExamples.SelectedItem != null)
+            {
+                Type example = Assembly.GetExecutingAssembly().GetType("CgExamples." + lstExamples.SelectedItem.ToString(), true, true);
+                example.InvokeMember("Run", BindingFlags.InvokeMethod, null, null, null);
+            }
+        }
+
+        private void lstExamples_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+    }
+}
diff --git a/examples/CgExamples/CgExamples.csproj b/examples/CgExamples/CgExamples.csproj
new file mode 100644
index 0000000..556aa84
--- /dev/null
+++ b/examples/CgExamples/CgExamples.csproj
@@ -0,0 +1,144 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{FA92914D-1A61-431A-9BD4-82469A1AF787}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>CgExamples</AssemblyName>
+    <AssemblyOriginatorKeyFile>../../src/Tao.Cg/Tao.Cg.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>CgExamples</RootNamespace>
+    <StartupObject>CgExamples.Program</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.Cg\Tao.Cg.csproj">
+      <Name>Tao.Cg</Name>
+      <Project>{723454BE-6A6B-4D52-B0A0-F4B0ED4F8C49}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.FreeGlut\Tao.FreeGlut.csproj">
+      <Name>Tao.FreeGlut</Name>
+      <Project>{87C95364-7158-4D81-83B8-97B649E27ABA}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="CgExamples.resx">
+      <DependentUpon>CgExamples.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="CgExamples.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="CgExamples.Designer.cs">
+      <DependentUpon>CgExamples.cs</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Gl_01_vertex_program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Gl_02_vertex_and_fragment_program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Gl_06_vertex_twisting_program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Gl_14_bulge_program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/CgExamples/CgExamples.resx b/examples/CgExamples/CgExamples.resx
new file mode 100644
index 0000000..06ec7be
--- /dev/null
+++ b/examples/CgExamples/CgExamples.resx
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAChl4QAopiGAKOZhgCjmYcAo5mIAKSahwCkmogApZuJAKaciQCmnIoAppyLAKiejACpn44ArKKRAK2j
+        kgCupZUAr6eXALGomACzqZkAsamaALOqmQCyqpsAtKuaALSsnQC0rJ4Atq2eALmxogC7s6UAvbSkALu0
+        pgC+t6sAwbuvAMW8rQDIv7AAycCxAMvFuwDLxrsA08y+ANDMwwDRzcQA08/GANfQwwDa08YA29THANfT
+        ywDY1MwA3dbKAODe2QDi4NoA5OHbAOPh3ADk4dwA5OLdAOTj3gDw6t8A7OnmAO7t6gDx8e8A9fXzAPX2
+        9AD4+fgA+fn4APj6+QD8/v4A/f//AP7//wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAQ0NDQ0NDQ0NDQ0NDMBcDDAwDFzFDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0M3Bw8cAAAAAAAAACsD
+        N0NDQ0NDQ0NDQ0NDQ0NDQ0NDFCctAAAAAAAAAAAAAAAAFENDQ0NDQ0NDQ0NDQ0NDERtAJgAAAAAAAAAA
+        AAAAAAAAABtDQ0NDQ0NDQ0NDQwY+QEAAAAAAAAAAAAAAAAAAAAAAAANDQ0NDQ0NDQ0MGQkBAEAAAAAAA
+        AAAAAAAAAAAAAAAAAAVDQ0NDQ0NDGz1AQEAgAAAAAAAAAAAAAAAAAAAAAAAAABFDQ0NDQ0MdQEBAQCkA
+        AAAAAAA0NQAAAAAAAAAAAAAAAENDQ0NDFkBAQEBAAAAAAAAAGkBAGgAAAAAAAAAAAAAAFENDQzknQEBA
+        QEAlAAAAAAAABwYAAAAAAAAAAAAAAAAAN0NDBkBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQ0MA
+        QEBAQEBAOAAAAAAAAAAAAAAAAAAAAAAAAAAAACtDMTJAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ADEZQkBAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAAFwNAQEBAQEBAQEBAJAAAAAAAAAAAAAAAAAAA
+        AAAAAAAEDkBAQEBAQEBAQEBAQRohAAAAAAAAAAAAAAAAAAAAAAwNQEBAQEBAQEBAQEBAQEA8IwsAAAAA
+        AAAAAAAAAAAADAVAQEBAQEBAQEBAQEBAQEBAQEEJAAAAAAAAAAAAAAADF0JAQEBAQEBAQEBAQEBAQEBA
+        QEA7AAAAAAAAAAAAABcwMEBAQEBAQEBAQEBAQEBAQEBAQEBALgAAAAAAAAAAMUMAQEBAQEBAQEBAQEBA
+        QEBAQEBAQEAtAAAAAAAAACtDQwhAQEBAQEBAQEBAQEBAQEBAQEBAQEAiAAAAAAAAA0NDNydAQEBAQEBA
+        QEBAQEAHCkBAQEBAQAEAAAAAAAA3Q0NDFkBAQEBAQEBAQEBAHjY2HkBAQEBAEwAAAAAAEkNDQ0NDHUBA
+        QEBAQEBAQEA/KipBQEBAQEATAAAAAABDQ0NDQ0MSPUBAQEBAQEBAQEBAQEBAQEBAQAwAAAAAG0NDQ0ND
+        Q0MHQkBAQEBAQEBAQEBAQEBAQEBBAAAAAAJDQ0NDQ0NDQ0MGPkBAQEBAQEBAQEBAQEBAQBEAAAADQ0ND
+        Q0NDQ0NDQ0MRGEBAQEBAQEBAQEBAQEA6AAAAG0NDQ0NDQ0NDQ0NDQ0NDFShBQEBAQEBAQEBAHwAAFEND
+        Q0NDQ0NDQ0NDQ0NDQ0NDNwYALEJAQEBALxIrAzdDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzFwYNDQMXMUND
+        Q0NDQ0NDQ0NDQ//wD///gAH//wAA//wAAD/4AAAf8AAAD+AAAAfgAAAHwAAAA4AAAAGAAAABgAAAAQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA+AAAAfgAAAH8AAAD/gA
+        AB/8AAA//wAA//+AAf//8A//
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/examples/CgExamples/CgExamples.sh b/examples/CgExamples/CgExamples.sh
new file mode 100755
index 0000000..8c89f88
--- /dev/null
+++ b/examples/CgExamples/CgExamples.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./CgExamples.exe "$@"
diff --git a/examples/CgExamples/Gl_01_vertex_program.cs b/examples/CgExamples/Gl_01_vertex_program.cs
new file mode 100644
index 0000000..71e44ee
--- /dev/null
+++ b/examples/CgExamples/Gl_01_vertex_program.cs
@@ -0,0 +1,186 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+/* 01_vertex_program.c - OpenGL-based very simple vertex program example
+   using Cg program from Chapter 2 of "The Cg Tutorial" (Addison-Wesley,
+   ISBN 0321194969). */
+
+/* Requires the OpenGL Utility Toolkit (GLUT) and Cg runtime (version
+   1.0 or higher). */
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+using System;
+using System.IO;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+using Tao.Cg;
+
+namespace CgExamples
+{
+    #region Class Documentation
+    /// <summary>
+    ///     Displays a triangle
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         OpenGL-based very simple vertex program example
+    ///         using Cg program from Chapter 2 of "The Cg Tutorial" (Addison-Wesley,
+    ///         ISBN 0321194969)
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Gl_01_vertex_program
+    {
+        static string myProgramName = "01_vertex_program";
+        static string myVertexProgramName = "C2E1v_green";
+
+        static IntPtr myCgContext;
+        static int myCgVertexProfile;
+        static IntPtr myCgVertexProgram;
+        static Glut.KeyboardCallback KeyboardDelegate;
+
+        // --- Entry Point ---
+        #region Run())
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="args"></param>
+        [STAThread]
+        public static void Run()
+        {
+            string filePath = Path.Combine("..", "..");
+            string fileDirectory = "Data";
+            string vertexFileName = "C2E1v_green.cg";
+            if (File.Exists(vertexFileName))
+            {
+                filePath = "";
+                fileDirectory = "";
+            }
+            else if (File.Exists(Path.Combine(fileDirectory, vertexFileName)))
+            {
+                filePath = "";
+            }
+
+            string myVertexProgramFileName = Path.Combine(Path.Combine(filePath, fileDirectory), vertexFileName);
+
+            KeyboardDelegate += Keyboard;
+            Glut.glutInitWindowSize(400, 400);
+            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
+            Glut.glutInit();
+
+            Glut.glutCreateWindow(myProgramName);
+            Glut.glutDisplayFunc(Display);
+            Glut.glutKeyboardFunc(KeyboardDelegate);
+
+            Gl.glClearColor(0.1f, 0.3f, 0.6f, 0.0f);  /* Blue background */
+
+            myCgContext = Cg.cgCreateContext();
+            checkForCgError("creating context");
+
+            myCgVertexProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_VERTEX);
+            CgGl.cgGLSetOptimalOptions(myCgVertexProfile);
+            checkForCgError("selecting vertex profile");
+
+            myCgVertexProgram =
+              Cg.cgCreateProgramFromFile(
+                myCgContext,              /* Cg runtime context */
+                Cg.CG_SOURCE,                /* Program in human-readable form */
+                myVertexProgramFileName,  /* Name of file containing program */
+                myCgVertexProfile,        /* Profile: OpenGL ARB vertex program */
+                myVertexProgramName,      /* Entry function name */
+                null);                    /* No extra compiler options */
+            checkForCgError("creating vertex program from file");
+            CgGl.cgGLLoadProgram(myCgVertexProgram);
+            checkForCgError("loading vertex program");
+
+            Glut.glutMainLoop();
+        }
+
+        #endregion Run())
+
+        static void checkForCgError(string situation)
+        {
+            int error;
+            string errorString = Cg.cgGetLastErrorString(out error);
+
+            if (error != Cg.CG_NO_ERROR)
+            {
+                Console.WriteLine("{0}- {1}- {2}",
+                  myProgramName, situation, errorString);
+                if (error == Cg.CG_COMPILER_ERROR)
+                {
+                    Console.WriteLine("{0}", Cg.cgGetLastListing(myCgContext));
+                }
+                Environment.Exit(0);
+            }
+        }
+
+        static void Display()
+        {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            CgGl.cgGLBindProgram(myCgVertexProgram);
+            checkForCgError("binding vertex program");
+
+            CgGl.cgGLEnableProfile(myCgVertexProfile);
+            checkForCgError("enabling vertex profile");
+
+            /* Rendering code verbatim from Chapter 1, Section 2.4.1 "Rendering
+               a Triangle with OpenGL" (page 57). */
+            Gl.glBegin(Gl.GL_TRIANGLES);
+            Gl.glVertex2f(-0.8f, 0.8f);
+            Gl.glVertex2f(0.8f, 0.8f);
+            Gl.glVertex2f(0.0f, -0.8f);
+            Gl.glEnd();
+
+            CgGl.cgGLDisableProfile(myCgVertexProfile);
+            checkForCgError("disabling vertex profile");
+
+            Glut.glutSwapBuffers();
+        }
+
+        #region Keyboard()
+        /// <summary>
+        ///     Exits application.
+        /// </summary>
+        private static void Keyboard(byte key, int x, int y)
+        {
+            switch (key)
+            {
+                case 27:
+                    Cg.cgDestroyProgram(myCgVertexProgram);
+                    Cg.cgDestroyContext(myCgContext);
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Exit()
+    }
+}
diff --git a/examples/CgExamples/Gl_02_vertex_and_fragment_program.cs b/examples/CgExamples/Gl_02_vertex_and_fragment_program.cs
new file mode 100644
index 0000000..3f1528f
--- /dev/null
+++ b/examples/CgExamples/Gl_02_vertex_and_fragment_program.cs
@@ -0,0 +1,244 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+/* 02_vertex_and_fragment_program.c - OpenGL-based example using a Cg
+   vertex and a Cg fragment programs from Chapter 2 of "The Cg Tutorial"
+   (Addison-Wesley, ISBN 0321194969). */
+
+/* Requires the OpenGL Utility Toolkit (GLUT) and Cg runtime (version
+   1.0 or higher). */
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+using System;
+using System.IO;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+using Tao.Cg;
+
+namespace CgExamples
+{
+    #region Class Documentation
+    /// <summary>
+    ///     Displays some stars
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Gl_02_vertex_and_fragment_program
+    {
+        static string myProgramName = "02_vertex_and_fragment_program";
+        static string myVertexProgramName = "C2E1v_green";
+        static string myFragmentProgramName = "C2E2f_passthru";
+
+        static IntPtr myCgContext;
+        static int myCgVertexProfile;
+        static int myCgFragmentProfile;
+        static IntPtr myCgVertexProgram;
+        static IntPtr myCgFragmentProgram;
+        static Glut.KeyboardCallback KeyboardDelegate;
+
+        // --- Entry Point ---
+        #region Run())
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="args"></param>
+        [STAThread]
+        public static void Run()
+        {
+            string filePath = Path.Combine("..", "..");
+            string fileDirectory = "Data";
+            string vertexFileName = "C2E1v_green.cg";
+            string fragmentFileName = "C2E2f_passthru.cg";
+            if (File.Exists(vertexFileName))
+            {
+                filePath = "";
+                fileDirectory = "";
+            }
+            else if (File.Exists(Path.Combine(fileDirectory, vertexFileName)))
+            {
+                filePath = "";
+            }
+
+            string myVertexProgramFileName = Path.Combine(Path.Combine(filePath, fileDirectory), vertexFileName);
+            string myFragmentProgramFileName = Path.Combine(Path.Combine(filePath, fileDirectory), fragmentFileName);
+
+            KeyboardDelegate += Keyboard;
+            Glut.glutInitWindowSize(400, 400);
+            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
+            Glut.glutInit();
+
+            Glut.glutCreateWindow(myProgramName);
+            Glut.glutDisplayFunc(Display);
+            Glut.glutKeyboardFunc(KeyboardDelegate);
+
+            Gl.glClearColor(0.1f, 0.3f, 0.6f, 0.0f);  /* Blue background */
+
+            myCgContext = Cg.cgCreateContext();
+            checkForCgError("creating context");
+
+            myCgVertexProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_VERTEX);
+            CgGl.cgGLSetOptimalOptions(myCgVertexProfile);
+            checkForCgError("selecting vertex profile");
+
+            myCgVertexProgram =
+              Cg.cgCreateProgramFromFile(
+                myCgContext,              /* Cg runtime context */
+                Cg.CG_SOURCE,                /* Program in human-readable form */
+                myVertexProgramFileName,  /* Name of file containing program */
+                myCgVertexProfile,        /* Profile: OpenGL ARB vertex program */
+                myVertexProgramName,      /* Entry function name */
+                null);                    /* No extra compiler options */
+            checkForCgError("creating vertex program from file");
+            CgGl.cgGLLoadProgram(myCgVertexProgram);
+            checkForCgError("loading vertex program");
+
+            myCgFragmentProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_FRAGMENT);
+            CgGl.cgGLSetOptimalOptions(myCgFragmentProfile);
+            checkForCgError("selecting fragment profile");
+
+            myCgFragmentProgram =
+              Cg.cgCreateProgramFromFile(
+                myCgContext,                /* Cg runtime context */
+                Cg.CG_SOURCE,                  /* Program in human-readable form */
+                myFragmentProgramFileName,  /* Name of file containing program */
+                myCgFragmentProfile,        /* Profile: OpenGL ARB vertex program */
+                myFragmentProgramName,      /* Entry function name */
+                null);                      /* No extra compiler options */
+            checkForCgError("creating fragment program from file");
+            CgGl.cgGLLoadProgram(myCgFragmentProgram);
+            checkForCgError("loading fragment program");
+
+            Glut.glutMainLoop();
+        }
+
+        #endregion Run())
+
+        static void DrawStar(float x, float y,
+                             int starPoints, float R, float r)
+        {
+            int i;
+            double piOverStarPoints = Math.PI / starPoints,
+                   angle = 0.0;
+
+            Gl.glBegin(Gl.GL_TRIANGLE_FAN);
+            Gl.glVertex2f(x, y);  /* Center of star */
+            /* Emit exterior vertices for star's points. */
+            for (i = 0; i < starPoints; i++)
+            {
+                Gl.glVertex2f((float)(x + R * Math.Cos(angle)), (float)(y + R * Math.Sin(angle)));
+                angle += piOverStarPoints;
+                Gl.glVertex2f((float)(x + r * Math.Cos(angle)), (float)(y + r * Math.Sin(angle)));
+                angle += piOverStarPoints;
+            }
+            /* End by repeating first exterior vertex of star. */
+            angle = 0;
+            Gl.glVertex2f((float)(x + R * Math.Cos(angle)), (float)(y + R * Math.Sin(angle)));
+            Gl.glEnd();
+        }
+
+        static void DrawStars()
+        {
+            /*                     star    outer   inner  */
+            /*        x      y     Points  radius  radius */
+            /*       =====  =====  ======  ======  ====== */
+            DrawStar(-0.1f, 0f, 5, 0.5f, 0.2f);
+            DrawStar(-0.84f, 0.1f, 5, 0.3f, 0.12f);
+            DrawStar(0.92f, -0.5f, 5, 0.25f, 0.11f);
+            DrawStar(0.3f, 0.97f, 5, 0.3f, 0.1f);
+            DrawStar(0.94f, 0.3f, 5, 0.5f, 0.2f);
+            DrawStar(-0.97f, -0.8f, 5, 0.6f, 0.2f);
+        }
+
+        static void checkForCgError(string situation)
+        {
+            int error;
+            string errorString = Cg.cgGetLastErrorString(out error);
+
+            if (error != Cg.CG_NO_ERROR)
+            {
+                Console.WriteLine("{0}- {1}- {2}",
+                  myProgramName, situation, errorString);
+                if (error == Cg.CG_COMPILER_ERROR)
+                {
+                    Console.WriteLine("{0}", Cg.cgGetLastListing(myCgContext));
+                }
+                Environment.Exit(0);
+            }
+        }
+
+        static void Display()
+        {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            CgGl.cgGLBindProgram(myCgVertexProgram);
+            checkForCgError("binding vertex program");
+
+            CgGl.cgGLEnableProfile(myCgVertexProfile);
+            checkForCgError("enabling vertex profile");
+
+            CgGl.cgGLBindProgram(myCgFragmentProgram);
+            checkForCgError("binding fragment program");
+
+            CgGl.cgGLEnableProfile(myCgFragmentProfile);
+            checkForCgError("enabling fragment profile");
+
+            DrawStars();
+
+            CgGl.cgGLDisableProfile(myCgVertexProfile);
+            checkForCgError("disabling vertex profile");
+
+            CgGl.cgGLDisableProfile(myCgFragmentProfile);
+            checkForCgError("disabling fragment profile");
+
+            Glut.glutSwapBuffers();
+        }
+
+        #region Keyboard()
+        /// <summary>
+        ///     Exits application.
+        /// </summary>
+        private static void Keyboard(byte key, int x, int y)
+        {
+            switch (key)
+            {
+                case 27:
+                    Cg.cgDestroyProgram(myCgVertexProgram);
+                    Cg.cgDestroyProgram(myCgFragmentProgram);
+                    Cg.cgDestroyContext(myCgContext);
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Exit()
+    }
+}
diff --git a/examples/CgExamples/Gl_06_vertex_twisting_program.cs b/examples/CgExamples/Gl_06_vertex_twisting_program.cs
new file mode 100644
index 0000000..bbe39ce
--- /dev/null
+++ b/examples/CgExamples/Gl_06_vertex_twisting_program.cs
@@ -0,0 +1,345 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+/* 02_vertex_and_fragment_program.c - OpenGL-based example using a Cg
+   vertex and a Cg fragment programs from Chapter 2 of "The Cg Tutorial"
+   (Addison-Wesley, ISBN 0321194969). */
+
+/* Requires the OpenGL Utility Toolkit (GLUT) and Cg runtime (version
+   1.0 or higher). */
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+#region Porting Credits
+//-----------------------------------------------------------------------------
+/*  Ported from C to C# by Marek Wyborski for the Tao Framework.
+    02/05/07
+*/
+//-----------------------------------------------------------------------------
+#endregion Porting Credits
+
+using System;
+using System.IO;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+using Tao.Cg;
+
+namespace CgExamples
+{
+    #region Class Documentation
+    /// <summary>
+    ///     Displays an animated Triangle
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Gl_06_vertex_twisting
+    {
+        static IntPtr   myCgContext;
+        static int      myCgVertexProfile,
+                        myCgFragmentProfile;
+        static IntPtr   myCgVertexProgram,
+                        myCgFragmentProgram;
+        static IntPtr   myCgVertexParam_twisting;
+
+        static string myProgramName = "06_vertex_twisting",
+            /* Page 79 */   myVertexProgramName = "C3E4v_twist",
+            /* Page 53 */   myFragmentProgramName = "C2E2f_passthru";
+
+        static float myTwisting = 2.9f, /* Twisting angle in radians. */
+                     myTwistDirection = 0.1f; /* Animation delta for twist. */
+
+        // Tao Delegates
+        static Glut.KeyboardCallback keyboardDelegate;
+        static Glut.CreateMenuCallback menuDelegate;
+        static Glut.IdleCallback idleDelegate;
+
+        //
+        static bool animating = false,
+            wireframe = false;
+
+
+        static void checkForCgError(string situation)
+        {
+            int error;
+            string errorString = Cg.cgGetLastErrorString(out error);
+
+            if (error != Cg.CG_NO_ERROR)
+            {
+                Console.WriteLine("{0}- {1}- {2}",
+                  myProgramName, situation, errorString);
+                if (error == Cg.CG_COMPILER_ERROR)
+                {
+                    Console.WriteLine("{0}", Cg.cgGetLastListing(myCgContext));
+                }
+                Environment.Exit(0);
+            }
+        }
+
+        // --- Entry Point ---
+        #region Run())
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="args"></param>
+        [STAThread]
+        public static void Run()
+        {
+            string filePath = Path.Combine("..", "..");
+            string fileDirectory = "Data";
+            string vertexFileName = "C3E4v_twist.cg";
+            string fragmentFileName = "C2E2f_passthru.cg";
+            if (File.Exists(vertexFileName))
+            {
+                filePath = "";
+                fileDirectory = "";
+            }
+            else if (File.Exists(Path.Combine(fileDirectory, vertexFileName)))
+            {
+                filePath = "";
+            }
+
+            string myVertexProgramFileName = Path.Combine(Path.Combine(filePath, fileDirectory), vertexFileName);
+            string myFragmentProgramFileName = Path.Combine(Path.Combine(filePath, fileDirectory), fragmentFileName);
+
+            // Callback Delegates
+            keyboardDelegate += keyboard;
+            menuDelegate += menu;
+            idleDelegate += idle;
+
+            Glut.glutInitWindowSize(400, 400);
+            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH );
+            Glut.glutInit();
+
+            Glut.glutCreateWindow(myProgramName);
+            Glut.glutDisplayFunc(display);
+            Glut.glutKeyboardFunc(keyboardDelegate);
+
+            Gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);  /* White background */
+
+            myCgContext = Cg.cgCreateContext();
+            checkForCgError("creating context");
+
+            myCgVertexProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_VERTEX);
+            CgGl.cgGLSetOptimalOptions(myCgVertexProfile);
+            checkForCgError("selecting vertex profile");
+
+            myCgVertexProgram =
+                Cg.cgCreateProgramFromFile(
+                myCgContext,              /* Cg runtime context */
+                Cg.CG_SOURCE,                /* Program in human-readable form */
+                myVertexProgramFileName,  /* Name of file containing program */
+                myCgVertexProfile,        /* Profile: OpenGL ARB vertex program */
+                myVertexProgramName,      /* Entry function name */
+                null);                    /* No extra compiler options */
+            checkForCgError("creating vertex program from file");
+            CgGl.cgGLLoadProgram(myCgVertexProgram);
+            checkForCgError("loading vertex program");
+
+            myCgVertexParam_twisting =
+              Cg.cgGetNamedParameter(myCgVertexProgram, "twisting");
+            checkForCgError("could not get twisting parameter");
+
+            myCgFragmentProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_FRAGMENT);
+            CgGl.cgGLSetOptimalOptions(myCgFragmentProfile);
+            checkForCgError("selecting fragment profile");
+
+            myCgFragmentProgram =
+                Cg.cgCreateProgramFromFile(
+                myCgContext,                /* Cg runtime context */
+                Cg.CG_SOURCE,                  /* Program in human-readable form */
+                myFragmentProgramFileName,  /* Name of file containing program */
+                myCgFragmentProfile,        /* Profile: OpenGL ARB vertex program */
+                myFragmentProgramName,      /* Entry function name */
+                null);                      /* No extra compiler options */
+            checkForCgError("creating fragment program from file");
+            CgGl.cgGLLoadProgram(myCgFragmentProgram);
+            checkForCgError("loading fragment program");
+
+            /* No uniform fragment program parameters expected. */
+
+            Glut.glutCreateMenu(menuDelegate);
+            Glut.glutAddMenuEntry("[ ] Animate", ' ');
+            Glut.glutAddMenuEntry("[w] Wireframe", 'w');
+            Glut.glutAttachMenu(Glut.GLUT_RIGHT_BUTTON);
+
+            // Change Animation to true, so that it starts with action ;-)
+            keyboard((byte)' ', 0, 0);
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run())
+
+        /// <summary>
+        /// Apply an inefficient but simple-to-implement subdivision scheme for a triangle.
+        /// </summary>
+        static void triangleDivide(int depth,
+                                   float[] a, float[] b, float[] c,
+                                   float[] ca, float[] cb, float[] cc)
+        {
+            if (depth == 0)
+            {
+                Gl.glColor3fv(ca);
+                Gl.glVertex2fv(a);
+                Gl.glColor3fv(cb);
+                Gl.glVertex2fv(b);
+                Gl.glColor3fv(cc);
+                Gl.glVertex2fv(c);
+            }
+            else
+            {
+                float[] d = { (a[0] + b[0]) / 2, (a[1] + b[1]) / 2 },
+                            e = { (b[0] + c[0]) / 2, (b[1] + c[1]) / 2 },
+                            f = { (c[0] + a[0]) / 2, (c[1] + a[1]) / 2 };
+                float[] cd = { (ca[0] + cb[0]) / 2, (ca[1] + cb[1]) / 2, (ca[2] + cb[2]) / 2 },
+                            ce = { (cb[0] + cc[0]) / 2, (cb[1] + cc[1]) / 2, (cb[2] + cc[2]) / 2 },
+                            cf = { (cc[0] + ca[0]) / 2, (cc[1] + ca[1]) / 2, (cc[2] + ca[2]) / 2 };
+
+                depth -= 1;
+                triangleDivide(depth, a, d, f, ca, cd, cf);
+                triangleDivide(depth, d, b, e, cd, cb, ce);
+                triangleDivide(depth, f, e, c, cf, ce, cc);
+                triangleDivide(depth, d, e, f, cd, ce, cf);
+            }
+        }
+
+
+        /// <summary>
+        /// Large vertex displacements such as are possible with C3E4v_twist
+        /// require a high degree of tessellation.  This routine draws a
+        /// triangle recursively subdivided to provide sufficient tessellation.
+        /// </summary>
+        static void drawSubDividedTriangle(int subdivisions)
+        {
+            float[] a = { -0.8f, 0.8f },
+                        b = { 0.8f, 0.8f },
+                        c = { 0.0f, -0.8f },
+                        ca = { 0f, 0f, 1f },
+                        cb = { 0f, 0f, 1f },
+                        cc = { 0.7f, 0.7f, 1f };
+
+            Gl.glBegin(Gl.GL_TRIANGLES);
+            triangleDivide(subdivisions, a, b, c, ca, cb, cc);
+            Gl.glEnd();
+        }
+
+        static void display()
+        {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Cg.cgSetParameter1f(myCgVertexParam_twisting, myTwisting);
+
+            CgGl.cgGLBindProgram(myCgVertexProgram);
+            checkForCgError("binding vertex program");
+
+            CgGl.cgGLEnableProfile(myCgVertexProfile);
+            checkForCgError("enabling vertex profile");
+
+            CgGl.cgGLBindProgram(myCgFragmentProgram);
+            checkForCgError("binding fragment program");
+
+            CgGl.cgGLEnableProfile(myCgFragmentProfile);
+            checkForCgError("enabling fragment profile");
+
+            drawSubDividedTriangle(5);
+
+            CgGl.cgGLDisableProfile(myCgVertexProfile);
+            checkForCgError("disabling vertex profile");
+
+            CgGl.cgGLDisableProfile(myCgFragmentProfile);
+            checkForCgError("disabling fragment profile");
+
+            Glut.glutSwapBuffers();
+        }
+
+        static void idle()
+        {
+            if (myTwisting > 3f)
+            {
+                myTwistDirection = -0.05f;
+            }
+            else if (myTwisting < -3f)
+            {
+                myTwistDirection = 0.05f;
+            }
+            myTwisting += myTwistDirection;
+            Glut.glutPostRedisplay();
+        }
+
+        private static void keyboard(byte key, int x, int y)
+        {
+            //static int animating = 0,
+            //  wireframe = 0;
+
+            switch (key)
+            {
+                case (byte)' ':
+                    animating = !animating; /* Toggle */
+                    if (animating)
+                    {
+                        Glut.glutIdleFunc(idleDelegate);
+                    }
+                    else
+                    {
+                        Glut.glutIdleFunc(null);
+                    }
+                    break;
+                case (byte)'w':
+                case (byte)'W':
+                    wireframe = !wireframe;
+                    if (wireframe)
+                    {
+                        Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE);
+                    }
+                    else
+                    {
+                        Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
+                    }
+                    Glut.glutPostRedisplay();
+                    break;
+                case 27:  /* Esc key */
+                    /* Demonstrate proper deallocation of Cg runtime data structures.
+                       Not strictly necessary if we are simply going to exit. */
+                    Cg.cgDestroyProgram(myCgVertexProgram);
+                    Cg.cgDestroyProgram(myCgFragmentProgram);
+                    Cg.cgDestroyContext(myCgContext);
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+
+        private static void menu(int item)
+        {
+            /* Pass menu item character code to keyboard callback. */
+            keyboard((byte)item, 0, 0);
+        }
+    }
+}
diff --git a/examples/CgExamples/Gl_14_bulge_program.cs b/examples/CgExamples/Gl_14_bulge_program.cs
new file mode 100644
index 0000000..3a9c121
--- /dev/null
+++ b/examples/CgExamples/Gl_14_bulge_program.cs
@@ -0,0 +1,817 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+/* 02_vertex_and_fragment_program.c - OpenGL-based example using a Cg
+   vertex and a Cg fragment programs from Chapter 2 of "The Cg Tutorial"
+   (Addison-Wesley, ISBN 0321194969). */
+
+/* Requires the OpenGL Utility Toolkit (GLUT) and Cg runtime (version
+   1.0 or higher). */
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+#region Porting Credits
+//-----------------------------------------------------------------------------
+/*  Ported from C to C# by Marek Wyborski for the Tao Framework.
+    02/05/07
+*/
+//-----------------------------------------------------------------------------
+#endregion Porting Credits
+
+using System;
+using System.IO;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+using Tao.Cg;
+using System.Diagnostics;
+using System.Reflection;
+
+namespace CgExamples
+{
+    public sealed class Gl_14_bulge
+    {
+        static IntPtr myCgContext;
+        static int myCgVertexProfile,
+                            myCgFragmentProfile;
+        static IntPtr myCgVertexProgram,
+                            myCgFragmentProgram,
+                            myCgLightVertexProgram/*,
+                            myCgLightFragmentProgram*/
+                                                      ;
+        static IntPtr myCgVertexParam_modelViewProj = IntPtr.Zero;
+        static IntPtr myCgVertexParam_time = IntPtr.Zero;
+        static IntPtr myCgVertexParam_frequency = IntPtr.Zero;
+        static IntPtr myCgVertexParam_scaleFactor = IntPtr.Zero;
+        static IntPtr myCgVertexParam_Kd = IntPtr.Zero;
+        static IntPtr myCgVertexParam_shininess = IntPtr.Zero;
+        static IntPtr myCgVertexParam_eyePosition = IntPtr.Zero;
+        static IntPtr myCgVertexParam_lightPosition = IntPtr.Zero;
+        static IntPtr myCgVertexParam_lightColor = IntPtr.Zero;
+        static IntPtr myCgLightVertexParam_modelViewProj = IntPtr.Zero;
+
+        static string myProgramName = "14_bulge",
+            //  myVertexProgramFileName = "C6E1v_bulge.cg",
+            /* Page 146 */      myVertexProgramName = "C6E1v_bulge";
+
+        static bool animating = false;
+        static float lightVelocity = 0.008f;
+        static float timeFlow = 0.01f;
+
+        static float[] myProjectionMatrix = new float[16];
+        static float[] myLightColor = { 0.95f, 0.95f, 0.95f };  /* White */
+        static float myLightAngle = -0.4f;   /* Angle light rotates around scene. */
+        static float myTime = 0.0f;  /* Timing of bulge. */
+
+        // Tao Delegates
+        static Glut.KeyboardCallback keyboardDelegate;
+        static Glut.CreateMenuCallback menuDelegate;
+        static Glut.IdleCallback idleDelegate;
+        static Glut.ReshapeCallback reshapeDelegate;
+
+        static void checkForCgError(string situation)
+        {
+            int error;
+            string errorString = Cg.cgGetLastErrorString(out error);
+
+            if (error != Cg.CG_NO_ERROR)
+            {
+                Console.WriteLine("{0}- {1}- {2}",
+                  myProgramName, situation, errorString);
+                if (error == Cg.CG_COMPILER_ERROR)
+                {
+                    Console.WriteLine("{0}", Cg.cgGetLastListing(myCgContext));
+                }
+                Environment.Exit(1);
+            }
+        }
+
+        // --- Entry Point ---
+        #region Run())
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="args"></param>
+        [STAThread]
+        public static void Run()
+        {
+            string filePath = Path.Combine("..", "..");
+            string fileDirectory = "Data";
+            string vertexFileName = "C6E1v_bulge.cg";
+            if (File.Exists(vertexFileName))
+            {
+                filePath = "";
+                fileDirectory = "";
+            }
+            else if (File.Exists(Path.Combine(fileDirectory, vertexFileName)))
+            {
+                filePath = "";
+            }
+
+            string myVertexProgramFileName = Path.Combine(Path.Combine(filePath, fileDirectory), vertexFileName);
+
+            // Callback Delegates
+            keyboardDelegate += keyboard;
+            menuDelegate += menu;
+            idleDelegate += idle;
+            reshapeDelegate += reshape;
+
+            Glut.glutInitWindowSize(400, 400);
+            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
+            Glut.glutInit();
+
+            Glut.glutCreateWindow(myProgramName);
+            Glut.glutDisplayFunc(display);
+            Glut.glutKeyboardFunc(keyboardDelegate);
+            Glut.glutReshapeFunc(reshapeDelegate);
+
+            Gl.glClearColor(0.1f, 0.1f, 0.5f, 0f);  /* Gray background. */
+            Gl.glEnable(Gl.GL_DEPTH_TEST);         /* Hidden surface removal. */
+
+            myCgContext = Cg.cgCreateContext();
+            checkForCgError("creating context");
+
+            myCgVertexProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_VERTEX);
+            CgGl.cgGLSetOptimalOptions(myCgVertexProfile);
+            checkForCgError("selecting vertex profile");
+
+            myCgVertexProgram =
+               Cg.cgCreateProgramFromFile(
+               myCgContext,              /* Cg runtime context */
+               Cg.CG_SOURCE,                /* Program in human-readable form */
+               myVertexProgramFileName,  /* Name of file containing program */
+               myCgVertexProfile,        /* Profile: OpenGL ARB vertex program */
+               myVertexProgramName,      /* Entry function name */
+               null);                    /* No extra compiler options */
+            checkForCgError("creating vertex program from file");
+            CgGl.cgGLLoadProgram(myCgVertexProgram);
+            checkForCgError("loading vertex program");
+
+            GET_PARAM("modelViewProj");
+            GET_PARAM("time");
+            GET_PARAM("frequency");
+            GET_PARAM("scaleFactor");
+            GET_PARAM("Kd");
+            GET_PARAM("shininess");
+            GET_PARAM("eyePosition");
+            GET_PARAM("lightPosition");
+            GET_PARAM("lightColor");
+
+            /* Set light source color parameters once. */
+            Cg.cgSetParameter3fv(myCgVertexParam_lightColor, out myLightColor[0]);
+
+            Cg.cgSetParameter1f(myCgVertexParam_scaleFactor, 0.3f);
+            Cg.cgSetParameter1f(myCgVertexParam_frequency, 2.4f);
+            Cg.cgSetParameter1f(myCgVertexParam_shininess, 35f);
+
+            myCgFragmentProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_FRAGMENT);
+            CgGl.cgGLSetOptimalOptions(myCgFragmentProfile);
+            checkForCgError("selecting fragment profile");
+
+            /* Specify fragment program with a string. */
+            myCgFragmentProgram =
+              Cg.cgCreateProgram(
+                myCgContext,              /* Cg runtime context */
+                Cg.CG_SOURCE,                /* Program in human-readable form */
+                "float4 main(float4 c : COLOR) : COLOR { return c; }",
+                myCgFragmentProfile,      /* Profile: latest fragment profile */
+                "main",                   /* Entry function name */
+                null); /* No extra commyPiler options */
+            checkForCgError("creating fragment program from string");
+            CgGl.cgGLLoadProgram(myCgFragmentProgram);
+            checkForCgError("loading fragment program");
+
+            /* Specify vertex program for rendering the light source with a
+               string. */
+            myCgLightVertexProgram =
+              Cg.cgCreateProgram(
+                myCgContext,              /* Cg runtime context */
+                Cg.CG_SOURCE,                /* Program in human-readable form */
+                "void main(inout float4 p : POSITION, " +
+                "uniform float4x4 modelViewProj, " +
+                "out float4 c : COLOR) " +
+                "{ p = mul(modelViewProj, p); c = float4(1,1,0,1); }",
+                myCgVertexProfile,        /* Profile: latest fragment profile */
+                "main",                   /* Entry function name */
+                null); /* No extra commyPiler options */
+            checkForCgError("creating light vertex program from string");
+            CgGl.cgGLLoadProgram(myCgLightVertexProgram);
+            checkForCgError("loading light vertex program");
+
+            myCgLightVertexParam_modelViewProj =
+              Cg.cgGetNamedParameter(myCgLightVertexProgram, "modelViewProj");
+            checkForCgError("could not get modelViewProj parameter");
+
+            Glut.glutCreateMenu(menu);
+            Glut.glutAddMenuEntry("[ ] Animate", ' ');
+            Glut.glutAttachMenu(Glut.GLUT_RIGHT_BUTTON);
+
+            // Change Animation to true, so that it starts with action ;-)
+            keyboard((byte)' ', 0, 0);
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run())
+
+        private static void GET_PARAM(string name)
+        {
+            FieldInfo fieldInfo = typeof(Gl_14_bulge).GetField("myCgVertexParam_" + name
+                , BindingFlags.Static | BindingFlags.NonPublic);
+            fieldInfo.SetValue(null, Cg.cgGetNamedParameter(myCgVertexProgram, name));
+            checkForCgError("could not get " + name + " parameter");
+        }
+
+        static void reshape(int width, int height)
+        {
+            double aspectRatio = (float)width / (float)height;
+            double fieldOfView = 40.0; /* Degrees */
+
+            /* Build projection matrix once. */
+            buildPerspectiveMatrix(fieldOfView, aspectRatio,
+                                   1.0, 20.0,  /* Znear and Zfar */
+                                   ref myProjectionMatrix);
+            Gl.glViewport(0, 0, width, height);
+        }
+
+        static void buildPerspectiveMatrix(double fieldOfView,
+                                   double aspectRatio,
+                                   double zNear, double zFar,
+                                   ref float[] m)
+        {
+            double sine, cotangent, deltaZ;
+            double radians = fieldOfView / 2.0 * Math.PI / 180.0;
+
+            deltaZ = zFar - zNear;
+            sine = Math.Sin(radians);
+            /* Should be non-zero to avoid division by zero. */
+            Debug.Assert(deltaZ != 0);
+            Debug.Assert(sine != 0);
+            Debug.Assert(aspectRatio != 0);
+            cotangent = Math.Cos(radians) / sine;
+
+            m[0 * 4 + 0] = (float)(cotangent / aspectRatio);
+            m[1 * 4 + 0] = 0.0f;
+            m[2 * 4 + 0] = 0.0f;
+            m[3 * 4 + 0] = 0.0f;
+
+            m[0 * 4 + 1] = 0.0f;
+            m[1 * 4 + 1] = (float)cotangent;
+            m[2 * 4 + 1] = 0.0f;
+            m[3 * 4 + 1] = 0.0f;
+
+            m[0 * 4 + 2] = 0.0f;
+            m[1 * 4 + 2] = 0.0f;
+            m[2 * 4 + 2] = (float)(-(zFar + zNear) / deltaZ);
+            m[3 * 4 + 2] = (float)(-2 * zNear * zFar / deltaZ);
+
+            m[0 * 4 + 3] = 0.0f;
+            m[1 * 4 + 3] = 0.0f;
+            m[2 * 4 + 3] = -1f;
+            m[3 * 4 + 3] = 0f;
+        }
+
+        /// <summary>
+        /// Build a row-major (C-style) 4x4 matrix transform based on the
+        /// parameters for gluLookAt.
+        /// </summary>
+        static void buildLookAtMatrix(double eyex, double eyey, double eyez,
+                              double centerx, double centery, double centerz,
+                              double upx, double upy, double upz,
+                              ref float[] m)
+        {
+            double[] x = new double[3], y = new double[3], z = new double[3];
+            double mag;
+
+            /* Difference eye and center vectors to make Z vector. */
+            z[0] = eyex - centerx;
+            z[1] = eyey - centery;
+            z[2] = eyez - centerz;
+            /* Normalize Z. */
+            mag = Math.Sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]);
+            if (mag != 0)
+            {
+                z[0] /= mag;
+                z[1] /= mag;
+                z[2] /= mag;
+            }
+
+            /* Up vector makes Y vector. */
+            y[0] = upx;
+            y[1] = upy;
+            y[2] = upz;
+
+            /* X vector = Y cross Z. */
+            x[0] = y[1] * z[2] - y[2] * z[1];
+            x[1] = -y[0] * z[2] + y[2] * z[0];
+            x[2] = y[0] * z[1] - y[1] * z[0];
+
+            /* Recompute Y = Z cross X. */
+            y[0] = z[1] * x[2] - z[2] * x[1];
+            y[1] = -z[0] * x[2] + z[2] * x[0];
+            y[2] = z[0] * x[1] - z[1] * x[0];
+
+            /* Normalize X. */
+            mag = Math.Sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
+            if (mag != 0)
+            {
+                x[0] /= mag;
+                x[1] /= mag;
+                x[2] /= mag;
+            }
+
+            /* Normalize Y. */
+            mag = Math.Sqrt(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]);
+            if (mag != 0)
+            {
+                y[0] /= mag;
+                y[1] /= mag;
+                y[2] /= mag;
+            }
+
+            /* Build resulting view matrix. */
+            m[0 * 4 + 0] = (float)x[0]; m[0 * 4 + 1] = (float)x[1];
+            m[0 * 4 + 2] = (float)x[2]; m[0 * 4 + 3] = (float)(-x[0] * eyex + -x[1] * eyey + -x[2] * eyez);
+
+            m[1 * 4 + 0] = (float)y[0]; m[1 * 4 + 1] = (float)y[1];
+            m[1 * 4 + 2] = (float)y[2]; m[1 * 4 + 3] = (float)(-y[0] * eyex + -y[1] * eyey + -y[2] * eyez);
+
+            m[2 * 4 + 0] = (float)z[0]; m[2 * 4 + 1] = (float)z[1];
+            m[2 * 4 + 2] = (float)z[2]; m[2 * 4 + 3] = (float)(-z[0] * eyex + -z[1] * eyey + -z[2] * eyez);
+
+            m[3 * 4 + 0] = (float)0.0; m[3 * 4 + 1] = (float)0.0; m[3 * 4 + 2] = 0.0f; m[3 * 4 + 3] = 1.0f;
+        }
+
+        static void makeRotateMatrix(float angle,
+                             float ax, float ay, float az,
+                             ref float[] m)
+        {
+            float radians, sine, cosine, ab, bc, ca, tx, ty, tz;
+            float[] axis = new float[3];
+            float mag;
+
+            axis[0] = ax;
+            axis[1] = ay;
+            axis[2] = az;
+            mag = (float)Math.Sqrt(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
+            if (mag != 0)
+            {
+                axis[0] /= mag;
+                axis[1] /= mag;
+                axis[2] /= mag;
+            }
+
+            radians = angle * (float)(Math.PI / 180.0);
+            sine = (float)Math.Sin(radians);
+            cosine = (float)Math.Cos(radians);
+            ab = axis[0] * axis[1] * (1 - cosine);
+            bc = axis[1] * axis[2] * (1 - cosine);
+            ca = axis[2] * axis[0] * (1 - cosine);
+            tx = axis[0] * axis[0];
+            ty = axis[1] * axis[1];
+            tz = axis[2] * axis[2];
+
+            m[0] = tx + cosine * (1 - tx);
+            m[1] = ab + axis[2] * sine;
+            m[2] = ca - axis[1] * sine;
+            m[3] = 0.0f;
+            m[4] = ab - axis[2] * sine;
+            m[5] = ty + cosine * (1 - ty);
+            m[6] = bc + axis[0] * sine;
+            m[7] = 0.0f;
+            m[8] = ca + axis[1] * sine;
+            m[9] = bc - axis[0] * sine;
+            m[10] = tz + cosine * (1 - tz);
+            m[11] = 0;
+            m[12] = 0;
+            m[13] = 0;
+            m[14] = 0;
+            m[15] = 1;
+        }
+
+        static void makeTranslateMatrix(float x, float y, float z, ref float[] m)
+        {
+            m[0] = 1; m[1] = 0; m[2] = 0; m[3] = x;
+            m[4] = 0; m[5] = 1; m[6] = 0; m[7] = y;
+            m[8] = 0; m[9] = 0; m[10] = 1; m[11] = z;
+            m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1;
+        }
+
+        /// <summary>
+        /// Simple 4x4 matrix by 4x4 matrix multiply.
+        /// </summary>
+        static void multMatrix(ref float[] dst, float[] src1, float[] src2)
+        {
+            float[] tmp = new float[16];
+            int i, j;
+
+            for (i = 0; i < 4; i++)
+            {
+                for (j = 0; j < 4; j++)
+                {
+                    tmp[i * 4 + j] = src1[i * 4 + 0] * src2[0 * 4 + j] +
+                                 src1[i * 4 + 1] * src2[1 * 4 + j] +
+                                 src1[i * 4 + 2] * src2[2 * 4 + j] +
+                                 src1[i * 4 + 3] * src2[3 * 4 + j];
+                }
+            }
+            /* Copy result to dst (so dst can also be src1 or src2). */
+            for (i = 0; i < 16; i++)
+                dst[i] = tmp[i];
+        }
+
+        /// <summary>
+        /// Invert a row-major (C-style) 4x4 matrix.
+        /// </summary>
+        static void invertMatrix(ref float[] output, ref float[] m)
+        {
+            double m0, m1, m2, m3, s;
+            double[] r0 = new double[8], r1 = new double[8], r2 = new double[8], r3 = new double[8];
+
+            r0[0] = MAT_Get(m, 0, 0); r0[1] = MAT_Get(m, 0, 1);
+            r0[2] = MAT_Get(m, 0, 2); r0[3] = MAT_Get(m, 0, 3);
+            r0[4] = 1.0; r0[5] = r0[6] = r0[7] = 0.0;
+
+            r1[0] = MAT_Get(m, 1, 0); r1[1] = MAT_Get(m, 1, 1);
+            r1[2] = MAT_Get(m, 1, 2); r1[3] = MAT_Get(m, 1, 3);
+            r1[5] = 1.0; r1[4] = r1[6] = r1[7] = 0.0;
+
+            r2[0] = MAT_Get(m, 2, 0); r2[1] = MAT_Get(m, 2, 1);
+            r2[2] = MAT_Get(m, 2, 2); r2[3] = MAT_Get(m, 2, 3);
+            r2[6] = 1.0; r2[4] = r2[5] = r2[7] = 0.0;
+
+            r3[0] = MAT_Get(m, 3, 0); r3[1] = MAT_Get(m, 3, 1);
+            r3[2] = MAT_Get(m, 3, 2); r3[3] = MAT_Get(m, 3, 3);
+            r3[7] = 1.0; r3[4] = r3[5] = r3[6] = 0.0;
+
+            /* Choose myPivot, or die. */
+            if (Math.Abs(r3[0]) > Math.Abs(r2[0])) SWAP_ROWS(ref r3, ref r2);
+            if (Math.Abs(r2[0]) > Math.Abs(r1[0])) SWAP_ROWS(ref r2, ref r1);
+            if (Math.Abs(r1[0]) > Math.Abs(r0[0])) SWAP_ROWS(ref r1, ref r0);
+            if (0.0 == r0[0])
+            {
+                Debug.Assert(false, "could not invert matrix");
+            }
+
+            /* Eliminate first variable. */
+            m1 = r1[0] / r0[0]; m2 = r2[0] / r0[0]; m3 = r3[0] / r0[0];
+            s = r0[1]; r1[1] -= m1 * s; r2[1] -= m2 * s; r3[1] -= m3 * s;
+            s = r0[2]; r1[2] -= m1 * s; r2[2] -= m2 * s; r3[2] -= m3 * s;
+            s = r0[3]; r1[3] -= m1 * s; r2[3] -= m2 * s; r3[3] -= m3 * s;
+            s = r0[4];
+            if (s != 0.0) { r1[4] -= m1 * s; r2[4] -= m2 * s; r3[4] -= m3 * s; }
+            s = r0[5];
+            if (s != 0.0) { r1[5] -= m1 * s; r2[5] -= m2 * s; r3[5] -= m3 * s; }
+            s = r0[6];
+            if (s != 0.0) { r1[6] -= m1 * s; r2[6] -= m2 * s; r3[6] -= m3 * s; }
+            s = r0[7];
+            if (s != 0.0) { r1[7] -= m1 * s; r2[7] -= m2 * s; r3[7] -= m3 * s; }
+
+            /* Choose myPivot, or die. */
+            if (Math.Abs(r3[1]) > Math.Abs(r2[1])) SWAP_ROWS(ref r3, ref r2);
+            if (Math.Abs(r2[1]) > Math.Abs(r1[1])) SWAP_ROWS(ref r2, ref r1);
+            if (0.0 == r1[1])
+            {
+                Debug.Assert(false, "could not invert matrix");
+            }
+
+            /* Eliminate second variable. */
+            m2 = r2[1] / r1[1]; m3 = r3[1] / r1[1];
+            r2[2] -= m2 * r1[2]; r3[2] -= m3 * r1[2];
+            r2[3] -= m2 * r1[3]; r3[3] -= m3 * r1[3];
+            s = r1[4]; if (0.0 != s) { r2[4] -= m2 * s; r3[4] -= m3 * s; }
+            s = r1[5]; if (0.0 != s) { r2[5] -= m2 * s; r3[5] -= m3 * s; }
+            s = r1[6]; if (0.0 != s) { r2[6] -= m2 * s; r3[6] -= m3 * s; }
+            s = r1[7]; if (0.0 != s) { r2[7] -= m2 * s; r3[7] -= m3 * s; }
+
+            /* Choose myPivot, or die. */
+            if (Math.Abs(r3[2]) > Math.Abs(r2[2])) SWAP_ROWS(ref r3, ref r2);
+            if (0.0 == r2[2])
+            {
+                Debug.Assert(false, "could not invert matrix");
+            }
+
+            /* Eliminate third variable. */
+            m3 = r3[2] / r2[2];
+            r3[3] -= m3 * r2[3]; r3[4] -= m3 * r2[4];
+            r3[5] -= m3 * r2[5]; r3[6] -= m3 * r2[6];
+            r3[7] -= m3 * r2[7];
+
+            /* Last check. */
+            if (0.0 == r3[3])
+            {
+                Debug.Assert(false, "could not invert matrix");
+            }
+
+            s = 1.0 / r3[3];              /* Now back substitute row 3. */
+            r3[4] *= s; r3[5] *= s; r3[6] *= s; r3[7] *= s;
+
+            m2 = r2[3];                 /* Now back substitute row 2. */
+            s = 1.0 / r2[2];
+            r2[4] = s * (r2[4] - r3[4] * m2); r2[5] = s * (r2[5] - r3[5] * m2);
+            r2[6] = s * (r2[6] - r3[6] * m2); r2[7] = s * (r2[7] - r3[7] * m2);
+            m1 = r1[3];
+            r1[4] -= r3[4] * m1; r1[5] -= r3[5] * m1;
+            r1[6] -= r3[6] * m1; r1[7] -= r3[7] * m1;
+            m0 = r0[3];
+            r0[4] -= r3[4] * m0; r0[5] -= r3[5] * m0;
+            r0[6] -= r3[6] * m0; r0[7] -= r3[7] * m0;
+
+            m1 = r1[2];                 /* Now back substitute row 1. */
+            s = 1.0 / r1[1];
+            r1[4] = s * (r1[4] - r2[4] * m1); r1[5] = s * (r1[5] - r2[5] * m1);
+            r1[6] = s * (r1[6] - r2[6] * m1); r1[7] = s * (r1[7] - r2[7] * m1);
+            m0 = r0[2];
+            r0[4] -= r2[4] * m0; r0[5] -= r2[5] * m0;
+            r0[6] -= r2[6] * m0; r0[7] -= r2[7] * m0;
+
+            m0 = r0[1];                 /* Now back substitute row 0. */
+            s = 1.0 / r0[0];
+            r0[4] = s * (r0[4] - r1[4] * m0); r0[5] = s * (r0[5] - r1[5] * m0);
+            r0[6] = s * (r0[6] - r1[6] * m0); r0[7] = s * (r0[7] - r1[7] * m0);
+
+            MAT_Set(ref output, 0, 0, r0[4]); MAT_Set(ref output, 0, 1, r0[5]);
+            MAT_Set(ref output, 0, 2, r0[6]); MAT_Set(ref output, 0, 3, r0[7]);
+            MAT_Set(ref output, 1, 0, r1[4]); MAT_Set(ref output, 1, 1, r1[5]);
+            MAT_Set(ref output, 1, 2, r1[6]); MAT_Set(ref output, 1, 3, r1[7]);
+            MAT_Set(ref output, 2, 0, r2[4]); MAT_Set(ref output, 2, 1, r2[5]);
+            MAT_Set(ref output, 2, 2, r2[6]); MAT_Set(ref output, 2, 3, r2[7]);
+            MAT_Set(ref output, 3, 0, r3[4]); MAT_Set(ref output, 3, 1, r3[5]);
+            MAT_Set(ref output, 3, 2, r3[6]); MAT_Set(ref output, 3, 3, r3[7]);
+        }
+
+        /// <summary>
+        /// Change Rows means in this case just change the Refrences
+        /// to the Arrays
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        static void SWAP_ROWS(ref double[] a, ref double[] b)
+        {
+            double[] temp = a;
+            a = b;
+            b = temp;
+        }
+
+        /// <summary>
+        /// Get Element of Matrix
+        /// </summary>
+        /// <param name="m">Matrix</param>
+        /// <param name="r">Row</param>
+        /// <param name="c">Column</param>
+        /// <returns>Value</returns>
+        static float MAT_Get(float[] m, int r, int c)
+        {
+            return m[r * 4 + c];
+        }
+
+        /// <summary>
+        /// Set Element in Matrix
+        /// </summary>
+        /// <param name="m">Matrix</param>
+        /// <param name="r">Row</param>
+        /// <param name="c">Column</param>
+        /// <param name="value">Value</param>
+        static void MAT_Set(ref float[] m, int r, int c, double value)
+        {
+            m[r * 4 + c] = (float)value;
+        }
+
+        /// <summary>
+        /// Simple 4x4 matrix by 4-component column vector multiply.
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="mat"></param>
+        /// <param name="vec"></param>
+        static void transform(ref float[] dst, float[] mat, float[] vec)
+        {
+            double[] tmp = new double[4];
+            double invW;
+            int i;
+
+            for (i = 0; i < 4; i++)
+            {
+                tmp[i] = mat[i * 4 + 0] * vec[0] +
+                         mat[i * 4 + 1] * vec[1] +
+                         mat[i * 4 + 2] * vec[2] +
+                         mat[i * 4 + 3] * vec[3];
+            }
+            invW = 1 / tmp[3];
+            /* Apply perspective divide and copy to dst (so dst can vec). */
+            for (i = 0; i < 3; i++)
+                dst[i] = (float)(tmp[i] * tmp[3]);
+            dst[3] = 1;
+        }
+
+        static void display()
+        {
+            /* World-space positions for light and eye. */
+            float[] eyePosition = { 0, 0, 8, 1 };
+            float[] lightPosition = { 5*(float) Math.Sin(myLightAngle), 
+                                   1.5f,
+                                   5*(float) Math.Cos(myLightAngle), 1 };
+
+            float[] translateMatrix = new float[16], rotateMatrix = new float[16],
+                    modelMatrix = new float[16], invModelMatrix = new float[16], viewMatrix = new float[16],
+                    modelViewMatrix = new float[16], modelViewProjMatrix = new float[16];
+            float[] objSpaceEyePosition = new float[4], objSpaceLightPosition = new float[4];
+
+            Cg.cgSetParameter1f(myCgVertexParam_time, myTime);
+
+            buildLookAtMatrix(eyePosition[0], eyePosition[1], eyePosition[2],
+                    0, 0, 0,
+                    0, 1, 0,
+                    ref viewMatrix);
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            CgGl.cgGLEnableProfile(myCgVertexProfile);
+            checkForCgError("enabling vertex profile");
+
+            CgGl.cgGLEnableProfile(myCgFragmentProfile);
+            checkForCgError("enabling fragment profile");
+
+            CgGl.cgGLBindProgram(myCgVertexProgram);
+            checkForCgError("binding vertex program");
+
+            CgGl.cgGLBindProgram(myCgFragmentProgram);
+            checkForCgError("binding fragment program");
+
+            /*** Render green solid bulging sphere ***/
+
+            /* modelView = rotateMatrix * translateMatrix */
+            makeRotateMatrix(70f, 1f, 1f, 1f, ref rotateMatrix);
+            makeTranslateMatrix(2.2f, 1f, 0.2f, ref translateMatrix);
+            multMatrix(ref modelMatrix, translateMatrix, rotateMatrix);
+
+            /* invModelMatrix = inverse(modelMatrix) */
+            invertMatrix(ref invModelMatrix, ref modelMatrix);
+
+            /* Transform world-space eye and light positions to sphere's object-space. */
+            transform(ref objSpaceEyePosition, invModelMatrix, eyePosition);
+            Cg.cgSetParameter3fv(myCgVertexParam_eyePosition, out objSpaceEyePosition[0]);
+            transform(ref objSpaceLightPosition, invModelMatrix, lightPosition);
+            Cg.cgSetParameter3fv(myCgVertexParam_lightPosition, out objSpaceLightPosition[0]);
+
+            /* modelViewMatrix = viewMatrix * modelMatrix */
+            multMatrix(ref modelViewMatrix, viewMatrix, modelMatrix);
+
+            /* modelViewProj = projectionMatrix * modelViewMatrix */
+            multMatrix(ref modelViewProjMatrix, myProjectionMatrix, modelViewMatrix);
+
+            /* Set matrix parameter with row-major matrix. */
+            Cg.cgSetMatrixParameterfr(myCgVertexParam_modelViewProj, out modelViewProjMatrix[0]);
+            Cg.cgSetParameter4f(myCgVertexParam_Kd, 0.1f, 0.7f, 0.1f, 1f);  /* Green */
+            Glut.glutSolidSphere(1.0, 40, 40);
+
+            /*** Render red solid bulging torus ***/
+
+            /* modelView = viewMatrix * translateMatrix */
+            makeTranslateMatrix(-2f, -1.5f, 0f, ref translateMatrix);
+            makeRotateMatrix(55, 1, 0, 0, ref rotateMatrix);
+            multMatrix(ref modelMatrix, translateMatrix, rotateMatrix);
+
+            /* invModelMatrix = inverse(modelMatrix) */
+            invertMatrix(ref invModelMatrix, ref modelMatrix);
+
+            /* Transform world-space eye and light positions to sphere's object-space. */
+            transform(ref objSpaceEyePosition, invModelMatrix, eyePosition);
+            Cg.cgSetParameter3fv(myCgVertexParam_eyePosition, out objSpaceEyePosition[0]);
+            transform(ref objSpaceLightPosition, invModelMatrix, lightPosition);
+            Cg.cgSetParameter3fv(myCgVertexParam_lightPosition, out objSpaceLightPosition[0]);
+
+            /* modelViewMatrix = viewMatrix * modelMatrix */
+            multMatrix(ref modelViewMatrix, viewMatrix, modelMatrix);
+
+            /* modelViewProj = projectionMatrix * modelViewMatrix */
+            multMatrix(ref modelViewProjMatrix, myProjectionMatrix, modelViewMatrix);
+
+            /* Set matrix parameter with row-major matrix. */
+            Cg.cgSetMatrixParameterfr(myCgVertexParam_modelViewProj, out modelViewProjMatrix[0]);
+            Cg.cgSetParameter4f(myCgVertexParam_Kd, 0.8f, 0.1f, 0.1f, 1f);  /* Red */
+            Glut.glutSolidTorus(0.15, 1.7, 40, 40);
+
+            /*** Render light as emissive yellow ball ***/
+
+            CgGl.cgGLBindProgram(myCgLightVertexProgram);
+            checkForCgError("binding light vertex program");
+
+            /* modelView = translateMatrix */
+            makeTranslateMatrix(lightPosition[0], lightPosition[1], lightPosition[2],
+              ref modelMatrix);
+
+            /* modelViewMatrix = viewMatrix * modelMatrix */
+            multMatrix(ref modelViewMatrix, viewMatrix, modelMatrix);
+
+            /* modelViewProj = projectionMatrix * modelViewMatrix */
+            multMatrix(ref modelViewProjMatrix, myProjectionMatrix, modelViewMatrix);
+
+            /* Set matrix parameter with row-major matrix. */
+            Cg.cgSetMatrixParameterfr(myCgLightVertexParam_modelViewProj,
+              out modelViewProjMatrix[0]);
+            Glut.glutSolidSphere(0.1, 12, 12);
+
+            CgGl.cgGLDisableProfile(myCgVertexProfile);
+            checkForCgError("disabling vertex profile");
+
+            CgGl.cgGLDisableProfile(myCgFragmentProfile);
+            checkForCgError("disabling fragment profile");
+
+            Glut.glutSwapBuffers();
+        }
+
+        static void idle()
+        {
+            // static float lightVelocity = 0.008;
+            // static float timeFlow = 0.01;
+
+            /* Repeat rotating light around front 180 degrees. */
+            if (myLightAngle > Math.PI / 2)
+            {
+                myLightAngle = (float)Math.PI / 2;
+                lightVelocity = -lightVelocity;
+            }
+            else if (myLightAngle < -Math.PI / 2)
+            {
+                myLightAngle = (float)-Math.PI / 2;
+                lightVelocity = -lightVelocity;
+            }
+            myLightAngle += lightVelocity;  /* Add a small angle (in radians). */
+
+            /* Repeatedly advance and rewind time. */
+            if (myTime > 10)
+            {
+                myTime = 10;
+                timeFlow = -timeFlow;
+            }
+            else if (myTime < 0)
+            {
+                myTime = 0;
+                timeFlow = -timeFlow;
+            }
+            myTime += timeFlow;  /* Add time delta. */
+
+            Glut.glutPostRedisplay();
+        }
+
+        private static void keyboard(byte key, int x, int y)
+        {
+            //static int animating = 0,
+            //  wireframe = 0;
+
+            switch (key)
+            {
+                case (byte)' ':
+                    animating = !animating; /* Toggle */
+                    if (animating)
+                    {
+                        Glut.glutIdleFunc(idleDelegate);
+                    }
+                    else
+                    {
+                        Glut.glutIdleFunc(null);
+                    }
+                    break;
+                case 27:  /* Esc key */
+                    /* Demonstrate proper deallocation of Cg runtime data structures.
+                       Not strictly necessary if we are simply going to exit. */
+                    Cg.cgDestroyProgram(myCgVertexProgram);
+                    Cg.cgDestroyContext(myCgContext);
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+
+        private static void menu(int item)
+        {
+            /* Pass menu item character code to keyboard callback. */
+            keyboard((byte)item, 0, 0);
+        }
+
+
+    }
+}
diff --git a/examples/CgExamples/Makefile.am b/examples/CgExamples/Makefile.am
new file mode 100644
index 0000000..12a4ecd
--- /dev/null
+++ b/examples/CgExamples/Makefile.am
@@ -0,0 +1,30 @@
+
+PROGRAM = CgExamples
+PACKAGES =
+BINARY_LIBS = \
+        Tao.Cg.dll \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+RESX = CgExamples.resx
+RESOURCES = $(PROGRAM).CgExamples.resources
+SOURCES = \
+        CgExamples.cs \
+        CgExamples.Designer.cs \
+        Gl_01_vertex_program.cs \
+        Gl_02_vertex_and_fragment_program.cs \
+        Gl_06_vertex_twisting_program.cs \
+        Gl_14_bulge_program.cs \
+        Program.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.Cg/Tao.Cg.snk
+
+$(PROGRAM).CgExamples.resources: CgExamples.resx
+	$(RESGEN) $< $@
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/CgExamples/Makefile.in b/examples/CgExamples/Makefile.in
new file mode 100644
index 0000000..9b7478d
--- /dev/null
+++ b/examples/CgExamples/Makefile.in
@@ -0,0 +1,378 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/CgExamples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = CgExamples
+PACKAGES = 
+BINARY_LIBS = \
+        Tao.Cg.dll \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+
+RESX = CgExamples.resx
+RESOURCES = $(PROGRAM).CgExamples.resources
+SOURCES = \
+        CgExamples.cs \
+        CgExamples.Designer.cs \
+        Gl_01_vertex_program.cs \
+        Gl_02_vertex_and_fragment_program.cs \
+        Gl_06_vertex_twisting_program.cs \
+        Gl_14_bulge_program.cs \
+        Program.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.Cg/Tao.Cg.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/CgExamples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/CgExamples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).CgExamples.resources: CgExamples.resx
+	$(RESGEN) $< $@
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/CgExamples/Program.cs b/examples/CgExamples/Program.cs
new file mode 100644
index 0000000..7b47dd5
--- /dev/null
+++ b/examples/CgExamples/Program.cs
@@ -0,0 +1,47 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace CgExamples
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new CgExamples());
+        }
+    }
+}
diff --git a/examples/CgExamples/Properties/AssemblyInfo.cs b/examples/CgExamples/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0946838
--- /dev/null
+++ b/examples/CgExamples/Properties/AssemblyInfo.cs
@@ -0,0 +1,51 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2005 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("CgExamples")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Cg GL Examples")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("CgExamples")]
+[assembly: AssemblyTitle("CgExamples")]
+[assembly: AssemblyTrademark("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/CgExamples/README b/examples/CgExamples/README
new file mode 100644
index 0000000..cfce6df
--- /dev/null
+++ b/examples/CgExamples/README
@@ -0,0 +1,23 @@
+CgIlExamples
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are C# ports of some Cg examples.  The originals
+are available from http://www.nvidia.com/.
+
+These examples use Tao.Cg, Tao.FreeGlut, and Tao.OpenGl.  Make sure you
+have the appropriate native libraries for your system installed.
+
+These examples are fairly well documented, however, do not take
+them to be 'best practices' for .NET Cg development.  The
+intent of these ports is as an introduction or as a comparison
+against the original native versions.
+
+David Hudson
+http://www.taoframework.com
+
+Change Log:
+
+August 11, 2006
+    Initial release, version 1.0.0.0.
diff --git a/examples/DevIlExamples/COPYING b/examples/DevIlExamples/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/DevIlExamples/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/DevIlExamples/DevIlExamples.csproj b/examples/DevIlExamples/DevIlExamples.csproj
new file mode 100644
index 0000000..d66677b
--- /dev/null
+++ b/examples/DevIlExamples/DevIlExamples.csproj
@@ -0,0 +1,102 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B5395FB5-D38F-4271-B7A8-8BAC98E37502}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>DevIlExamples</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.DevIl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>DevIlExamples</RootNamespace>
+    <StartupObject>DevIlExamples.SimpleExample</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.DevIl\Tao.DevIl.csproj">
+      <Name>Tao.DevIl</Name>
+      <Project>{E644F15A-A963-4B9D-808D-9463CB96D0B2}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="SimpleExample.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.DevIl.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/DevIlExamples/DevIlExamples.sh b/examples/DevIlExamples/DevIlExamples.sh
new file mode 100755
index 0000000..8efee44
--- /dev/null
+++ b/examples/DevIlExamples/DevIlExamples.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./DevIlExamples.exe "$@"
diff --git a/examples/DevIlExamples/Makefile.am b/examples/DevIlExamples/Makefile.am
new file mode 100644
index 0000000..eee6c17
--- /dev/null
+++ b/examples/DevIlExamples/Makefile.am
@@ -0,0 +1,14 @@
+
+PROGRAM = DevIlExamples
+PACKAGES =
+BINARY_LIBS = Tao.DevIl.dll
+SYSTEM_LIBS = System
+RESX =
+RESOURCES =
+SOURCES = \
+        SimpleExample.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.DevIl/Tao.DevIl.snk
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/DevIlExamples/Makefile.in b/examples/DevIlExamples/Makefile.in
new file mode 100644
index 0000000..dd97b4f
--- /dev/null
+++ b/examples/DevIlExamples/Makefile.in
@@ -0,0 +1,360 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/DevIlExamples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = DevIlExamples
+PACKAGES = 
+BINARY_LIBS = Tao.DevIl.dll
+SYSTEM_LIBS = System
+RESX = 
+RESOURCES = 
+SOURCES = \
+        SimpleExample.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.DevIl/Tao.DevIl.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/DevIlExamples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/DevIlExamples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/DevIlExamples/Properties/AssemblyInfo.cs b/examples/DevIlExamples/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..965a01b
--- /dev/null
+++ b/examples/DevIlExamples/Properties/AssemblyInfo.cs
@@ -0,0 +1,51 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2005 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("DevIlExamples.SimpleExample")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("DevIL simple example.")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("DevIlExamples.SimpleExample.exe")]
+[assembly: AssemblyTitle("DevIL simple example.")]
+[assembly: AssemblyTrademark("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/DevIlExamples/README b/examples/DevIlExamples/README
new file mode 100644
index 0000000..800a03d
--- /dev/null
+++ b/examples/DevIlExamples/README
@@ -0,0 +1,23 @@
+DevIlExamples
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are C# ports of some DevIL examples.  The originals
+are available from http://openil.sourceforge.net/.
+
+These examples use Tao.DevIl, Tao.FreeGlut, and Tao.OpenGl.  Make sure you
+have the appropriate native libraries for your system installed.
+
+These examples are fairly well documented, however, do not take
+them to be 'best practices' for .NET DevIL development.  The
+intent of these ports is as an introduction or as a comparison
+against the original native versions.
+
+Randy Ridge
+http://www.taoframework.com
+
+Change Log:
+
+December 04, 2004
+    Initial release, version 1.0.0.0.
diff --git a/examples/DevIlExamples/SimpleExample.cs b/examples/DevIlExamples/SimpleExample.cs
new file mode 100644
index 0000000..0b97c30
--- /dev/null
+++ b/examples/DevIlExamples/SimpleExample.cs
@@ -0,0 +1,168 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+//
+// DevIL Source Example
+// Copyright (C) 2000-2002 by Denton Woods
+// Last modified:  4/22/2002 <--Y2K Compliant! =]
+//
+// Filename: examples/Simple Example/simple.c
+//
+// Description: Simplest implementation of an DevIL application.
+//              Loads an image and saves it to a new image.
+//              The images can be of any format and can be different.
+//
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+using System;
+using System.IO;
+using Tao.DevIl;
+
+namespace DevIlExamples
+{
+    #region Class Documentation
+    /// <summary>
+    ///     Converts one image to another.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Denton Woods
+    ///         http://openil.sourceforge.net/
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class SimpleExample
+    {
+        // --- Entry Point ---
+        #region Main(string[] args)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="args"></param>
+        [STAThread]
+        public static void Main(string[] args)
+        {
+            int imageId;
+
+            string filePath = Path.Combine("..", "..");
+            string fileDirectory = "Data";
+            string fileName = "yinyangblue.gif";
+            if (File.Exists(fileName))
+            {
+                filePath = "";
+                fileDirectory = "";
+            }
+            else if (File.Exists(Path.Combine(fileDirectory, fileName)))
+            {
+                filePath = "";
+            }
+
+            string inputFile = Path.Combine(Path.Combine(filePath, fileDirectory), fileName);
+            string outputFile = Path.Combine(Path.Combine(filePath, fileDirectory), "yinyangblue.jpg");
+
+            Console.WriteLine("DevIlExamples - DevIL simple command line application.");
+
+            if (args.Length == 2)
+            {
+                inputFile = args[0];
+                outputFile = args[1];
+                Console.WriteLine("Converting - {0} -> {1}", inputFile, outputFile);
+            }
+            else
+            {
+                Console.WriteLine("Usage - DevIlExamples <inputfile> <outputfile>");
+                Console.WriteLine("Converting example files - {0} -> {1}", inputFile, outputFile);
+            }
+
+            if (Il.ilGetInteger(Il.IL_VERSION_NUM) < Il.IL_VERSION ||
+                Il.ilGetInteger(Ilu.ILU_VERSION_NUM) < Ilu.ILU_VERSION ||
+                Il.ilGetInteger(Ilut.ILUT_VERSION_NUM) < Ilut.ILUT_VERSION)
+            {
+                Console.WriteLine("*** Your DevIL native libraries are older than what Tao.DevIl supports, get the latest DevIL native libraries. ***");
+                Console.WriteLine("Your DevIL native IL version: {0}.  Tao.DevIl's IL version: {1}.",
+                    Il.ilGetInteger(Il.IL_VERSION_NUM), Il.IL_VERSION);
+                Console.WriteLine("Your DevIL native ILU version: {0}.  Tao.DevIl's ILU version: {1}.",
+                    Il.ilGetInteger(Ilu.ILU_VERSION_NUM), Ilu.ILU_VERSION_NUM);
+                Console.WriteLine("Your DevIL native ILUT version: {0}.  Tao.DevIl's ILUT version: {1}.",
+                    Il.ilGetInteger(Ilut.ILUT_VERSION_NUM), Ilut.ILUT_VERSION_NUM);
+            }
+
+            // Initialize DevIL
+            Il.ilInit();
+
+            // Generate the main image name to use
+            Il.ilGenImages(1, out imageId);
+
+            // Bind this image name
+            Il.ilBindImage(imageId);
+
+            // Loads the image into the imageId
+            if (!Il.ilLoadImage(inputFile))
+            {
+                Console.WriteLine("Could not open file, {0}, exiting.", inputFile);
+                Exit();
+            }
+
+            // Display the image's dimensions
+            Console.WriteLine("Width: {0} Height: {1}, Depth: {2}, Bpp: {3}",
+                Il.ilGetInteger(Il.IL_IMAGE_WIDTH), Il.ilGetInteger(Il.IL_IMAGE_HEIGHT),
+                Il.ilGetInteger(Il.IL_IMAGE_DEPTH),
+                Il.ilGetInteger(Il.IL_IMAGE_BITS_PER_PIXEL));
+
+            // Enable overwriting destination file
+            Il.ilEnable(Il.IL_FILE_OVERWRITE);
+
+            // Save the image
+            Il.ilSaveImage(outputFile);
+
+            // Done with the imageId, so let's delete it
+            Il.ilDeleteImages(1, ref imageId);
+
+            Exit();
+        }
+        #endregion Main(string[] args)
+
+        #region Exit()
+        /// <summary>
+        ///     Exits application.
+        /// </summary>
+        private static void Exit()
+        {
+            Console.WriteLine("Press Enter to exit...");
+            Console.ReadLine();
+            Environment.Exit(0);
+        }
+        #endregion Exit()
+    }
+}
diff --git a/examples/FFmpegExamples/AudioStream.cs b/examples/FFmpegExamples/AudioStream.cs
new file mode 100644
index 0000000..8b16f74
--- /dev/null
+++ b/examples/FFmpegExamples/AudioStream.cs
@@ -0,0 +1,184 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+//using Tao.OpenAl;
+using System.Threading;
+using System.Diagnostics;
+
+namespace FFmpegExamples
+{
+    public class AudioStream
+    {
+        private const int MAX_BUFFERS = 10;
+        private Decoder decoder;
+        //private int source;
+        private int[] buffers = new int[MAX_BUFFERS];
+        //private float[] zeros = { 0.0f, 0.0f, 0.0f };
+        private bool playing;
+
+        public event LiveUpdateCallback LivtUpdateEvent;
+
+        public AudioStream()
+        {
+            decoder = new Decoder();
+            decoder.LivtUpdateEvent += new LiveUpdateCallback(decoder_LivtUpdateEvent);
+
+            //Alut.alutInit();
+            //Al.alGenBuffers(MAX_BUFFERS, buffers);
+            Check();
+
+            //Al.alGenSources(1,out source);
+            Check();
+
+            //Al.alSourcefv(source, Al.AL_POSITION, zeros);
+            //Al.alSourcefv(source, Al.AL_VELOCITY, zeros);
+            //Al.alSourcefv(source, Al.AL_DIRECTION, zeros);
+            //Al.alSourcef(source, Al.AL_ROLLOFF_FACTOR, 0.0f);
+            //Al.alSourcei(source, Al.AL_SOURCE_RELATIVE, Al.AL_TRUE);
+        }
+
+        void decoder_LivtUpdateEvent(object update)
+        {
+            if (LivtUpdateEvent != null)
+                LivtUpdateEvent(update);
+        }
+
+        public bool Open(string path)
+        {
+            return decoder.Open(path);
+        }
+
+        public void Play()
+        {
+            //Thread t = new Thread(new ThreadStart(PlayFunc));
+            //t.IsBackground = true;
+            //t.Start();
+            PlayFunc();
+        }
+
+        private bool Update()
+        {
+            int processed = 0;
+            bool active = true;
+
+            //Al.alGetSourcei(source, Al.AL_BUFFERS_PROCESSED, out processed);
+
+            while (processed-- > 0) {
+                int buffer = -1;
+
+                //Al.alSourceUnqueueBuffers(source, 1, ref buffer);
+                Check();
+
+                active = Stream(buffer);
+
+                if (active) {
+                    //Al.alSourceQueueBuffers(source, 1, ref buffer);
+                    Check();
+                }
+            }
+
+            return active;
+        }
+
+        private void Check()
+        {
+            //int error = Al.alGetError();
+            //if (error != Al.AL_NO_ERROR) {
+            //    Debug.WriteLine("OpenAL error: " + Al.alGetString(error));
+            //}
+        }
+
+        private bool Stream(int buffer)
+        {
+            if (decoder.Stream()) {
+                if (decoder.IsAudioStream) {
+                    //byte[] samples = decoder.Samples;
+                    //int sampleSize = decoder.SampleSize;
+                    //Al.alBufferData(buffer, decoder.Format, samples, sampleSize, decoder.Frequency);
+                    Check();
+                }
+                return true;
+            }
+            return false;
+        }
+
+        public bool Playing()
+        {
+            //int state;
+            //Al.alGetSourcei(source, Al.AL_SOURCE_STATE, out state);
+            //return (state == Al.AL_PLAYING);
+            return true;
+        }
+
+        public void Stop()
+        {
+            playing = false;
+            //Al.alSourceStop(source);
+        }
+
+        public bool Playback()
+        {
+            int queue = 0;
+            //Al.alGetSourcei(source, Al.AL_BUFFERS_QUEUED, out queue);
+
+            if (queue > 0) {
+                //Al.alSourcePlay(source);
+            }
+
+            if(Playing())
+                return true;
+
+            for(int i = 0; i < MAX_BUFFERS; ++i)
+            {
+                if (!Stream(buffers[i]))
+                    return false;
+            }
+
+            //Al.alSourceQueueBuffers(source, MAX_BUFFERS, buffers);            
+
+            return true;
+        }
+
+        private void PlayFunc()
+        {
+            playing = true;
+            if (!Playback())
+                throw new Exception("Refused to play");
+            while (Update()) {
+                if (!playing)
+                    break;
+                Thread.Sleep(10);
+                if (!Playing()) {
+                    Playback();
+                }
+            }
+        }
+    }
+}
diff --git a/examples/FFmpegExamples/COPYING b/examples/FFmpegExamples/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/FFmpegExamples/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/FFmpegExamples/Decoder.cs b/examples/FFmpegExamples/Decoder.cs
new file mode 100644
index 0000000..945c324
--- /dev/null
+++ b/examples/FFmpegExamples/Decoder.cs
@@ -0,0 +1,246 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime;
+using System.Runtime.InteropServices;
+using System.Diagnostics;
+using Tao.FFmpeg;
+//using Tao.OpenAl;
+
+namespace FFmpegExamples
+{
+    public delegate void LiveUpdateCallback(object update);
+
+    public class Decoder
+    {
+        // public static string text;
+
+        private IntPtr pFormatContext;
+        private FFmpeg.AVFormatContext formatContext;
+
+        private FFmpeg.AVCodecContext audioCodecContext;
+        //private IntPtr pAudioCodecContext;
+
+        private FFmpeg.AVRational timebase;
+        //private IntPtr pAudioStream;
+
+        private IntPtr pAudioCodec;
+        //private FFmpeg.AVCodecStruct audioCodec;
+
+        //private readonly String path;
+        private int audioStartIndex = -1;
+        private int audioSampleRate;
+        //private int format;
+        private const int AUDIO_FRAME_SIZE = 5000;
+        private byte[] samples = new byte[AUDIO_FRAME_SIZE];
+        private int sampleSize = -1;
+        private bool isAudioStream = false;
+
+        private const int TIMESTAMP_BASE = 1000000;
+
+        public event LiveUpdateCallback LivtUpdateEvent;
+
+        public Decoder()
+        {
+            FFmpeg.av_register_all();
+        }
+
+        ~Decoder()
+        {
+            if (pFormatContext != IntPtr.Zero)
+                FFmpeg.av_close_input_file(pFormatContext);
+            FFmpeg.av_free_static();
+        }
+
+        public void Reset()
+        {
+            if (pFormatContext != IntPtr.Zero)
+                FFmpeg.av_close_input_file(pFormatContext);
+            sampleSize = -1;
+            audioStartIndex = -1;
+        }
+
+        public bool Open(string path)
+        {
+            Reset();
+
+            int ret;
+            ret = FFmpeg.av_open_input_file(out pFormatContext, path, IntPtr.Zero, 0, IntPtr.Zero);
+
+            if (ret < 0)
+            {
+                Console.WriteLine("couldn't opne input file");
+                return false;
+            }
+
+            ret = FFmpeg.av_find_stream_info(pFormatContext);
+
+            if (ret < 0)
+            {
+                Console.WriteLine("couldnt find stream informaion");
+                return false;
+            }
+
+            formatContext = (FFmpeg.AVFormatContext)
+                Marshal.PtrToStructure(pFormatContext, typeof(FFmpeg.AVFormatContext));
+
+            for (int i = 0; i < formatContext.nb_streams; ++i)
+            {
+                FFmpeg.AVStream stream = (FFmpeg.AVStream)
+                       Marshal.PtrToStructure(formatContext.streams[i], typeof(FFmpeg.AVStream));
+
+                FFmpeg.AVCodecContext codec = (FFmpeg.AVCodecContext)
+                       Marshal.PtrToStructure(stream.codec, typeof(FFmpeg.AVCodecContext));
+
+                if (codec.codec_type == FFmpeg.CodecType.CODEC_TYPE_AUDIO &&
+                                        audioStartIndex == -1)
+                {
+                    //this.pAudioCodecContext = stream.codec;
+                    //this.pAudioStream = formatContext.streams[i];
+                    this.audioCodecContext = codec;
+                    this.audioStartIndex = i;
+                    this.timebase = stream.time_base;
+
+                    pAudioCodec = FFmpeg.avcodec_find_decoder(this.audioCodecContext.codec_id);
+                    if (pAudioCodec == IntPtr.Zero)
+                    {
+                        Console.WriteLine("couldn't find codec");
+                        return false;
+                    }
+
+                    FFmpeg.avcodec_open(stream.codec, pAudioCodec);
+                }
+            }
+
+            if (audioStartIndex == -1)
+            {
+                Console.WriteLine("Couldn't find audio streamn");
+                return false;
+            }
+
+            audioSampleRate = audioCodecContext.sample_rate;
+
+            if (audioCodecContext.channels == 1)
+            {
+                //format = Al.AL_FORMAT_MONO16;
+            }
+            else
+            {
+                //format = Al.AL_FORMAT_STEREO16;
+            }
+
+            return true;
+        }
+
+        static int count = 0;
+        public bool Stream()
+        {
+            int result;
+
+            //  FFmpeg.AVPacket packet = new FFmpeg.AVPacket();
+            IntPtr pPacket = Marshal.AllocHGlobal(56);
+
+            //Marshal.StructureToPtr(packet, pPacket, false);
+            //  Marshal.PtrToStructure(
+
+            result = FFmpeg.av_read_frame(pFormatContext, pPacket);
+            if (result < 0)
+                return false;
+            count++;
+
+            int frameSize = 0;
+            IntPtr pSamples = IntPtr.Zero;
+            FFmpeg.AVPacket packet = (FFmpeg.AVPacket)
+                                Marshal.PtrToStructure(pPacket, typeof(FFmpeg.AVPacket));
+            Marshal.FreeHGlobal(pPacket);
+
+            if (LivtUpdateEvent != null)
+            {
+                int cur = (int)(packet.dts * timebase.num / timebase.den);
+                int total = (int)(formatContext.duration / TIMESTAMP_BASE);
+                string time = String.Format("{0} out of {1} seconds", cur, total);
+                LivtUpdateEvent(time);
+            }
+
+            if (packet.stream_index != this.audioStartIndex)
+            {
+                this.isAudioStream = false;
+                return true;
+            }
+            this.isAudioStream = true;
+
+            try
+            {
+                pSamples = Marshal.AllocHGlobal(AUDIO_FRAME_SIZE);
+                //int size = FFmpeg.avcodec_decode_audio(pAudioCodecContext, pSamples,
+                //        ref frameSize, packet.data, packet.size);
+
+                //FFmpeg.av_free_packet(pPacket);                                      
+
+                this.sampleSize = frameSize;
+                Marshal.Copy(pSamples, samples, 0, AUDIO_FRAME_SIZE);
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine(e.Message);
+                return false;
+            }
+            finally
+            {
+                Marshal.FreeHGlobal(pSamples);
+            }
+
+            return true;
+        }
+
+        public byte[] Samples
+        {
+            get { return samples; }
+        }
+
+        public int SampleSize
+        {
+            get { return sampleSize; }
+        }
+
+        //public int Format
+        //{
+        //    get { return format; }
+        //}
+
+        public int Frequency
+        {
+            get { return audioSampleRate; }
+        }
+
+        public bool IsAudioStream
+        {
+            get { return isAudioStream; }
+        }
+    }
+}
diff --git a/examples/FFmpegExamples/FFmpegExamples.csproj b/examples/FFmpegExamples/FFmpegExamples.csproj
new file mode 100644
index 0000000..27e02c7
--- /dev/null
+++ b/examples/FFmpegExamples/FFmpegExamples.csproj
@@ -0,0 +1,141 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6A86C66C-2A58-4BBF-BA13-B54515052BAE}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>FFmpegExamples</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.FFmpeg.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>FFmpegExamples</RootNamespace>
+    <StartupObject>FFmpegExamples.Program</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.FFmpeg\Tao.FFmpeg.csproj">
+      <Name>Tao.FFmpeg</Name>
+      <Project>{ABF4DD1F-C5CE-40E1-86B2-AA82127B1927}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Player.resx">
+      <DependentUpon>Player.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Player.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="AudioStream.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Decoder.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Player.Designer.cs">
+      <DependentUpon>Player.cs</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.FFmpeg.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/FFmpegExamples/FFmpegExamples.sh b/examples/FFmpegExamples/FFmpegExamples.sh
new file mode 100755
index 0000000..4d649fa
--- /dev/null
+++ b/examples/FFmpegExamples/FFmpegExamples.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./FFmpegExamples.exe "$@"
diff --git a/examples/FFmpegExamples/Makefile.am b/examples/FFmpegExamples/Makefile.am
new file mode 100644
index 0000000..98502bc
--- /dev/null
+++ b/examples/FFmpegExamples/Makefile.am
@@ -0,0 +1,31 @@
+
+PROGRAM = FFmpegExamples
+PACKAGES =
+BINARY_LIBS = Tao.FFmpeg.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+RESX = \
+        Player.resx \
+        Properties/Resources.resx
+RESOURCES = \
+        $(PROGRAM).Player.resources \
+        $(PROGRAM).Resources.resources
+SOURCES = \
+        Player.cs \
+        AudioStream.cs \
+        Decoder.cs \
+        Player.Designer.cs \
+        Program.cs \
+        Properties/Resources.Designer.cs \
+        Properties/AssemblyInfo.cs
+
+$(PROGRAM).Player.resources: Player.resx
+	$(RESGEN) $< $@
+$(PROGRAM).Resources.resources: Properties/Resources.resx
+	$(RESGEN) $< $@
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/FFmpegExamples/Makefile.in b/examples/FFmpegExamples/Makefile.in
new file mode 100644
index 0000000..6cdc204
--- /dev/null
+++ b/examples/FFmpegExamples/Makefile.in
@@ -0,0 +1,380 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/FFmpegExamples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = FFmpegExamples
+PACKAGES = 
+BINARY_LIBS = Tao.FFmpeg.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+
+RESX = \
+        Player.resx \
+        Properties/Resources.resx
+
+RESOURCES = \
+        $(PROGRAM).Player.resources \
+        $(PROGRAM).Resources.resources
+
+SOURCES = \
+        Player.cs \
+        AudioStream.cs \
+        Decoder.cs \
+        Player.Designer.cs \
+        Program.cs \
+        Properties/Resources.Designer.cs \
+        Properties/AssemblyInfo.cs
+
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/FFmpegExamples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/FFmpegExamples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).Player.resources: Player.resx
+	$(RESGEN) $< $@
+$(PROGRAM).Resources.resources: Properties/Resources.resx
+	$(RESGEN) $< $@
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/FFmpegExamples/Player.Designer.cs b/examples/FFmpegExamples/Player.Designer.cs
new file mode 100644
index 0000000..3d64715
--- /dev/null
+++ b/examples/FFmpegExamples/Player.Designer.cs
@@ -0,0 +1,150 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+namespace FFmpegExamples
+{
+    partial class Player
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null)) {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Player));
+            this.pnlMusicInfo = new System.Windows.Forms.Panel();
+            this.label1 = new System.Windows.Forms.Label();
+            this.button1 = new System.Windows.Forms.Button();
+            this.button2 = new System.Windows.Forms.Button();
+            this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
+            this.button3 = new System.Windows.Forms.Button();
+            this.pnlMusicInfo.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pnlMusicInfo
+            // 
+            this.pnlMusicInfo.BackColor = System.Drawing.SystemColors.ControlText;
+            this.pnlMusicInfo.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.pnlMusicInfo.Controls.Add(this.label1);
+            this.pnlMusicInfo.Location = new System.Drawing.Point(12, 12);
+            this.pnlMusicInfo.Name = "pnlMusicInfo";
+            this.pnlMusicInfo.Size = new System.Drawing.Size(118, 45);
+            this.pnlMusicInfo.TabIndex = 0;
+            // 
+            // label1
+            // 
+            this.label1.BackColor = System.Drawing.SystemColors.ControlText;
+            this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label1.ForeColor = System.Drawing.Color.DarkGreen;
+            this.label1.Location = new System.Drawing.Point(3, 3);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(96, 23);
+            this.label1.TabIndex = 0;
+            // 
+            // button1
+            // 
+            this.button1.Location = new System.Drawing.Point(12, 63);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(75, 23);
+            this.button1.TabIndex = 1;
+            this.button1.Text = "Play";
+            this.button1.UseVisualStyleBackColor = true;
+            this.button1.Click += new System.EventHandler(this.button1_Click);
+            // 
+            // button2
+            // 
+            this.button2.Location = new System.Drawing.Point(136, 12);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(75, 23);
+            this.button2.TabIndex = 2;
+            this.button2.Text = "Open";
+            this.button2.UseVisualStyleBackColor = true;
+            this.button2.Click += new System.EventHandler(this.button2_Click);
+            // 
+            // openFileDialog1
+            // 
+            this.openFileDialog1.FileName = "openFileDialog1";
+            // 
+            // button3
+            // 
+            this.button3.Location = new System.Drawing.Point(136, 63);
+            this.button3.Name = "button3";
+            this.button3.Size = new System.Drawing.Size(75, 23);
+            this.button3.TabIndex = 3;
+            this.button3.Text = "Stop";
+            this.button3.UseVisualStyleBackColor = true;
+            this.button3.Click += new System.EventHandler(this.button3_Click);
+            // 
+            // Player
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(228, 86);
+            this.Controls.Add(this.button3);
+            this.Controls.Add(this.button2);
+            this.Controls.Add(this.button1);
+            this.Controls.Add(this.pnlMusicInfo);
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "Player";
+            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
+            this.Text = "FFmpegPlayer";
+            this.pnlMusicInfo.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Panel pnlMusicInfo;
+        private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.Button button2;
+        private System.Windows.Forms.OpenFileDialog openFileDialog1;
+        private System.Windows.Forms.Button button3;
+        private System.Windows.Forms.Label label1;
+    }
+}
+
diff --git a/examples/FFmpegExamples/Player.cs b/examples/FFmpegExamples/Player.cs
new file mode 100644
index 0000000..91c8d06
--- /dev/null
+++ b/examples/FFmpegExamples/Player.cs
@@ -0,0 +1,90 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Threading;
+
+namespace FFmpegExamples
+{
+    public partial class Player : Form
+    {
+        public Player()
+        {
+            InitializeComponent();
+            this.audio.LivtUpdateEvent += new LiveUpdateCallback(audio_LivtUpdateEvent);
+            
+        }
+
+        void audio_LivtUpdateEvent(object update)
+        {
+            if (InvokeRequired) {
+                BeginInvoke(new TimerCallback(audio_LivtUpdateEvent), new object[] { update });
+                return;
+            }
+            if (this.label1.Text != update.ToString())
+                this.label1.Text = update.ToString();
+        }
+
+        AudioStream audio = new AudioStream();
+        bool canPlay;
+
+        private void button2_Click(object sender, EventArgs e)
+        {
+            if (DialogResult.OK == this.openFileDialog1.ShowDialog()) {
+                string path = this.openFileDialog1.FileName;
+                audio.Open(path);
+                canPlay = true;
+            }
+        }
+
+        Thread thread;
+        private void button1_Click(object sender, EventArgs e)
+        {
+            thread = new Thread(new ThreadStart(RunMusic));
+            thread.IsBackground = true;
+            thread.Start();
+        }
+
+        private void RunMusic()
+        {
+            if (canPlay) {
+                audio.Play();
+            }
+        }
+
+        private void button3_Click(object sender, EventArgs e)
+        {
+            audio.Stop();
+        }
+    }
+}
diff --git a/examples/FFmpegExamples/Player.resx b/examples/FFmpegExamples/Player.resx
new file mode 100644
index 0000000..b96be1b
--- /dev/null
+++ b/examples/FFmpegExamples/Player.resx
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAChl4QAopiGAKOZhgCjmYcAo5mIAKSahwCkmogApZuJAKaciQCmnIoAppyLAKiejACpn44ArKKRAK2j
+        kgCupZUAr6eXALGomACzqZkAsamaALOqmQCyqpsAtKuaALSsnQC0rJ4Atq2eALmxogC7s6UAvbSkALu0
+        pgC+t6sAwbuvAMW8rQDIv7AAycCxAMvFuwDLxrsA08y+ANDMwwDRzcQA08/GANfQwwDa08YA29THANfT
+        ywDY1MwA3dbKAODe2QDi4NoA5OHbAOPh3ADk4dwA5OLdAOTj3gDw6t8A7OnmAO7t6gDx8e8A9fXzAPX2
+        9AD4+fgA+fn4APj6+QD8/v4A/f//AP7//wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAQ0NDQ0NDQ0NDQ0NDMBcDDAwDFzFDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0M3Bw8cAAAAAAAAACsD
+        N0NDQ0NDQ0NDQ0NDQ0NDQ0NDFCctAAAAAAAAAAAAAAAAFENDQ0NDQ0NDQ0NDQ0NDERtAJgAAAAAAAAAA
+        AAAAAAAAABtDQ0NDQ0NDQ0NDQwY+QEAAAAAAAAAAAAAAAAAAAAAAAANDQ0NDQ0NDQ0MGQkBAEAAAAAAA
+        AAAAAAAAAAAAAAAAAAVDQ0NDQ0NDGz1AQEAgAAAAAAAAAAAAAAAAAAAAAAAAABFDQ0NDQ0MdQEBAQCkA
+        AAAAAAA0NQAAAAAAAAAAAAAAAENDQ0NDFkBAQEBAAAAAAAAAGkBAGgAAAAAAAAAAAAAAFENDQzknQEBA
+        QEAlAAAAAAAABwYAAAAAAAAAAAAAAAAAN0NDBkBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQ0MA
+        QEBAQEBAOAAAAAAAAAAAAAAAAAAAAAAAAAAAACtDMTJAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ADEZQkBAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAAFwNAQEBAQEBAQEBAJAAAAAAAAAAAAAAAAAAA
+        AAAAAAAEDkBAQEBAQEBAQEBAQRohAAAAAAAAAAAAAAAAAAAAAAwNQEBAQEBAQEBAQEBAQEA8IwsAAAAA
+        AAAAAAAAAAAADAVAQEBAQEBAQEBAQEBAQEBAQEEJAAAAAAAAAAAAAAADF0JAQEBAQEBAQEBAQEBAQEBA
+        QEA7AAAAAAAAAAAAABcwMEBAQEBAQEBAQEBAQEBAQEBAQEBALgAAAAAAAAAAMUMAQEBAQEBAQEBAQEBA
+        QEBAQEBAQEAtAAAAAAAAACtDQwhAQEBAQEBAQEBAQEBAQEBAQEBAQEAiAAAAAAAAA0NDNydAQEBAQEBA
+        QEBAQEAHCkBAQEBAQAEAAAAAAAA3Q0NDFkBAQEBAQEBAQEBAHjY2HkBAQEBAEwAAAAAAEkNDQ0NDHUBA
+        QEBAQEBAQEA/KipBQEBAQEATAAAAAABDQ0NDQ0MSPUBAQEBAQEBAQEBAQEBAQEBAQAwAAAAAG0NDQ0ND
+        Q0MHQkBAQEBAQEBAQEBAQEBAQEBBAAAAAAJDQ0NDQ0NDQ0MGPkBAQEBAQEBAQEBAQEBAQBEAAAADQ0ND
+        Q0NDQ0NDQ0MRGEBAQEBAQEBAQEBAQEA6AAAAG0NDQ0NDQ0NDQ0NDQ0NDFShBQEBAQEBAQEBAHwAAFEND
+        Q0NDQ0NDQ0NDQ0NDQ0NDNwYALEJAQEBALxIrAzdDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzFwYNDQMXMUND
+        Q0NDQ0NDQ0NDQ//wD///gAH//wAA//wAAD/4AAAf8AAAD+AAAAfgAAAHwAAAA4AAAAGAAAABgAAAAQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA+AAAAfgAAAH8AAAD/gA
+        AB/8AAA//wAA//+AAf//8A//
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/examples/FFmpegExamples/Program.cs b/examples/FFmpegExamples/Program.cs
new file mode 100644
index 0000000..f9d1e8f
--- /dev/null
+++ b/examples/FFmpegExamples/Program.cs
@@ -0,0 +1,47 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace FFmpegExamples
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new Player());
+        }
+    }
+}
diff --git a/examples/FFmpegExamples/Properties/AssemblyInfo.cs b/examples/FFmpegExamples/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..705ef88
--- /dev/null
+++ b/examples/FFmpegExamples/Properties/AssemblyInfo.cs
@@ -0,0 +1,60 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("FFmpegPlayer")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("FFmpegPlayer")]
+[assembly: AssemblyCopyright("Copyright ©  2006")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("2413e115-f73e-4867-8d56-306ae071eada")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/examples/FFmpegExamples/Properties/Resources.Designer.cs b/examples/FFmpegExamples/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..aff0e86
--- /dev/null
+++ b/examples/FFmpegExamples/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.42
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace FFmpegExamples.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FFmpegExamples.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}
diff --git a/examples/FFmpegExamples/Properties/Resources.resx b/examples/FFmpegExamples/Properties/Resources.resx
new file mode 100644
index 0000000..4d26a2a
--- /dev/null
+++ b/examples/FFmpegExamples/Properties/Resources.resx
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+</root>
\ No newline at end of file
diff --git a/examples/FFmpegExamples/README b/examples/FFmpegExamples/README
new file mode 100644
index 0000000..2563561
--- /dev/null
+++ b/examples/FFmpegExamples/README
@@ -0,0 +1,11 @@
+SdlExamples
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are various FFmpeg examples.
+
+Dave Hudson (jendave at yahoo.com)
+
+October 22, 2004
+    Initial release, version 1.0.0.0
diff --git a/examples/FreeGlutExamples/COPYING b/examples/FreeGlutExamples/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/FreeGlutExamples/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/FreeGlutExamples/FreeGlutExamples.csproj b/examples/FreeGlutExamples/FreeGlutExamples.csproj
new file mode 100644
index 0000000..198f718
--- /dev/null
+++ b/examples/FreeGlutExamples/FreeGlutExamples.csproj
@@ -0,0 +1,107 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3B6C7425-AA18-4890-ADF1-56F21095E94E}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>FreeGlutExamples</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.FreeGlut.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>FreeGlutExamples</RootNamespace>
+    <StartupObject>FreeGlutExamples.One</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.FreeGlut\Tao.FreeGlut.csproj">
+      <Name>Tao.FreeGlut</Name>
+      <Project>{87C95364-7158-4D81-83B8-97B649E27ABA}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="One.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.FreeGlut.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/FreeGlutExamples/FreeGlutExamples.sh b/examples/FreeGlutExamples/FreeGlutExamples.sh
new file mode 100755
index 0000000..5a13251
--- /dev/null
+++ b/examples/FreeGlutExamples/FreeGlutExamples.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./FreeGlutExamples.exe "$@"
diff --git a/examples/FreeGlutExamples/Makefile.am b/examples/FreeGlutExamples/Makefile.am
new file mode 100644
index 0000000..f2933a2
--- /dev/null
+++ b/examples/FreeGlutExamples/Makefile.am
@@ -0,0 +1,16 @@
+
+PROGRAM = FreeGlutExamples
+PACKAGES =
+BINARY_LIBS = \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+SYSTEM_LIBS = System
+RESX =
+RESOURCES =
+SOURCES = \
+        One.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.FreeGlut/Tao.FreeGlut.snk
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/FreeGlutExamples/Makefile.in b/examples/FreeGlutExamples/Makefile.in
new file mode 100644
index 0000000..4a2265c
--- /dev/null
+++ b/examples/FreeGlutExamples/Makefile.in
@@ -0,0 +1,363 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/FreeGlutExamples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = FreeGlutExamples
+PACKAGES = 
+BINARY_LIBS = \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+
+SYSTEM_LIBS = System
+RESX = 
+RESOURCES = 
+SOURCES = \
+        One.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.FreeGlut/Tao.FreeGlut.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/FreeGlutExamples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/FreeGlutExamples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/FreeGlutExamples/One.cs b/examples/FreeGlutExamples/One.cs
new file mode 100644
index 0000000..51dd319
--- /dev/null
+++ b/examples/FreeGlutExamples/One.cs
@@ -0,0 +1,355 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original License
+/*
+Copyright (c) 1999 by Pawel W. Olszta
+Written by Pawel W. Olszta, <olszta at sourceforge.net>
+Creation date: czw gru  2 11:58:41 CET 1999
+*/
+#endregion Original License
+
+using System;
+using System.IO;
+using System.Text;
+
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace FreeGlutExamples
+{
+    /// <summary>
+    /// FreeGlut One Example
+    /// </summary>
+    /// <remarks>
+    ///     Hey! This was the original file where freeglut development started. Just
+    ///     note what I have written here at the time. And see the creation date :)
+    /// </remarks>
+    public class One
+    {
+        static int g_LeaveGameMode = 0;
+        static int g_InGameMode = 1;
+
+        static void PrintText(int nX, int nY, string pszText)
+        {
+            int lines = 0;
+
+            /*
+             * Prepare the OpenGL state
+             */
+            Gl.glDisable(Gl.GL_LIGHTING);
+            Gl.glDisable(Gl.GL_DEPTH_TEST);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glPushMatrix();
+            Gl.glLoadIdentity();
+
+            /*
+             * Have an orthogonal projection matrix set
+             */
+            Gl.glOrtho(0, Glut.glutGet(Glut.GLUT_WINDOW_WIDTH),
+                     0, Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT),
+                     -1, +1
+            );
+
+            /*
+             * Now the matrix mode
+             */
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glPushMatrix();
+            Gl.glLoadIdentity();
+
+            /*
+             * Now the main text
+             */
+            Gl.glColor3ub(0, 0, 0);
+            Gl.glRasterPos2i(nX, nY);
+
+            for (int i = 0; i < pszText.Length; i++)
+            {
+                char p = pszText[i];
+                if (p == '\n')
+                {
+                    lines++;
+                    Gl.glRasterPos2i(nX, nY - (lines * 18));
+                }
+
+                Glut.glutBitmapCharacter(Glut.GLUT_BITMAP_HELVETICA_18, (int)p);
+            }
+
+            /*
+             * Revert to the old matrix modes
+             */
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glPopMatrix();
+
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glPopMatrix();
+
+            /*
+             * Restore the old OpenGL states
+             */
+            Gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glEnable(Gl.GL_LIGHTING);
+        }
+
+        /*
+         * This is the display routine for our sample FreeGLUT windows
+         */
+        static float g_fTime = 0.0f;
+
+        public static void SampleDisplay()
+        {
+            /*
+             * Clear the screen
+             */
+            Gl.glClearColor(0f, 0.5f, 1f, 1f);
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            /*
+             * Have the cube rotated
+             */
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glPushMatrix();
+
+            Gl.glRotatef(g_fTime, 0, 0, 1);
+            Gl.glRotatef(g_fTime, 0, 1, 0);
+            Gl.glRotatef(g_fTime, 1, 0, 0);
+
+            /*
+             * And then drawn...
+             */
+            Gl.glColor3f(1, 1, 0);
+            /* glutWireCube( 20.0 ); */
+            Glut.glutWireTeapot(20.0);
+            /* glutWireSpher( 15.0, 15, 15 ); */
+            /* glColor3f( 0, 1, 0 ); */
+            /* glutWireCube( 30.0 ); */
+            /* glutSolidCone( 10, 20, 10, 2 ); */
+
+            /*
+             * Don't forget about the model-view matrix
+             */
+            Gl.glPopMatrix();
+
+            /*
+             * Draw a silly text
+             */
+            if (g_InGameMode == 0)
+                PrintText(20, 20, "Hello there cruel world!");
+            else
+                PrintText(20, 20, "Press ESC to leave the game mode!");
+
+            /*
+             * And swap this context's buffers
+             */
+            Glut.glutSwapBuffers();
+        }
+
+        /*
+         * This is a sample idle function
+         */
+        static void SampleIdle()
+        {
+            g_fTime += 0.5f;
+
+            if (g_LeaveGameMode == 1)
+            {
+                Glut.glutLeaveGameMode();
+                g_LeaveGameMode = 0;
+                g_InGameMode = 0;
+            }
+        }
+
+        /*
+         * The reshape function
+         */
+        static void SampleReshape(int nWidth, int nHeight)
+        {
+            float fAspect = (float)nHeight / (float)nWidth;
+            float[] fPos = new float[4] { 0.0f, 0.0f, 10.0f, 0.0f };
+            float[] fCol = new float[4] { 0.5f, 1.0f, 0.0f, 1.0f };
+
+            /*
+             * Update the viewport first
+             */
+            Gl.glViewport(0, 0, nWidth, nHeight);
+
+            /*
+             * Then the projection matrix
+             */
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glFrustum(-1.0, 1.0, -fAspect, fAspect, 1.0, 80.0);
+
+            /*
+             * Move back the camera a bit
+             */
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -40.0f);
+
+            /*
+             * Enable some features...
+             */
+            Gl.glEnable(Gl.GL_CULL_FACE);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glEnable(Gl.GL_NORMALIZE);
+
+            /*
+             * Set up some lighting
+             */
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, fPos);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+
+            /*
+             * Set up a sample material
+             */
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE, fCol);
+        }
+
+        /*
+         * A sample keyboard callback
+         */
+        static void SampleKeyboard(byte cChar, int nMouseX, int nMouseY)
+        {
+            Console.WriteLine("SampleKeyboard(): keypress '%c' at (%i,%i)\n",
+                    cChar, nMouseX, nMouseY);
+        }
+
+        /*
+         * A sample keyboard callback (for game mode window)
+         */
+        static void SampleGameModeKeyboard(byte cChar, int nMouseX, int nMouseY)
+        {
+            if (cChar == 27)
+                g_LeaveGameMode = 1;
+        }
+
+
+        /*
+        * A sample special callback
+        */
+        static void SampleSpecial(int nSpecial, int nMouseX, int nMouseY)
+        {
+            Console.WriteLine("SampleSpecial(): special keypress %i at (%i,%i)\n",
+                    nSpecial, nMouseX, nMouseY);
+        }
+
+        /*
+         * A sample menu callback
+         */
+        static void SampleMenu(int menuID)
+        {
+            /*
+             * Just print something funny
+             */
+            Console.WriteLine("SampleMenu() callback executed, menuID is %i\n", menuID);
+        }
+
+
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        public static void Main(string[] args)
+        {
+            int menuID, subMenuA, subMenuB;
+
+            Glut.glutInitDisplayString("stencil~2 rgb double depth>=16 samples");
+            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowPosition(100, 100);
+
+            Glut.glutInit();
+
+            subMenuA = Glut.glutCreateMenu(SampleMenu);
+            Glut.glutAddMenuEntry("Sub menu A1 (01)", 1);
+            Glut.glutAddMenuEntry("Sub menu A2 (02)", 2);
+            Glut.glutAddMenuEntry("Sub menu A3 (03)", 3);
+
+            subMenuB = Glut.glutCreateMenu(SampleMenu);
+            Glut.glutAddMenuEntry("Sub menu B1 (04)", 4);
+            Glut.glutAddMenuEntry("Sub menu B2 (05)", 5);
+            Glut.glutAddMenuEntry("Sub menu B3 (06)", 6);
+            Glut.glutAddSubMenu("Going to sub menu A", subMenuA);
+
+            menuID = Glut.glutCreateMenu(SampleMenu);
+            Glut.glutAddMenuEntry("Entry one", 1);
+            Glut.glutAddMenuEntry("Entry two", 2);
+            Glut.glutAddMenuEntry("Entry three", 3);
+            Glut.glutAddMenuEntry("Entry four", 4);
+            Glut.glutAddMenuEntry("Entry five", 5);
+            Glut.glutAddSubMenu("Enter sub menu A", subMenuA);
+            Glut.glutAddSubMenu("Enter sub menu B", subMenuB);
+
+            Glut.glutCreateWindow("Hello world!");
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(SampleDisplay));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(SampleReshape));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(SampleKeyboard));
+            Glut.glutSpecialFunc(new Glut.SpecialCallback(SampleSpecial));
+            Glut.glutIdleFunc(new Glut.IdleCallback(SampleIdle));
+            Glut.glutAttachMenu(Glut.GLUT_LEFT_BUTTON);
+
+            Glut.glutInitWindowPosition(200, 200);
+            Glut.glutCreateWindow("I am not Jan B.");
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(SampleDisplay));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(SampleReshape));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(SampleKeyboard));
+            Glut.glutSpecialFunc(new Glut.SpecialCallback(SampleSpecial));
+            Glut.glutIdleFunc(new Glut.IdleCallback(SampleIdle));
+            Glut.glutAttachMenu(Glut.GLUT_LEFT_BUTTON);
+
+            Console.WriteLine("Testing game mode string parsing, don't panic!\n");
+            Glut.glutGameModeString("320x240:32 at 100");
+            Glut.glutGameModeString("640x480:16 at 72");
+            Glut.glutGameModeString("1024x768");
+            Glut.glutGameModeString(":32 at 120");
+            Glut.glutGameModeString("Toudi glupcze, Danwin bedzie moj!");
+            Glut.glutGameModeString("640x480:16 at 72");
+
+            Glut.glutEnterGameMode();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(SampleDisplay));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(SampleReshape));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(SampleGameModeKeyboard));
+            Glut.glutIdleFunc(new Glut.IdleCallback(SampleIdle));
+            Glut.glutAttachMenu(Glut.GLUT_LEFT_BUTTON);
+
+            Console.WriteLine("current window is %ix%i+%i+%i",
+                    Glut.glutGet(Glut.GLUT_WINDOW_X), Glut.glutGet(Glut.GLUT_WINDOW_Y),
+                    Glut.glutGet(Glut.GLUT_WINDOW_WIDTH), Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT)
+            );
+
+            /*
+             * Enter the main FreeGLUT processing loop
+             */
+            Glut.glutMainLoop();
+
+            Console.WriteLine("glutMainLoop() termination works fine!\n");
+        }
+    }
+}
diff --git a/examples/FreeGlutExamples/Properties/AssemblyInfo.cs b/examples/FreeGlutExamples/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..cb2569f
--- /dev/null
+++ b/examples/FreeGlutExamples/Properties/AssemblyInfo.cs
@@ -0,0 +1,59 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework - http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright �2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("FreeGlutExamples.One")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("A simple FreeGlut example.")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+[assembly: AssemblyKeyName("")]
+#if DEBUG
+[assembly: AssemblyProduct("FreeGlutExamples.One.exe *** Debug Build ***")]
+#else
+[assembly: AssemblyProduct("FreeGlutExamples.One.exe")]
+#endif
+[assembly: AssemblyTitle("A simple FreeGlut example.")]
+[assembly: AssemblyTrademark("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/FreeGlutExamples/README b/examples/FreeGlutExamples/README
new file mode 100644
index 0000000..92644be
--- /dev/null
+++ b/examples/FreeGlutExamples/README
@@ -0,0 +1,23 @@
+FreeGlutExamples
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are C# ports of some official FreeGLUT examples.  The
+originals are available from http://freeglut.sourceforge.net/.
+
+These examples use Tao.FreeGlut, and Tao.OpenGl.  Make sure you
+have the appropriate native libraries for your system installed.
+
+These examples are fairly well documented, however, do not take
+them to be 'best practices' for .NET FreGLUT development.  The
+intent of these ports is as an introduction or as a comparison
+against the original native versions.
+
+Rob Loach
+http://www.taoframework.com
+
+Change Log:
+
+August 24, 2006
+    Initial release, version 1.0.0.0.
diff --git a/examples/FtGlScrolling/FtGlScrolling.cs b/examples/FtGlScrolling/FtGlScrolling.cs
new file mode 100644
index 0000000..cd3dc79
--- /dev/null
+++ b/examples/FtGlScrolling/FtGlScrolling.cs
@@ -0,0 +1,207 @@
+namespace FtGlScrolling
+{
+    using Tao.FtGl;
+    using Tao.FreeGlut;
+    using Tao.FreeType;
+    using Tao.OpenGl;
+    using System;
+    using System.Collections.Generic;
+
+    /// Starfield class. Puts stars at random on the screen.
+    public class StarField
+    {
+        int _nstars;
+        float[] _x, _y, _size;
+
+        public StarField(int nstars)
+        {
+            _nstars = nstars;
+            _x = new float[_nstars];
+            _y = new float[_nstars];
+            _size = new float[_nstars];
+
+            Random rand = new Random();
+            for(int i = 0; i < _nstars; i++)
+            {
+                _x[i] = rand.Next(-100, 100) * 0.1f;
+                _y[i] = rand.Next(-100, 100) * 0.1f;
+                _size[i] = rand.Next(1, 30) * 0.1f;
+            }
+        }
+
+        public void Display()
+        {
+            Gl.glDisable(Gl.GL_FOG);
+            Gl.glColor3f(0.8f, 0.8f, 0.8f);
+
+            for(int i = 0; i < _nstars; i++)
+            {
+                Gl.glPointSize(_size[i]);
+                Gl.glBegin(Gl.GL_POINTS);
+                    Gl.glVertex3f(_x[i], _y[i], -2);
+                Gl.glEnd();
+            }
+        }
+    }
+
+    /// Black fog class. Helps the text fade out.
+    public class BlackFog
+    {
+        float density = 0.06f;
+        float []fogColor = new float[4]{0.0f, 0.0f, 0.0f, 1.0f};
+
+        public void Display()
+        {
+            Gl.glEnable(Gl.GL_FOG);
+            Gl.glFogi(Gl.GL_FOG_MODE, Gl.GL_EXP2);
+            Gl.glFogfv(Gl.GL_FOG_COLOR, fogColor);
+            Gl.glFogf(Gl.GL_FOG_START, 5000.0f);
+            Gl.glFogf(Gl.GL_FOG_END, 10000.0f);
+            Gl.glFogf(Gl.GL_FOG_DENSITY, density);
+            Gl.glHint(Gl.GL_FOG_HINT, Gl.GL_NICEST);
+        }
+    }
+
+    /// The scrolltext class. This is where the FTGL stuff happens.
+    public class ScrollText
+    {
+        DateTime _starttime;
+        FtGl.FTSimpleLayout _layout;
+        FtGl.FTFont _font;
+        float _width = 15.0f;
+        string _text;
+
+        public ScrollText(string text)
+        {
+            _font = new FtGl.FTGLExtrudeFont("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf");
+            _font.Depth(0.01f);
+            _font.FaceSize(1);
+            _font.Outset(0.0f, 0.02f);
+            _font.CharMap(FT_Encoding.FT_ENCODING_UNICODE);
+
+            _layout = new FtGl.FTSimpleLayout();
+            _layout.SetLineLength(_width);
+            _layout.SetFont(_font);
+            _layout.SetAlignment(FtGl.TextAlignment.ALIGN_CENTER);
+
+            _text = text;
+            _starttime = DateTime.Now;
+        }
+
+        public void Display()
+        {
+            TimeSpan span = DateTime.Now.Subtract(_starttime);
+            float translate = -10.0f + (float)span.TotalSeconds / 2;
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-_width / 2, 0, 0);
+                Gl.glRotatef(-90, 1, 0, 0);
+                Gl.glTranslatef(0, translate, 0);
+                Gl.glPushMatrix();
+                    Gl.glColor3f(1.0f, 1.0f, 0.0f);
+                    _layout.RenderMode(_text, FtGl.RenderMode.RENDER_FRONT);
+                    Gl.glColor3f(0.8f, 0.8f, 0.0f);
+                    _layout.RenderMode(_text, FtGl.RenderMode.RENDER_SIDE);
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+        }
+
+        public void Destroy()
+        {
+            _font.Destroy();
+            _layout.Destroy();
+        }
+    }
+
+    /// Our main OpenGL application class.
+    public class FtGlScrolling
+    {
+        static StarField _starfield;
+        static ScrollText _scrolltext;
+        static BlackFog _blackfog;
+
+        static private void Idle()
+        {
+            Glut.glutPostRedisplay();
+        }
+
+        static private void Reshape(int w, int h)
+        {
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(45, (float)w / (float)h, 1, 1000);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glViewport(0, 0, w, h);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(0.0f, 5.0f, 15.0f,
+                          0.0f, 0.0f, 0.0f,
+                          0.0f, 1.0f, 0.0f);
+        }
+
+        static private void Display()
+        {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.8f);
+
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            _starfield.Display();
+            _blackfog.Display();
+            _scrolltext.Display();
+
+            Glut.glutSwapBuffers();
+        }
+
+        static private void Parsekey(byte key, int x, int y)
+        {
+            int k = Convert.ToInt32(key.ToString());
+            switch(k)
+            {
+                case 27:
+                    _scrolltext.Destroy();
+                    System.Environment.Exit(0);
+                    break;
+            }
+        }
+
+        static void Main(string[] args)
+        {
+            _starfield = new StarField(150);
+            _blackfog = new BlackFog();
+            _scrolltext = new ScrollText(
+                "FTGL 2.1.3: A NEW VERSION\n"
+              + "\n"
+              + "FTGL is a free cross-platform Open Source library that "
+              + "uses Freetype2 to simplify rendering fonts in OpenGL "
+              + "applications. FTGL supports bitmap, pixmap, texture map, "
+              + "outline, polygon mesh, and extruded polygon rendering "
+              + "modes.\n"
+              + "\n"
+              + "FTGL offers both a C++ and a plain C programming interface. "
+              + "Various bindings exist for other languages such as Python or "
+              + "Ruby. This program was done in C# using FTGL's .NET "
+              + "language bindings.\n"
+              + "\n"
+              + "It's time to press ESC because this is the end of the "
+              + "scrolltext."
+              + "\n\n\n\n\n\n\n\n\n\n\n\n\n"
+              + "No, really.\n"
+              + "\n\n\n\n\n\n\n\n\n\n\n\n\n"
+              + "It's over.\n"
+              + "\n\n\n\n\n\n\n\n\n\n\n\n\n"
+              + "Please let go now!");
+
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DEPTH | Glut.GLUT_RGB | Glut.GLUT_DOUBLE);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutInitWindowSize(480, 270);
+            Glut.glutCreateWindow("FTGL scrolltext");
+            Glut.glutDisplayFunc(Display);
+            Glut.glutKeyboardFunc(Parsekey);
+            Glut.glutReshapeFunc(Reshape);
+            Glut.glutIdleFunc(Idle);
+            Glut.glutMainLoop();
+        }
+    }
+}
+
diff --git a/examples/FtGlScrolling/FtGlScrolling.csproj b/examples/FtGlScrolling/FtGlScrolling.csproj
new file mode 100644
index 0000000..fbf6a07
--- /dev/null
+++ b/examples/FtGlScrolling/FtGlScrolling.csproj
@@ -0,0 +1,158 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6899DB22-2477-42CD-813C-ED77011AE28F}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>FtGlScrolling</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.FtGl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>FtGlScrolling</RootNamespace>
+    <StartupObject>FtGlScrolling.FtGlScrolling</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.FreeGlut\Tao.FreeGlut.csproj">
+      <Project>{87C95364-7158-4D81-83B8-97B649E27ABA}</Project>
+      <Name>Tao.FreeGlut</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.FreeType\Tao.FreeType.csproj">
+      <Project>{C04A3F9B-E8C5-42F2-9E15-1B2E71264881}</Project>
+      <Name>Tao.FreeType</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.FtGl\Tao.FtGl.csproj">
+      <Project>{AB1A37A9-854C-4C38-BE80-0D2A0502C7A6}</Project>
+      <Name>Tao.FtGl</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.Lua\Tao.Lua.csproj">
+      <Name>Tao.Lua</Name>
+      <Project>{11D88031-4650-43D5-B626-4C3E9A276923}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Name>Tao.OpenGl</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="FtGlScrolling.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.FtGl.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/FtGlScrolling/FtGlScrolling.sh b/examples/FtGlScrolling/FtGlScrolling.sh
new file mode 100755
index 0000000..ea2acf0
--- /dev/null
+++ b/examples/FtGlScrolling/FtGlScrolling.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./FtGlScrolling.exe "$@"
diff --git a/examples/FtGlScrolling/Makefile.am b/examples/FtGlScrolling/Makefile.am
new file mode 100644
index 0000000..5725764
--- /dev/null
+++ b/examples/FtGlScrolling/Makefile.am
@@ -0,0 +1,14 @@
+
+PROGRAM = FtGlScrolling
+PACKAGES =
+BINARY_LIBS = Tao.FtGl.dll Tao.OpenGl.dll Tao.FreeGlut.dll Tao.FreeType.dll
+SYSTEM_LIBS = System
+RESX =
+RESOURCES =
+SOURCES = \
+        FtGlScrolling.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.FtGl/Tao.FtGl.snk
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/FtGlScrolling/Makefile.in b/examples/FtGlScrolling/Makefile.in
new file mode 100644
index 0000000..7bca4c8
--- /dev/null
+++ b/examples/FtGlScrolling/Makefile.in
@@ -0,0 +1,360 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am
+subdir = examples/FtGlScrolling
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = FtGlScrolling
+PACKAGES = 
+BINARY_LIBS = Tao.FtGl.dll Tao.OpenGl.dll Tao.FreeGlut.dll Tao.FreeType.dll
+SYSTEM_LIBS = System
+RESX = 
+RESOURCES = 
+SOURCES = \
+        FtGlScrolling.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.FtGl/Tao.FtGl.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/FtGlScrolling/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/FtGlScrolling/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/FtGlScrolling/Properties/AssemblyInfo.cs b/examples/FtGlScrolling/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0cb9e70
--- /dev/null
+++ b/examples/FtGlScrolling/Properties/AssemblyInfo.cs
@@ -0,0 +1,57 @@
+#region License
+/*
+MIT License
+Copyright ©2008 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright ©2008 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.FtGl")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework FtGl Binding For .NET")]
+[assembly: AssemblyFileVersion("2.1.3.0")]
+[assembly: AssemblyInformationalVersion("2.1.3.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.FtGl.dll")]
+[assembly: AssemblyTitle("Tao Framework FtGl Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("2.1.3.0")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/FtGlSimple/FtGlSimple.cs b/examples/FtGlSimple/FtGlSimple.cs
new file mode 100644
index 0000000..ae65aca
--- /dev/null
+++ b/examples/FtGlSimple/FtGlSimple.cs
@@ -0,0 +1,472 @@
+namespace FtGlSimple
+{
+    using Tao.FtGl;
+    using Tao.FreeGlut;
+    using Tao.FreeType;
+    using Tao.OpenGl;
+    using System;
+    using System.Reflection;
+    public class FtGlSimple
+    {
+        static float[] texture = new float[]{ 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+                                              1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+                                              0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
+                                              0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
+
+        private const int FTGL_BITMAP=0;
+        private const int FTGL_PIXMAP = 1;
+        private const int FTGL_OUTLINE = 2;
+        private const int FTGL_POLYGON = 3;
+        private const int FTGL_EXTRUDE = 4;
+        private const int FTGL_TEXTURE = 5;
+        private static int current_font = FTGL_EXTRUDE;
+
+        private static int w_win = 640, h_win = 480;
+        private enum mode_t{INTERACTIVE, EDITING};
+        private static mode_t mode = mode_t.INTERACTIVE;
+
+        private static string myString = "a";
+
+        static private void setUpLighting()
+        {
+            // Set up lighting.
+            float[] light1_ambient = new float [] { 1.0f, 1.0f, 1.0f, 1.0f };
+            float[] light1_diffuse  = new float [] { 1.0f, 0.9f, 0.9f, 1.0f };
+            float[] light1_specular = new float [] { 1.0f, 0.7f, 0.7f, 1.0f };
+            float[] light1_position = new float [] { -1.0f, 1.0f, 1.0f, 0.0f };
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT,  light1_ambient);
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE,  light1_diffuse);
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_SPECULAR, light1_specular);
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, light1_position);
+            Gl.glEnable(Gl.GL_LIGHT1);
+
+            float[] light2_ambient  = new float [] { 0.2f, 0.2f, 0.2f, 1.0f };
+            float[] light2_diffuse  = new float [] { 0.9f, 0.9f, 0.9f, 1.0f };
+            float[] light2_specular = new float [] { 0.7f, 0.7f, 0.7f, 1.0f };
+            float[] light2_position = new float [] { 1.0f, -1.0f, -1.0f, 0.0f };
+            Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_AMBIENT,  light2_ambient);
+            Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_DIFFUSE,  light2_diffuse);
+            Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_SPECULAR, light2_specular);
+            Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_POSITION, light2_position);
+            //Gl.glEnable(Gl.GL_LIGHT2);
+
+            float[] front_emission = new float [] { 0.3f, 0.2f, 0.1f, 0.0f };
+            float[] front_ambient  = new float [] { 0.2f, 0.2f, 0.2f, 0.0f };
+            float[] front_diffuse  = new float [] { 0.95f, 0.95f, 0.8f, 0.0f };
+            float[] front_specular = new float [] { 0.6f, 0.6f, 0.6f, 0.0f };
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, front_emission);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, front_ambient);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, front_diffuse);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, front_specular);
+            Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 16.0f);
+            Gl.glColor4fv(front_diffuse);
+
+            Gl.glLightModeli(Gl.GL_LIGHT_MODEL_TWO_SIDE, Gl.GL_FALSE);
+            Gl.glColorMaterial(Gl.GL_FRONT, Gl.GL_DIFFUSE);
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+        }
+
+        const string fontName = "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif-BoldItalic.ttf";
+        static FtGl.FTFont[] fonts = new FtGl.FTFont[6];
+        static FtGl.FTFont infoFont = new FtGl.FTGLPixmapFont(fontName);
+
+        private static void setUpFonts()
+        {
+            fonts[FTGL_BITMAP] = new FtGl.FTGLBitmapFont(fontName);
+            fonts[FTGL_PIXMAP] = new FtGl.FTGLPixmapFont(fontName);
+            fonts[FTGL_OUTLINE] = new FtGl.FTGLOutlineFont(fontName);
+            fonts[FTGL_POLYGON] = new FtGl.FTGLPolygonFont(fontName);
+            fonts[FTGL_EXTRUDE] = new FtGl.FTGLExtrudeFont(fontName);
+            fonts[FTGL_TEXTURE] = new FtGl.FTGLTextureFont(fontName);
+
+            for( int x = 0; x < 6; ++x)
+            {
+                if( fonts[x].Error() < 0)
+                {
+                    Console.WriteLine("Failed to open font {0}", fontName);
+                    System.Environment.Exit(0);
+                }
+
+                if( fonts[x].FaceSize( 144) == 0)
+                {
+                    Console.WriteLine("Failed to set size");
+                    System.Environment.Exit(0);
+                }
+
+                fonts[x].Depth(20);
+
+                fonts[x].CharMap( FT_Encoding.FT_ENCODING_UNICODE);
+            }
+
+            //infoFont.FTGLPixmapFont(fontName);
+
+            if( infoFont.Error() < 0)
+            {
+                Console.WriteLine("Failed to open font {0}", fontName);
+                System.Environment.Exit(0);
+            }
+
+            infoFont.FaceSize( 18);
+
+            //myString[0] = 65;
+            //myString[1] = 0;
+        }
+
+        static private void renderFontmetrics()
+        {
+            float x1, y1, z1, x2, y2, z2;
+            fonts[(int)current_font].BBox( myString, out x1, out y1, out z1, out x2, out y2, out z2);
+
+            // Draw the bounding box
+            Gl.glDisable( Gl.GL_LIGHTING);
+            Gl.glDisable( Gl.GL_TEXTURE_2D);
+            Gl.glEnable( Gl.GL_LINE_SMOOTH);
+            Gl.glEnable(Gl.GL_BLEND);
+            Gl.glBlendFunc( Gl.GL_SRC_ALPHA, Gl.GL_ONE); // GL_ONE_MINUS_SRC_ALPHA
+
+            Gl.glColor3f( 0.0f, 1.0f, 0.0f);
+            // Draw the front face
+            Gl.glBegin( Gl.GL_LINE_LOOP);
+                Gl.glVertex3f( x1, y1, z1);
+                Gl.glVertex3f( x1, y2, z1);
+                Gl.glVertex3f( x2, y2, z1);
+                Gl.glVertex3f( x2, y1, z1);
+            Gl.glEnd();
+            // Draw the back face
+            if( current_font == FTGL_EXTRUDE && z1 != z2)
+            {
+                Gl.glBegin( Gl.GL_LINE_LOOP);
+                    Gl.glVertex3f( x1, y1, z2);
+                    Gl.glVertex3f( x1, y2, z2);
+                    Gl.glVertex3f( x2, y2, z2);
+                    Gl.glVertex3f( x2, y1, z2);
+                Gl.glEnd();
+            // Join the faces
+                Gl.glBegin( Gl.GL_LINES);
+                    Gl.glVertex3f( x1, y1, z1);
+                    Gl.glVertex3f( x1, y1, z2);
+
+                    Gl.glVertex3f( x1, y2, z1);
+                    Gl.glVertex3f( x1, y2, z2);
+
+                    Gl.glVertex3f( x2, y2, z1);
+                    Gl.glVertex3f( x2, y2, z2);
+
+                    Gl.glVertex3f( x2, y1, z1);
+                    Gl.glVertex3f( x2, y1, z2);
+                Gl.glEnd();
+            }
+             // Draw the baseline, Ascender and Descender
+            Gl.glBegin( Gl.GL_LINES);
+                Gl.glColor3f( 0.0f, 0.0f, 1.0f);
+                Gl.glVertex3f( 0.0f, 0.0f, 0.0f);
+                Gl.glVertex3f( fonts[(int)current_font].Advance( myString), 0.0f, 0.0f);
+                Gl.glVertex3f( 0.0f, fonts[(int)current_font].Ascender(), 0.0f);
+                Gl.glVertex3f( 0.0f, fonts[(int)current_font].Descender(), 0.0f);
+            Gl.glEnd();
+
+            // Draw the origin
+            Gl.glColor3f( 1.0f, 0.0f, 0.0f);
+            Gl.glPointSize( 5.0f);
+            Gl.glBegin( Gl.GL_POINTS);
+                Gl.glVertex3f( 0.0f, 0.0f, 0.0f);
+            Gl.glEnd();
+        }
+        private static void renderFontInfo()
+        {
+            Gl.glMatrixMode( Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluOrtho2D(0f, (float)w_win, 0f, (float)h_win);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+
+            // draw mode
+            Gl.glColor3f( 1.0f, 1.0f, 1.0f);
+            Gl.glRasterPos2f( 20.0f , h_win - ( 20.0f + infoFont.Ascender()));
+
+            switch( mode)
+            {
+                case mode_t.EDITING:
+                    infoFont.Render("Edit Mode");
+                    break;
+                case mode_t.INTERACTIVE:
+                    break;
+            }
+
+            // draw font type
+            Gl.glRasterPos2i( 20 , 20);
+            switch( current_font)
+            {
+                case FTGL_BITMAP:
+                    infoFont.Render("Bitmap Font");
+                    break;
+                case FTGL_PIXMAP:
+                    infoFont.Render("Pixmap Font");
+                    break;
+                case FTGL_OUTLINE:
+                    infoFont.Render("Outline Font");
+                    break;
+                case FTGL_POLYGON:
+                    infoFont.Render("Polygon Font");
+                    break;
+                case FTGL_EXTRUDE:
+                    infoFont.Render("Extruded Font");
+                    break;
+                case FTGL_TEXTURE:
+                    infoFont.Render("Texture Font");
+                    break;
+            }
+
+            Gl.glRasterPos2f( 20.0f , 20.0f + infoFont.LineHeight());
+            infoFont.Render(fontName);
+        }
+        static int textureID;
+        private static void do_display ()
+        {
+            switch( current_font)
+            {
+                case FTGL_BITMAP:
+                case FTGL_PIXMAP:
+                case FTGL_OUTLINE:
+                    break;
+                case FTGL_POLYGON:
+                    Gl.glEnable( Gl.GL_TEXTURE_2D);
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, textureID);
+                    Gl.glDisable( Gl.GL_BLEND);
+                    setUpLighting();
+                    break;
+                case FTGL_EXTRUDE:
+                    Gl.glEnable( Gl.GL_DEPTH_TEST);
+                    Gl.glDisable( Gl.GL_BLEND);
+                    Gl.glEnable( Gl.GL_TEXTURE_2D);
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, textureID);
+                    setUpLighting();
+                    break;
+                case FTGL_TEXTURE:
+                    Gl.glEnable( Gl.GL_TEXTURE_2D);
+                    Gl.glDisable( Gl.GL_DEPTH_TEST);
+                    setUpLighting();
+                    Gl.glNormal3f( 0.0f, 0.0f, 1.0f);
+                    break;
+
+            }
+
+            Gl.glColor3f( 1.0f, 1.0f, 1.0f);
+        // If you do want to switch the color of bitmaps rendered with glBitmap,
+        // you will need to explicitly call glRasterPos3f (or its ilk) to lock
+        // in a changed current color.
+            Gl.glPushMatrix();
+                fonts[(int)current_font].Render( myString);
+            Gl.glPopMatrix();
+
+            Gl.glPushMatrix();
+                renderFontmetrics();
+            Gl.glPopMatrix();
+
+            renderFontInfo();
+        }
+
+        private static void display()
+        {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+               SetCamera();
+
+            switch( current_font)
+            {
+                case FTGL_BITMAP:
+                case FTGL_PIXMAP:
+                    Gl.glRasterPos2i( w_win / 2, h_win / 2);
+                    Gl.glTranslatef(  w_win / 2f, h_win / 2f, 0.0f);
+                    break;
+                case FTGL_OUTLINE:
+                case FTGL_POLYGON:
+                case FTGL_EXTRUDE:
+                case FTGL_TEXTURE:
+                    //tbMatrix();
+                    break;
+            }
+
+            Gl.glPushMatrix();
+
+            do_display();
+
+            Gl.glPopMatrix();
+
+            Glut.glutSwapBuffers();
+        }
+
+        private static void mytest()
+        {
+           int cnt = fonts[0].CharMapCount();
+           Console.WriteLine("CharMap : {0}", cnt);
+           float line = fonts[0].LineHeight();
+           Console.WriteLine("Line Height : {0}", line);
+           float des = fonts[0].Descender();
+           Console.WriteLine("Descender : {0}", des);
+           float asc = fonts[0].Ascender();
+           Console.WriteLine("Ascender : {0}", asc);
+           float adv = fonts[0].Advance("Coucou");
+           Console.WriteLine("Advance : {0}", adv);
+           bool att = fonts[0].Attach("/usr/share/fonts/truetype/FreeMono.ttf");
+           Console.WriteLine("Attach : {0}", att);
+           att = fonts[0].Attach("dsadsadas", 10);
+           Console.WriteLine("Attach : {0}", att);
+
+           fonts[FTGL_EXTRUDE].SetDisplayList(false);
+        }
+
+        private static void myinit()
+        {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glClearColor( 0.13f, 0.17f, 0.32f, 0.0f);
+            Gl.glColor3f( 1.0f, 1.0f, 1.0f);
+
+            Gl.glEnable( Gl.GL_CULL_FACE);
+            Gl.glFrontFace( Gl.GL_CCW);
+
+            Gl.glEnable( Gl.GL_DEPTH_TEST);
+            Gl.glEnable(Gl.GL_CULL_FACE);
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+
+            Gl.glEnable( Gl.GL_POLYGON_OFFSET_LINE);
+            Gl.glPolygonOffset( 1.0f, 1.0f); // ????
+
+            SetCamera();
+
+            //tbInit(GLUT_LEFT_BUTTON);
+            //tbAnimate( Gl.GL_FALSE);
+
+            setUpFonts();
+
+            Gl.glGenTextures(1, out textureID);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, textureID);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB, 4, 4, 0, Gl.GL_RGB, Gl.GL_FLOAT, texture);
+
+
+        }
+
+        static private void parsekey(byte key, int x, int y)
+        {
+            int k = Convert.ToInt32(key.ToString());
+            switch (k)
+            {
+                case 27:
+                    for( int i = 0; i < 6; ++i)
+                        fonts[i].Destroy();
+                    System.Environment.Exit(0);
+                    break;
+                case 13:
+                    if( mode == mode_t.EDITING)
+                    {
+                        mode = mode_t.INTERACTIVE;
+                    }
+                    else
+                    {
+                        mode = mode_t.EDITING;
+                    }
+                    break;
+                case 32:
+                    current_font++;
+                    if((int)current_font > 5)
+                        current_font = 0;
+                    break;
+                default:
+                    byte[] tmp = new byte[1];
+                    tmp[0] = key;
+                    if( mode == mode_t.INTERACTIVE)
+                        myString = System.Text.Encoding.ASCII.GetString(tmp);
+                    else
+                        myString += System.Text.Encoding.ASCII.GetString(tmp);
+                    break;
+                }
+                Glut.glutPostRedisplay();
+        }
+        static private void parseSpecialKey(int key, int x, int y)
+        {
+            switch(key)
+            {
+                case Glut.GLUT_KEY_UP:
+                    current_font = (current_font + 1) % 6;
+                    break;
+                case Glut.GLUT_KEY_DOWN:
+                    current_font = (current_font + 5) % 6;
+                    break;
+            }
+        }
+        static private void mouse(int b, int s, int x, int y)
+        {
+            //tbMouse( button, state, x, y);
+        }
+        static private void motion(int x, int y)
+        {
+            //tbMotion( x, y);
+        }
+        static private void myReshape(int w, int h)
+        {
+            Gl.glMatrixMode (Gl.GL_MODELVIEW);
+            Gl.glViewport (0, 0, w, h);
+            Gl.glLoadIdentity();
+
+            w_win = w;
+            h_win = h;
+            SetCamera();
+
+            //tbReshape(w_win, h_win);
+
+        }
+
+        static private void SetCamera()
+        {
+            switch( current_font)
+            {
+                case FTGL_BITMAP:
+                case FTGL_PIXMAP:
+                    Gl.glMatrixMode( Gl.GL_PROJECTION);
+                    Gl.glLoadIdentity();
+                    Glu.gluOrtho2D(0, w_win, 0, h_win);
+                    Gl.glMatrixMode(Gl.GL_MODELVIEW);
+                    Gl.glLoadIdentity();
+                    break;
+                case FTGL_OUTLINE:
+                case FTGL_POLYGON:
+                case FTGL_EXTRUDE:
+                case FTGL_TEXTURE:
+                    Gl.glMatrixMode (Gl.GL_PROJECTION);
+                    Gl.glLoadIdentity ();
+                    Glu.gluPerspective( 90, (float)w_win / (float)h_win, 1, 1000);
+                    Gl.glMatrixMode(Gl.GL_MODELVIEW);
+                    Gl.glLoadIdentity();
+                    Glu.gluLookAt( 0.0, 0.0, (float)h_win / 2.0f, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+                    break;
+            }
+        }
+
+        static void Main(string[] args)
+        {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DEPTH | Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_MULTISAMPLE);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutInitWindowSize( w_win, h_win);
+            Glut.glutCreateWindow("FTGL TEST");
+            Glut.glutDisplayFunc(display);
+            Glut.glutKeyboardFunc(parsekey);
+            Glut.glutSpecialFunc(parseSpecialKey);
+            Glut.glutMouseFunc(mouse);
+            Glut.glutMotionFunc(motion);
+            Glut.glutReshapeFunc(myReshape);
+            Glut.glutIdleFunc(display);
+
+            myinit();
+            mytest();
+
+            Glut.glutMainLoop();
+
+        }
+    }
+}
diff --git a/examples/FtGlSimple/FtGlSimple.csproj b/examples/FtGlSimple/FtGlSimple.csproj
new file mode 100644
index 0000000..dc6ecf0
--- /dev/null
+++ b/examples/FtGlSimple/FtGlSimple.csproj
@@ -0,0 +1,158 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0C0EFC5C-B5E8-4595-B270-A67D2463FEAA}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>FtGlSimple</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.FtGl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>FtGlSimple</RootNamespace>
+    <StartupObject>FtGlSimple.FtGlSimple</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.FreeGlut\Tao.FreeGlut.csproj">
+      <Project>{87C95364-7158-4D81-83B8-97B649E27ABA}</Project>
+      <Name>Tao.FreeGlut</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.FreeType\Tao.FreeType.csproj">
+      <Project>{C04A3F9B-E8C5-42F2-9E15-1B2E71264881}</Project>
+      <Name>Tao.FreeType</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.FtGl\Tao.FtGl.csproj">
+      <Project>{AB1A37A9-854C-4C38-BE80-0D2A0502C7A6}</Project>
+      <Name>Tao.FtGl</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.Lua\Tao.Lua.csproj">
+      <Name>Tao.Lua</Name>
+      <Project>{11D88031-4650-43D5-B626-4C3E9A276923}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Name>Tao.OpenGl</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="FtGlSimple.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.FtGl.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/FtGlSimple/FtGlSimple.sh b/examples/FtGlSimple/FtGlSimple.sh
new file mode 100755
index 0000000..6fcaa55
--- /dev/null
+++ b/examples/FtGlSimple/FtGlSimple.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./FtGlSimple.exe "$@"
diff --git a/examples/FtGlSimple/Makefile.am b/examples/FtGlSimple/Makefile.am
new file mode 100644
index 0000000..aa467e1
--- /dev/null
+++ b/examples/FtGlSimple/Makefile.am
@@ -0,0 +1,14 @@
+
+PROGRAM = FtGlSimple
+PACKAGES =
+BINARY_LIBS = Tao.FtGl.dll Tao.OpenGl.dll Tao.FreeGlut.dll Tao.FreeType.dll
+SYSTEM_LIBS = System
+RESX =
+RESOURCES =
+SOURCES = \
+        FtGlSimple.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.FtGl/Tao.FtGl.snk
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/FtGlSimple/Makefile.in b/examples/FtGlSimple/Makefile.in
new file mode 100644
index 0000000..057552d
--- /dev/null
+++ b/examples/FtGlSimple/Makefile.in
@@ -0,0 +1,360 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am
+subdir = examples/FtGlSimple
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = FtGlSimple
+PACKAGES = 
+BINARY_LIBS = Tao.FtGl.dll Tao.OpenGl.dll Tao.FreeGlut.dll Tao.FreeType.dll
+SYSTEM_LIBS = System
+RESX = 
+RESOURCES = 
+SOURCES = \
+        FtGlSimple.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.FtGl/Tao.FtGl.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/FtGlSimple/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/FtGlSimple/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/FtGlSimple/Properties/AssemblyInfo.cs b/examples/FtGlSimple/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0cb9e70
--- /dev/null
+++ b/examples/FtGlSimple/Properties/AssemblyInfo.cs
@@ -0,0 +1,57 @@
+#region License
+/*
+MIT License
+Copyright ©2008 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright ©2008 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.FtGl")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework FtGl Binding For .NET")]
+[assembly: AssemblyFileVersion("2.1.3.0")]
+[assembly: AssemblyInformationalVersion("2.1.3.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.FtGl.dll")]
+[assembly: AssemblyTitle("Tao Framework FtGl Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("2.1.3.0")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/GeWangExamples/COPYING b/examples/GeWangExamples/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/GeWangExamples/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/GeWangExamples/ClippingPlanes.cs b/examples/GeWangExamples/ClippingPlanes.cs
new file mode 100644
index 0000000..f9eb9d6
--- /dev/null
+++ b/examples/GeWangExamples/ClippingPlanes.cs
@@ -0,0 +1,427 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+// File: clipping.cpp
+// Desc: sample shows the usage of clipping planes in OpenGL
+//
+// Autumn 2000 - Ge Wang - implementation
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace GeWangExamples
+{
+    #region Class Documentation
+    /// <summary>
+    ///     Shows the usage of clipping planes in OpenGL.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Ge Wang
+    ///         http://www.gewang.com/projects/samples/opengl/clipping.cpp
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class ClippingPlanes {
+        // --- Fields ---
+        #region Private Constants
+        private const float STEP = 2.0f;
+        private const float PI = 3.14159265359f;
+        #endregion Private Constants
+
+        #region Private Fields
+        // width and height of the window
+        private static int windowWidth = 480;
+        private static int windowHeight = 360;
+
+        // whether to animate
+        private static bool isRotating = true;
+
+        // fill mode
+        private static int fillMode = Gl.GL_FILL;
+
+        // light 0 position
+        private static float[] light0Position = {2.0f, 1.2f, 4.0f, 1.0f};
+
+        // light 1 parameters
+        private static float[] light1Ambient = {0.2f, 0.2f, 0.2f, 1.0f};
+        private static float[] light1Diffuse = {1.0f, 1.0f, 1.0f, 1.0f};
+        private static float[] light1Specular = {1.0f, 1.0f, 1.0f, 1.0f};
+        private static float[] light1Position = {-2.0f, 0.0f, -4.0f, 1.0f};
+
+        // toggle each of 3 clipping planes
+        private static bool useClip1 = false;
+        private static bool useClip2 = false;
+        private static bool useClip3 = false;
+
+        // clipping planes
+        private static double[] clippingPlane1 = {1.0, 0.0, 0.0, 0.0};
+        private static double[] clippingPlane2 = {0.0, 1.0, 0.0, 0.0};
+        private static double[] clippingPlane3 = {0.0, 0.0, 1.0, 0.0};
+
+        // modelview stuff
+        private static float angleY = 32.0f;
+        private static float increment = 0.0f;
+        private static float eyeY = 0;
+
+        // translation for the clipping planes
+        private static float clipX = 0.0f;
+        private static float clipY = 0.0f;
+        private static float clipZ = 0.0f;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run()
+        {
+            // initialize GLUT
+            Glut.glutInit();
+            // double buffer, use rgb color, enable depth buffer
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            // initialize the window size
+            Glut.glutInitWindowSize(windowWidth, windowHeight);
+            // set the window postion
+            Glut.glutInitWindowPosition(100, 100);
+            // create the window
+            Glut.glutCreateWindow("Clipping Planes");
+
+            // set the display function - called when redrawing
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            // set the idle function - called when idle
+            if(isRotating) {
+                Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            }
+            else {
+                Glut.glutIdleFunc(null);
+            }
+            // set the keyboard function - called on keyboard events
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            // set the mouse function - called on mouse stuff
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            // set the reshape function - called when client area changes
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            // do our own initialization
+            Init();
+
+            // let GLUT handle the current thread from here
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     Sets initial OpenGL states and initializes any application data.
+        /// </summary>
+        private static void Init() {
+            // set the GL clear color - use when the color buffer is cleared
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+            // set the shading model to 'smooth'
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+            // enable depth
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            // set the front faces of polygons
+            Gl.glFrontFace(Gl.GL_CCW);
+            // set fill mode
+            Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, fillMode);
+
+            // enable lighting
+            Gl.glEnable(Gl.GL_LIGHTING);
+            // enable lighting for front
+            Gl.glLightModeli(Gl.GL_FRONT, Gl.GL_TRUE);
+            // material have diffuse and ambient lighting 
+            Gl.glColorMaterial(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE);
+            // enable color
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
+
+            // enable light 0
+            Gl.glEnable(Gl.GL_LIGHT0);
+
+            // setup and enable light 1
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT, light1Ambient);
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, light1Diffuse);
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_SPECULAR, light1Specular);
+            Gl.glEnable(Gl.GL_LIGHT1);
+
+            Console.WriteLine("----------------------------------------------------");
+            Console.WriteLine("Clipping Planes sample in OpenGL");
+            Console.WriteLine("----------------------------------------------------");
+            Console.WriteLine("'1' - toggle x=0 halfplane");
+            Console.WriteLine("'2' - toggle y=0 halfplane");
+            Console.WriteLine("'3' - toggle z=0 halfplane");
+            Console.WriteLine("'j', 'l' - translate x=0 halfplane (when toggled)");
+            Console.WriteLine("',', 'i' - translate y=0 halfplane (when toggled)");
+            Console.WriteLine("'u', 'm' - translate x=0 halfplane (when toggled)");
+            Console.WriteLine("'x', 'y', 'z' - reverse the corresponding half plane");
+            Console.WriteLine();
+            Console.WriteLine("'-', '=' - rotate about y-axis");
+            Console.WriteLine("(L/R) mouse buttons - rotate about y-axis");
+            Console.WriteLine("'[', ']' - rotate viewpoint about x-axis");
+            Console.WriteLine("'f' - toggle fill/wireframe drawmode");
+            Console.WriteLine("----------------------------------------------------");
+            Console.WriteLine();
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     Called to draw the client area.
+        /// </summary>
+        private static void Display() {
+            // clear the color and depth buffers
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                // rotate the sphere about y axis
+                Gl.glRotatef(angleY += increment, 0.0f, 1.0f, 0.0f);
+
+                // set up the clipping planes
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(clipX, 0.0f, 0.0f);
+                    Gl.glClipPlane(Gl.GL_CLIP_PLANE0, clippingPlane1);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(0.0f, clipY, 0.0f);
+                    Gl.glClipPlane(Gl.GL_CLIP_PLANE1, clippingPlane2);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(0.0f, 0.0f, clipZ);
+                    Gl.glClipPlane(Gl.GL_CLIP_PLANE2, clippingPlane3);
+                Gl.glPopMatrix();
+
+                // enable each clipping plane
+                if(useClip1) {
+                    Gl.glEnable(Gl.GL_CLIP_PLANE0);
+                }
+                else {
+                    Gl.glDisable(Gl.GL_CLIP_PLANE0);
+                }
+
+                if(useClip2) {
+                    Gl.glEnable(Gl.GL_CLIP_PLANE1);
+                }
+                else {
+                    Gl.glDisable(Gl.GL_CLIP_PLANE1);
+                }
+
+                if(useClip3) {
+                    Gl.glEnable(Gl.GL_CLIP_PLANE2);
+                }
+                else {
+                    Gl.glDisable(Gl.GL_CLIP_PLANE2);
+                }
+
+                // draw spheres inside of spheres
+                Gl.glColor3f(0.4f, 0.4f, 1.0f);
+                Glut.glutSolidSphere(0.23, 16, 16);
+
+                Gl.glColor3f(1.0f, 0.4f, 0.4f);
+                Glut.glutSolidSphere(0.45, 16, 16);
+
+                Gl.glColor3f(1.0f, 0.8f, 0.4f);
+                Glut.glutSolidSphere(0.71, 16, 16);
+
+                Gl.glColor3f(0.4f, 1.0f, 0.4f);
+                Glut.glutSolidSphere(1.0, 16, 16);
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        /// <summary>
+        ///     Called on a key event.
+        /// </summary>
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 'f':
+                    fillMode = (fillMode == Gl.GL_FILL ? Gl.GL_LINE : Gl.GL_FILL);
+                    Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, fillMode);
+                    break;
+                // toggle the 3 clipping planes
+                case (byte) '1':
+                    useClip1 = !useClip1;
+                    break;
+                case (byte) '2':
+                    useClip2 = !useClip2;
+                    break;
+                case (byte) '3':
+                    useClip3 = !useClip3;
+                    break;
+                // quit app
+                case 27:
+                case (byte) 'Q':
+                case (byte) 'q':
+                    Environment.Exit(0);
+                    break;
+                // set the rotation along the y axis
+                case (byte) '-':
+                    angleY -= STEP * 4.0f;
+                    break;
+                case (byte) '=':
+                    angleY += STEP * 4.0f;
+                    break;
+                // move the view point up and down
+                case (byte) '[':
+                    eyeY -= 0.1f;
+                    break;
+                case (byte) ']':
+                    eyeY += 0.1f;
+                    break;
+                // translate each clipping plane
+                case (byte) 'j':
+                    if(useClip1 && clipX > -1.0f) {
+                        clipX -= 0.1f;
+                    }
+                    break;
+                case (byte) 'l':
+                    if(useClip1 && clipX < 1.0f) {
+                        clipX += 0.1f;
+                    }
+                    break;
+                case (byte) ',':
+                    if(useClip2 && clipY > -1.0f) {
+                        clipY -= 0.1f;
+                    }
+                    break;
+                case (byte) 'i':
+                    if(useClip2 && clipY < 1.0f) {
+                        clipY += 0.1f;
+                    }
+                    break;
+                case (byte) 'u':
+                    if(useClip3 && clipZ > -1.0f) {
+                        clipZ -= 0.1f;
+                    }
+                    break;
+                case (byte) 'm':
+                    if(useClip3 && clipZ < 1.0f) {
+                        clipZ += 0.1f;
+                    }
+                    break;
+                // reverse the half space that is removed
+                case (byte) 'x':
+                    clippingPlane1[0] *= -1;
+                    break;
+                case (byte) 'y':
+                    clippingPlane2[1] *= -1;
+                    break;
+                case (byte) 'z':
+                    clippingPlane3[2] *= -1;
+                    break;
+            }
+
+
+            // do a reshape since eyeY might have changed
+            Reshape(windowWidth, windowHeight);
+            Glut.glutPostRedisplay();
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Idle()
+        private static void Idle() {
+            // render the scene
+            Glut.glutPostRedisplay();
+        }
+        #endregion Idle()
+
+        #region Mouse(int button, int state, int x, int y)
+        /// <summary>
+        ///     Called on a mouse event.
+        /// </summary>
+        private static void Mouse(int button, int state, int x, int y) {
+            if(button == Glut.GLUT_LEFT_BUTTON) {
+                // rotate
+                if(state == Glut.GLUT_DOWN) {
+                    increment -= STEP;
+                }
+                else {
+                    increment += STEP;
+                }
+            }
+            else if (button == Glut.GLUT_RIGHT_BUTTON) {
+                if(state == Glut.GLUT_DOWN) {
+                    increment += STEP;
+                }
+                else {
+                    increment -= STEP;
+                }
+            }
+            else {
+                increment = 0.0f;
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        /// <summary>
+        ///     Called when window size changes.
+        /// </summary>
+        private static void Reshape(int w, int h) {
+            // save the new window size
+            windowWidth = w;
+            windowHeight = h;
+            // map the view port to the client area
+            Gl.glViewport(0, 0, w, h);
+            // set the matrix mode to project
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+            // create the viewing frustum
+            Glu.gluPerspective(45.0, (float) w / (float) h, 1.0, 300.0);
+            // set the matrix mode to modelview
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+            // position the view point
+            Glu.gluLookAt(0.0f, 3.5f * Math.Sin(eyeY), 3.5f * Math.Cos(eyeY), 0.0f, 0.0f, 0.0f, 0.0f, (Math.Cos(eyeY) < 0 ? -1.0f : 1.0f), 0.0f);
+
+            // set the position of the lights
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light0Position);
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, light1Position);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/GeWangExamples/GeWangExamples.Designer.cs b/examples/GeWangExamples/GeWangExamples.Designer.cs
new file mode 100644
index 0000000..150dd30
--- /dev/null
+++ b/examples/GeWangExamples/GeWangExamples.Designer.cs
@@ -0,0 +1,106 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+namespace GeWangExamples
+{
+    partial class GeWang
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GeWang));
+            this.lstExamples = new System.Windows.Forms.ListBox();
+            this.btnRun = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // lstExamples
+            // 
+            this.lstExamples.FormattingEnabled = true;
+            this.lstExamples.Location = new System.Drawing.Point(13, 13);
+            this.lstExamples.Name = "lstExamples";
+            this.lstExamples.Size = new System.Drawing.Size(258, 173);
+            this.lstExamples.Sorted = true;
+            this.lstExamples.TabIndex = 0;
+            this.lstExamples.DoubleClick += new System.EventHandler(this.lstExamples_SelectedIndexChanged);
+            // 
+            // btnRun
+            // 
+            this.btnRun.Location = new System.Drawing.Point(94, 192);
+            this.btnRun.Name = "btnRun";
+            this.btnRun.Size = new System.Drawing.Size(95, 23);
+            this.btnRun.TabIndex = 1;
+            this.btnRun.Text = "Run";
+            this.btnRun.UseVisualStyleBackColor = true;
+            this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+            // 
+            // GeWang
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(283, 224);
+            this.Controls.Add(this.btnRun);
+            this.Controls.Add(this.lstExamples);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "GeWang";
+            this.Text = "GeWangExamples";
+            this.Load += new System.EventHandler(this.frmExamples_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ListBox lstExamples;
+        private System.Windows.Forms.Button btnRun;
+    }
+}
+
diff --git a/examples/GeWangExamples/GeWangExamples.cs b/examples/GeWangExamples/GeWangExamples.cs
new file mode 100644
index 0000000..75a7476
--- /dev/null
+++ b/examples/GeWangExamples/GeWangExamples.cs
@@ -0,0 +1,82 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace GeWangExamples
+{
+    public partial class GeWang : Form
+    {
+        public GeWang()
+        {
+            InitializeComponent();
+        }
+
+        private void frmExamples_Load(object sender, EventArgs e)
+        {
+            Type[] types = Assembly.GetExecutingAssembly().GetTypes();
+            foreach (Type type in types)
+            {
+                MemberInfo[] runMethods = type.GetMember("Run");
+                foreach (MemberInfo run in runMethods)
+                {
+                    lstExamples.Items.Add(type.Name);
+                }
+                if (lstExamples.Items.Count > 0)
+                {
+                    this.lstExamples.SelectedIndex = 0;
+                }
+            }
+        }
+
+        private void btnRun_Click(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+
+        private void SelectExample()
+        {
+            if (lstExamples.SelectedItem != null)
+            {
+                Type example = Assembly.GetExecutingAssembly().GetType("GeWangExamples." + lstExamples.SelectedItem.ToString(), true, true);
+                example.InvokeMember("Run", BindingFlags.InvokeMethod, null, null, null);
+            }
+        }
+
+        private void lstExamples_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+    }
+}
diff --git a/examples/GeWangExamples/GeWangExamples.csproj b/examples/GeWangExamples/GeWangExamples.csproj
new file mode 100644
index 0000000..f799bd0
--- /dev/null
+++ b/examples/GeWangExamples/GeWangExamples.csproj
@@ -0,0 +1,145 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{78748E63-B733-4B50-BE65-05E711E33D4F}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>GeWangExamples</AssemblyName>
+    <AssemblyOriginatorKeyFile>../../src/Tao.OpenGl/Tao.OpenGl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>GeWangExamples</RootNamespace>
+    <StartupObject>GeWangExamples.Program</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.FreeGlut\Tao.FreeGlut.csproj">
+      <Name>Tao.FreeGlut</Name>
+      <Project>{87C95364-7158-4D81-83B8-97B649E27ABA}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="GeWangExamples.resx">
+      <DependentUpon>GeWangExamples.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="GeWangExamples.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ClippingPlanes.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GeWangExamples.Designer.cs">
+      <DependentUpon>GeWangExamples.cs</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Lorenz3d.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Mirror.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Shadow.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Starfield.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Xform.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/GeWangExamples/GeWangExamples.resx b/examples/GeWangExamples/GeWangExamples.resx
new file mode 100644
index 0000000..06ec7be
--- /dev/null
+++ b/examples/GeWangExamples/GeWangExamples.resx
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAChl4QAopiGAKOZhgCjmYcAo5mIAKSahwCkmogApZuJAKaciQCmnIoAppyLAKiejACpn44ArKKRAK2j
+        kgCupZUAr6eXALGomACzqZkAsamaALOqmQCyqpsAtKuaALSsnQC0rJ4Atq2eALmxogC7s6UAvbSkALu0
+        pgC+t6sAwbuvAMW8rQDIv7AAycCxAMvFuwDLxrsA08y+ANDMwwDRzcQA08/GANfQwwDa08YA29THANfT
+        ywDY1MwA3dbKAODe2QDi4NoA5OHbAOPh3ADk4dwA5OLdAOTj3gDw6t8A7OnmAO7t6gDx8e8A9fXzAPX2
+        9AD4+fgA+fn4APj6+QD8/v4A/f//AP7//wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAQ0NDQ0NDQ0NDQ0NDMBcDDAwDFzFDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0M3Bw8cAAAAAAAAACsD
+        N0NDQ0NDQ0NDQ0NDQ0NDQ0NDFCctAAAAAAAAAAAAAAAAFENDQ0NDQ0NDQ0NDQ0NDERtAJgAAAAAAAAAA
+        AAAAAAAAABtDQ0NDQ0NDQ0NDQwY+QEAAAAAAAAAAAAAAAAAAAAAAAANDQ0NDQ0NDQ0MGQkBAEAAAAAAA
+        AAAAAAAAAAAAAAAAAAVDQ0NDQ0NDGz1AQEAgAAAAAAAAAAAAAAAAAAAAAAAAABFDQ0NDQ0MdQEBAQCkA
+        AAAAAAA0NQAAAAAAAAAAAAAAAENDQ0NDFkBAQEBAAAAAAAAAGkBAGgAAAAAAAAAAAAAAFENDQzknQEBA
+        QEAlAAAAAAAABwYAAAAAAAAAAAAAAAAAN0NDBkBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQ0MA
+        QEBAQEBAOAAAAAAAAAAAAAAAAAAAAAAAAAAAACtDMTJAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ADEZQkBAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAAFwNAQEBAQEBAQEBAJAAAAAAAAAAAAAAAAAAA
+        AAAAAAAEDkBAQEBAQEBAQEBAQRohAAAAAAAAAAAAAAAAAAAAAAwNQEBAQEBAQEBAQEBAQEA8IwsAAAAA
+        AAAAAAAAAAAADAVAQEBAQEBAQEBAQEBAQEBAQEEJAAAAAAAAAAAAAAADF0JAQEBAQEBAQEBAQEBAQEBA
+        QEA7AAAAAAAAAAAAABcwMEBAQEBAQEBAQEBAQEBAQEBAQEBALgAAAAAAAAAAMUMAQEBAQEBAQEBAQEBA
+        QEBAQEBAQEAtAAAAAAAAACtDQwhAQEBAQEBAQEBAQEBAQEBAQEBAQEAiAAAAAAAAA0NDNydAQEBAQEBA
+        QEBAQEAHCkBAQEBAQAEAAAAAAAA3Q0NDFkBAQEBAQEBAQEBAHjY2HkBAQEBAEwAAAAAAEkNDQ0NDHUBA
+        QEBAQEBAQEA/KipBQEBAQEATAAAAAABDQ0NDQ0MSPUBAQEBAQEBAQEBAQEBAQEBAQAwAAAAAG0NDQ0ND
+        Q0MHQkBAQEBAQEBAQEBAQEBAQEBBAAAAAAJDQ0NDQ0NDQ0MGPkBAQEBAQEBAQEBAQEBAQBEAAAADQ0ND
+        Q0NDQ0NDQ0MRGEBAQEBAQEBAQEBAQEA6AAAAG0NDQ0NDQ0NDQ0NDQ0NDFShBQEBAQEBAQEBAHwAAFEND
+        Q0NDQ0NDQ0NDQ0NDQ0NDNwYALEJAQEBALxIrAzdDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzFwYNDQMXMUND
+        Q0NDQ0NDQ0NDQ//wD///gAH//wAA//wAAD/4AAAf8AAAD+AAAAfgAAAHwAAAA4AAAAGAAAABgAAAAQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA+AAAAfgAAAH8AAAD/gA
+        AB/8AAA//wAA//+AAf//8A//
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/examples/GeWangExamples/GeWangExamples.sh b/examples/GeWangExamples/GeWangExamples.sh
new file mode 100755
index 0000000..af87549
--- /dev/null
+++ b/examples/GeWangExamples/GeWangExamples.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./GeWangExamples.exe "$@"
diff --git a/examples/GeWangExamples/Lorenz3d.cs b/examples/GeWangExamples/Lorenz3d.cs
new file mode 100644
index 0000000..02afb90
--- /dev/null
+++ b/examples/GeWangExamples/Lorenz3d.cs
@@ -0,0 +1,454 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+// File: lorenz3d.cpp
+// Desc: 3d animation (with roller coaster view!) for lorenz attractor.
+//
+//       [L|R] mouse buttons - rotate ( 3rd person only )
+//       's' start the tracer over
+//       'p' toggle plot [all] or [to tracer]
+//       'v' change view between [3rd person] and [roller coaster]
+//       'm' toggle drawing mode between line | points
+//       '-' or '=' zoom in or out ( 3rd person only )
+//
+// autumn 2000 - Ge Wang - implementation
+//             - Dr. Xiaobai Sun (xiaobai at cs.duke.edu) - professor
+//
+//       http://www.gewang.com/projects/lorenz3d/
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace GeWangExamples
+{
+    #region Class Documentation
+    /// <summary>
+    ///     3d animation (with roller coaster view!) for lorenz attractor.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Ge Wang
+    ///         http://www.gewang.com/projects/lorenz3d/lorenz3d.cpp
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lorenz3d {
+        // --- Fields ---
+        #region Private Constants
+        private const float LORENZ3D_VERSION = 1.00f;
+        private const float FLT_MAX = 1E+37f;
+        #endregion Private Constants
+
+        #region Private Fields
+        // width and height of the window
+        private static int windowWidth = 480;
+        private static int windowHeight = 360;
+
+        // axis parallel bounding box
+        private static float[] boundLow = {FLT_MAX, FLT_MAX, FLT_MAX};
+        private static float[] boundHigh = {-FLT_MAX, -FLT_MAX, -FLT_MAX};
+
+        // the vertex array of data points
+        private static float[][] vertexArray;
+        private static int numberOfVertices = 0;
+
+        // the current glBegin draw mode
+        private static int drawingMode = Gl.GL_LINE_STRIP;
+
+        // 3rd person or the in your face
+        private static bool viewRollerCoaster = false;
+
+        // draw to tracer
+        private static bool drawTracer = false;
+        // start the tracer over
+        private static bool resetTracer = false;
+
+        // increment to change rotation
+        private static float delta = 4.8f;
+        // angle in degree to rotate
+        private static float rotation = 0.0f;
+        // zoom factor
+        private static float zoomFactor = 0.0f;
+
+        private static int index = 0;
+        private static float deg = 128.0f;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run()
+        {
+            // initialize GLUT
+            Glut.glutInit();
+            // double buffer, use rgb color, enable depth buffers
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            // initialize the window size
+            Glut.glutInitWindowSize(windowWidth, windowHeight);
+            // set the window postion
+            Glut.glutInitWindowPosition(100, 100);
+            // create the window
+            Glut.glutCreateWindow("Lorenz3d");
+
+            // set the display function - called when redrawing
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            // set the idle function - called when idle
+            Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            // set the keyboard function - called on keyboard events
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            // set the mouse function - called on mouse stuff
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            // set the reshape function - called when client area changes
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            // do our own initialization
+            Init();
+
+            // let GLUT handle the current thread from here
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region BuildVertices(double a, double b, double c, double T, double h, double x, double y, double z)
+        private static void BuildVertices(double a, double b, double c, double T, double h, double x, double y, double z) {
+            double _x = x;
+            double _y = y;
+            double _z = z;
+
+            // clean up any memory
+            CleanUp();
+
+            // num = T / h
+            numberOfVertices = (int) (T / h + 0.5);
+
+            // allocate data point array
+            vertexArray = new float[numberOfVertices][];
+
+            for(int i = 0; i < numberOfVertices; i++) {
+                // allocate the current data point
+                vertexArray[i] = new float[3];
+
+                // calculate the next vertex
+                vertexArray[i][0] = (float) _x;
+                vertexArray[i][1] = (float) _y;
+                vertexArray[i][2] = (float) _z;
+
+                // find bounding box
+                if(_x < boundLow[0]) {
+                    boundLow[0] = (float) _x;
+                }
+                if(_y < boundLow[1]) { 
+                    boundLow[1] = (float) _y;
+                }
+                if(_z < boundLow[2]) {
+                    boundLow[2] = (float) _z;
+                }
+
+                if(_x > boundHigh[0]) {
+                    boundHigh[0] = (float) _x;
+                }
+                if(_y > boundHigh[1]) {
+                    boundHigh[1] = (float) _y;
+                }
+                if(_z > boundHigh[2]) {
+                    boundHigh[2] = (float) _z;
+                }
+
+                // calculate next point by forward Euler
+                _x = x + h * (a * (y - x));
+                _y = y + h * (x * (b - z) - y);
+                _z = z + h * (x * y - c * z);
+
+                x = _x;
+                y = _y;
+                z = _z;
+            }
+
+            // reshape since the bounding box could have been changed
+            Reshape(windowWidth, windowHeight);
+        }
+        #endregion BuildVertices(double a, double b, double c, double T, double h, double x, double y, double z)
+
+        #region CleanUp()
+        private static void CleanUp() {
+            vertexArray = null;
+            numberOfVertices = 0;
+            for(int i = 0; i < 3; i++) {
+                boundLow[i] = FLT_MAX;
+                boundHigh[i] = -FLT_MAX;
+            }
+        }
+        #endregion CleanUp()
+
+        #region Init()
+        /// <summary>
+        ///     Sets initial OpenGL states and initializes any application data.
+        /// </summary>
+        private static void Init() {
+            // set the GL clear color - use when the color buffer is cleared
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            // set the shading model to 'smooth'
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+            // render front of polygons
+            Gl.glPolygonMode(Gl.GL_FRONT, Gl.GL_POLYGON);
+            // enable depth
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            // set the initial line width
+            Gl.glLineWidth(1.0f);
+
+            // construct lorenz data points
+            BuildVertices(10.0, 28.0, 8.0 / 3.0, 100.0, 0.01, 0.1, 0.0, 0.0);
+
+            Console.WriteLine("--------------------------------------------------");
+            Console.WriteLine("Lorenz Attractor 3D (v{0:F2})", LORENZ3D_VERSION);
+            Console.WriteLine("--------------------------------------------------");
+            Console.WriteLine("[L/R] mouse button - (3rd person view) rotate view\n");
+            Console.WriteLine("'s' - reset tracer to beginning");
+            Console.WriteLine("'p' - toggle plot [all points] | [up to tracer]");
+            Console.WriteLine("'v' - toggle [3rd person] | [roller coaster] view");
+            Console.WriteLine("    (try differrent combinations of 's','p','v')\n");
+            Console.WriteLine("'-' - (3rd person view) zoom in");
+            Console.WriteLine("'=' - (3rd person view) zoom out");
+            Console.WriteLine("'m' - (3rd person view) mode [line] | [point]\n");
+            Console.WriteLine("'q' - quit progrqam");
+            Console.WriteLine("--------------------------------------------------");
+            Console.WriteLine("http://www.gewang.com/projects/lorenz3d/");
+            Console.WriteLine("http://www.taoframework.com");
+            Console.WriteLine("--------------------------------------------------");
+            Console.WriteLine();
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     Called to draw the client area.
+        /// </summary>
+        private static void Display() {
+            float mz = (boundLow[2] + boundHigh[2]) / 2;
+            int i;
+            int num = (drawTracer ? index : numberOfVertices - 1);
+
+            // clear the color
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glPushMatrix();
+                // increment our current index (where tracer is)
+                if(++index >= numberOfVertices) {
+                    index = 0;
+                }
+                if(resetTracer) {
+                    index = 0;
+                    resetTracer = false;
+                }
+
+                // make references to next 4 data points
+                float[] a = vertexArray[index];
+                float[] b = vertexArray[(index + 1 >= numberOfVertices - 1 ? 0 : index + 1)];
+                float[] c = vertexArray[(index + 2 >= numberOfVertices - 1 ? 0 : index + 2)];
+                float[] d = vertexArray[(index + 3 >= numberOfVertices - 1 ? 0 : index + 3)];
+
+                if(!viewRollerCoaster) { // 3rd person
+                    // rotates the polygon about the z-axis
+                    Gl.glRotatef(deg, 0.0f, 1.0f, 0.0f);
+                    deg += rotation;
+
+                    // center on axis of rotation
+                    Gl.glTranslatef(0.0f, 0.0f, -mz);
+                }
+                else { // 1st person
+                    // roller coaster view (chase the tracer)
+                    Glu.gluLookAt(a[0], a[1], a[2], d[0], d[1], d[2], 0.0, 1.0, 1.0);
+                    Gl.glTranslatef(0.0f, -0.3f, 0.0f);
+                }
+
+                Gl.glColor3f(0.8f, 1.0f, 0.4f);
+                Gl.glBegin(viewRollerCoaster ? Gl.GL_LINE_STRIP : drawingMode);
+                    // draw data points
+                    for(i = 0; i <= num; i++) {
+                        Gl.glVertex3fv(vertexArray[i]);
+                    }
+
+                    // extra lines for roller coaster view
+                    if(viewRollerCoaster && drawTracer) {
+                        Gl.glVertex3fv(b);
+                        Gl.glColor3f(0.8f, 0.8f, 0.4f);
+                        Gl.glVertex3fv(c);
+                        Gl.glColor3f(0.8f, 0.4f, 0.4f);
+                        Gl.glVertex3fv(d);
+                    }
+                Gl.glEnd();
+
+                // the tracer
+                Gl.glColor3f(1.0f, 0.0f, 0.0f);
+                if(!viewRollerCoaster) {
+                    // 3rd person
+                    Gl.glTranslatef(a[0], a[1], a[2]);
+                    Glut.glutSolidSphere(0.5, 10, 10);
+                }
+                else {
+                    // roller coaster view
+                    Gl.glTranslatef(d[0], d[1], d[2]);
+                    Glut.glutWireSphere(0.3, 10, 10);
+                    Gl.glColor3f(1.0f, 1.0f, 0.6f);
+                    Glut.glutWireSphere(0.03, 5, 3);
+                }
+            Gl.glPopMatrix();
+            Gl.glFlush();
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        /// <summary>
+        ///     Called on a key event.
+        /// </summary>
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                case (byte) 'Q':
+                case (byte) 'q':
+                    CleanUp();
+                    Environment.Exit(0);
+                    break;
+                case (byte) '+':
+                case (byte) '=':
+                    // rotate right
+                    zoomFactor -= 1.0f;
+                    break;
+                case (byte) '-':
+                case (byte) '_':
+                    // rotate left
+                    zoomFactor += 1.0f;
+                    break;
+                case (byte) 'v':
+                    // toggle roller coaster view | standard
+                    viewRollerCoaster = !viewRollerCoaster;
+                    break;
+                case (byte) 'p':
+                    // toggle draw to tracer
+                    drawTracer = !drawTracer;
+                    break;
+                case (byte) 's':
+                    // reset the tracer
+                    resetTracer = true;
+                    break;
+                case (byte) 'm':
+                    drawingMode = (drawingMode == Gl.GL_LINE_STRIP ? Gl.GL_POINTS : Gl.GL_LINE_STRIP);
+                    break;
+            }
+
+            Reshape(windowWidth, windowHeight);
+            Glut.glutPostRedisplay();
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Idle()
+        private static void Idle() {
+            // invalidates the current window, so GLUT will call display function
+            Glut.glutPostRedisplay();
+        }
+        #endregion Idle()
+
+        #region Mouse(int button, int state, int x, int y)
+        /// <summary>
+        ///     Called on a mouse event.
+        /// </summary>
+        private static void Mouse(int button, int state, int x, int y) {
+            if(button == Glut.GLUT_LEFT_BUTTON) {
+                // when left mouse button is down, move left
+                if(state == Glut.GLUT_DOWN) {
+                    rotation -= delta;
+                }
+                else if(state == Glut.GLUT_UP) {
+                    rotation += delta;
+                }
+            }
+            else if( button == Glut.GLUT_RIGHT_BUTTON) {
+                // when right mouse button down, move right
+                if(state == Glut.GLUT_DOWN) {
+                    rotation += delta;
+                }
+                else if(state == Glut.GLUT_UP) {
+                    rotation -= delta;
+                }
+            }
+            else {
+                // reset the increment
+                rotation = 0.0f;
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        /// <summary>
+        ///     Called when window size changes.
+        /// </summary>
+        private static void Reshape(int w, int h) {
+            // save the new window size
+            windowWidth = w;
+            windowHeight = h;
+            // map the view port to the client area
+            Gl.glViewport(0, 0, w, h);
+            // set the matrix mode to project
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+
+            if(viewRollerCoaster) {
+                Glu.gluPerspective(80.0, (double) w / h, 0.0001, 300.0);
+            }
+            else {
+                Glu.gluPerspective(64.0, (double) w / h, 1.0, 300.0);
+            }
+
+            // set the matrix mode to the modelview matrix
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            // load the identity matrix into the modelview matrix
+            Gl.glLoadIdentity();
+
+            if(!viewRollerCoaster) {
+                // if not 1st person center our view
+                float mx = (boundLow[0] + boundHigh[0]) / 2;
+                float mz = (boundLow[2] + boundHigh[2]) / 2;
+                Gl.glTranslatef(mx, 0.0f, -mz * 2 + zoomFactor);
+            }
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/GeWangExamples/Makefile.am b/examples/GeWangExamples/Makefile.am
new file mode 100644
index 0000000..2219b8b
--- /dev/null
+++ b/examples/GeWangExamples/Makefile.am
@@ -0,0 +1,31 @@
+
+PROGRAM = GeWangExamples
+PACKAGES =
+BINARY_LIBS = \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+RESX = GeWangExamples.resx
+RESOURCES = $(PROGRAM).GeWang.resources
+SOURCES = \
+        ClippingPlanes.cs \
+        GeWangExamples.cs \
+        GeWangExamples.Designer.cs \
+        Lorenz3d.cs \
+        Mirror.cs \
+        Program.cs \
+        Shadow.cs \
+        Starfield.cs \
+        Xform.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.FreeGlut/Tao.FreeGlut.snk
+
+$(PROGRAM).GeWang.resources: GeWangExamples.resx
+	$(RESGEN) $< $@
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/GeWangExamples/Makefile.in b/examples/GeWangExamples/Makefile.in
new file mode 100644
index 0000000..44a174a
--- /dev/null
+++ b/examples/GeWangExamples/Makefile.in
@@ -0,0 +1,379 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/GeWangExamples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = GeWangExamples
+PACKAGES = 
+BINARY_LIBS = \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+
+RESX = GeWangExamples.resx
+RESOURCES = $(PROGRAM).GeWang.resources
+SOURCES = \
+        ClippingPlanes.cs \
+        GeWangExamples.cs \
+        GeWangExamples.Designer.cs \
+        Lorenz3d.cs \
+        Mirror.cs \
+        Program.cs \
+        Shadow.cs \
+        Starfield.cs \
+        Xform.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.FreeGlut/Tao.FreeGlut.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/GeWangExamples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/GeWangExamples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).GeWang.resources: GeWangExamples.resx
+	$(RESGEN) $< $@
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/GeWangExamples/Mirror.cs b/examples/GeWangExamples/Mirror.cs
new file mode 100644
index 0000000..8c48d24
--- /dev/null
+++ b/examples/GeWangExamples/Mirror.cs
@@ -0,0 +1,403 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+// File: mirror.cpp
+// Desc: sample shows a simple mirror placed on the xy plane
+//       this a special case of mirror placement (greatly simplified)
+//       the general method:
+//           - make stencil mask of mirror pane
+//           - draw inverted mirror image with stencil mask
+//           - draw mirror pane to depth buffer
+//           - draw normal scene without stencil
+//           - blend mirror pane for effect
+//
+// Autumn 2000 - Ge Wang, Eric McGimpsey, Christina Hsu
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace GeWangExamples
+{
+    #region Class Documentation
+    /// <summary>
+    ///     Shows a simple mirror placed on the xy plane.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Ge Wang
+    ///         http://www.gewang.com/projects/samples/opengl/mirror.cpp
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Mirror {
+        // --- Fields ---
+        #region Private Constants
+        private const float STEP = 2.0f;
+        private const float PI = 3.14159265359f;
+        #endregion Private Constants
+
+        #region Private Fields
+        // width and height of the window
+        private static int windowWidth = 480;
+        private static int windowHeight = 360;
+
+        // whether to animate
+        private static bool isRotating = true;
+
+        // light 0 position
+        private static float[] light0Position = {10.0f, 5.0f, 0.0f, 1.0f};
+
+        // clipping planes
+        private static double[] clippingPlane = {0.0, 0.0, 1.0, 0.0};
+        private static float increment = 0.0f;
+        private static float angle = 0.0f;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run()
+        {
+            // initialize GLUT
+            Glut.glutInit();
+            // double buffer, use rgb color, enable depth and stencil buffers
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH | Glut.GLUT_STENCIL);
+            // initialize the window size
+            Glut.glutInitWindowSize(windowWidth, windowHeight);
+            // set the window postion
+            Glut.glutInitWindowPosition(100, 100);
+            // create the window
+            Glut.glutCreateWindow("Mirror");
+
+            // set the display function - called when redrawing
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            // set the idle function - called when idle
+            if(isRotating) {
+                Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            }
+            else {
+                Glut.glutIdleFunc(null);
+            }
+            // set the keyboard function - called on keyboard events
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            // set the mouse function - called on mouse stuff
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            // set the reshape function - called when client area changes
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            // do our own initialization
+            Init();
+
+            // let GLUT handle the current thread from here
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     Sets initial OpenGL states and initializes any application data.
+        /// </summary>
+        private static void Init() {
+            // set the GL clear color - use when the color buffer is cleared
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+            // set the shading model to 'smooth'
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+            // enable depth
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            // set the front faces of polygons
+            Gl.glFrontFace(Gl.GL_CCW);
+            // set fill mode
+            Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
+            // set the line width
+            Gl.glLineWidth(2.0f);
+
+            // enable lighting
+            Gl.glEnable(Gl.GL_LIGHTING);
+            // enable lighting for front
+            Gl.glLightModeli(Gl.GL_FRONT, Gl.GL_TRUE);
+            // material have diffuse and ambient lighting 
+            Gl.glColorMaterial(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE);
+            // enable color
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
+
+            // enable light 0
+            Gl.glEnable(Gl.GL_LIGHT0);
+
+            Console.WriteLine("Press left or right mouse button to rotate.");
+        }
+        #endregion Init()
+
+        #region DrawMirror(float val)
+        /// <summary>
+        ///     Draws mirror pane.
+        /// </summary>
+        private static void DrawMirror(float val) {
+            Gl.glVertex3f(val, val, 0.0f);
+            Gl.glVertex3f(-val, val, 0.0f);
+            Gl.glVertex3f(-val, -val, 0.0f);
+            Gl.glVertex3f(val, -val, 0.0f);
+        }
+        #endregion DrawMirror(float val)
+
+        #region Render()
+        /// <summary>
+        ///     Draws the scene.
+        /// </summary>
+        private static void Render() {
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light0Position);
+
+            Gl.glPushMatrix();
+                Gl.glColor3f(0.4f, 1.0f, 0.4f);
+                Gl.glTranslatef(0.0f, 0.0f, 2.5f);
+                Glut.glutSolidSphere(0.5, 12, 12);
+
+                Gl.glTranslatef(0.5f, 0.0f, -0.7f);
+                Gl.glColor3f(1.0f, 0.4f, 0.4f);
+                Glut.glutSolidCube(0.3);
+
+                Gl.glTranslatef(-0.5f, 0.0f, -0.2f);
+                Gl.glRotatef(-90, 1.0f, 0.0f, 0.0f);
+                Gl.glColor3f(1.0f, 1.0f, 0.4f);
+                Glut.glutSolidCone(0.3, 0.6, 8, 8);
+            Gl.glPopMatrix();
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.2f, 0.3f, -2.0f);
+                Gl.glColor3f(0.9f, 0.4f, 0.9f);
+                Glut.glutWireTorus(0.3f, 0.8f, 8, 8);
+            Gl.glPopMatrix();
+        }
+        #endregion Render()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     Called to draw the client area.
+        /// </summary>
+        private static void Display() {
+            float val = 0.8f;
+            int[] buffer = { 0 };
+
+            // get the current color buffer being drawn to
+            Gl.glGetIntegerv(Gl.GL_DRAW_BUFFER, buffer);
+            
+            Gl.glPushMatrix();
+                // rotate the viewpoint
+                Gl.glRotatef(angle += increment, 0.0f, 1.0f, 0.0f);
+
+                // set the clear value
+                Gl.glClearStencil(0x0);
+                // clear the stencil buffer
+                Gl.glClear(Gl.GL_STENCIL_BUFFER_BIT);
+                // always pass the stencil test
+                Gl.glStencilFunc(Gl.GL_ALWAYS, 0x1, 0x1);
+                // set the operation to modify the stencil buffer
+                Gl.glStencilOp(Gl.GL_REPLACE, Gl.GL_REPLACE, Gl.GL_REPLACE);
+                // disable drawing to the color buffer
+                Gl.glDrawBuffer(Gl.GL_NONE);
+                // enable stencil
+                Gl.glEnable(Gl.GL_STENCIL_TEST);
+
+                // draw the stencil mask
+                Gl.glBegin(Gl.GL_QUADS);
+                    DrawMirror(val);
+                Gl.glEnd();
+
+                // reenable drawing to color buffer
+                Gl.glDrawBuffer(buffer[0]);
+                // make stencil buffer read only
+                Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_KEEP);
+
+                // clear the color and depth buffers
+                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+                // draw the mirror image
+                Gl.glPushMatrix();
+                    // invert image about xy plane
+                    Gl.glScalef(1.0f, 1.0f, -1.0f);
+
+                    // invert the clipping plane based on the view point
+                    if(Math.Cos(angle * PI / 180.0) < 0.0) {
+                        clippingPlane[2] = -1.0;
+                    }
+                    else {
+                        clippingPlane[2] = 1.0;
+                    }
+
+                    // clip one side of the plane
+                    Gl.glClipPlane(Gl.GL_CLIP_PLANE0, clippingPlane);
+                    Gl.glEnable(Gl.GL_CLIP_PLANE0);
+                    
+                    // draw only where the stencil buffer == 1
+                    Gl.glStencilFunc(Gl.GL_EQUAL, 0x1, 0x1);
+                    // draw the object
+                    Render();
+
+                    // turn off clipping plane
+                    Gl.glDisable(Gl.GL_CLIP_PLANE0);
+                Gl.glPopMatrix();
+
+                // disable the stencil buffer
+                Gl.glDisable(Gl.GL_STENCIL_TEST);
+                // disable drawing to the color buffer
+                Gl.glDrawBuffer(Gl.GL_NONE);
+
+                // draw the mirror pane into depth buffer -
+                // to prevent object behind mirror from being render
+                Gl.glBegin(Gl.GL_QUADS);
+                    DrawMirror(val);
+                Gl.glEnd();
+
+                // enable drawing to the color buffer
+                Gl.glDrawBuffer(buffer[0]);
+
+                // draw the normal image, without stencil test
+                Gl.glPushMatrix();
+                    Render();
+                Gl.glPopMatrix();
+
+                // draw the outline of the mirror
+                Gl.glColor3f(0.4f, 0.4f, 1.0f);
+                Gl.glBegin(Gl.GL_LINE_LOOP);
+                    DrawMirror(val);
+                Gl.glEnd();
+
+                // mirror shine
+                Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
+                Gl.glEnable(Gl.GL_BLEND);
+                Gl.glDepthMask(false);
+                Gl.glDepthFunc(Gl.GL_LEQUAL);
+                Gl.glDisable(Gl.GL_LIGHTING);
+
+                Gl.glColor4f(1.0f, 1.0f, 1.0f, 0.2f);
+                Gl.glTranslatef(0.0f, 0.0f, 0.01f * (float) clippingPlane[2]);
+                Gl.glBegin(Gl.GL_QUADS);
+                    DrawMirror(val);
+                Gl.glEnd();
+
+                Gl.glDisable(Gl.GL_BLEND);
+                Gl.glDepthMask(false);
+                Gl.glDepthFunc(Gl.GL_LESS);
+                Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        /// <summary>
+        ///     Called on a key event.
+        /// </summary>
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                case (byte) 'Q':
+                case (byte) 'q':
+                    Environment.Exit(0);
+                    break;
+            }
+
+            Reshape(windowWidth, windowHeight);
+            Glut.glutPostRedisplay();
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Idle()
+        private static void Idle() {
+            // render the scene
+            Glut.glutPostRedisplay();
+        }
+        #endregion Idle()
+
+        #region Mouse(int button, int state, int x, int y)
+        /// <summary>
+        ///     Called on a mouse event.
+        /// </summary>
+        private static void Mouse(int button, int state, int x, int y) {
+            if(button == Glut.GLUT_LEFT_BUTTON) {
+                // rotate
+                if(state == Glut.GLUT_DOWN) {
+                    increment -= STEP;
+                }
+                else {
+                    increment += STEP;
+                }
+            }
+            else if (button == Glut.GLUT_RIGHT_BUTTON) {
+                if(state == Glut.GLUT_DOWN) {
+                    increment += STEP;
+                }
+                else {
+                    increment -= STEP;
+                }
+            }
+            else {
+                increment = 0.0f;
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        /// <summary>
+        ///     Called when window size changes.
+        /// </summary>
+        private static void Reshape(int w, int h) {
+            // save the new window size
+            windowWidth = w;
+            windowHeight = h;
+            // map the view port to the client area
+            Gl.glViewport(0, 0, w, h);
+            // set the matrix mode to project
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+            // create the viewing frustum
+            Glu.gluPerspective(45.0, (float) w / (float) h, 1.0, 300.0);
+            // set the matrix mode to modelview
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+            // position the view point
+            Glu.gluLookAt(0.0f, 1.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/GeWangExamples/Program.cs b/examples/GeWangExamples/Program.cs
new file mode 100644
index 0000000..ac80268
--- /dev/null
+++ b/examples/GeWangExamples/Program.cs
@@ -0,0 +1,47 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace GeWangExamples
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new GeWang());
+        }
+    }
+}
diff --git a/examples/GeWangExamples/Properties/AssemblyInfo.cs b/examples/GeWangExamples/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..fd27482
--- /dev/null
+++ b/examples/GeWangExamples/Properties/AssemblyInfo.cs
@@ -0,0 +1,60 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("GeWangExamples")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("GeWangExamples")]
+[assembly: AssemblyCopyright("Copyright ©  2006")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("5831e45f-ba01-4c61-bed0-46deae17275a")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/examples/GeWangExamples/README b/examples/GeWangExamples/README
new file mode 100644
index 0000000..9dd0027
--- /dev/null
+++ b/examples/GeWangExamples/README
@@ -0,0 +1,27 @@
+GeWang
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are C# ports of some OpenGL examples developed by Ge Wang, the originals
+are available from http://www.gewang.com/projects/samples/opengl/.
+
+These examples use Tao.OpenGl and Tao.FreeGlut.  Make sure you have the
+appropriate native libraries for your system installed.
+
+These examples are fairly well documented, however, do not take
+them to be 'best practices' for .NET OpenGL development.  The
+intent of these ports is as an introduction or as a comparison
+against the original native versions.
+
+If you'd like to contribute you can port the Globe example as listed
+on Ge Wang's site.  I never got around to it, but it looks pretty
+trivial.
+
+Randy Ridge
+http://www.taoframework.com
+
+Change Log:
+
+April 23, 2004
+    Initial release, version 1.0.0.0.
diff --git a/examples/GeWangExamples/Shadow.cs b/examples/GeWangExamples/Shadow.cs
new file mode 100644
index 0000000..5636faa
--- /dev/null
+++ b/examples/GeWangExamples/Shadow.cs
@@ -0,0 +1,433 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+// File: shadow.cpp
+// Desc: 2 pass z buffer algorightm using opengl
+//
+// Autumn 2000 - Ge Wang, Christina Hsu
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace GeWangExamples
+{
+    #region Class Documentation
+    /// <summary>
+    ///     2 pass z buffer algorithm using OpenGL.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Ge Wang
+    ///         http://www.gewang.com/projects/samples/opengl/shadow.cpp
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Shadow {
+        // --- Fields ---
+        #region Private Constants
+        private const float STEP = 2.0f;
+        private const float PI = 3.14159265359f;
+        #endregion Private Constants
+
+        #region Private Fields
+        // width and height of the window
+        private static int windowWidth = 480;
+        private static int windowHeight = 360;
+
+        // whether to animate
+        private static bool isRotating = true;
+
+        // light 0 position
+        private static float[] lightPosition = {2.0f, 2.0f, 2.0f, 1.0f};
+
+        // clipping planes
+        private static double[] clippingPlane = {0.0, 0.0, 1.0, 0.0};
+
+        // depth buffer
+        private static float[] depthLight;
+        private static float[] depthView;
+
+        private static float increment = 0.0f;
+        private static float angle1 = -14.0f;
+        private static float angle2 = 0.0f;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run()
+        {
+            // initialize GLUT
+            Glut.glutInit();
+            // double buffer, use rgb color, enable depth buffer
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            // initialize the window size
+            Glut.glutInitWindowSize(windowWidth, windowHeight);
+            // set the window postion
+            Glut.glutInitWindowPosition(100, 100);
+            // create the window
+            Glut.glutCreateWindow("Shadow");
+
+            // set the display function - called when redrawing
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            // set the idle function - called when idle
+            if(isRotating) {
+                Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            }
+            else {
+                Glut.glutIdleFunc(null);
+            }
+            // set the keyboard function - called on keyboard events
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            // set the mouse function - called on mouse stuff
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            // set the reshape function - called when client area changes
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            // do our own initialization
+            Init();
+
+            // let GLUT handle the current thread from here
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     Sets initial OpenGL states and initializes any application data.
+        /// </summary>
+        private static void Init() {
+            // set the GL clear color - use when the color buffer is cleared
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+            // set the shading model to 'smooth'
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+            // enable depth
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            // set the front faces of polygons
+            Gl.glFrontFace(Gl.GL_CCW);
+            // set fill mode
+            Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
+            // set the line width
+            Gl.glLineWidth(2.0f);
+
+            // enable lighting
+            Gl.glEnable(Gl.GL_LIGHTING);
+            // enable lighting for front
+            Gl.glLightModeli(Gl.GL_FRONT, Gl.GL_TRUE);
+            // material have diffuse and ambient lighting 
+            Gl.glColorMaterial(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE);
+            // enable color
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
+
+            // enable light 0
+            Gl.glEnable(Gl.GL_LIGHT0);
+
+            Console.WriteLine("Press left or right mouse button to rotate.");
+        }
+        #endregion Init()
+
+        #region Render()
+        /// <summary>
+        ///     Draws the scene.
+        /// </summary>
+        private static void Render() {
+            Gl.glColor3f(0.4f, 1.0f, 0.4f);
+            Glut.glutSolidSphere(0.6, 12, 12);
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.6f, 0.35f, 0.6f);
+                Gl.glColor3f(1.0f, 0.7f, 0.7f);
+                Glut.glutSolidCube(0.2);
+            Gl.glPopMatrix();
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.7f, 0.85f, 0.7f);
+                Gl.glRotatef(angle2 += 1, 0.0f, 1.0f, 0.0f);
+                Gl.glTranslatef(0.0f, -0.2f, 0.0f);
+                Gl.glRotatef(-90, 1.0f, 0.0f, 0.0f);
+                Gl.glColor3f(1.0f, 1.0f, 0.4f);
+                Glut.glutWireCone(0.2, 0.4, 8, 8);
+            Gl.glPopMatrix();
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-0.9f, -0.9f, -0.1f);
+                Gl.glRotatef(90, -0.5f, 0.5f, 0.15f);
+                Gl.glRotatef(angle2, 0.0f, 0.0f, 1.0f);
+                Gl.glColor3f(1.0f, 0.4f, 1.0f);
+                Glut.glutWireTorus(0.2, 0.5, 8, 8);
+            Gl.glPopMatrix();
+        }
+        #endregion Render()
+
+        #region Shadows()
+        /// <summary>
+        ///     Draws shadow.
+        /// </summary>
+        private static void Shadows() {
+            double[] modelviewMatrix = new double[16];
+            double[] projectionMatrix = new double[16];
+            int[] viewport = new int[4];
+            double objX, objY, objZ;
+            float depth;
+            float[] p = lightPosition;
+            float[] localDepthView, localDepthLight;
+            double[] modelviewLight = new double[16];
+            double winX, winY, winZ;
+            int ix, iy;
+            double depth_2;
+            int x, y;
+
+            // color of pixels in shadow
+            int[] pixel = { 0x7f7f7f7f };
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+
+            // get the modelview, project, and viewport
+            Gl.glGetDoublev(Gl.GL_MODELVIEW_MATRIX, modelviewMatrix);
+            Gl.glGetDoublev(Gl.GL_PROJECTION_MATRIX, projectionMatrix);
+            Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
+
+            // get the transformation from light view
+            Gl.glPushMatrix();
+                Gl.glLoadIdentity();
+                Glu.gluLookAt(p[0], p[1], p[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+                Gl.glGetDoublev(Gl.GL_MODELVIEW_MATRIX, modelviewLight);
+            Gl.glPopMatrix();
+
+            // set the project matrix to orthographic
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glPushMatrix();
+                Gl.glLoadIdentity();
+                Glu.gluOrtho2D(0.0, (float) windowWidth, 0.0, (float) windowHeight);
+
+                // set the modelview matrix to identity
+                Gl.glMatrixMode(Gl.GL_MODELVIEW);
+                Gl.glPushMatrix();
+                    Gl.glLoadIdentity();
+
+                    // get the current depth buffer
+                    Gl.glReadPixels(0, 0, windowWidth, windowHeight, Gl.GL_DEPTH_COMPONENT, Gl.GL_FLOAT, depthView);
+
+                    // get pointers to the depth buffers
+                    localDepthView = depthView;
+                    localDepthLight = depthLight;
+
+                    int i = 0;
+                    // go through every pixel in frame buffer
+                    for(y = 0; y < windowHeight; y++) {
+                        for(x = 0; x < windowWidth; x++) {
+                            // depth at pixel
+                            depth = localDepthView[i++];
+
+                            // on the far plane of frustum - don't calculate
+                            if(depth > 0.99) {
+                                continue;
+                            }
+
+                            // get world coordinate from x, y, depth
+                            Glu.gluUnProject(x, y, (double) depth, modelviewMatrix, projectionMatrix, viewport, out objX, out objY, out objZ);
+
+                            // get light view screen coordinate and depth
+                            Glu.gluProject(objX, objY, objZ, modelviewLight, projectionMatrix, viewport, out winX, out winY, out winZ);
+
+                            ix = (int)(winX + 0.5);
+                            iy = (int)(winY + 0.5);
+
+                            // make sure within the screen
+                            if(ix >= windowWidth || iy >= windowHeight || ix < 0 || iy < 0) {
+                                continue;
+                            }
+
+                            // get the depth value from the light
+                            depth_2 = (double) depthLight[iy * windowWidth + ix];
+
+                            // is something between the light and the pixel?
+                            if((winZ - depth_2) > 0.01) {
+                                Gl.glRasterPos2i(x, y);
+                                Gl.glDrawPixels(1, 1, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, pixel);
+                            }
+                        }
+                    }
+
+                // restore modelview transformation
+                Gl.glPopMatrix();
+
+                // restore projection
+                Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glPopMatrix();
+
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Shadows()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     Called to draw the client area.
+        /// </summary>
+        private static void Display() {
+            int[] buffer = new int[1];
+            float[] p = lightPosition;
+
+            // get the current color buffer being drawn to
+            Gl.glGetIntegerv(Gl.GL_DRAW_BUFFER, buffer);
+
+            // clear the color and depth buffer
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glRotatef(angle1 += increment, 0.0f, 1.0f, 0.0f);
+
+                // set the position of the light
+                Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+
+                // switch to viewpoint of light
+                Gl.glPushMatrix();
+                    // disable drawing into color buffer
+                    Gl.glDrawBuffer(Gl.GL_NONE);
+
+                    // set the camera to the viewpoint of the light
+                    Gl.glLoadIdentity();
+                    Glu.gluLookAt(p[0], p[1], p[2], 0, 0, 0, 0, 1, 0);
+
+                    // draw scene
+                    Render();
+
+                    // save the depth buffer
+                    Gl.glReadPixels(0, 0, windowWidth, windowHeight, Gl.GL_DEPTH_COMPONENT, Gl.GL_FLOAT, depthLight);
+
+                    // enable drawing into color buffer
+                    Gl.glDrawBuffer(buffer[0]);
+                Gl.glPopMatrix();
+
+                // clear the depth buffer
+                Gl.glClear(Gl.GL_DEPTH_BUFFER_BIT);
+                // draw scene
+                Render();
+
+                // draw the shadow
+                Shadows();
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        /// <summary>
+        ///     Called on a key event.
+        /// </summary>
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                case (byte) 'Q':
+                case (byte) 'q':
+                    Environment.Exit(0);
+                    break;
+            }
+
+            Reshape(windowWidth, windowHeight);
+            Glut.glutPostRedisplay();
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Idle()
+        private static void Idle() {
+            // render the scene
+            Glut.glutPostRedisplay();
+        }
+        #endregion Idle()
+
+        #region Mouse(int button, int state, int x, int y)
+        /// <summary>
+        ///     Called on a mouse event.
+        /// </summary>
+        private static void Mouse(int button, int state, int x, int y) {
+            if(button == Glut.GLUT_LEFT_BUTTON) {
+                // rotate
+                if(state == Glut.GLUT_DOWN) {
+                    increment -= STEP;
+                }
+                else {
+                    increment += STEP;
+                }
+            }
+            else if (button == Glut.GLUT_RIGHT_BUTTON) {
+                if(state == Glut.GLUT_DOWN) {
+                    increment += STEP;
+                }
+                else {
+                    increment -= STEP;
+                }
+            }
+            else {
+                increment = 0.0f;
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        /// <summary>
+        ///     Called when window size changes.
+        /// </summary>
+        private static void Reshape(int w, int h) {
+            // save the new window size
+            windowWidth = w;
+            windowHeight = h;
+            // map the view port to the client area
+            Gl.glViewport(0, 0, w, h);
+            // set the matrix mode to project
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+            // create the viewing frustum
+            Glu.gluPerspective(45.0, (float) w / (float) h, 1.0, 300.0);
+            // set the matrix mode to modelview
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+            // position the view point
+            Glu.gluLookAt(0.0f, 1.2f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
+
+            depthLight = new float[windowWidth * windowHeight];
+            depthView = new float[windowWidth * windowHeight];
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/GeWangExamples/Starfield.cs b/examples/GeWangExamples/Starfield.cs
new file mode 100644
index 0000000..73faf4b
--- /dev/null
+++ b/examples/GeWangExamples/Starfield.cs
@@ -0,0 +1,409 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+// File: starfield.cpp
+// Desc: 3d opengl/glut starfield
+//
+// summer 2001 - Ge Wang & Adrenaline University c++ class
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace GeWangExamples
+{
+    #region Class Documentation
+    /// <summary>
+    ///     3D starfield.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Ge Wang
+    ///         http://www.gewang.com/projects/samples/opengl/starfield.cpp
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Starfield
+    {
+        // --- Fields ---
+        #region Private Constants
+        private const int NUMBER_STARS = 400;
+        private const float FAR_PLANE = -40.0f;
+        private const float NEAR_PLANE = 3.0f;
+        private const float GAP = 0.0f;
+        private const float FIELD_WIDTH = 30.0f;
+        private const float FIELD_HEIGHT = 25.0f;
+        private const float RADIUS = 1.0f;
+        private const float DEFAULT_SPEED = 0.2f;
+        private const int RAND_MAX = 0x7fff;
+        #endregion Private Constants
+
+        #region Private Fields
+        // width and height of the window
+        private static int windowWidth = 640;
+        private static int windowHeight = 480;
+
+        // light position
+        private static float[] lightPosition = { 0.0f, 0.0f, 3.0f, 1.0f };
+
+        // the location
+        private static float[][] xyz = new float[NUMBER_STARS][];
+        // the colors
+        private static float[][] colors = new float[NUMBER_STARS][];
+
+        // the alpha and red components of polygon to blend
+        private static float alpha = 0.3f;
+        private static float red = 0.0f;
+        private static float speed = DEFAULT_SPEED;
+        private static float speedIncrement = 0.0f;
+        private static float inc = 0.0f;
+        private static Random rand = new Random();
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        public static void Run()
+        {
+            // initialize GLUT
+            Glut.glutInit();
+            // double buffer, use rgb color, enable depth buffers
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            // initialize the window size
+            Glut.glutInitWindowSize(windowWidth, windowHeight);
+            // set the window postion
+            Glut.glutInitWindowPosition(100, 100);
+            // create the window
+            Glut.glutCreateWindow("Starfield");
+
+            // set the display function - called when redrawing
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            // set the idle function - called when idle
+            Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            // set the keyboard function - called on keyboard events
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            // set the mouse function - called on mouse stuff
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            // set the reshape function - called when client area changes
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            // do our own initialization
+            Init();
+
+            // let GLUT handle the current thread from here
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     Sets initial OpenGL states and initializes any application data.
+        /// </summary>
+        private static void Init()
+        {
+            // set the GL clear color - use when the color buffer is cleared
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            // set the shading model to 'smooth'
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+            // enable depth
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            // draw in fill
+            Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
+            // set the initial line width
+            Gl.glLineWidth(1.0f);
+
+            // enable lighting
+            Gl.glEnable(Gl.GL_LIGHTING);
+            // enable lighting for front
+            Gl.glLightModeli(Gl.GL_FRONT, Gl.GL_TRUE);
+            // material have diffuse and ambient lighting 
+            Gl.glColorMaterial(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE);
+            // enable color
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
+            // enable light 0
+            Gl.glEnable(Gl.GL_LIGHT0);
+
+            // set light attenuation
+            Gl.glLightf(Gl.GL_LIGHT0, Gl.GL_CONSTANT_ATTENUATION, 0.01f);
+            Gl.glLightf(Gl.GL_LIGHT0, Gl.GL_LINEAR_ATTENUATION, 0.2f);
+            Gl.glLightf(Gl.GL_LIGHT0, Gl.GL_QUADRATIC_ATTENUATION, 0.001f);
+
+            // clear the color buffer once
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            // randomly generate
+            for (int i = 0; i < NUMBER_STARS; i++)
+            {
+                xyz[i] = new float[3];
+                xyz[i][0] = ((float)rand.Next(RAND_MAX) / RAND_MAX - 0.5f) * FIELD_WIDTH;
+                xyz[i][1] = ((float)rand.Next(RAND_MAX) / RAND_MAX - 0.5f) * FIELD_HEIGHT;
+                xyz[i][2] = ((float)rand.Next(RAND_MAX) / RAND_MAX) * (NEAR_PLANE - FAR_PLANE + GAP) + FAR_PLANE;
+
+                colors[i] = new float[3];
+                colors[i][0] = (float)rand.Next(RAND_MAX) / RAND_MAX;
+                colors[i][1] = (float)rand.Next(RAND_MAX) / RAND_MAX;
+                colors[i][2] = (float)rand.Next(RAND_MAX) / RAND_MAX;
+            }
+
+            Console.WriteLine("--------------------------------------------------");
+            Console.WriteLine("OpenGL flying simulation");
+            Console.WriteLine("--------------------------------------------------");
+            Console.WriteLine("[L/R] mouse button - accelerate forward/backwards");
+            Console.WriteLine("                     (try going backwards)");
+            Console.WriteLine("middle mouse button - reset to default speed");
+            Console.WriteLine("'=' or '+' - increase tail");
+            Console.WriteLine("'-' - decrease tail");
+            Console.WriteLine("'q' - quit progrqam");
+            Console.WriteLine("--------------------------------------------------");
+            Console.WriteLine();
+        }
+        #endregion Init()
+
+        #region Render()
+        private static void Render()
+        {
+            inc += 0.01f;
+            Gl.glRotatef(50 * (float)(Math.Cos(inc)), 0.0f, 0.0f, 1.0f);
+
+            speed += speedIncrement;
+            for (int i = 0; i < NUMBER_STARS; i++)
+            {
+                Gl.glPushMatrix();
+                Gl.glTranslatef(xyz[i][0], xyz[i][1], xyz[i][2]);
+                Gl.glColor3fv(colors[i]);
+                Glut.glutSolidSphere(0.1f, 5, 5);
+                Gl.glPopMatrix();
+
+                // increment z
+                xyz[i][2] += speed;
+
+                // check to see if passed view
+                if (xyz[i][2] > NEAR_PLANE + GAP)
+                {
+                    float d;
+                    if ((d = (float)(Math.Sqrt(xyz[i][0] * xyz[i][0] + xyz[i][1] * xyz[i][1]))) < RADIUS)
+                    {
+                        red += (RADIUS - d) / RADIUS;
+                        if (red > 2.5f)
+                        {
+                            red = 2.5f;
+                        }
+                    }
+
+                    xyz[i][0] = ((float)rand.Next(RAND_MAX) / RAND_MAX - 0.5f) * FIELD_WIDTH;
+                    xyz[i][1] = ((float)rand.Next(RAND_MAX) / RAND_MAX - 0.5f) * FIELD_HEIGHT;
+                    xyz[i][2] = FAR_PLANE;
+                }
+                else if (xyz[i][2] < FAR_PLANE)
+                {
+                    xyz[i][0] = ((float)rand.Next(RAND_MAX) / RAND_MAX - 0.5f) * FIELD_WIDTH;
+                    xyz[i][1] = ((float)rand.Next(RAND_MAX) / RAND_MAX - 0.5f) * FIELD_HEIGHT;
+                    xyz[i][2] = NEAR_PLANE;
+                }
+            }
+        }
+        #endregion Render()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     Called to draw the client area.
+        /// </summary>
+        private static void Display()
+        {
+            // clear the depth buffer
+            Gl.glClear(Gl.GL_DEPTH_BUFFER_BIT);
+
+            // enable blending
+            Gl.glEnable(Gl.GL_BLEND);
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
+
+            // disable lighting
+            Gl.glDisable(Gl.GL_LIGHTING);
+            // disable depth test
+            Gl.glDisable(Gl.GL_DEPTH_TEST);
+            // blend in a polygon
+            Gl.glColor4f(red, red, red, alpha);
+
+            // reduce the red component
+            red -= 0.02f;
+            if (red < 0.0f)
+            {
+                red = 0.0f;
+            }
+
+            // draw the polygons
+            Gl.glBegin(Gl.GL_QUADS);
+            Gl.glVertex3f(-1.0f, -1.0f, 2.0f);
+            Gl.glVertex3f(-1.0f, 1.0f, 2.0f);
+            Gl.glVertex3f(1.0f, 1.0f, 2.0f);
+            Gl.glVertex3f(1.0f, -1.0f, 2.0f);
+            Gl.glEnd();
+
+            // enable lighting
+            Gl.glEnable(Gl.GL_LIGHTING);
+            // enable depth test
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            // disable blending
+            Gl.glDisable(Gl.GL_BLEND);
+
+            // save the current matrix state, so transformation will
+            // not persist across displayFunc calls, since we
+            // will do a glPopMatrix() at the end of this function
+            Gl.glPushMatrix();
+            // render the scene
+            Render();
+            // restore the matrix state
+            Gl.glPopMatrix();
+
+            // flush the buffer
+            Gl.glFlush();
+            // swap the double buffer
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        /// <summary>
+        ///     Called on a key event.
+        /// </summary>
+        private static void Keyboard(byte key, int x, int y)
+        {
+            switch (key)
+            {
+                case 27:
+                case (byte)'Q':
+                case (byte)'q':
+                    Environment.Exit(0);
+                    break;
+                case (byte)'+':
+                case (byte)'=':
+                    alpha -= 0.02f;
+                    if (alpha < 0.05f)
+                    {
+                        alpha = 0.05f;
+                    }
+                    break;
+                case (byte)'-':
+                    alpha += 0.02f;
+                    if (alpha > 1.0f)
+                    {
+                        alpha = 1.0f;
+                    }
+                    break;
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Idle()
+        private static void Idle()
+        {
+            // invalidates the current window, so GLUT will call display function
+            Glut.glutPostRedisplay();
+        }
+        #endregion Idle()
+
+        #region Mouse(int button, int state, int x, int y)
+        /// <summary>
+        ///     Called on a mouse event.
+        /// </summary>
+        private static void Mouse(int button, int state, int x, int y)
+        {
+            if (button == Glut.GLUT_LEFT_BUTTON)
+            {
+                // when left mouse button is down, go forward faster
+                if (state == Glut.GLUT_DOWN)
+                {
+                    speedIncrement += 0.02f;
+                }
+                else if (state == Glut.GLUT_UP)
+                {
+                    speedIncrement -= 0.02f;
+                }
+            }
+            else if (button == Glut.GLUT_RIGHT_BUTTON)
+            {
+                // when right mouse button down, go backwards faster
+                if (state == Glut.GLUT_DOWN)
+                {
+                    speedIncrement -= 0.02f;
+                }
+                else if (state == Glut.GLUT_UP)
+                {
+                    speedIncrement += 0.02f;
+                }
+            }
+            else if (button == Glut.GLUT_MIDDLE_BUTTON)
+            {
+                if (state == Glut.GLUT_DOWN)
+                {
+                    speed = DEFAULT_SPEED;
+                    speedIncrement = 0;
+                }
+            }
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        /// <summary>
+        ///     Called when window size changes.
+        /// </summary>
+        private static void Reshape(int w, int h)
+        {
+            // save the new window size
+            windowWidth = w;
+            windowHeight = h;
+            // map the view port to the client area
+            Gl.glViewport(0, 0, w, h);
+            // set the matrix mode to project
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+            // create the viewing frustum
+            Glu.gluPerspective(64.0, (float)w / (float)h, 0.1, 300.0);
+            // set the matrix mode to modelview
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+            // position the view point
+            Glu.gluLookAt(0.0f, 0.0, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, 3.0f);
+            // set the position of the light
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/GeWangExamples/Xform.cs b/examples/GeWangExamples/Xform.cs
new file mode 100644
index 0000000..4390d73
--- /dev/null
+++ b/examples/GeWangExamples/Xform.cs
@@ -0,0 +1,505 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+// File: xform.cpp
+// Desc: sample shows how usage of modelview transformations in OpenGL
+//
+// Autumn 2000 - Ge Wang - implementation
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace GeWangExamples
+{
+    #region Class Documentation
+    /// <summary>
+    ///     Shows how usage of modelview transformations in OpenGL.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Ge Wang
+    ///         http://www.gewang.com/projects/samples/opengl/xform.cpp
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Xform {
+        // --- Fields ---
+        #region Private Constants
+        private const float PI = 3.1415926f;
+        private const float RADIUS = 0.4f;
+        #endregion Private Constants
+
+        #region Private Fields
+        // width and height of the window
+        private static int windowWidth = 640;
+        private static int windowHeight = 420;
+
+        // whether to animate
+        private static bool isRotating = true;
+
+        // data points for wheel
+        private static float[][] vertexArray;
+        private static int numberOfVertices = 0;
+
+        // the grid
+        private static float[][] grid;
+        private static int gridPoints = 0;
+
+        // x position of object
+        private static float objectPositionX = 0.0f;
+        // z postion of object
+        private static float objectPositionZ = 0.0f;
+        // increment for x on each cycle
+        private static float increment = 0.0f;
+        // the speed and direction of the wheels
+        private static float factor = 1.0f;
+        // the y for the pos of viewer
+        private static float viewerPositionY = 3.0f;
+
+        private static float rotateZ = 0.0f;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run()
+        {
+            // initialize GLUT
+            Glut.glutInit();
+            // double buffer, use rgb color, enable depth buffers
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            // initialize the window size
+            Glut.glutInitWindowSize(windowWidth, windowHeight);
+            // set the window postion
+            Glut.glutInitWindowPosition(100, 100);
+            // create the window
+            Glut.glutCreateWindow("Xform");
+
+            // set the display function - called when redrawing
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            // set the idle function - called when idle
+            if(isRotating) {
+                Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            }
+            else {
+                Glut.glutIdleFunc(null);
+            }
+            // set the keyboard function - called on keyboard events
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            // set the mouse function - called on mouse stuff
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            // set the reshape function - called when client area changes
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            // do our own initialization
+            Init();
+
+            // let GLUT handle the current thread from here
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     Sets initial OpenGL states and initializes any application data.
+        /// </summary>
+        private static void Init() {
+            // set the GL clear color - use when the color buffer is cleared
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+            // set the shading model to 'smooth'
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+            // enable depth
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            // set the front faces of polygons
+            Gl.glFrontFace(Gl.GL_CCW);
+            // draw in wireframe
+            Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE);
+
+            // build data points for wheels
+            BuildVertices(16);
+
+            // build data points for grid
+            BuildGrid(11, 11, 1.0f);
+
+            Console.WriteLine("hold left mouse button - move car left");
+            Console.WriteLine("hold right mouse button - move car right");
+            Console.WriteLine("center mouse button - resets position");
+            Console.WriteLine("'[' - move car left");
+            Console.WriteLine("'-' - move car near");
+            Console.WriteLine("'=' - move car far");
+            Console.WriteLine("'u' - move camera up");
+            Console.WriteLine("'d' - move camera down");
+        }
+        #endregion Init()
+
+        #region BuildGrid(int x, int z, float space)
+        /// <summary>
+        ///     Builds the grid.
+        /// </summary>
+        private static void BuildGrid(int x, int z, float space) {
+            int i;
+
+            // allocate the grid
+            gridPoints = (x + z) * 2;
+            grid = new float[gridPoints][];
+
+            float width = (x - 1) * space * 2;
+            float height = (z - 1) * space * 2;
+
+            // generate the points for the grid
+            for(i = 0; i < x * 2; i += 2) {
+                grid[i] = new float[3];
+                grid[i + 1] = new float[3];
+
+                grid[i][0] = i * space;
+                grid[i][1] = 0;
+                grid[i][2] = 0;
+
+                grid[i + 1][0] = i * space;
+                grid[i + 1][1] = 0;
+                grid[i + 1][2] = -height;
+            }
+
+            for(i = 0; i < z * 2; i += 2) {
+                grid[i + x * 2] = new float[3];
+                grid[i + x * 2 + 1] = new float[3];
+
+                grid[i + x * 2][0] = 0;
+                grid[i + x * 2][1] = 0;
+                grid[i + x * 2][2] = -i * space;
+
+                grid[i + x * 2 + 1][0] = width;
+                grid[i + x * 2 + 1][1] = 0;
+                grid[i + x * 2 + 1][2] = -i * space;
+            }
+        }
+        #endregion BuildGrid(int x, int z, float space)
+
+        #region BuildVertices(int vertices)
+        /// <summary>
+        ///     Builds the vertex and color arrays for a N-sided polygon.
+        /// </summary>
+        private static void BuildVertices(int vertices) {
+            // this is the degrees between two vertices adjacent
+            float inc = 360.0f / (float) vertices;
+            // the radios of the vertice
+            float radius = RADIUS;
+
+            // make sure we have at least 3 vertices
+            if(vertices < 3 ) {
+                return;
+            }
+
+            // allocate the vert and color arrays
+            vertexArray = new float[vertices][];
+            numberOfVertices = vertices;
+
+            for(int i = 0; i < vertices; i++) {
+                vertexArray[i] = new float[3];
+
+                // calculate the next vertex
+                vertexArray[i][0] = (float) (Math.Cos((inc * i) * PI / 180.0f) * radius);//(Math.Cos(inc * i) * radius);
+                vertexArray[i][1] = (float) (Math.Sin((inc * i) * PI / 180.0f) * radius);//(Math.Sin(inc * i) * radius);
+                vertexArray[i][2] = 0.0f;
+            }
+        }
+        #endregion BuildVertices(int vertices)
+
+        #region RenderFrame()
+        /// <summary>
+        ///     Draw the frame of the car.
+        /// </summary>
+        private static void RenderFrame() {
+            float y1 = RADIUS / 2, y2 = y1 * 1.2f;
+            float x1 = -1.04f, x2 = 1.04f;
+            float z1 = 0.5f, z2 = -0.5f;
+
+            // draw the frame
+            Gl.glBegin(Gl.GL_QUAD_STRIP);
+                Gl.glVertex3f(x1, 0.0f, z1);
+                Gl.glVertex3f(x1, y1, z1);
+
+                Gl.glVertex3f(x2, 0.0f, z1);
+                Gl.glVertex3f(x2, y2, z1);
+
+                Gl.glVertex3f(x2, 0.0f, z2);
+                Gl.glVertex3f(x2, y2, z2);
+
+                Gl.glVertex3f(x1, 0.0f, z2);
+                Gl.glVertex3f(x1, y1, z2);
+
+                Gl.glVertex3f(x1, 0.0f, z1);
+                Gl.glVertex3f(x1, y1, z1);
+            Gl.glEnd();
+        }
+        #endregion RenderFrame()
+
+        #region RenderGrid()
+        /// <summary>
+        ///     Draws grid in object coordinate.
+        /// </summary>
+        private static void RenderGrid() {
+            Gl.glBegin(Gl.GL_LINES);
+                for(int i = 0; i < gridPoints; i += 2) {
+                    Gl.glVertex3fv(grid[i]);
+                    Gl.glVertex3fv(grid[i + 1]);
+                }
+            Gl.glEnd();
+        }
+        #endregion RenderGrid()
+
+        #region RenderObject()
+        /// <summary>
+        ///     Draws object in object coordinate.
+        /// </summary>
+        private static void RenderObject() {
+            // left near wheel
+            Gl.glColor3f(1.0f, 0.8f, 0.2f);
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-1.0f, RADIUS, 0.5f);
+                Gl.glRotatef(rotateZ, 0.0f, 0.0f, 1.0f);
+                RenderWheel();
+            Gl.glPopMatrix();
+    
+            // left far wheel
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-1.0f, RADIUS, -0.5f);
+                Gl.glRotatef(rotateZ, 0.0f, 0.0f, 1.0f);
+                RenderWheel();
+            Gl.glPopMatrix();
+
+            // right near wheel
+            Gl.glPushMatrix();
+                Gl.glTranslatef(1.0f, RADIUS, 0.5f);
+                Gl.glRotatef(rotateZ, 0.0f, 0.0f, 1.0f);
+                RenderWheel();
+            Gl.glPopMatrix();
+
+            // right far wheel
+            Gl.glPushMatrix();
+                Gl.glTranslatef(1.0f, RADIUS, -0.5f);
+                Gl.glRotatef(rotateZ, 0.0f, 0.0f, 1.0f);
+                RenderWheel();
+            Gl.glPopMatrix();
+
+            // rotate the wheel for next time
+            rotateZ += 1.0f * factor;
+
+            // draw the frame of the object
+            Gl.glColor3f(0.6f, 0.6f, 1.0f);
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.0f, RADIUS, 0.0f);
+                RenderFrame();
+            Gl.glPopMatrix();
+        }
+        #endregion RenderObject()
+
+        #region RenderWheel()
+        /// <summary>
+        ///     Draw a wheel in local coordinate.
+        /// </summary>
+        private static void RenderWheel() {
+            int i;
+
+            // draw one wheel
+            Gl.glBegin(Gl.GL_TRIANGLE_FAN);
+                Gl.glVertex3f(0.0f, 0.0f, 0.0f);
+                for(i = 0; i < numberOfVertices; i++) {
+                    Gl.glVertex3fv(vertexArray[i]);
+                }
+                Gl.glVertex3fv(vertexArray[0]);
+            Gl.glEnd();
+        }
+        #endregion RenderWheel()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     Called to draw the client area.
+        /// </summary>
+        private static void Display() {
+            // clear the color and depth buffers
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            // draw the world grid
+            Gl.glPushMatrix();
+                // position the grid
+                Gl.glTranslatef(-10.0f, 0.0f, 10.0f);
+
+                // draw the grid
+                Gl.glLineWidth(1.0f);
+                Gl.glColor3f(0.2f, 1.0f, 0.2f);
+                RenderGrid();
+            Gl.glPopMatrix();
+
+            // draw the car
+            Gl.glPushMatrix();
+                // translate to (x, 0, z) world coordinate
+                Gl.glTranslatef(objectPositionX, 0.0f, objectPositionZ);
+                Gl.glLineWidth(2.0f);
+
+                // draw the object
+                RenderObject();
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        /// <summary>
+        ///     Called on a key event.
+        /// </summary>
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                case (byte) 'Q':
+                case (byte) 'q':
+                    Environment.Exit(0);
+                    break;
+                case (byte) '[':
+                    // move object towards -x
+                    objectPositionX -= 0.05f;
+                    factor = 1.0f;
+                    break;
+                case (byte) ']':
+                    // move object towards x
+                    objectPositionX += 0.05f;
+                    // let the wheel turn clockwise
+                    factor = -1.0f;
+                    break;
+                case (byte) '=':
+                    // move further
+                    objectPositionZ -= 0.1f;
+                    break;
+                case (byte) '-':
+                    // move closer
+                    objectPositionZ += 0.1f;
+                    break;
+                case (byte) '0':
+                    // reset the location of object
+                    objectPositionX = 0.0f;
+                    increment = 0.0f;
+                    break;
+                case (byte) 'u':
+                    // move view up
+                    viewerPositionY += 0.2f;
+                    Reshape(windowWidth, windowHeight);
+                    break;
+                case (byte) 'd':
+                    // move view down
+                    viewerPositionY -= 0.2f;
+                    Reshape(windowWidth, windowHeight);
+                    break;
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Idle()
+        private static void Idle() {
+            // render the scene
+            Glut.glutPostRedisplay();
+
+            // increment the x position
+            objectPositionX += increment;
+        }
+        #endregion Idle()
+
+        #region Mouse(int button, int state, int x, int y)
+        /// <summary>
+        ///     Called on a mouse event.
+        /// </summary>
+        private static void Mouse(int button, int state, int x, int y) {
+            if(button == Glut.GLUT_LEFT_BUTTON) {
+                // when left mouse button is down, move left
+                if(state == Glut.GLUT_DOWN) {
+                    increment -= 0.01f;
+                    factor = 1.0f;
+                }
+                else {
+                    increment += 0.01f;
+                }
+            }
+            else if(button == Glut.GLUT_RIGHT_BUTTON) {
+                // when right mouse button down, move right
+                if(state == Glut.GLUT_DOWN) {
+                    increment += 0.01f;
+                    factor = -1.0f;
+                }
+                else {
+                    increment -= 0.01f;
+                }
+            }
+            else {
+                // reset the location of object
+                objectPositionX = 0.0f;
+                increment = 0.0f;
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        /// <summary>
+        ///     Called when window size changes.
+        /// </summary>
+        private static void Reshape(int w, int h) {
+            // save the new window size
+            windowWidth = w;
+            windowHeight = h;
+            // map the view port to the client area
+            Gl.glViewport(0, 0, w, h);
+            // set the matrix mode to project
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+            // create the viewing frustum
+            Glu.gluPerspective(45.0, (float) w / (float) h, 1.0, 300.0);
+            // set the matrix mode to modelview
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            // load the identity matrix
+            Gl.glLoadIdentity();
+            // position the view point
+            Glu.gluLookAt(0.0f, viewerPositionY, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/GlfwExamples/Boing.cs b/examples/GlfwExamples/Boing.cs
new file mode 100644
index 0000000..029df77
--- /dev/null
+++ b/examples/GlfwExamples/Boing.cs
@@ -0,0 +1,670 @@
+#region License
+/*
+MIT License
+Copyright �2003-2004 Randy Ridge
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits/License
+/*
+Copyright (c) 2002-2004 Marcus Geelnard
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would
+   be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must not
+   be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+   distribution.
+
+Marcus Geelnard
+marcus.geelnard at home.se
+*/
+
+/*****************************************************************************
+ * Title:   GLBoing
+ * Desc:    Tribute to Amiga Boing.
+ * Author:  Jim Brooks  <gfx at jimbrooks.org>
+ *          Original Amiga authors were R.J. Mical and Dale Luck.
+ *          GLFW conversion by Marcus Geelnard
+ * Notes:   - 360' = 2*PI [radian]
+ *
+ *          - Distances between objects are created by doing a relative
+ *            Z translations.
+ *
+ *          - Although OpenGL enticingly supports alpha-blending,
+ *            the shadow of the original Boing didn't affect the color
+ *            of the grid.
+ *
+ *          - [Marcus] Changed timing scheme from interval driven to frame-
+ *            time based animation steps (which results in much smoother
+ *            movement)
+ *
+ * History of Amiga Boing:
+ *
+ * Boing was demonstrated on the prototype Amiga (codenamed "Lorraine") in
+ * 1985. According to legend, it was written ad-hoc in one night by
+ * R. J. Mical and Dale Luck. Because the bouncing ball animation was so fast
+ * and smooth, attendees did not believe the Amiga prototype was really doing
+ * the rendering. Suspecting a trick, they began looking around the booth for
+ * a hidden computer or VCR.
+ *****************************************************************************/
+#endregion Original Credits/License
+
+using System;
+using Tao.Glfw;
+using Tao.OpenGl;
+
+namespace GlfwExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     This is a small test application for GLFW.
+    /// </summary>
+    /// <remarks>
+    ///     Tribute to Amiga's Boing.
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Boing {
+        // --- Fields ---
+        #region Private Constants
+        private const float PI = 3.1415926535897932384626433832795f;
+        private const int RAND_MAX = 4095;
+        private const float RADIUS = 70;
+        // 22.5 makes 8 bands like original Boing
+        private const float STEP_LONGITUDE = 22.5f;
+        private const float STEP_LATITUDE = 22.5f;
+        private const float DISTANCE_BALL = RADIUS * 2 + RADIUS * 0.1f;
+        // Distance from viewer to middle of buing area
+        private const float VIEW_SCENE_DISTANCE = DISTANCE_BALL * 3 + 200;
+        // Length (width) of grid
+        private const float GRID_SIZE = (RADIUS * 4.5f);
+        private const float BOUNCE_HEIGHT = (RADIUS * 2.1f);
+        private const float BOUNCE_WIDTH = (RADIUS * 2.1f);
+        // Maximum allowed delta time per physics iteration
+        private const float MAX_DELTA_TIME = 0.02f;
+        // Animation speed (50.0 mimics the original GLUT demo speed)
+        private const float ANIMATION_SPEED = 50;
+        private const float SHADOW_OFFSET_X = -20;
+        private const float SHADOW_OFFSET_Y = 10;
+        private const float SHADOW_OFFSET_Z = 0;
+        private const float WALL_LEFT_OFFSET = 0;
+        private const float WALL_RIGHT_OFFSET = 5f;
+        #endregion Private Constants
+
+        #region Private Enums
+        #region DrawType
+        /// <summary>
+        ///     Draw type.
+        /// </summary>
+        private enum DrawType {
+            /// <summary>
+            ///     Draw ball.
+            /// </summary>
+            DrawBall,
+            /// <summary>
+            ///     Draw ball's shadow.
+            /// </summary>
+            DrawBallShadow
+        }
+        #endregion DrawType
+        #endregion Private Enums
+
+        #region Private Structs
+        #region Vertex
+        /// <summary>
+        ///     Vertex structure.
+        /// </summary>
+        private struct Vertex {
+            /// <summary>
+            ///     X coordinate.
+            /// </summary>
+            public float X;
+            /// <summary>
+            ///     Y coordinate.
+            /// </summary>
+            public float Y;
+            /// <summary>
+            ///     Z coordinate.
+            /// </summary>
+            public float Z;
+        }
+        #endregion Vertex
+        #endregion Private Structs
+
+        #region Private Static Fields
+        private static Random rand = new Random();
+        private static double currentTime, oldTime, timeDifference;
+        private static float yRotationDegree = 0;
+        private static float yRotationDegreeIncrement = 2;
+        private static float ballX = -RADIUS;
+        private static float ballY = -RADIUS;
+        private static float ballXIncrement = 1;
+        private static float ballYIncrement = 2;
+        private static DrawType drawType;
+        private static bool isColor;
+        #endregion Private Static Fields
+
+        // --- Application Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            bool isRunning = true;
+
+            // Initialise GLFW
+            Glfw.glfwInit();
+            if(Glfw.glfwOpenWindow(400, 400, 0, 0, 0, 0, 16, 0, Glfw.GLFW_WINDOW) == Gl.GL_FALSE) {
+                Glfw.glfwTerminate();
+                return;
+            }
+            Glfw.glfwSetWindowTitle("Boing (classic Amiga demo)");
+            Glfw.glfwSetWindowSizeCallback(new Glfw.GLFWwindowsizefun(Reshape));
+            Glfw.glfwEnable(Glfw.GLFW_STICKY_KEYS);
+            Glfw.glfwSwapInterval(1);
+            // TODO: Glfw.glfwSetTime(0.0);
+
+            Init();
+
+            // Main loop
+            while(isRunning) {
+                // Timing
+                currentTime = Glfw.glfwGetTime();
+                timeDifference = currentTime - oldTime;
+                oldTime = currentTime;
+
+                // Draw one frame
+                Display();
+
+                // Swap buffers
+                Glfw.glfwSwapBuffers();
+
+                // Check if we are still running
+                isRunning = ((Glfw.glfwGetKey(Glfw.GLFW_KEY_ESC) == Glfw.GLFW_RELEASE) &&
+                    Glfw.glfwGetWindowParam(Glfw.GLFW_OPENED) == Gl.GL_TRUE);
+            }
+
+            // Close OpenGL window and terminate GLFW
+            Glfw.glfwTerminate();
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region BounceBall(double timeDifference)
+        /// <summary>
+        ///     Bounces the ball.
+        /// </summary>
+        /// <param name="timeDifference">
+        ///     The time difference.
+        /// </param>
+        private static void BounceBall(double timeDifference) {
+            float sign;
+            float degree;
+
+            // Bounce on walls
+            if(ballX > (BOUNCE_WIDTH / 2 + WALL_RIGHT_OFFSET)) {
+                ballXIncrement = -0.5f - 0.75f * (float) rand.NextDouble() / (float) RAND_MAX;
+                yRotationDegreeIncrement = -yRotationDegreeIncrement;
+            }
+
+            if(ballX < -(BOUNCE_HEIGHT / 2 + WALL_LEFT_OFFSET)) {
+                ballXIncrement = 0.5f + 0.75f * (float) rand.NextDouble() / (float) RAND_MAX;
+                yRotationDegreeIncrement = -yRotationDegreeIncrement;
+            }
+
+            // Bounce on floor / ceiling
+            if(ballY > BOUNCE_HEIGHT / 2) {
+                ballYIncrement = -0.75f - 1.0f * (float) rand.NextDouble() / (float) RAND_MAX;
+            }
+
+            if(ballY < -BOUNCE_HEIGHT / 2 * 0.85f) {
+                ballYIncrement = 0.75f + 1 * (float) rand.NextDouble() / (float) RAND_MAX;
+            }
+
+            // Update ball position
+            ballX += (float) (ballXIncrement * (timeDifference * ANIMATION_SPEED));
+            ballY += (float) (ballYIncrement * (timeDifference * ANIMATION_SPEED));
+
+            // Simulate the effects of gravity on Y movement
+            if(ballYIncrement < 0) {
+                sign = -1;
+            }
+            else {
+                sign = 1;
+            }
+
+            degree = (ballY + BOUNCE_HEIGHT / 2) * 90 / BOUNCE_HEIGHT;
+
+            if(degree > 80) {
+                degree = 80;
+            }
+            else if(degree < 10) {
+                degree = 10;
+            }
+
+            ballYIncrement = sign * 4 * (float) SinDegree(degree);
+        }
+        #endregion BounceBall(double timeDifference)
+
+        #region double CosDegree(double degree)
+        /// <summary>
+        ///     360' Cos().
+        /// </summary>
+        /// <param name="degree">
+        ///     The degree.
+        /// </param>
+        /// <returns>
+        ///     The Cos.
+        /// </returns>
+        private static double CosDegree(double degree) {
+            return Math.Cos(DegreeToRadian(degree));
+        }
+        #endregion double CosDegree(double degree)
+
+        #region CrossProduct(Vertex a, Vertex b, Vertex c, out Vertex normal)
+        /// <summary>
+        ///     Computes a cross product for a vector normal.
+        /// </summary>
+        /// <param name="a">
+        ///     First vector.
+        /// </param>
+        /// <param name="b">
+        ///     Second vector.
+        /// </param>
+        /// <param name="c">
+        ///     Third vector.
+        /// </param>
+        /// <param name="normal">
+        ///     The normalized vector.
+        /// </param>
+        private static void CrossProduct(Vertex a, Vertex b, Vertex c, out Vertex normal) {
+            float u1, u2, u3;
+            float v1, v2, v3;
+
+            u1 = b.X - a.X;
+            u2 = b.Y - a.Y;
+            u3 = b.Y - a.Z;
+
+            v1 = c.X - a.X;
+            v2 = c.Y - a.Y;
+            v3 = c.Z - a.Z;
+
+            normal.X = u2 * v3 - v2 * v3;
+            normal.Y = u3 * v1 - v3 * u1;
+            normal.Z = u1 * v2 - v1 * u2;
+        }
+        #endregion CrossProduct(Vertex a, Vertex b, Vertex c, out Vertex normal)
+
+        #region double DegreeToRadian(double degree)
+        /// <summary>
+        ///     Converts a degree to a radian.
+        /// </summary>
+        /// <param name="degree">
+        ///     The degree.
+        /// </param>
+        /// <returns>
+        ///     The radian.
+        /// </returns>
+        private static double DegreeToRadian(double degree) {
+            return degree / 360 * (2 * PI);
+        }
+        #endregion double DegreeToRadian(double degree)
+
+        #region Display()
+        /// <summary>
+        ///     Draws a frame.
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glPushMatrix();
+                drawType = DrawType.DrawBallShadow;
+                DrawBoingBall();
+                DrawGrid();
+                drawType = DrawType.DrawBall;
+                DrawBoingBall();
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region DrawBoingBall()
+        /// <summary>
+        ///     Draws the Boing ball.
+        /// </summary>
+        /// <remarks>
+        ///     The Boing ball is sphere in which each facet is a rectangle.  Facet colors
+        ///     alternate between red and white.  The ball is built by stacking latitudinal
+        ///     circles.  Each circle is composed of a widely-separated set of points, so
+        ///     that each facet is noticably large.
+        /// </remarks>
+        private static void DrawBoingBall() {
+            float degreeOfLongitude;
+            double timeDifferenceTotal, timeDifferenceTemp;
+
+            Gl.glPushMatrix();
+                Gl.glMatrixMode(Gl.GL_MODELVIEW);
+
+                // Another relative Z translation to separate objects
+                Gl.glTranslatef(0, 0, (float) DISTANCE_BALL);
+
+                // Update ball position and rotation (iterate if necessary)
+                timeDifferenceTotal = timeDifference;
+                while(timeDifferenceTotal > 0.0) {
+                    timeDifferenceTemp = timeDifferenceTotal > MAX_DELTA_TIME ? MAX_DELTA_TIME :
+                        timeDifferenceTotal;
+                    timeDifferenceTotal -= timeDifferenceTemp;
+                    BounceBall(timeDifferenceTemp);
+                    yRotationDegree = TruncateDegree((float) (yRotationDegree + yRotationDegreeIncrement *
+                        (timeDifferenceTemp * ANIMATION_SPEED)));
+                }
+
+                // Set ball position
+                Gl.glTranslatef(ballX, ballY, 0);
+
+                // Offset the shadow
+                if(drawType == DrawType.DrawBallShadow) {
+                    Gl.glTranslatef(SHADOW_OFFSET_X, SHADOW_OFFSET_Y, SHADOW_OFFSET_Z);
+                }
+
+                // Tilt the ball
+                Gl.glRotatef(-20, 0, 0, 1);
+
+                // Continually rotate ball around Y axis
+                Gl.glRotatef(yRotationDegree, 0, 1, 0);
+
+                // Set OpenGL state for Boing ball
+                Gl.glCullFace(Gl.GL_FRONT);
+                Gl.glEnable(Gl.GL_CULL_FACE);
+                Gl.glEnable(Gl.GL_NORMALIZE);
+
+                // Build a faceted latitude slice of the Boing ball,  stepping same-sized vertical
+                // bands of the sphere
+                for(degreeOfLongitude = 0; degreeOfLongitude < 180;
+                    degreeOfLongitude += STEP_LONGITUDE) {
+                    // Draw a latitude circle at this longitude
+                    DrawBoingBallBand(degreeOfLongitude, degreeOfLongitude + STEP_LONGITUDE);
+                }
+            Gl.glPopMatrix();
+        }
+        #endregion DrawBoingBall()
+
+        #region DrawBoingBallBand(float low, float high)
+        /// <summary>
+        ///     Drawa a faceted latitude band of the Boing ball.
+        /// </summary>
+        /// <param name="low">
+        ///     The low longitude of the slice.
+        /// </param>
+        /// <param name="high">
+        ///     The high longitude of the slice.
+        /// </param>
+        private static void DrawBoingBallBand(float low, float high) {
+            // "ne" means north-east, so on
+            Vertex neVertex;
+            Vertex nwVertex;
+            Vertex seVertex;
+            Vertex swVertex;
+            Vertex normalVertex;
+            float degreeLatitude;
+
+            // Iterate thru the points of a latitude circle.  A latitude circle is a 2D set of
+            // X, Z points
+            for(degreeLatitude = 0; degreeLatitude <= (360 - STEP_LATITUDE);
+                degreeLatitude += STEP_LATITUDE) {
+            // Color this polygon with red or white
+                if(isColor) {
+                    Gl.glColor3f(0.8f, 0.1f, 0.1f);
+                }
+                else {
+                    Gl.glColor3f(0.95f, 0.95f, 0.95f);
+                }
+
+                #if BOING_DEBUG
+                if(degreeLatitude >= 180) {
+                    if(isColor) {
+                        Gl.glColor3f(0.1f, 0.8f, 0.1f);
+                    }
+                    else {
+                        Gl.glColor3f(0.5f, 0.5f, 0.95f);
+                    }
+                }
+                #endif
+
+                isColor = !isColor;
+
+                // Change color if drawing shadow
+                if(drawType == DrawType.DrawBallShadow) {
+                    Gl.glColor3f(0.35f, 0.35f, 0.35f);
+                }
+
+                // Assign each Y
+                neVertex.Y = nwVertex.Y = (float) CosDegree(high) * RADIUS;
+                swVertex.Y = seVertex.Y = (float) CosDegree(low) * RADIUS;
+
+                // Assign each X, Z with Sin, Cos values scaled by latitude radius indexed by
+                // longitude.  E.G. longitude = 0 and longitude = 180 are at the poles, so zero
+                // scale is Sin(longitude), while longitude = 90 (Sin(90) = 1) is at equator
+                neVertex.X = (float) CosDegree(degreeLatitude) * (float) (RADIUS * SinDegree(low + STEP_LONGITUDE));
+                seVertex.X = (float) CosDegree(degreeLatitude) * (float) (RADIUS * SinDegree(low));
+                nwVertex.X = (float) CosDegree(degreeLatitude + STEP_LATITUDE) * (float) (RADIUS * SinDegree(low + STEP_LONGITUDE));
+                swVertex.X = (float) CosDegree(degreeLatitude + STEP_LATITUDE) * (float) (RADIUS * SinDegree(low));
+
+                neVertex.Z = (float) SinDegree(degreeLatitude) * (float) (RADIUS * SinDegree(low + STEP_LONGITUDE));
+                seVertex.Z = (float) SinDegree(degreeLatitude) * (float) (RADIUS * SinDegree(low));
+                nwVertex.Z = (float) SinDegree(degreeLatitude + STEP_LATITUDE) * (float) (RADIUS * SinDegree(low + STEP_LONGITUDE));
+                swVertex.Z = (float) SinDegree(degreeLatitude + STEP_LATITUDE) * (float) (RADIUS * SinDegree(low));
+
+                //  Draw the facet
+                Gl.glBegin(Gl.GL_POLYGON);
+                    CrossProduct(neVertex, nwVertex, swVertex, out normalVertex);
+                    Gl.glNormal3f(normalVertex.X, normalVertex.Y, normalVertex.Z);
+                    Gl.glVertex3f(neVertex.X, neVertex.Y, neVertex.Z);
+                    Gl.glVertex3f(nwVertex.X, nwVertex.Y, nwVertex.Z);
+                    Gl.glVertex3f(swVertex.X, swVertex.Y, swVertex.Z);
+                    Gl.glVertex3f(seVertex.X, seVertex.Y, seVertex.Z);
+                Gl.glEnd();
+
+                #if BOING_DEBUG
+                Console.WriteLine("-----------------------------------------------------------");
+                Console.WriteLine("lat = {0}  low = {1}  high = {2}", degreeLatitude, low, high);
+                Console.WriteLine( "vert_ne  x = %.8f  y = %.8f  z = %.8f \n", vert_ne.x, vert_ne.y, vert_ne.z );
+                Console.WriteLine( "vert_nw  x = %.8f  y = %.8f  z = %.8f \n", vert_nw.x, vert_nw.y, vert_nw.z );
+                Console.WriteLine( "vert_se  x = %.8f  y = %.8f  z = %.8f \n", vert_se.x, vert_se.y, vert_se.z );
+                Console.WriteLine( "vert_sw  x = %.8f  y = %.8f  z = %.8f \n", vert_sw.x, vert_sw.y, vert_sw.z );
+                #endif
+            }
+
+            // Toggle color so that next band will opposite red/white colors than this one
+            isColor = !isColor;
+        }
+        #endregion DrawBoingBallBand(float low, float high)
+
+        #region DrawGrid()
+        /// <summary>
+        ///     Draws the purple grid of lines behind the Boing ball.
+        /// </summary>
+        private static void DrawGrid() {
+            int row, column;
+            int rowTotal = 12;              // must be divisible by 2
+            int columnTotal = rowTotal;     // must be same as rowTotal
+            float widthLine = 2;            // should be divisible by 2
+            float sizeCell = (float) GRID_SIZE / rowTotal;
+            float z_offset = -40;
+            float xl, xr;
+            float yt, yb;
+
+            Gl.glPushMatrix();
+                Gl.glDisable(Gl.GL_CULL_FACE);
+
+                // Another relative Z translation to separate objects
+                Gl.glTranslatef(0, 0, DISTANCE_BALL);
+
+                // Draw vertical lines (as skinny 3D rectangles)
+                for(column = 0; column <= columnTotal; column++) {
+                    // Compute coordinatess of line
+                    xl = (float) -GRID_SIZE / 2 + column * sizeCell;
+                    xr = xl + widthLine;
+
+                    yt =  (float) GRID_SIZE / 2;
+                    yb = (float) -GRID_SIZE / 2 - widthLine;
+
+                    Gl.glBegin(Gl.GL_POLYGON);
+                        Gl.glColor3f(0.6f, 0.1f, 0.6f);     // purple
+                        Gl.glVertex3f(xr, yt, z_offset);    // NE
+                        Gl.glVertex3f(xl, yt, z_offset);    // NW
+                        Gl.glVertex3f(xl, yb, z_offset);    // SW
+                        Gl.glVertex3f(xr, yb, z_offset);    // SE
+                    Gl.glEnd();
+                }
+
+                // Draw horizontal lines (as skinny 3D rectangles)
+                for(row = 0; row <= rowTotal; row++) {
+                    // Compute coordinates of line
+                    yt = (float) GRID_SIZE / 2 - row * sizeCell;
+                    yb = yt - widthLine;
+
+                    xl = (float) -GRID_SIZE / 2;
+                    xr = (float) GRID_SIZE / 2 + widthLine;
+
+                    Gl.glBegin(Gl.GL_POLYGON);
+                        Gl.glColor3f(0.6f, 0.1f, 0.6f);     // purple
+                        Gl.glVertex3f(xr, yt, z_offset);    // NE
+                        Gl.glVertex3f(xl, yt, z_offset);    // NW
+                        Gl.glVertex3f(xl, yb, z_offset);    // SW
+                        Gl.glVertex3f(xr, yb, z_offset);    // SE
+                    Gl.glEnd();
+                }
+            Gl.glPopMatrix();
+        }
+        #endregion DrawGrid()
+
+        #region Init()
+        /// <summary>
+        ///     Initializes some GL settings.
+        /// </summary>
+        private static void Init() {
+            // Clear background
+            Gl.glClearColor(0.55f, 0.55f, 0.55f, 0.0f);
+            // Flat shading
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        #region double PerspectiveAngle(double size, double distance)
+        /// <summary>
+        ///     Calculates the angle to be passed to <see cref="Glu.gluPerspective" /> so that
+        ///     a scene is visible.
+        /// </summary>
+        /// <param name="size">
+        ///     The size of the segment when the angle is intersected at
+        ///     <paramref name="distance" />.
+        /// </param>
+        /// <param name="distance">
+        ///     The distance from viewpoint to the scene.
+        /// </param>
+        /// <returns></returns>
+        private static double PerspectiveAngle(double size, double distance) {
+            double radianTheta = 2 * Math.Atan2(size / 2, distance);
+            return (double) (180 * radianTheta) / PI;
+        }
+        #endregion double PerspectiveAngle(double size, double distance)
+
+        #region double SinDegree(double degree)
+        /// <summary>
+        ///     360' Sin().
+        /// </summary>
+        /// <param name="degree">
+        ///     The degree.
+        /// </param>
+        /// <returns>
+        ///     The Sin.
+        /// </returns>
+        private static double SinDegree(double degree) {
+            return Math.Sin(DegreeToRadian(degree));
+        }
+        #endregion double SinDegree(double degree)
+
+        #region float TruncateDegree(float degree)
+        /// <summary>
+        ///     Truncates a degree.
+        /// </summary>
+        /// <param name="degree">
+        ///     The degree to truncate.
+        /// </param>
+        /// <returns>
+        ///     The truncated degree value.
+        /// </returns>
+        private static float TruncateDegree(float degree) {
+            if(degree >= 360.0f) {
+                return (degree - 360.0f);
+            }
+            else {
+                return degree;
+            }
+        }
+        #endregion float TruncateDegree(float degree)
+
+        // --- Private GLFW Callback Methods ---
+        #region Reshape(int width, int height)
+        /// <summary>
+        ///     Handles GLFW's window reshape callback.
+        /// </summary>
+        /// <param name="width">
+        ///     New window width.
+        /// </param>
+        /// <param name="height">
+        ///     New window height.
+        /// </param>
+        private static void Reshape(int width, int height) {
+            Gl.glViewport(0, 0, width, height);
+
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+
+            Glu.gluPerspective(PerspectiveAngle(RADIUS * 2, 200),
+                (double) width / (double) height,
+                1,
+                VIEW_SCENE_DISTANCE);
+
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+
+            Glu.gluLookAt(0, 0, VIEW_SCENE_DISTANCE,    // eye
+                0, 0, 0,                                // center of vision
+                0, -1, 0);                              // up vector
+        }
+        #endregion Reshape(int width, int height)
+    }
+}
diff --git a/examples/GlfwExamples/COPYING b/examples/GlfwExamples/COPYING
new file mode 100644
index 0000000..a57cb63
--- /dev/null
+++ b/examples/GlfwExamples/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2004 Randy Ridge
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/GlfwExamples/Cube.cs b/examples/GlfwExamples/Cube.cs
new file mode 100644
index 0000000..c53a10d
--- /dev/null
+++ b/examples/GlfwExamples/Cube.cs
@@ -0,0 +1,222 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Tao.Glfw;
+using Tao.OpenGl;
+
+namespace GlfwExamples
+{
+    class Cube : IDisposable
+    {
+        #region Shaders
+
+        string[] vertex_shader =
+        {
+            "void main() { ",
+            "gl_FrontColor = gl_Color;",
+            "gl_Position = ftransform();",
+            "}"
+        };
+            
+        string[] fragment_shader =
+        {
+            "void main() { gl_FragColor = gl_Color; }"
+        };
+
+        #endregion
+
+        bool exit = false;
+        int vs_object, fs_object, program;
+
+        #region Constructor
+
+        public Cube()
+        {
+            Glfw.glfwInit();
+            Glfw.glfwOpenWindow(640, 480, 8, 8, 8, 8, 16, 0, Glfw.GLFW_WINDOW);
+            Glfw.glfwSetWindowTitle(
+                Gl.glGetString(Gl.GL_VENDOR) + " " +
+                Gl.glGetString(Gl.GL_RENDERER) + " " +
+                Gl.glGetString(Gl.GL_VERSION)
+            );
+
+            Gl.glClearColor(0.1f, 0.1f, 0.5f, 0.0f);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            vs_object = Gl.glCreateShader(Gl.GL_VERTEX_SHADER);
+            fs_object = Gl.glCreateShader(Gl.GL_FRAGMENT_SHADER);
+
+            int[] status = new int[1];
+
+            Gl.glShaderSource(vs_object, 1, vertex_shader, null);
+            Gl.glCompileShader(vs_object);
+            Gl.glGetShaderiv(vs_object, Gl.GL_COMPILE_STATUS, status);
+            //if (status[0] != Gl.GL_TRUE)
+            //    throw new Exception("Could not compile vertex shader");
+
+            Gl.glShaderSource(fs_object, 1, fragment_shader, null);
+            Gl.glCompileShader(fs_object);
+            Gl.glGetShaderiv(fs_object, Gl.GL_COMPILE_STATUS, status);
+            //if (status[0] != Gl.GL_TRUE)
+            //    throw new Exception("Could not compile fragment shader");
+
+            program = Gl.glCreateProgram();
+            Gl.glAttachShader(program, fs_object);
+            Gl.glAttachShader(program, vs_object);
+
+            Gl.glLinkProgram(program);
+            Gl.glUseProgram(program);
+
+            Glfw.GLFWwindowsizefun ResizeCallback = new Glfw.GLFWwindowsizefun(Resize);
+            Glfw.GLFWwindowclosefun CloseCallback = new Glfw.GLFWwindowclosefun(Close);
+            Glfw.glfwSetWindowSizeCallback(ResizeCallback);
+            Glfw.glfwSetWindowCloseCallback(CloseCallback);
+        }
+
+        #endregion
+
+        #region Resize
+
+        void Resize(int w, int h)
+        {
+            // Prevent a divide by zero, when window is too short
+            // (you cant make a window of zero width).
+            if (h == 0)
+                h = 1;
+
+            double ratio = 1.0 * w / h;
+
+            // Reset the coordinate system before modifying
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+
+            // Set the viewport to be the entire window
+            Gl.glViewport(0, 0, w, h);
+
+            // Set the correct perspective.
+            Glu.gluPerspective(45.0, ratio, 1.0, 64.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+
+        #endregion
+
+        #region Close
+
+        int Close()
+        {
+            exit = true;
+            return 0;
+        }
+
+        #endregion
+
+        #region Render
+
+        public void Render()
+        {
+            Gl.glBegin(Gl.GL_QUADS);
+
+            Gl.glColor3f(1, 0, 0);
+            Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
+            Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
+            Gl.glVertex3f(1.0f, 1.0f, -1.0f);
+            Gl.glVertex3f(1.0f, -1.0f, -1.0f);
+
+            Gl.glColor3f(1, 1, 0);
+            Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
+            Gl.glVertex3f(1.0f, -1.0f, -1.0f);
+            Gl.glVertex3f(1.0f, -1.0f, 1.0f);
+            Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
+
+            Gl.glColor3f(1, 0, 1);
+            Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
+            Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
+            Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
+            Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
+
+            Gl.glColor3f(0, 1, 0);
+            Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
+            Gl.glVertex3f(1.0f, -1.0f, 1.0f);
+            Gl.glVertex3f(1.0f, 1.0f, 1.0f);
+            Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
+
+            Gl.glColor3f(0, 0, 1);
+            Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
+            Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
+            Gl.glVertex3f(1.0f, 1.0f, 1.0f);
+            Gl.glVertex3f(1.0f, 1.0f, -1.0f);
+
+            Gl.glColor3f(0, 1, 1);
+            Gl.glVertex3f(1.0f, -1.0f, -1.0f);
+            Gl.glVertex3f(1.0f, 1.0f, -1.0f);
+            Gl.glVertex3f(1.0f, 1.0f, 1.0f);
+            Gl.glVertex3f(1.0f, -1.0f, 1.0f);
+
+            Gl.glEnd();
+        }
+
+        #endregion
+
+        public void MainLoop()
+        {
+            float angle = 0.0f;
+
+            while (!exit)
+            {
+                Glfw.glfwPollEvents();
+
+                if (Glfw.glfwGetKey(Glfw.GLFW_KEY_ESC) == Glfw.GLFW_KEY_DOWN)
+                    exit = true;
+
+                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+                
+                Gl.glLoadIdentity();
+                Glu.gluLookAt(0.0f, 5.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
+                Gl.glRotatef(angle, 0.0f, 1.0f, 0.0f);
+                angle += 0.01f;
+                
+                Render();
+                                
+                Glfw.glfwSwapBuffers();
+            }
+        }
+
+        #region IDisposable Members
+
+        public void Dispose()
+        {
+            GC.SuppressFinalize(this);
+            Glfw.glfwCloseWindow();
+            Glfw.glfwTerminate();
+        }
+
+        #endregion
+    }
+}
diff --git a/examples/GlfwExamples/Gears.cs b/examples/GlfwExamples/Gears.cs
new file mode 100644
index 0000000..cc9da96
--- /dev/null
+++ b/examples/GlfwExamples/Gears.cs
@@ -0,0 +1,448 @@
+#region License
+/*
+MIT License
+Copyright �2003-2004 Randy Ridge
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits/License
+/*
+Copyright (c) 2002-2004 Marcus Geelnard
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would
+   be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must not
+   be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+   distribution.
+
+Marcus Geelnard
+marcus.geelnard at home.se
+*/
+
+/*
+ * 3-D gear wheels.  This program is in the public domain.
+ *
+ * Command line options:
+ *    -info      print GL implementation information
+ *    -exit      automatically exit after 30 seconds
+ *
+ *
+ * Brian Paul
+ *
+ *
+ * Marcus Geelnard:
+ *   - Conversion to GLFW
+ *   - Time based rendering (frame rate independent)
+ *   - Slightly modified camera that should work better for stereo viewing
+ */
+#endregion Original Credits/License
+
+using System;
+using Tao.Glfw;
+using Tao.OpenGl;
+
+namespace GlfwExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     This is a small test application for GLFW.
+    /// </summary>
+    /// <remarks>
+    ///     Classic gears.
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Gears {
+        // --- Fields ---
+        #region Private Constants
+        private const float PI = 3.141592654f;
+        #endregion Private Constants
+
+        #region Private Static Fields
+        private static bool isRunning = true;
+        private static double currentTime = 0;
+        private static double oldTime = 0;
+        private static double timeDifference = 0;
+        private static int frameCount;
+        private static int autoExit = 0;
+        private static float[] lightPosition = new float[] {5, 5, 10, 0};
+        private static float[] redMaterial = new float[] {0.8f, 0.1f, 0, 1};
+        private static float[] greenMaterial = new float[] {0, 0.8f, 0.2f, 1};
+        private static float[] blueMaterial = new float[] {0.2f, 0.2f, 1, 1};
+        private static float rotateX = 20, rotateY = 30, rotateZ = 0;
+        private static int gear1, gear2, gear3;
+        private static float angle = 0;
+        #endregion Private Static Fields
+
+        // --- Application Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            // Initialise GLFW and open window
+            Glfw.glfwInit();
+            if(Glfw.glfwOpenWindow(300, 300, 0, 0, 0, 0, 0, 0, Glfw.GLFW_WINDOW) == Gl.GL_FALSE) {
+                Glfw.glfwTerminate();
+                return;
+            }
+            Glfw.glfwSetWindowTitle("Gears");
+            Glfw.glfwEnable(Glfw.GLFW_KEY_REPEAT);
+            Glfw.glfwSwapInterval(0);
+
+            Init();
+
+            // Set callback functions
+            Glfw.glfwSetWindowSizeCallback(new Glfw.GLFWwindowsizefun(Reshape));
+            Glfw.glfwSetKeyCallback(new Glfw.GLFWkeyfun(Key));
+
+            // Main loop
+            while(isRunning) {
+                // Draw gears
+                Draw();
+
+                // Update animation
+                Animate();
+
+                // Swap Buffers
+                Glfw.glfwSwapBuffers();
+
+                if(Glfw.glfwGetWindowParam(Glfw.GLFW_OPENED) == Gl.GL_FALSE) {
+                    isRunning = false;
+                }
+            }
+
+            // Close OpenGL window and terminate GLFW
+            Glfw.glfwTerminate();
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region Animate()
+        /// <summary>
+        ///     Updates animation parameters.
+        /// </summary>
+        private static void Animate() {
+            angle += 100 * (float) timeDifference;
+        }
+        #endregion Animate()
+
+        #region Draw()
+        /// <summary>
+        ///     OpenGL draw function and timing.
+        /// </summary>
+        private static void Draw() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glRotatef(rotateX, 1, 0, 0);
+                Gl.glRotatef(rotateY, 0, 1, 0);
+                Gl.glRotatef(rotateZ, 0, 0, 1);
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-3, -2, 0);
+                    Gl.glRotatef(angle, 0, 0, 1);
+                    Gl.glCallList(gear1);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(3.1f, -2, 0);
+                    Gl.glRotatef(-2 * angle - 9, 0, 0, 1);
+                    Gl.glCallList(gear2);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-3.1f, 4.2f, 0);
+                    Gl.glRotatef(-2 * angle - 25, 0, 0, 1);
+                    Gl.glCallList(gear3);
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+
+            frameCount++;
+
+            double newTime = Glfw.glfwGetTime();
+            timeDifference = newTime - currentTime;
+            currentTime = newTime;
+
+            if(currentTime  - oldTime >= 5.0) {
+                double seconds = currentTime - oldTime;
+                double fps = frameCount / seconds;
+                Console.WriteLine("{0} frames in {1} seconds = {2} FPS", frameCount, seconds, fps);
+                oldTime = currentTime;
+                frameCount = 0;
+                if((currentTime >= 0.999 * autoExit) && (autoExit > 0)) {
+                    isRunning = false;
+                }
+            }
+        }
+        #endregion Draw()
+
+        #region Gear(float innerRadius, float outerRadius, float width, float teeth, float toothDepth)
+        private static void Gear(float innerRadius, float outerRadius, float width, float teeth, float toothDepth) {
+            int i;
+            float r0, r1, r2;
+            float angle, da;
+            float u, v, len;
+
+            r0 = innerRadius;
+            r1 = outerRadius - toothDepth / 2;
+            r2 = outerRadius + toothDepth / 2;
+
+            da = 2 * PI / teeth / 4;
+
+            Gl.glShadeModel(Gl.GL_FLAT);
+
+            Gl.glNormal3f(0, 0, 1);
+
+            // draw front face
+            Gl.glBegin(Gl.GL_QUAD_STRIP);
+                for(i = 0; i <= teeth; i++) {
+                    angle = i * 2 * PI / teeth;
+                    Gl.glVertex3f(r0 * (float) Math.Cos(angle), r0 * (float) Math.Sin(angle), width * 0.5f);
+                    Gl.glVertex3f(r1 * (float) Math.Cos(angle), r1 * (float) Math.Sin(angle), width * 0.5f);
+                    if(i < teeth) {
+                        Gl.glVertex3f(r0 * (float) Math.Cos(angle), r0 * (float) Math.Sin(angle), width * 0.5f);
+                        Gl.glVertex3f(r1 * (float) Math.Cos(angle + 3 * da), r1 * (float) Math.Sin(angle + 3 * da), width * 0.5f);
+                    }
+                }
+            Gl.glEnd();
+
+            // draw front sides of teeth
+            Gl.glBegin(Gl.GL_QUADS);
+                da = 2 * PI / teeth / 4;
+                for(i = 0; i < teeth; i++) {
+                    angle = i * 2 * PI / teeth;
+                    Gl.glVertex3f(r1 * (float) Math.Cos(angle), r1 * (float) Math.Sin(angle), width * 0.5f);
+                    Gl.glVertex3f(r2 * (float) Math.Cos(angle + da), r2 * (float) Math.Sin(angle + da), width * 0.5f);
+                    Gl.glVertex3f(r2 * (float) Math.Cos(angle + 2 * da), r2 * (float) Math.Sin(angle + 2 * da), width * 0.5f);
+                    Gl.glVertex3f(r1 * (float) Math.Cos(angle + 3 * da), r1 * (float) Math.Sin(angle + 3 * da), width * 0.5f);
+                }
+            Gl.glEnd();
+
+            Gl.glNormal3f(0, 0, -1);
+
+            // draw back face
+            Gl.glBegin(Gl.GL_QUAD_STRIP);
+                for(i = 0; i <= teeth; i++) {
+                    angle = i * 2 * PI / teeth;
+                    Gl.glVertex3f(r1 * (float) Math.Cos(angle), r1 * (float) Math.Sin(angle), -width * 0.5f);
+                    Gl.glVertex3f(r0 * (float) Math.Cos(angle), r0 * (float) Math.Sin(angle), -width * 0.5f);
+                    if(i < teeth) {
+                        Gl.glVertex3f(r1 * (float) Math.Cos(angle + 3 * da), r1 * (float) Math.Sin(angle + 3 * da), -width * 0.5f);
+                        Gl.glVertex3f(r0 * (float) Math.Cos(angle), r0 * (float) Math.Sin(angle), -width * 0.5f);
+                    }
+                }
+            Gl.glEnd();
+
+            // draw back sides of teeth
+            Gl.glBegin(Gl.GL_QUADS);
+                da = 2 * PI / teeth / 4;
+                for(i = 0; i < teeth; i++) {
+                    angle = i * 2 * PI / teeth;
+                    Gl.glVertex3f(r1 * (float) Math.Cos(angle + 3 * da), r1 * (float) Math.Sin(angle + 3 * da), -width * 0.5f);
+                    Gl.glVertex3f(r2 * (float) Math.Cos(angle + 2 * da), r2 * (float) Math.Sin(angle + 2 * da), -width * 0.5f);
+                    Gl.glVertex3f(r2 * (float) Math.Cos(angle + da), r2 * (float) Math.Sin(angle + da), -width * 0.5f);
+                    Gl.glVertex3f(r1 * (float) Math.Cos(angle), r1 * (float) Math.Sin(angle), -width * 0.5f);
+                }
+            Gl.glEnd();
+
+            // draw outward faces of teeth
+            Gl.glBegin(Gl.GL_QUAD_STRIP);
+                for(i = 0; i < teeth; i++) {
+                    angle = i * 2 * PI / teeth;
+                    Gl.glVertex3f(r1 * (float) Math.Cos(angle), r1 * (float) Math.Sin(angle), width * 0.5f);
+                    Gl.glVertex3f(r1 * (float) Math.Cos(angle), r1 * (float) Math.Sin(angle), -width * 0.5f);
+                    u = r2 * (float) Math.Cos(angle + da) - r1 * (float) Math.Cos(angle);
+                    v = r2 * (float) Math.Sin(angle + da) - r1 * (float) Math.Sin(angle);
+                    len = (float) Math.Sqrt(u * u + v * v);
+                    u /= len;
+                    v /= len;
+                    Gl.glNormal3f(v, -u, 0);
+                    Gl.glVertex3f(r2 * (float) Math.Cos(angle + da), r2 * (float) Math.Sin(angle + da), width * 0.5f);
+                    Gl.glVertex3f(r2 * (float) Math.Cos(angle + da), r2 * (float) Math.Sin(angle + da), -width * 0.5f);
+                    Gl.glNormal3f((float) Math.Cos(angle), (float) Math.Sin(angle), 0);
+                    Gl.glVertex3f(r2 * (float) Math.Cos(angle + 2 * da), r2 * (float) Math.Sin(angle + 2 * da), width * 0.5f);
+                    Gl.glVertex3f(r2 * (float) Math.Cos(angle + 2 * da), r2 * (float) Math.Sin(angle + 2 * da), -width * 0.5f);
+                    u = r1 * (float) Math.Cos(angle + 3 * da) - r2 * (float) Math.Cos(angle + 2 * da);
+                    v = r1 * (float) Math.Sin(angle + 3 * da) - r2 * (float) Math.Sin(angle + 2 * da);
+                    Gl.glNormal3f(v, -u, 0);
+                    Gl.glVertex3f(r1 * (float) Math.Cos(angle + 3 * da), r1 * (float) Math.Sin(angle + 3 * da), width * 0.5f);
+                    Gl.glVertex3f(r1 * (float) Math.Cos(angle + 3 * da), r1 * (float) Math.Sin(angle + 3 * da), -width * 0.5f);
+                    Gl.glNormal3f((float) Math.Cos(angle), (float) Math.Sin(angle), 0);
+                }
+
+                Gl.glVertex3f(r1 * (float) Math.Cos(0), r1 * (float) Math.Sin(0), width * 0.5f);
+                Gl.glVertex3f(r1 * (float) Math.Cos(0), r1 * (float) Math.Sin(0), -width * 0.5f);
+            Gl.glEnd();
+
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+
+            // draw inside radius cylinder
+            Gl.glBegin(Gl.GL_QUAD_STRIP);
+                for(i = 0; i <= teeth; i++) {
+                    angle = i * 2 * PI / teeth;
+                    Gl.glNormal3f((float) -Math.Cos(angle), (float) -Math.Sin(angle), 0);
+                    Gl.glVertex3f(r0 * (float) Math.Cos(angle), r0 * (float) Math.Sin(angle), -width * 0.5f);
+                    Gl.glVertex3f(r0 * (float) Math.Cos(angle), r0 * (float) Math.Sin(angle), width * 0.5f);
+                }
+            Gl.glEnd();
+        }
+        #endregion Gear(float innerRadius, float outerRadius, float width, float teeth, float toothDepth)
+
+        #region Init()
+        /// <summary>
+        ///     Performs program and OpenGL initialization.
+        /// </summary>
+        /// <param name="arguments">
+        ///     The command line arguments.
+        /// </param>
+        private static void Init() {
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+            Gl.glEnable(Gl.GL_CULL_FACE);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            // make the gears
+            gear1 = Gl.glGenLists(1);
+            Gl.glNewList(gear1, Gl.GL_COMPILE);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE, redMaterial);
+                Gear(1, 4, 1, 20, 0.7f);
+            Gl.glEndList();
+
+            gear2 = Gl.glGenLists(1);
+            Gl.glNewList(gear2, Gl.GL_COMPILE);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE, greenMaterial);
+                Gear(0.5f, 2, 2, 10, 0.7f);
+            Gl.glEndList();
+
+            gear3 = Gl.glGenLists(1);
+            Gl.glNewList(gear3, Gl.GL_COMPILE);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE, blueMaterial);
+                Gear(1.3f, 2, 0.5f, 10, 0.7f);
+            Gl.glEndList();
+
+            Gl.glEnable(Gl.GL_NORMALIZE);
+
+            //for(int i = 0; i < arguments.Length; i++) {
+            //    if(arguments[i] == "-info") {
+            //        Console.WriteLine("GL_RENDERER   = {0}", Gl.glGetString(Gl.GL_RENDERER));
+            //        Console.WriteLine("GL_VERSION    = {0}", Gl.glGetString(Gl.GL_VERSION));
+            //        Console.WriteLine("GL_VENDOR     = {0}", Gl.glGetString(Gl.GL_VENDOR));
+            //        Console.WriteLine("GL_EXTENSIONS = {0}", Gl.glGetString(Gl.GL_EXTENSIONS));
+            //    }
+            //    else if(arguments[i] == "-exit") {
+            //        autoExit = 30;
+            //        Console.WriteLine("Auto Exit after {0} seconds.", autoExit);
+            //    }
+            //}
+        }
+        #endregion Init()
+
+        // --- Private GLFW Callback Methods ---
+        #region Key(int key, int action)
+        /// <summary>
+        ///     Changes view angle, exits the app.
+        /// </summary>
+        /// <param name="key">
+        ///     The key.
+        /// </param>
+        /// <param name="action">
+        ///     The key action.
+        /// </param>
+        private static void Key(int key, int action) {
+            if(action != Glfw.GLFW_PRESS) {
+                return;
+            }
+
+            switch(key) {
+                case (int) 'Z':
+                    if(Glfw.glfwGetKey(Glfw.GLFW_KEY_LSHIFT) == Gl.GL_TRUE) {
+                        rotateZ -= 5;
+                    }
+                    else {
+                        rotateZ += 5;
+                    }
+                    break;
+                case Glfw.GLFW_KEY_ESC:
+                    isRunning = false;
+                    break;
+                case Glfw.GLFW_KEY_UP:
+                    rotateX += 5;
+                    break;
+                case Glfw.GLFW_KEY_DOWN:
+                    rotateX -= 5;
+                    break;
+                case Glfw.GLFW_KEY_LEFT:
+                    rotateY += 5;
+                    break;
+                case Glfw.GLFW_KEY_RIGHT:
+                    rotateY -= 5;
+                    break;
+                default:
+                    return;
+            }
+        }
+        #endregion Key(int key, int action)
+
+        #region Reshape(int width, int height)
+        /// <summary>
+        ///     Reshape callback.
+        /// </summary>
+        /// <param name="width">
+        ///     The window width.
+        /// </param>
+        /// <param name="height">
+        ///     The window height.
+        /// </param>
+        private static void Reshape(int width, int height) {
+            float h = (float) height / (float) width;
+            float xMax, zNear, zFar;
+
+            zNear = 5;
+            zFar  = 30;
+            xMax  = zNear * 0.5f;
+
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glFrustum(-xMax, xMax, -xMax * h, xMax * h, zNear, zFar);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0, 0, -20);
+        }
+        #endregion Reshape(int width, int height)
+    }
+}
diff --git a/examples/GlfwExamples/GlfwExamples.Designer.cs b/examples/GlfwExamples/GlfwExamples.Designer.cs
new file mode 100644
index 0000000..dc63797
--- /dev/null
+++ b/examples/GlfwExamples/GlfwExamples.Designer.cs
@@ -0,0 +1,106 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+namespace GlfwExamples
+{
+    partial class GlfwExamples
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GlfwExamples));
+            this.lstExamples = new System.Windows.Forms.ListBox();
+            this.btnRun = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // lstExamples
+            // 
+            this.lstExamples.FormattingEnabled = true;
+            this.lstExamples.Location = new System.Drawing.Point(13, 13);
+            this.lstExamples.Name = "lstExamples";
+            this.lstExamples.Size = new System.Drawing.Size(258, 173);
+            this.lstExamples.Sorted = true;
+            this.lstExamples.TabIndex = 0;
+            this.lstExamples.DoubleClick += new System.EventHandler(this.lstExamples_SelectedIndexChanged);
+            // 
+            // btnRun
+            // 
+            this.btnRun.Location = new System.Drawing.Point(94, 192);
+            this.btnRun.Name = "btnRun";
+            this.btnRun.Size = new System.Drawing.Size(95, 23);
+            this.btnRun.TabIndex = 1;
+            this.btnRun.Text = "Run";
+            this.btnRun.UseVisualStyleBackColor = true;
+            this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+            // 
+            // GlfwExamples
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(283, 224);
+            this.Controls.Add(this.btnRun);
+            this.Controls.Add(this.lstExamples);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "GlfwExamples";
+            this.Text = "GlfwExamples";
+            this.Load += new System.EventHandler(this.frmExamples_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ListBox lstExamples;
+        private System.Windows.Forms.Button btnRun;
+    }
+}
+
diff --git a/examples/GlfwExamples/GlfwExamples.cs b/examples/GlfwExamples/GlfwExamples.cs
new file mode 100644
index 0000000..ec61dcd
--- /dev/null
+++ b/examples/GlfwExamples/GlfwExamples.cs
@@ -0,0 +1,82 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace GlfwExamples
+{
+    public partial class GlfwExamples : Form
+    {
+        public GlfwExamples()
+        {
+            InitializeComponent();
+        }
+
+        private void frmExamples_Load(object sender, EventArgs e)
+        {
+            Type[] types = Assembly.GetExecutingAssembly().GetTypes();
+            foreach (Type type in types)
+            {
+                MemberInfo[] runMethods = type.GetMember("Run");
+                foreach (MemberInfo run in runMethods)
+                {
+                    lstExamples.Items.Add(type.Name);
+                }
+                if (lstExamples.Items.Count > 0)
+                {
+                    this.lstExamples.SelectedIndex = 0;
+                }
+            }
+        }
+
+        private void btnRun_Click(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+
+        private void SelectExample()
+        {
+            if (lstExamples.SelectedItem != null)
+            {
+                Type example = Assembly.GetExecutingAssembly().GetType("GlfwExamples." + lstExamples.SelectedItem.ToString(), true, true);
+                example.InvokeMember("Run", BindingFlags.InvokeMethod, null, null, null);
+            }
+        }
+
+        private void lstExamples_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+    }
+}
diff --git a/examples/GlfwExamples/GlfwExamples.csproj b/examples/GlfwExamples/GlfwExamples.csproj
new file mode 100644
index 0000000..10a2b6d
--- /dev/null
+++ b/examples/GlfwExamples/GlfwExamples.csproj
@@ -0,0 +1,151 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B60D9D96-28D9-4D65-B493-2D8EBD8CDF44}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>GlfwExamples</AssemblyName>
+    <AssemblyOriginatorKeyFile>../../src/Tao.Glfw/Tao.Glfw.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>GlfwExamples</RootNamespace>
+    <StartupObject>GlfwExamples.Program</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.Glfw\Tao.Glfw.csproj">
+      <Name>Tao.Glfw</Name>
+      <Project>{15C1A132-940F-4C07-B81A-74C56AC80D10}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="GlfwExamples.resx">
+      <DependentUpon>GlfwExamples.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="GlfwExamples.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Boing.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Cube.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Gears.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GlfwExamples.Designer.cs">
+      <DependentUpon>GlfwExamples.cs</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GlslLesson01.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="KeyTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ListModes.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Pong.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Triangle.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/GlfwExamples/GlfwExamples.resx b/examples/GlfwExamples/GlfwExamples.resx
new file mode 100644
index 0000000..06ec7be
--- /dev/null
+++ b/examples/GlfwExamples/GlfwExamples.resx
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAChl4QAopiGAKOZhgCjmYcAo5mIAKSahwCkmogApZuJAKaciQCmnIoAppyLAKiejACpn44ArKKRAK2j
+        kgCupZUAr6eXALGomACzqZkAsamaALOqmQCyqpsAtKuaALSsnQC0rJ4Atq2eALmxogC7s6UAvbSkALu0
+        pgC+t6sAwbuvAMW8rQDIv7AAycCxAMvFuwDLxrsA08y+ANDMwwDRzcQA08/GANfQwwDa08YA29THANfT
+        ywDY1MwA3dbKAODe2QDi4NoA5OHbAOPh3ADk4dwA5OLdAOTj3gDw6t8A7OnmAO7t6gDx8e8A9fXzAPX2
+        9AD4+fgA+fn4APj6+QD8/v4A/f//AP7//wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAQ0NDQ0NDQ0NDQ0NDMBcDDAwDFzFDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0M3Bw8cAAAAAAAAACsD
+        N0NDQ0NDQ0NDQ0NDQ0NDQ0NDFCctAAAAAAAAAAAAAAAAFENDQ0NDQ0NDQ0NDQ0NDERtAJgAAAAAAAAAA
+        AAAAAAAAABtDQ0NDQ0NDQ0NDQwY+QEAAAAAAAAAAAAAAAAAAAAAAAANDQ0NDQ0NDQ0MGQkBAEAAAAAAA
+        AAAAAAAAAAAAAAAAAAVDQ0NDQ0NDGz1AQEAgAAAAAAAAAAAAAAAAAAAAAAAAABFDQ0NDQ0MdQEBAQCkA
+        AAAAAAA0NQAAAAAAAAAAAAAAAENDQ0NDFkBAQEBAAAAAAAAAGkBAGgAAAAAAAAAAAAAAFENDQzknQEBA
+        QEAlAAAAAAAABwYAAAAAAAAAAAAAAAAAN0NDBkBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQ0MA
+        QEBAQEBAOAAAAAAAAAAAAAAAAAAAAAAAAAAAACtDMTJAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ADEZQkBAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAAFwNAQEBAQEBAQEBAJAAAAAAAAAAAAAAAAAAA
+        AAAAAAAEDkBAQEBAQEBAQEBAQRohAAAAAAAAAAAAAAAAAAAAAAwNQEBAQEBAQEBAQEBAQEA8IwsAAAAA
+        AAAAAAAAAAAADAVAQEBAQEBAQEBAQEBAQEBAQEEJAAAAAAAAAAAAAAADF0JAQEBAQEBAQEBAQEBAQEBA
+        QEA7AAAAAAAAAAAAABcwMEBAQEBAQEBAQEBAQEBAQEBAQEBALgAAAAAAAAAAMUMAQEBAQEBAQEBAQEBA
+        QEBAQEBAQEAtAAAAAAAAACtDQwhAQEBAQEBAQEBAQEBAQEBAQEBAQEAiAAAAAAAAA0NDNydAQEBAQEBA
+        QEBAQEAHCkBAQEBAQAEAAAAAAAA3Q0NDFkBAQEBAQEBAQEBAHjY2HkBAQEBAEwAAAAAAEkNDQ0NDHUBA
+        QEBAQEBAQEA/KipBQEBAQEATAAAAAABDQ0NDQ0MSPUBAQEBAQEBAQEBAQEBAQEBAQAwAAAAAG0NDQ0ND
+        Q0MHQkBAQEBAQEBAQEBAQEBAQEBBAAAAAAJDQ0NDQ0NDQ0MGPkBAQEBAQEBAQEBAQEBAQBEAAAADQ0ND
+        Q0NDQ0NDQ0MRGEBAQEBAQEBAQEBAQEA6AAAAG0NDQ0NDQ0NDQ0NDQ0NDFShBQEBAQEBAQEBAHwAAFEND
+        Q0NDQ0NDQ0NDQ0NDQ0NDNwYALEJAQEBALxIrAzdDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzFwYNDQMXMUND
+        Q0NDQ0NDQ0NDQ//wD///gAH//wAA//wAAD/4AAAf8AAAD+AAAAfgAAAHwAAAA4AAAAGAAAABgAAAAQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA+AAAAfgAAAH8AAAD/gA
+        AB/8AAA//wAA//+AAf//8A//
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/examples/GlfwExamples/GlfwExamples.sh b/examples/GlfwExamples/GlfwExamples.sh
new file mode 100755
index 0000000..99044ec
--- /dev/null
+++ b/examples/GlfwExamples/GlfwExamples.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./GlfwExamples.exe "$@"
diff --git a/examples/GlfwExamples/GlslLesson01.cs b/examples/GlfwExamples/GlslLesson01.cs
new file mode 100644
index 0000000..d11ab75
--- /dev/null
+++ b/examples/GlfwExamples/GlslLesson01.cs
@@ -0,0 +1,48 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+
+namespace GlfwExamples
+{
+    static class GlslLesson01
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        public static void Run()
+        {
+            //Application.EnableVisualStyles();
+            //Application.SetCompatibleTextRenderingDefault(false);
+            //Application.Run(new Example());
+            Cube e = new Cube();
+            e.MainLoop();
+        }
+    }
+}
\ No newline at end of file
diff --git a/examples/GlfwExamples/KeyTest.cs b/examples/GlfwExamples/KeyTest.cs
new file mode 100644
index 0000000..738fcf8
--- /dev/null
+++ b/examples/GlfwExamples/KeyTest.cs
@@ -0,0 +1,324 @@
+#region License
+/*
+MIT License
+Copyright �2003-2004 Randy Ridge
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits/License
+/*
+Copyright (c) 2002-2004 Marcus Geelnard
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would
+   be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must not
+   be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+   distribution.
+
+Marcus Geelnard
+marcus.geelnard at home.se
+*/
+#endregion Original Credits/License
+
+using System;
+using Tao.Glfw;
+using Tao.OpenGl;
+
+namespace GlfwExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     This is a small test application for GLFW.
+    /// </summary>
+    /// <remarks>
+    ///     Keyboard input test.
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class KeyTest {
+        // --- Fields ---
+        #region Private Static Fields
+        private static bool isRunning = true;
+        private static bool isKeyRepeat = false;
+        private static bool isSystemKeys = true;
+        #endregion Private Static Fields
+
+        // --- Application Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            int windowWidth, windowHeight;
+            double currentTime;
+
+            // Initialise GLFW
+            Glfw.glfwInit();
+
+            // Open OpenGL window
+            if(Glfw.glfwOpenWindow(250, 100, 0, 0, 0, 0, 0, 0, Glfw.GLFW_WINDOW) == Gl.GL_FALSE) {
+                Glfw.glfwTerminate();
+                return;
+            }
+
+            // Set key callback function
+            Glfw.glfwSetKeyCallback(new Glfw.GLFWkeyfun(Key));
+
+            // Set title
+            Glfw.glfwSetWindowTitle("Press some keys!");
+
+            // Main loop
+            while(isRunning) {
+                // Get time
+                currentTime = Glfw.glfwGetTime();
+
+                // Get window size (may be different than the requested size)
+                Glfw.glfwGetWindowSize(out windowWidth, out windowHeight);
+                windowHeight = windowHeight > 0 ? windowHeight : 1;
+
+                // Set viewport
+                Gl.glViewport(0, 0, windowWidth, windowHeight);
+
+                // Clear color buffer
+                Gl.glClearColor((float) (0.5f + 0.5f * (float) Math.Sin(3.0 * currentTime)),
+                    0, 0, 0);
+                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+                // Swap buffers
+                Glfw.glfwSwapBuffers();
+
+                // Check if the window was closed
+                if(Glfw.glfwGetWindowParam(Glfw.GLFW_OPENED) == Gl.GL_FALSE) {
+                    isRunning = false;
+                }
+            }
+
+            // Close OpenGL window and terminate GLFW
+            Glfw.glfwTerminate();
+        }
+        #endregion Run()
+
+        // --- Private GLFW Callback Methods ---
+        #region Key(int key, int action)
+        /// <summary>
+        ///     Handles GLFW key callback.
+        /// </summary>
+        /// <param name="key">
+        ///     The key.
+        /// </param>
+        /// <param name="action">
+        ///     The key action.
+        /// </param>
+        private static void Key(int key, int action) {
+            if(action != Glfw.GLFW_PRESS) {
+                return;
+            }
+
+            switch(key) {
+                case Glfw.GLFW_KEY_ESC:
+                    Console.WriteLine("ESC => quit program");
+                    isRunning = false;
+                    break;
+                case Glfw.GLFW_KEY_F1:
+                case Glfw.GLFW_KEY_F2:
+                case Glfw.GLFW_KEY_F3:
+                case Glfw.GLFW_KEY_F4:
+                case Glfw.GLFW_KEY_F5:
+                case Glfw.GLFW_KEY_F6:
+                case Glfw.GLFW_KEY_F7:
+                case Glfw.GLFW_KEY_F8:
+                case Glfw.GLFW_KEY_F9:
+                case Glfw.GLFW_KEY_F10:
+                case Glfw.GLFW_KEY_F11:
+                case Glfw.GLFW_KEY_F12:
+                case Glfw.GLFW_KEY_F13:
+                case Glfw.GLFW_KEY_F14:
+                case Glfw.GLFW_KEY_F15:
+                case Glfw.GLFW_KEY_F16:
+                case Glfw.GLFW_KEY_F17:
+                case Glfw.GLFW_KEY_F18:
+                case Glfw.GLFW_KEY_F19:
+                case Glfw.GLFW_KEY_F20:
+                case Glfw.GLFW_KEY_F21:
+                case Glfw.GLFW_KEY_F22:
+                case Glfw.GLFW_KEY_F23:
+                case Glfw.GLFW_KEY_F24:
+                case Glfw.GLFW_KEY_F25:
+                    Console.WriteLine("F{0}", 1 + key - Glfw.GLFW_KEY_F1);
+                    break;
+                case Glfw.GLFW_KEY_UP:
+                    Console.WriteLine("UP");
+                    break;
+                case Glfw.GLFW_KEY_DOWN:
+                    Console.WriteLine("DOWN");
+                    break;
+                case Glfw.GLFW_KEY_LEFT:
+                    Console.WriteLine("LEFT");
+                    break;
+                case Glfw.GLFW_KEY_RIGHT:
+                    Console.WriteLine("RIGHT");
+                    break;
+                case Glfw.GLFW_KEY_LSHIFT:
+                    Console.WriteLine("LSHIFT");
+                    break;
+                case Glfw.GLFW_KEY_RSHIFT:
+                    Console.WriteLine("RSHIFT");
+                    break;
+                case Glfw.GLFW_KEY_LCTRL:
+                    Console.WriteLine("LCTRL");
+                    break;
+                case Glfw.GLFW_KEY_RCTRL:
+                    Console.WriteLine("RCTRL");
+                    break;
+                case Glfw.GLFW_KEY_LALT:
+                    Console.WriteLine("LALT");
+                    break;
+                case Glfw.GLFW_KEY_RALT:
+                    Console.WriteLine("RALT");
+                    break;
+                case Glfw.GLFW_KEY_TAB:
+                    Console.WriteLine("TAB");
+                    break;
+                case Glfw.GLFW_KEY_ENTER:
+                    Console.WriteLine("ENTER");
+                    break;
+                case Glfw.GLFW_KEY_BACKSPACE:
+                    Console.WriteLine("BACKSPACE");
+                    break;
+                case Glfw.GLFW_KEY_INSERT:
+                    Console.WriteLine("INSERT");
+                    break;
+                case Glfw.GLFW_KEY_DEL:
+                    Console.WriteLine("DEL");
+                    break;
+                case Glfw.GLFW_KEY_PAGEUP:
+                    Console.WriteLine("PAGEUP");
+                    break;
+                case Glfw.GLFW_KEY_PAGEDOWN:
+                    Console.WriteLine("PAGEDOWN");
+                    break;
+                case Glfw.GLFW_KEY_HOME:
+                    Console.WriteLine("HOME");
+                    break;
+                case Glfw.GLFW_KEY_END:
+                    Console.WriteLine("END");
+                    break;
+                case Glfw.GLFW_KEY_KP_0:
+                    Console.WriteLine("KEYPAD 0");
+                    break;
+                case Glfw.GLFW_KEY_KP_1:
+                    Console.WriteLine("KEYPAD 1");
+                    break;
+                case Glfw.GLFW_KEY_KP_2:
+                    Console.WriteLine("KEYPAD 2");
+                    break;
+                case Glfw.GLFW_KEY_KP_3:
+                    Console.WriteLine("KEYPAD 3");
+                    break;
+                case Glfw.GLFW_KEY_KP_4:
+                    Console.WriteLine("KEYPAD 4");
+                    break;
+                case Glfw.GLFW_KEY_KP_5:
+                    Console.WriteLine("KEYPAD 5");
+                    break;
+                case Glfw.GLFW_KEY_KP_6:
+                    Console.WriteLine("KEYPAD 6");
+                    break;
+                case Glfw.GLFW_KEY_KP_7:
+                    Console.WriteLine("KEYPAD 7");
+                    break;
+                case Glfw.GLFW_KEY_KP_8:
+                    Console.WriteLine("KEYPAD 8");
+                    break;
+                case Glfw.GLFW_KEY_KP_9:
+                    Console.WriteLine("KEYPAD 9");
+                    break;
+                case Glfw.GLFW_KEY_KP_DIVIDE:
+                    Console.WriteLine("KEYPAD DIVIDE");
+                    break;
+                case Glfw.GLFW_KEY_KP_MULTIPLY:
+                    Console.WriteLine("KEYPAD MULTIPLY");
+                    break;
+                case Glfw.GLFW_KEY_KP_SUBTRACT:
+                    Console.WriteLine("KEYPAD SUBTRACT");
+                    break;
+                case Glfw.GLFW_KEY_KP_ADD:
+                    Console.WriteLine("KEYPAD ADD");
+                    break;
+                case Glfw.GLFW_KEY_KP_DECIMAL:
+                    Console.WriteLine("KEYPAD DECIMAL");
+                    break;
+                case Glfw.GLFW_KEY_KP_EQUAL:
+                    Console.WriteLine("KEYPAD =");
+                    break;
+                case Glfw.GLFW_KEY_KP_ENTER:
+                    Console.WriteLine("KEYPAD ENTER");
+                    break;
+                case Glfw.GLFW_KEY_SPACE:
+                    Console.WriteLine("SPACE");
+                    break;
+                case (int) 'R':
+                    isKeyRepeat = !isKeyRepeat;
+                    if(isKeyRepeat) {
+                        Glfw.glfwEnable(Glfw.GLFW_KEY_REPEAT);
+                    }
+                    else {
+                        Glfw.glfwDisable(Glfw.GLFW_KEY_REPEAT);
+                    }
+                    Console.WriteLine("R => Key repeat: {0}", isKeyRepeat ? "ON" : "OFF");
+                    break;
+                case (int) 'S':
+                    isSystemKeys = !isSystemKeys;
+                    if(isSystemKeys) {
+                        Glfw.glfwEnable(Glfw.GLFW_SYSTEM_KEYS);
+                    }
+                    else {
+                        Glfw.glfwDisable(Glfw.GLFW_SYSTEM_KEYS);
+                    }
+                    Console.WriteLine("S => System keys: {0}", isSystemKeys ? "ON" : "OFF");
+                    break;
+                default:
+                    if(key > 0 && key < 256) {
+                        Console.WriteLine("{0}", (char) key);
+                    }
+                    else {
+                        Console.WriteLine("???");
+                    }
+                    break;
+            }
+        }
+        #endregion Key(int key, int action)
+    }
+}
diff --git a/examples/GlfwExamples/ListModes.cs b/examples/GlfwExamples/ListModes.cs
new file mode 100644
index 0000000..9f7bb6a
--- /dev/null
+++ b/examples/GlfwExamples/ListModes.cs
@@ -0,0 +1,115 @@
+#region License
+/*
+MIT License
+Copyright �2003-2004 Randy Ridge
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits/License
+/*
+Copyright (c) 2002-2004 Marcus Geelnard
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would
+   be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must not
+   be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+   distribution.
+
+Marcus Geelnard
+marcus.geelnard at home.se
+*/
+#endregion Original Credits/License
+
+using System;
+using Tao.Glfw;
+using Tao.OpenGl;
+
+namespace GlfwExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     This is a small test application for GLFW.
+    /// </summary>
+    /// <remarks>
+    ///     The program lists all available fullscreen video modes.
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class ListModes {
+        // --- Fields ---
+        #region Private Constants
+        // Maximum number of modes that we want to list
+        private const int MAX_NUMBER_OF_MODES = 400;
+        #endregion Private Constants
+
+        // --- Application Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glfw.GLFWvidmode desktopMode;
+            Glfw.GLFWvidmode[] availableModes = new Glfw.GLFWvidmode[MAX_NUMBER_OF_MODES];
+            int modeCount;
+
+            // Initialize GLFW
+            if(Glfw.glfwInit() == Gl.GL_FALSE) {
+                return;
+            }
+
+            // Show desktop video mode
+            Glfw.glfwGetDesktopMode(out desktopMode);
+            Console.WriteLine("Desktop mode: {0} x {1} x {2}", desktopMode.Width,
+                desktopMode.Height, desktopMode.RedBits + desktopMode.GreenBits +
+                desktopMode.BlueBits);
+
+            // List available video modes
+            modeCount = Glfw.glfwGetVideoModes(availableModes, MAX_NUMBER_OF_MODES);
+            Console.WriteLine("Available modes:");
+            for(int i = 0; i < modeCount; i++) {
+                Console.WriteLine("{0}: {1} x {2} x {3}", i, availableModes[i].Width,
+                    availableModes[i].Height, availableModes[i].RedBits +
+                    availableModes[i].GreenBits + availableModes[i].BlueBits);
+            }
+
+            // Terminate GLFW
+            Glfw.glfwTerminate();
+
+            Console.Write("\n\nPress Enter to exit...");
+            Console.ReadLine();
+        }
+        #endregion Run()
+    }
+}
diff --git a/examples/GlfwExamples/Makefile.am b/examples/GlfwExamples/Makefile.am
new file mode 100644
index 0000000..3916d7b
--- /dev/null
+++ b/examples/GlfwExamples/Makefile.am
@@ -0,0 +1,33 @@
+
+PROGRAM = GlfwExamples
+PACKAGES =
+BINARY_LIBS = \
+        Tao.Glfw.dll \
+        Tao.OpenGl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+RESX = GlfwExamples.resx
+RESOURCES = $(PROGRAM).GlfwExamples.resources
+SOURCES = \
+        Boing.cs \
+        Cube.cs \
+        Gears.cs \
+        GlfwExamples.cs \
+        GlfwExamples.Designer.cs \
+        GlslLesson01.cs \
+        KeyTest.cs \
+        ListModes.cs \
+        Pong.cs \
+        Program.cs \
+        Triangle.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.Glfw/Tao.Glfw.snk
+
+$(PROGRAM).GlfwExamples.resources: GlfwExamples.resx
+	$(RESGEN) $< $@
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/GlfwExamples/Makefile.in b/examples/GlfwExamples/Makefile.in
new file mode 100644
index 0000000..7f712a7
--- /dev/null
+++ b/examples/GlfwExamples/Makefile.in
@@ -0,0 +1,381 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/GlfwExamples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = GlfwExamples
+PACKAGES = 
+BINARY_LIBS = \
+        Tao.Glfw.dll \
+        Tao.OpenGl.dll
+
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+
+RESX = GlfwExamples.resx
+RESOURCES = $(PROGRAM).GlfwExamples.resources
+SOURCES = \
+        Boing.cs \
+        Cube.cs \
+        Gears.cs \
+        GlfwExamples.cs \
+        GlfwExamples.Designer.cs \
+        GlslLesson01.cs \
+        KeyTest.cs \
+        ListModes.cs \
+        Pong.cs \
+        Program.cs \
+        Triangle.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.Glfw/Tao.Glfw.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/GlfwExamples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/GlfwExamples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).GlfwExamples.resources: GlfwExamples.resx
+	$(RESGEN) $< $@
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/GlfwExamples/Pong.cs b/examples/GlfwExamples/Pong.cs
new file mode 100644
index 0000000..1c6a3b6
--- /dev/null
+++ b/examples/GlfwExamples/Pong.cs
@@ -0,0 +1,919 @@
+#region License
+/*
+ MIT License
+ Copyright �2003-2006 The Tao Framework Team
+ http://www.taoframework.com
+ All rights reserved.
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+ 
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ */
+#endregion License
+
+#region Tao Port Credits
+/* Original Tao port by Simon <the-real-sim at gmx.de> */
+#endregion Tao Port Credits
+
+#region Original Credits/License
+/*
+ Copyright (c) 2002-2004 Marcus Geelnard
+ 
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+ 
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+ 
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would
+ be appreciated but is not required.
+ 
+ 2. Altered source versions must be plainly marked as such, and must not
+ be misrepresented as being the original software.
+ 
+ 3. This notice may not be removed or altered from any source
+ distribution.
+ 
+ Marcus Geelnard
+ marcus.geelnard at home.se
+ */
+
+//========================================================================
+// This is a small test application for GLFW.
+// This is an OpenGL port of the famous "PONG" game (the first computer
+// game ever?). It is very simple, and could be improved alot. It was
+// created in order to show off the gaming capabilities of GLFW.
+//========================================================================
+#endregion Original Credits/License
+
+using System;
+using Tao.Glfw;
+using Tao.OpenGl;
+
+namespace GlfwExamples {
+	#region Class Documentation
+	/// <summary>
+	/// This is a small test application for GLFW
+	/// </summary>
+	/// <remarks>
+	/// This is an OpenGL port of the famous "PONG" game (the first computer
+  /// game ever?). It is very simple, and could be improved alot. It was
+  /// created in order to show off the gaming capabilities of GLFW.
+	/// </remarks>
+	#endregion Class Documentation
+	public sealed class Pong {
+		
+		#region fields
+		
+		/// <summary> Screen resolution: width </summary>
+		public static int width = 640;
+
+		/// <summary> Screen resolution: height </summary>
+		public static int height = 480;
+		
+		/// <summary> Player size (units): X dimension </summary>
+		public static float playerSizeX = 0.05f;
+
+		/// <summary> Player size (units): Y dimension </summary>
+		public static float playerSizeY = 0.15f;
+		
+		/// <summary> Ball size (units) </summary>
+		public static float ballSize = 0.02f;
+		
+		/// <summary> Maximum player movement speed (units / second) </summary>
+		public static float maxSpeed = 1.5f;
+		
+		/// <summary> Player movement acceleration (units / seconds^2) </summary>
+		public static float acceleration = 4.0f;
+		
+		/// <summary> Player movement deceleration (units / seconds^2) </summary>
+		public static float deceleration = 2.0f;
+		
+		/// <summary> Ball movement speed (units / second) </summary>
+		public static float ballSpeed = 0.4f;
+		
+		/// <summary>
+		///  Menu options
+		/// </summary>
+		public enum MenuOption {
+			None,Play,Quit
+		}
+		/// <summary>
+		/// Game events
+		/// </summary>
+		public enum GameEvent {
+			NobodyWins,
+			Player1Wins,
+			Player2Wins
+		}
+		
+		/// <summary>
+		/// Game winners
+		/// </summary>
+		public enum Winner {
+			Nobody,
+			Player1,
+			Player2
+		}
+		
+		/// <summary> The winning player </summary>
+		public static int winningPlayer;
+		
+		/// <summary>
+		///  Camera positions
+		/// </summary>
+		public enum CameraPosition {
+			Classic,
+			Above,
+			Spectator
+		}
+		
+		/// <summary> Default camera position </summary>
+		public static CameraPosition cameraDefault = CameraPosition.Classic;
+		
+		
+		/// <summary>
+		/// Textures
+		/// </summary>
+		public enum Textures {
+			Title,
+			Menu,
+			Instr,
+			Winner1,
+			Winner2,
+			Field,
+			Num_textures
+		}
+
+		/// <summary>
+		/// Texture file names
+		/// </summary>
+		public static String[] TexName = {"Data/pong3d_title.tga",
+			"Data/pong3d_menu.tga",
+			"Data/pong3d_instr.tga",
+			"Data/pong3d_winner1.tga",
+			"Data/pong3d_winner2.tga",
+			"Data/pong3d_field.tga"};
+		
+		/// <summary> Frame information </summary>
+		public static double thisTime, oldTime, dt, startTime;
+		
+		/// <summary> Camera position information </summary>
+		public static CameraPosition cameraPos;
+		
+		/// <summary>
+		///  Player information
+		/// </summary>
+		public struct Player {
+			/// <summary> Player Id: Player 1 or Player 2 </summary>
+			public int id;
+			/// <summary> Y-position of player paddle: -1.0 to +1.0 </summary>
+			public double posY;
+			/// <summary> Maximum speed of player paddle: -MAX_SPEED to +MAX_SPEED </summary>
+			public double speedY;   
+		}
+		
+		/// <summary>Players</summary>
+		public static Player Player1,Player2;
+		
+		/// <summary> Ball information </summary>
+		public struct Ball {
+			public double posX, posY;
+			public double speedX, speedY;
+		}
+		
+		/// <summary> The game ball </summary>
+		public static Ball gameBall;
+		
+		#region Lighting configuration
+		public static float[] envAmbient;
+		public static float[] light1Position;
+		public static float[] light1Diffuse;
+		public static float[] light1Ambient;
+		#endregion Lighting configuration
+		
+		#region Object material properties
+		public static float[] Player1Diffuse;
+		public static float[] Player1Ambient;
+		public static float[] Player2Diffuse;
+		public static float[] Player2Ambient;
+		public static float[] ballDiffuse;
+		public static float[] ballAmbient;
+		public static float[] borderDiffuse;
+		public static float[] borderAmbient;
+		public static float[] floorDiffuse;
+		public static float[] floorAmbient;
+		#endregion Object material properties
+		
+		/// <summary> OpenGL texture object IDs </summary>
+		public static int[] TexId = new int[(int)Textures.Num_textures];
+		
+		#endregion fields
+		
+		/// <summary>
+		/// LoadTextures
+		/// 
+		/// Load textures from disk and upload to OpenGL card
+		/// </summary>
+		public static void LoadTextures() {
+			int  i;
+			
+			// Generate texture objects
+			Gl.glGenTextures((int)Textures.Num_textures, TexId);
+			
+			// Load textures 
+			for(i = 0; i < (int)Textures.Num_textures; i++) {
+				
+				// Select texture object
+				Gl.glBindTexture(Gl.GL_TEXTURE_2D, TexId[i]);
+				
+				// Set texture parameters
+				Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
+				Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
+				Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+				Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+				
+				// Upload texture from file to texture memory
+				Glfw.glfwLoadTexture2D(TexName[i], 0);
+			}
+		}
+		
+		/// <summary>
+		/// DrawImage
+		/// 
+		/// Draw a 2d image as a texture
+		/// </summary>
+		/// <param name="texnum">An int</param>
+		/// <param name="x1">A  float</param>
+		/// <param name="x2">A  float</param>
+		/// <param name="y1">A  float</param>
+		/// <param name="y2">A  float</param>
+		public static void DrawImage(int texnum, float x1, float x2, float y1, float y2) {
+			Gl.glEnable(Gl.GL_TEXTURE_2D);
+			Gl.glBindTexture(Gl.GL_TEXTURE_2D, TexId[texnum]);
+			Gl.glBegin(Gl.GL_QUADS);
+			Gl.glTexCoord2f(0.0f, 1.0f);
+			Gl.glVertex2f(x1, y1);
+			Gl.glTexCoord2f(1.0f, 1.0f);
+			Gl.glVertex2f(x2, y1);
+			Gl.glTexCoord2f(1.0f, 0.0f);
+			Gl.glVertex2f(x2, y2);
+			Gl.glTexCoord2f(0.0f, 0.0f);
+			Gl.glVertex2f(x1, y2);
+			Gl.glEnd();
+			Gl.glDisable(Gl.GL_TEXTURE_2D);
+		}
+		
+		/// <summary>
+		/// GameMenu
+		/// 
+		/// Returns menu option
+		/// </summary>
+		/// <returns>A MenuOption</returns>
+		public static MenuOption GameMenu() {
+			MenuOption option;
+			
+			// Enable sticky keys
+			Glfw.glfwEnable(Glfw.GLFW_STICKY_KEYS);
+			
+			// Wait for a game menu key to be pressed
+			do
+			{
+				// Get window size
+				Glfw.glfwGetWindowSize(out width, out height);
+				
+				// Set viewport
+				Gl.glViewport(0, 0, width, height);
+				
+				// Clear display
+				Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+				Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+				
+				// Setup projection matrix
+				Gl.glMatrixMode(Gl.GL_PROJECTION);
+				Gl.glLoadIdentity();
+				Gl.glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);
+				
+				// Setup modelview matrix
+				Gl.glMatrixMode(Gl.GL_MODELVIEW);
+				Gl.glLoadIdentity();
+				
+				// Display title
+				Gl.glColor3f(1.0f, 1.0f, 1.0f);
+				DrawImage((int)Textures.Title, 0.1f, 0.9f, 0.0f, 0.3f);
+				
+				// Display menu
+				Gl.glColor3f(1.0f, 1.0f, 0.0f);
+				DrawImage((int)Textures.Menu, 0.38f, 0.62f, 0.35f, 0.5f);
+				
+				// Display instructions
+				Gl.glColor3f(0.0f, 1.0f, 1.0f);
+				DrawImage((int)Textures.Instr, 0.32f, 0.68f, 0.65f, 0.85f);
+				
+				// Swap buffers
+				Glfw.glfwSwapBuffers();
+				
+				// Check for keys
+				if(Glfw.glfwGetKey('Q') == Gl.GL_TRUE || Glfw.glfwGetWindowParam(Glfw.GLFW_OPENED) == Gl.GL_FALSE) {
+					option = MenuOption.Quit;
+				}
+				else if(Glfw.glfwGetKey(Glfw.GLFW_KEY_F1) == Gl.GL_TRUE) {
+					option = MenuOption.Play;
+				}
+				else {
+					option = MenuOption.None;
+				}
+				
+				// To avoid horrible busy waiting, sleep for at least 20 ms
+				Glfw.glfwSleep(0.02);
+			}
+			while( option == MenuOption.None );
+			
+			// Disable sticky keys
+			Glfw.glfwDisable(Glfw.GLFW_STICKY_KEYS);
+			
+			return option;
+		}
+		
+		/// <summary>
+		/// NewGame
+		/// 
+		/// Initialize a new game
+		/// </summary>
+		public static void NewGame() {
+			// Frame information
+			startTime = thisTime = Glfw.glfwGetTime();
+			
+			// Camera information
+			cameraPos = cameraDefault;
+			
+			// Player 1 information
+			Player1.posY   = 0.0;
+			Player1.speedY = 0.0;
+			
+			// Player 2 information
+			Player2.posY   = 0.0;
+			Player2.speedY = 0.0;
+			
+			// Ball information
+			gameBall.posX = -1.0 + playerSizeX;
+			gameBall.posY = Player1.posY;
+			gameBall.speedX = 1.0;
+			gameBall.speedY = 1.0;
+		}
+		
+		/// <summary>
+		/// PlayerControl
+		/// </summary>
+		public static void PlayerControl() {
+			float[] joy1pos = new float[2];
+			float[] joy2pos = new float[2];
+			
+			// Get joystick X & Y axis positions
+			Glfw.glfwGetJoystickPos(Glfw.GLFW_JOYSTICK_1, joy1pos, 2);
+			Glfw.glfwGetJoystickPos(Glfw.GLFW_JOYSTICK_2, joy2pos, 2);
+			
+			// Player 1 control
+			if(Glfw.glfwGetKey('A') == Gl.GL_TRUE || joy1pos[1] > 0.2f) {
+				Player1.speedY += dt * acceleration;
+				if(Player1.speedY > maxSpeed) {
+					Player1.speedY = maxSpeed;
+				}
+			}
+			else if(Glfw.glfwGetKey('Z') == Gl.GL_TRUE || joy1pos[1] < -0.2f) {
+				Player1.speedY -= dt * acceleration;
+				if(Player1.speedY < -maxSpeed) {
+					Player1.speedY = -maxSpeed;
+				}
+			}
+			else {
+				Player1.speedY /= System.Math.Exp(deceleration * dt);
+			}
+			
+			// Player 2 control
+			if(Glfw.glfwGetKey('K') == Gl.GL_TRUE || joy2pos[1] > 0.2f) {
+				Player2.speedY += dt * acceleration;
+				if(Player2.speedY > maxSpeed) {
+					Player2.speedY = maxSpeed;
+				}
+			}
+			else if(Glfw.glfwGetKey('M') == Gl.GL_TRUE || joy2pos[1] < -0.2f) {
+				Player2.speedY -= dt * acceleration;
+				if(Player2.speedY < -maxSpeed) {
+					Player2.speedY = -maxSpeed;
+				}
+			}
+			else {
+				Player2.speedY /= System.Math.Exp(deceleration * dt);
+			}
+			
+			// Update player 1 position
+			Player1.posY += dt * Player1.speedY;
+			if(Player1.posY > 1.0 - playerSizeY) {
+				Player1.posY = 1.0 - playerSizeY;
+				Player1.speedY = 0.0;
+			}
+			else if(Player1.posY < -1.0 + playerSizeY) {
+				Player1.posY = -1.0 + playerSizeY;
+				Player1.speedY = 0.0;
+			}
+			
+			// Update player 2 position
+			Player2.posY += dt * Player2.speedY;
+			if(Player2.posY > 1.0 - playerSizeY) {
+				Player2.posY = 1.0 - playerSizeY;
+				Player2.speedY = 0.0;
+			}
+			else if(Player2.posY < -1.0 + playerSizeY) {
+				Player2.posY = -1.0 + playerSizeY;
+				Player2.speedY = 0.0;
+			}
+		}
+		
+		/// <summary>
+		/// UpdateDisplay
+		/// 
+		/// Draw graphics (all game related OpenGL stuff goes here)
+		/// </summary>
+		public static void UpdateDisplay() {
+			// Get window size
+			Glfw.glfwGetWindowSize(out width, out height);
+			
+			// Set viewport
+			Gl.glViewport(0, 0, width, height);
+			
+			// Clear display
+			Gl.glClearColor(0.02f, 0.02f, 0.02f, 0.0f);
+			Gl.glClearDepth(1.0f);
+			Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+			
+			// Setup projection matrix
+			Gl.glMatrixMode(Gl.GL_PROJECTION);
+			Gl.glLoadIdentity();
+			Glu.gluPerspective(
+				55.0f,							// Angle of view
+				(float)width / (float)height,		// Aspect
+				1.0f,							// Near Z
+				100.0f							// Far Z
+			);
+			
+			// Setup modelview matrix
+			Gl.glMatrixMode(Gl.GL_MODELVIEW);
+			Gl.glLoadIdentity();
+			
+			switch(cameraPos) {
+				default:
+				case CameraPosition.Classic:
+					Glu.gluLookAt(
+						0.0f, 0.0f, 2.5f,
+						0.0f, 0.0f, 0.0f,
+						0.0f, 1.0f, 0.0f
+					);
+					break;
+					
+				case CameraPosition.Above:
+					Glu.gluLookAt(
+						0.0f, 0.0f, 2.5f,
+						(float)gameBall.posX, (float)gameBall.posY, 0.0f,
+						0.0f, 1.0f, 0.0f
+					);
+					break;
+					
+				case CameraPosition.Spectator:
+					Glu.gluLookAt(
+						0.0f, -2.0, 1.2f,
+						(float)gameBall.posX, (float)gameBall.posY, 0.0f,
+						0.0f, 0.0f, 1.0f
+					);
+					break;
+			}
+			
+			// Enable depth testing
+			Gl.glEnable(Gl.GL_DEPTH_TEST);
+			Gl.glDepthFunc(Gl.GL_LEQUAL);
+			
+			// Enable lighting
+			Gl.glEnable(Gl.GL_LIGHTING);
+			Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, envAmbient);
+			Gl.glLightModeli(Gl.GL_LIGHT_MODEL_LOCAL_VIEWER, Gl.GL_TRUE);
+			Gl.glLightModeli(Gl.GL_LIGHT_MODEL_TWO_SIDE, Gl.GL_FALSE);
+			Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, light1Position);
+			Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE,  light1Diffuse);
+			Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT,  light1Ambient);
+			Gl.glEnable(Gl.GL_LIGHT1);
+			
+			// Front face is counter-clock-wise
+			Gl.glFrontFace(Gl.GL_CCW);
+			
+			// Enable face culling (not necessary, but speeds up rendering)
+			Gl.glCullFace(Gl.GL_BACK);
+			Gl.glEnable(Gl.GL_CULL_FACE);
+			
+			// Draw Player 1
+			Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, Player1Diffuse);
+			Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, Player1Ambient);
+			DrawBox(-1.0f,              (float)Player1.posY - playerSizeY, 0.0f,
+							-1.0f + playerSizeX, (float)Player1.posY + playerSizeY, 0.1f);
+			
+			// Draw Player 2
+			Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, Player2Diffuse);
+			Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, Player2Ambient);
+			DrawBox(1.0f - playerSizeX, (float)Player2.posY - playerSizeY, 0.0f,
+							1.0f,              (float)Player2.posY + playerSizeY, 0.1f);
+			
+			// Draw Ball
+			Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, ballDiffuse);
+			Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, ballAmbient);
+			DrawBox((float)gameBall.posX - ballSize, (float)gameBall.posY - ballSize, 0.0f,
+							(float)gameBall.posX + ballSize, (float)gameBall.posY + ballSize, ballSize * 2);
+			
+			// Top game field border
+			Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, borderDiffuse);
+			Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, borderAmbient);
+			DrawBox(-1.1f, 1.0f, 0.0f,  1.1f, 1.1f, 0.1f);
+			// Bottom game field border
+			Gl.glColor3f(0.0f, 0.0f, 0.7f);
+			DrawBox(-1.1f, -1.1f, 0.0f,  1.1f, -1.0f, 0.1f);
+			// Left game field border
+			DrawBox(-1.1f, -1.0f, 0.0f,  -1.0f, 1.0f, 0.1f);
+			// Left game field border
+			DrawBox(1.0f, -1.0f, 0.0f,  1.1f, 1.0f, 0.1f);
+			
+			// Enable texturing
+			Gl.glEnable(Gl.GL_TEXTURE_2D);
+			Gl.glBindTexture(Gl.GL_TEXTURE_2D, TexId[(int)Textures.Field]);
+			
+			// Game field floor
+			Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, floorDiffuse);
+			Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, floorAmbient);
+			DrawBox(-1.01f, -1.01f, -0.01f,  1.01f, 1.01f, 0.0f);
+			
+			// Disable texturing
+			Gl.glDisable(Gl.GL_TEXTURE_2D);
+			
+			// Disable face culling
+			Gl.glDisable(Gl.GL_CULL_FACE);
+			
+			// Disable lighting
+			Gl.glDisable(Gl.GL_LIGHTING);
+			
+			// Disable depth testing
+			Gl.glDisable(Gl.GL_DEPTH_TEST);
+		}
+		
+		/// <summary>
+		/// GameOver
+		/// </summary>
+		public static void GameOver() {
+			// Enable sticky keys
+			Glfw.glfwEnable(Glfw.GLFW_STICKY_KEYS);
+			
+			// Until the user presses ESC or SPACE
+			while(Glfw.glfwGetKey(Glfw.GLFW_KEY_ESC) == Gl.GL_FALSE && Glfw.glfwGetKey(' ') == Gl.GL_FALSE &&
+						Glfw.glfwGetWindowParam(Glfw.GLFW_OPENED) == Gl.GL_TRUE) {
+				// Draw display
+				UpdateDisplay();
+				
+				// Setup projection matrix
+				Gl.glMatrixMode(Gl.GL_PROJECTION);
+				Gl.glLoadIdentity();
+				Gl.glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);
+				
+				// Setup modelview matrix
+				Gl.glMatrixMode(Gl.GL_MODELVIEW);
+				Gl.glLoadIdentity();
+				
+				// Enable blending
+				Gl.glEnable(Gl.GL_BLEND);
+				
+				// Dim background
+				Gl.glBlendFunc(Gl.GL_ONE_MINUS_SRC_ALPHA, Gl.GL_SRC_ALPHA);
+				Gl.glColor4f(0.3f, 0.3f, 0.3f, 0.3f);
+				Gl.glBegin(Gl.GL_QUADS);
+				Gl.glVertex2f(0.0f, 0.0f);
+				Gl.glVertex2f(1.0f, 0.0f);
+				Gl.glVertex2f(1.0f, 1.0f);
+				Gl.glVertex2f(0.0f, 1.0f);
+				Gl.glEnd();
+				
+				// Display winner text
+				Gl.glBlendFunc(Gl.GL_ONE, Gl.GL_ONE_MINUS_SRC_COLOR);
+				if(winningPlayer == (int)Winner.Player1) {
+					Gl.glColor4f(1.0f, 0.5f, 0.5f, 1.0f);
+					DrawImage((int)Textures.Winner1, 0.35f, 0.65f, 0.46f, 0.54f);
+				}
+				else if(winningPlayer == (int)Winner.Player2) {
+					Gl.glColor4f(0.5f, 1.0f, 0.5f, 1.0f);
+					DrawImage((int)Textures.Winner2, 0.35f, 0.65f, 0.46f, 0.54f);
+				}
+				
+				// Disable blending
+				Gl.glDisable(Gl.GL_BLEND);
+				
+				// Swap buffers
+				Glfw.glfwSwapBuffers();
+			}
+			
+			// Disable sticky keys
+			Glfw.glfwDisable(Glfw.GLFW_STICKY_KEYS);
+		}
+		
+		/// <summary>
+		/// DrawBox
+		/// 
+		/// Draw a 3D box
+		/// </summary>
+		/// <param name="x1">A  float</param>
+		/// <param name="y1">A  float</param>
+		/// <param name="z1">A  float</param>
+		/// <param name="x2">A  float</param>
+		/// <param name="y2">A  float</param>
+		/// <param name="z2">A  float</param>
+		public static void DrawBox(float x1, float y1, float z1, float x2, float y2, float z2) {
+			float texScale = 4.0f;
+			
+			// Draw six sides of a cube
+			Gl.glBegin(Gl.GL_QUADS);
+			// Side 1 (down)
+			Gl.glNormal3f(0.0f, 0.0f, -1.0f);
+			Gl.glTexCoord2f(0.0f, 0.0f);
+			Gl.glVertex3f(x1, y2, z1);
+			Gl.glTexCoord2f(texScale, 0.0f);
+			Gl.glVertex3f(x2, y2, z1);
+			Gl.glTexCoord2f(texScale, texScale);
+			Gl.glVertex3f(x2, y1, z1);
+			Gl.glTexCoord2f(0.0f, texScale);
+			Gl.glVertex3f(x1, y1, z1);
+			
+			// Side 2 (up)
+			Gl.glNormal3f(0.0f, 0.0f, 1.0f);
+			Gl.glTexCoord2f(0.0f, 0.0f);
+			Gl.glVertex3f(x1, y1, z2);
+			Gl.glTexCoord2f(texScale, 0.0f);
+			Gl.glVertex3f(x2, y1, z2);
+			Gl.glTexCoord2f(texScale, texScale);
+			Gl.glVertex3f(x2, y2, z2);
+			Gl.glTexCoord2f(0.0f, texScale);
+			Gl.glVertex3f(x1, y2, z2);
+			
+			// Side 3 (backward)
+			Gl.glNormal3f(0.0f, -1.0f, 0.0f);
+			Gl.glTexCoord2f(0.0f, 0.0f);
+			Gl.glVertex3f(x1, y1, z1);
+			Gl.glTexCoord2f(texScale, 0.0f);
+			Gl.glVertex3f(x2, y1, z1);
+			Gl.glTexCoord2f(texScale, texScale);
+			Gl.glVertex3f(x2, y1, z2);
+			Gl.glTexCoord2f(0.0f, texScale);
+			Gl.glVertex3f(x1, y1, z2);
+			
+			// Side 4 (forward)
+			Gl.glNormal3f(0.0f, 1.0f, 0.0f);
+			Gl.glTexCoord2f(0.0f, 0.0f);
+			Gl.glVertex3f(x1, y2, z2);
+			Gl.glTexCoord2f(texScale, 0.0f);
+			Gl.glVertex3f(x2, y2, z2);
+			Gl.glTexCoord2f(texScale, texScale);
+			Gl.glVertex3f(x2, y2, z1);
+			Gl.glTexCoord2f(0.0f, texScale);
+			Gl.glVertex3f(x1, y2, z1);
+			
+			// Side 5 (left)
+			Gl.glNormal3f(-1.0f, 0.0f, 0.0f);
+			Gl.glTexCoord2f(0.0f, 0.0f);
+			Gl.glVertex3f(x1, y1, z2);
+			Gl.glTexCoord2f(texScale, 0.0f);
+			Gl.glVertex3f(x1, y2, z2);
+			Gl.glTexCoord2f(texScale, texScale);
+			Gl.glVertex3f(x1, y2, z1);
+			Gl.glTexCoord2f(0.0f, texScale);
+			Gl.glVertex3f(x1, y1, z1);
+			
+			// Side 6 (right)
+			Gl.glNormal3f(1.0f, 0.0f, 0.0f);
+			Gl.glTexCoord2f(0.0f, 0.0f);
+			Gl.glVertex3f(x2, y1, z1);
+			Gl.glTexCoord2f(texScale, 0.0f);
+			Gl.glVertex3f(x2, y2, z1);
+			Gl.glTexCoord2f(texScale, texScale);
+			Gl.glVertex3f(x2, y2, z2);
+			Gl.glTexCoord2f(0.0f, texScale);
+			Gl.glVertex3f(x2, y1, z2);
+			Gl.glEnd();
+		}
+		
+		/// <summary>
+		/// GameLoop
+		/// </summary>
+		static void GameLoop() {
+			int playing;
+			GameEvent gameEvent;
+			
+			// Initialize a new game
+			NewGame();
+			
+			// Enable sticky keys
+			Glfw.glfwEnable(Glfw.GLFW_STICKY_KEYS);
+			
+			// Loop until the game ends
+			playing = Gl.GL_TRUE;
+			while(playing == Gl.GL_TRUE && Glfw.glfwGetWindowParam(Glfw.GLFW_OPENED) == Gl.GL_TRUE) {
+				// Frame timer
+				oldTime = thisTime;
+				thisTime = Glfw.glfwGetTime();
+				dt = thisTime - oldTime;
+				
+				// Get user input and update player positions
+				PlayerControl();
+				
+				// Move the ball, and check if a player hits/misses the ball
+				gameEvent = BallControl();
+				
+				// Did we have a winner?
+				switch(gameEvent) {
+					case GameEvent.Player1Wins:
+						winningPlayer = Player1.id;
+						playing = Gl.GL_FALSE;
+						break;
+						
+					case GameEvent.Player2Wins:
+						winningPlayer = Player2.id;
+						playing = Gl.GL_FALSE;
+						break;
+					default:
+						break;
+				}
+				
+				// Did the user press ESC?
+				if(Glfw.glfwGetKey(Glfw.GLFW_KEY_ESC) == Gl.GL_TRUE) {
+					playing = Gl.GL_FALSE;
+				}
+				
+				// Did the user change camera view?
+				if(Glfw.glfwGetKey('1') == Gl.GL_TRUE) {
+					cameraPos = CameraPosition.Classic;
+				}
+				else if(Glfw.glfwGetKey('2') == Gl.GL_TRUE) {
+					cameraPos = CameraPosition.Above;
+				}
+				else if(Glfw.glfwGetKey('3') == Gl.GL_TRUE) {
+					cameraPos = CameraPosition.Spectator;
+				}
+				
+				// Draw display
+				UpdateDisplay();
+				
+				// Swap buffers
+				Glfw.glfwSwapBuffers();
+			}
+			
+			// Disable sticky keys
+			Glfw.glfwDisable(Glfw.GLFW_STICKY_KEYS);
+			
+			// Show winner
+			GameOver();
+		}
+		
+		/// <summary>
+		/// BallControl
+		/// </summary>
+		/// <returns>A GameEvent</returns>
+		public static GameEvent BallControl() {
+			GameEvent gameEvent;
+			double ballspeed;
+			
+			// Calculate new ball speed
+			ballspeed = ballSpeed * (1.0 + 0.02 * (thisTime - startTime));
+			gameBall.speedX = gameBall.speedX > 0 ? ballspeed : -ballspeed;
+			gameBall.speedY = gameBall.speedY > 0 ? ballspeed : -ballspeed;
+			gameBall.speedY *= 0.74321;
+			
+			// Update ball position
+			gameBall.posX += dt * gameBall.speedX;
+			gameBall.posY += dt * gameBall.speedY;
+			
+			// Did the ball hit a top/bottom wall?
+			if(gameBall.posY >= 1.0) {
+				gameBall.posY = 2.0 - gameBall.posY;
+				gameBall.speedY = -gameBall.speedY;
+			}
+			else if(gameBall.posY <= -1.0) {
+				gameBall.posY = -2.0 - gameBall.posY;
+				gameBall.speedY = -gameBall.speedY;
+			}
+			
+			// Did the ball hit/miss a player?
+			gameEvent = GameEvent.NobodyWins;
+			
+			// Is the ball entering the player 1 goal?
+			if(gameBall.posX < -1.0 + playerSizeX) {
+				// Did player 1 catch the ball?
+				if(gameBall.posY > (Player1.posY - playerSizeY) &&
+					 gameBall.posY < (Player1.posY + playerSizeY)) {
+					gameBall.posX = -2.0 + 2.0 * playerSizeX - gameBall.posX;
+					gameBall.speedX = -gameBall.speedX;
+				}
+				else {
+					gameEvent = GameEvent.Player2Wins;
+				}
+			}
+			
+			// Is the ball entering the player 2 goal?
+			if(gameBall.posX > 1.0 - playerSizeX) {
+				// Did player 2 catch the ball?
+				if(gameBall.posY > (Player2.posY - playerSizeY) &&
+					 gameBall.posY < (Player2.posY + playerSizeY)) {
+					gameBall.posX = 2.0 - 2.0 * playerSizeX - gameBall.posX;
+					gameBall.speedX = -gameBall.speedX;
+				}
+				else {
+					gameEvent = GameEvent.Player1Wins;
+				}
+			}
+			
+			return gameEvent;
+		}
+		
+		/// <summary>
+		/// Main
+		/// 
+		/// Program entry point
+		/// </summary>
+		public static void Run() {
+			MenuOption menuoption;
+			
+			envAmbient     = new float[]{1.0f,1.0f,1.0f,1.0f};
+			light1Position = new float[]{-3.0f,3.0f,2.0f,1.0f};
+			light1Diffuse  = new float[]{1.0f,1.0f,1.0f,0.0f};
+			light1Ambient  = new float[]{0.0f,0.0f,0.0f,0.0f};
+			
+			Player1Diffuse = new float[]{1.0f,0.3f,0.3f,1.0f};
+			Player1Ambient = new float[]{0.3f,0.1f,0.0f,1.0f};
+			Player2Diffuse = new float[]{0.3f,1.0f,0.3f,1.0f};
+			Player2Ambient = new float[]{0.1f,0.3f,0.1f,1.0f};
+			ballDiffuse    = new float[]{1.0f,1.0f,0.5f,1.0f};
+			ballAmbient    = new float[]{0.3f,0.3f,0.1f,1.0f};
+			borderDiffuse  = new float[]{0.3f,0.3f,1.0f,1.0f};
+			borderAmbient  = new float[]{0.1f,0.1f,0.3f,1.0f};
+			floorDiffuse   = new float[]{1.0f,1.0f,1.0f,1.0f};
+			floorAmbient   = new float[]{0.3f,0.3f,0.3f,1.0f};
+			
+			Player1.id = 1;
+			Player2.id = 2;
+			
+			// Initialize GLFW
+			if(Glfw.glfwInit() == Gl.GL_FALSE) {
+				System.Environment.Exit(0);
+			}
+			
+			// Open OpenGL window
+			if(Glfw.glfwOpenWindow(width, height, 0, 0, 0, 0, 16, 0, Glfw.GLFW_FULLSCREEN) == Gl.GL_FALSE) {
+				Glfw.glfwTerminate();
+				System.Environment.Exit(0);
+			}
+			
+			// Load all textures
+			LoadTextures();
+			
+			// Main loop
+			do
+			{
+				// Get menu option
+				menuoption = GameMenu();
+				
+				// If the user wants to play, let him...
+				if(menuoption == MenuOption.Play) {
+					GameLoop();
+				}
+			}
+			while( menuoption != MenuOption.Quit );
+			
+			// Unload all textures
+			if(Glfw.glfwGetWindowParam(Glfw.GLFW_OPENED) == Gl.GL_FALSE) {
+				Gl.glDeleteTextures((int)Textures.Num_textures, TexId);
+			}
+			
+			// Terminate GLFW
+			Glfw.glfwTerminate();
+			
+		}
+	}
+}
diff --git a/examples/GlfwExamples/Program.cs b/examples/GlfwExamples/Program.cs
new file mode 100644
index 0000000..af61975
--- /dev/null
+++ b/examples/GlfwExamples/Program.cs
@@ -0,0 +1,47 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace GlfwExamples
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new GlfwExamples());
+        }
+    }
+}
diff --git a/examples/GlfwExamples/Properties/AssemblyInfo.cs b/examples/GlfwExamples/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..46c6b75
--- /dev/null
+++ b/examples/GlfwExamples/Properties/AssemblyInfo.cs
@@ -0,0 +1,59 @@
+#region License
+/*
+MIT License
+Copyright �2003-2004 Randy Ridge
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Randy Ridge http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("�2003-2004 Randy Ridge.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("GlfwExamples")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("GLFW Triangle example.")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+[assembly: AssemblyKeyName("")]
+#if DEBUG
+[assembly: AssemblyProduct("GlfwExamples *** Debug Build ***")]
+#else
+[assembly: AssemblyProduct("GlfwExamples")]
+#endif
+[assembly: AssemblyTitle("GLFW Examples")]
+[assembly: AssemblyTrademark("Randy Ridge")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/GlfwExamples/README b/examples/GlfwExamples/README
new file mode 100644
index 0000000..9ff81b1
--- /dev/null
+++ b/examples/GlfwExamples/README
@@ -0,0 +1,26 @@
+GlfwExamples
+http://www.taoframework.com
+Copyright �2003-2004 Randy Ridge, All rights reserved.
+
+These are C# ports of some OpenGL examples developed for GLFW, the originals
+are available from http://glfw.sourceforge.net.
+
+These examples use Tao.OpenGl and Tao.Glfw.  Make sure you have the
+appropriate native GLFW libraries for your system installed.
+
+These examples are fairly well documented, however, do not take
+them to be 'best practices' for .NET OpenGL development.  The
+intent of these ports is as an introduction or as a comparison
+against the original native versions.
+
+If you'd like to contribute you can port the remaining examples as supplied
+with GLFW.  I never got around to them, but they look pretty trivial.
+
+Randy Ridge
+http://www.taoframework.com
+
+
+Change Log:
+
+April 23, 2004:
+    Initial release, version 1.0.0.0.
diff --git a/examples/GlfwExamples/Triangle.cs b/examples/GlfwExamples/Triangle.cs
new file mode 100644
index 0000000..00d4629
--- /dev/null
+++ b/examples/GlfwExamples/Triangle.cs
@@ -0,0 +1,169 @@
+#region License
+/*
+MIT License
+Copyright �2003-2004 Randy Ridge
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits/License
+/*
+Copyright (c) 2002-2004 Marcus Geelnard
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would
+   be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must not
+   be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+   distribution.
+
+Marcus Geelnard
+marcus.geelnard at home.se
+*/
+#endregion Original Credits/License
+
+using System;
+using Tao.Glfw;
+using Tao.OpenGl;
+
+namespace GlfwExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     This is a small test application for GLFW.
+    /// </summary>
+    /// <remarks>
+    ///     The program opens a window (640x480), and renders a spinning colored triangle (it
+    ///     is controlled with both the GLFW timer and the mouse).  It also calculates the
+    ///     rendering speed (FPS), which is displayed in the window title bar.
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Triangle {
+        // --- Application Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            int windowWidth, windowHeight;
+            int mouseX, mouseY;
+            bool isRunning;
+            double currentTime, startTime, frameRate;
+            int frameCount;
+
+            // Initialise GLFW
+            Glfw.glfwInit();
+
+            // Open OpenGL window
+            if(Glfw.glfwOpenWindow(640, 480, 0, 0, 0, 0, 0, 0, Glfw.GLFW_WINDOW) == Gl.GL_FALSE) {
+                Glfw.glfwTerminate();
+                return;
+            }
+
+            // Enable sticky keys
+            Glfw.glfwEnable(Glfw.GLFW_STICKY_KEYS);
+
+            // Disable vertical sync (on cards that support it)
+            Glfw.glfwSwapInterval(0);
+
+            // Main loop
+            isRunning = true;
+            frameCount = 0;
+            startTime = Glfw.glfwGetTime();
+
+            while(isRunning) {
+                // Get time and mouse position
+                currentTime = Glfw.glfwGetTime();
+                Glfw.glfwGetMousePos(out mouseX, out mouseY);
+
+                // Calculate and display FPS (frames per second)
+                if((currentTime - startTime) > 1.0 || frameCount == 0) {
+                    frameRate = frameCount / (currentTime - startTime);
+                    Glfw.glfwSetWindowTitle(string.Format("Spinning Triangle ({0:0} FPS)",
+                        frameRate));
+                    startTime = currentTime;
+                    frameCount = 0;
+                }
+
+                frameCount++;
+
+                // Get window size (may be different than the requested size)
+                Glfw.glfwGetWindowSize(out windowWidth, out windowHeight);
+                windowHeight = windowHeight > 0 ? windowHeight : 1;
+
+                // Set viewport
+                Gl.glViewport(0, 0, windowWidth, windowHeight);
+
+                // Clear color buffer
+                Gl.glClearColor(0, 0, 0, 0);
+                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+                // Select and setup the projection matrix
+                Gl.glMatrixMode(Gl.GL_PROJECTION);
+                Gl.glLoadIdentity();
+                Glu.gluPerspective(65, windowWidth / (double) windowHeight, 1, 100);
+
+                // Select and setup the modelview matrix
+                Gl.glMatrixMode(Gl.GL_MODELVIEW);
+                Gl.glLoadIdentity();
+                Glu.gluLookAt(0, 1, 0,  // Eye-position
+                    0, 20, 0,           // View-point
+                    0, 0, 1);           // Up-vector
+
+                // Draw a rotating colorful triangle
+                Gl.glTranslatef(0, 14, 0);
+                Gl.glRotatef(0.3f * (float) mouseX + (float) currentTime * 100, 0, 0, 1);
+                Gl.glBegin(Gl.GL_TRIANGLES);
+                    Gl.glColor3f(1, 0, 0);
+                    Gl.glVertex3f(-5, 0, -4);
+                    Gl.glColor3f(0, 1, 0);
+                    Gl.glVertex3f(5, 0, -4);
+                    Gl.glColor3f(0, 0, 1);
+                    Gl.glVertex3f(0, 0, 6);
+                Gl.glEnd();
+
+                // Swap buffers
+                Glfw.glfwSwapBuffers();
+
+                // Check if the ESC key was pressed or the window was closed
+                isRunning = ((Glfw.glfwGetKey(Glfw.GLFW_KEY_ESC) == Glfw.GLFW_RELEASE) &&
+                    Glfw.glfwGetWindowParam(Glfw.GLFW_OPENED) == Gl.GL_TRUE);
+            }
+
+            // Close OpenGL window and terminate GLFW
+            Glfw.glfwTerminate();
+        }
+        #endregion Run()
+    }
+}
diff --git a/examples/LuaFunctions/COPYING b/examples/LuaFunctions/COPYING
new file mode 100644
index 0000000..b67358c
--- /dev/null
+++ b/examples/LuaFunctions/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/examples/LuaFunctions/Functions.cs b/examples/LuaFunctions/Functions.cs
new file mode 100644
index 0000000..3e3e410
--- /dev/null
+++ b/examples/LuaFunctions/Functions.cs
@@ -0,0 +1,98 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.IO;
+using Tao.Lua;
+
+namespace LuaFunctions
+{
+    /// <summary>
+    ///     Simple execution of calling a C# function from Lua.
+    /// </summary>
+    /// <remarks>
+    ///		<para>
+    ///			Originally written by Christian Stigen Larsen (csl at sublevel3.org).
+    ///			The original article is available at http://csl.sublevel3.org/lua .
+    ///		</para>
+    ///		<para>
+    ///			Translated to Tao.Lua by Rob Loach (http://www.robloach.net)
+    ///		</para>
+    /// </remarks>
+    public class Functions
+    {
+        private static int my_function(IntPtr L)
+        {
+            int argc = Lua.lua_gettop(L);
+
+            Console.WriteLine("-- my_function() called with " + argc + " arguments:");
+
+            for (int n = 1; n <= argc; n++)
+            {
+                Console.WriteLine("-- argument " + n + ": " + Lua.lua_tostring(L, n));
+            }
+            Lua.lua_pushnumber(L, 123); // return value
+            return 1; // number of return values
+        }
+
+        private static void report_errors(IntPtr L, int status)
+        {
+            if (status != 0)
+            {
+                Console.WriteLine("-- " + Lua.lua_tostring(L, -1));
+                Lua.lua_pop(L, 1); // remove error message
+            }
+        }
+
+        [STAThread]
+        static void Main(string[] args)
+        {
+            string file = Path.Combine("Data", "LuaFunctions.lua");
+
+            IntPtr L = Lua.luaL_newstate();
+
+            Lua.luaL_openlibs(L);
+
+            // make my_function() available to Lua programs
+            Lua.lua_register(L, "my_function", new Lua.lua_CFunction(my_function));
+
+            Console.WriteLine("-- Loading file: " + file);
+
+            int s = Lua.luaL_loadfile(L, file);
+
+            if (s == 0)
+            {
+                // execute Lua program
+                s = Lua.lua_pcall(L, 0, Lua.LUA_MULTRET, 0);
+            }
+
+            report_errors(L, s);
+			Lua.lua_close(L);
+			System.Console.ReadLine();
+        }
+    }
+}
diff --git a/examples/LuaFunctions/LuaFunctions.csproj b/examples/LuaFunctions/LuaFunctions.csproj
new file mode 100644
index 0000000..11158ba
--- /dev/null
+++ b/examples/LuaFunctions/LuaFunctions.csproj
@@ -0,0 +1,148 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{1130F7D5-1CB1-4619-837F-D4325D723D53}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>LuaFunctions</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.Lua.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>LuaFunctions</RootNamespace>
+    <StartupObject>LuaFunctions.Functions</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.Lua\Tao.Lua.csproj">
+      <Name>Tao.Lua</Name>
+      <Project>{11D88031-4650-43D5-B626-4C3E9A276923}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Data\LuaFunctions.lua">
+      <SubType>Code</SubType>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Compile Include="Functions.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.Lua.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/LuaFunctions/LuaFunctions.sh b/examples/LuaFunctions/LuaFunctions.sh
new file mode 100755
index 0000000..6007c1d
--- /dev/null
+++ b/examples/LuaFunctions/LuaFunctions.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./LuaFunctions.exe "$@"
diff --git a/examples/LuaFunctions/Makefile.am b/examples/LuaFunctions/Makefile.am
new file mode 100644
index 0000000..357184c
--- /dev/null
+++ b/examples/LuaFunctions/Makefile.am
@@ -0,0 +1,14 @@
+
+PROGRAM = LuaFunctions
+PACKAGES =
+BINARY_LIBS = Tao.Lua.dll
+SYSTEM_LIBS = System
+RESX =
+RESOURCES =
+SOURCES = \
+        Functions.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.Lua/Tao.Lua.snk
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/LuaFunctions/Makefile.in b/examples/LuaFunctions/Makefile.in
new file mode 100644
index 0000000..a8658e3
--- /dev/null
+++ b/examples/LuaFunctions/Makefile.in
@@ -0,0 +1,360 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/LuaFunctions
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = LuaFunctions
+PACKAGES = 
+BINARY_LIBS = Tao.Lua.dll
+SYSTEM_LIBS = System
+RESX = 
+RESOURCES = 
+SOURCES = \
+        Functions.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.Lua/Tao.Lua.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/LuaFunctions/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/LuaFunctions/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/LuaFunctions/Properties/AssemblyInfo.cs b/examples/LuaFunctions/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..a0730d0
--- /dev/null
+++ b/examples/LuaFunctions/Properties/AssemblyInfo.cs
@@ -0,0 +1,60 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Functions")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Functions")]
+[assembly: AssemblyCopyright("Copyright ©  2006")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("d46ff42f-c4f3-45b0-b8e5-7d7ffd793a49")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/examples/LuaFunctions/README b/examples/LuaFunctions/README
new file mode 100644
index 0000000..4cc2ebc
--- /dev/null
+++ b/examples/LuaFunctions/README
@@ -0,0 +1,13 @@
+LuaExamples
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are various Lua examples.
+
+Rob Loach (http://www.robloach.net)
+
+
+Todo:
+
+Change Log:
diff --git a/examples/LuaSimple/COPYING b/examples/LuaSimple/COPYING
new file mode 100644
index 0000000..b67358c
--- /dev/null
+++ b/examples/LuaSimple/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/examples/LuaSimple/LuaSimple.csproj b/examples/LuaSimple/LuaSimple.csproj
new file mode 100644
index 0000000..501f65c
--- /dev/null
+++ b/examples/LuaSimple/LuaSimple.csproj
@@ -0,0 +1,148 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{FD17B662-5A37-4FCD-A5AF-B654FA001E89}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>LuaSimple</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.Lua.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>LuaSimple</RootNamespace>
+    <StartupObject>LuaSimple.Simple</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.Lua\Tao.Lua.csproj">
+      <Name>Tao.Lua</Name>
+      <Project>{11D88031-4650-43D5-B626-4C3E9A276923}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Data\LuaSimple.lua">
+      <SubType>Code</SubType>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Compile Include="Simple.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.Lua.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/LuaSimple/LuaSimple.sh b/examples/LuaSimple/LuaSimple.sh
new file mode 100755
index 0000000..cc71bcd
--- /dev/null
+++ b/examples/LuaSimple/LuaSimple.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./LuaSimple.exe "$@"
diff --git a/examples/LuaSimple/Makefile.am b/examples/LuaSimple/Makefile.am
new file mode 100644
index 0000000..fc6ad32
--- /dev/null
+++ b/examples/LuaSimple/Makefile.am
@@ -0,0 +1,14 @@
+
+PROGRAM = LuaSimple
+PACKAGES =
+BINARY_LIBS = Tao.Lua.dll
+SYSTEM_LIBS = System
+RESX =
+RESOURCES =
+SOURCES = \
+        Simple.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.Lua/Tao.Lua.snk
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/LuaSimple/Makefile.in b/examples/LuaSimple/Makefile.in
new file mode 100644
index 0000000..b0aecea
--- /dev/null
+++ b/examples/LuaSimple/Makefile.in
@@ -0,0 +1,360 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/LuaSimple
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = LuaSimple
+PACKAGES = 
+BINARY_LIBS = Tao.Lua.dll
+SYSTEM_LIBS = System
+RESX = 
+RESOURCES = 
+SOURCES = \
+        Simple.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.Lua/Tao.Lua.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/LuaSimple/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/LuaSimple/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/LuaSimple/Properties/AssemblyInfo.cs b/examples/LuaSimple/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..125b70f
--- /dev/null
+++ b/examples/LuaSimple/Properties/AssemblyInfo.cs
@@ -0,0 +1,84 @@
+#region License
+/*
+MIT License
+Copyright �2003-2007 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("LuaExamples.Simple")]
+[assembly: AssemblyDescription("A simple example of Lua executing a script.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyName("")]
diff --git a/examples/LuaSimple/README b/examples/LuaSimple/README
new file mode 100644
index 0000000..4cc2ebc
--- /dev/null
+++ b/examples/LuaSimple/README
@@ -0,0 +1,13 @@
+LuaExamples
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are various Lua examples.
+
+Rob Loach (http://www.robloach.net)
+
+
+Todo:
+
+Change Log:
diff --git a/examples/LuaSimple/Simple.cs b/examples/LuaSimple/Simple.cs
new file mode 100644
index 0000000..232204f
--- /dev/null
+++ b/examples/LuaSimple/Simple.cs
@@ -0,0 +1,84 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.IO;
+using Tao.Lua;
+
+namespace LuaSimple
+{
+	/// <summary>
+	///		Simple execution of a Lua script.
+	/// </summary>
+	/// <remarks>
+	///		<para>
+	///			Originally written by Christian Stigen Larsen (csl at sublevel3.org).
+	///			The original article is available at http://csl.sublevel3.org/lua .
+	///		</para>
+	///		<para>
+	///			Translated to Tao.Lua by Rob Loach (http://www.robloach.net)
+	///		</para>
+	/// </remarks>
+	public class Simple
+	{
+		private static void report_errors(IntPtr L, int status)
+		{
+			if ( status!=0 ) 
+			{
+				Console.WriteLine("-- " + Lua.lua_tostring(L, -1));
+				Lua.lua_pop(L, 1); // remove error message
+			}
+		}
+
+		/// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		static void Main(string[] args)
+		{
+            string file = Path.Combine("Data", "LuaSimple.lua");
+
+			IntPtr L = Lua.luaL_newstate();
+
+            Lua.luaL_openlibs(L);
+
+			System.Console.WriteLine("-- Loading file: " + file);
+
+			int s = Lua.luaL_loadfile(L, file);
+
+			if(s == 0) 
+			{
+				// execute Lua program
+				s = Lua.lua_pcall(L, 0, Lua.LUA_MULTRET, 0);
+			}
+
+			report_errors(L, s);
+			Lua.lua_close(L);
+			System.Console.ReadLine();
+		}
+	}
+}
diff --git a/examples/Makefile.am b/examples/Makefile.am
new file mode 100644
index 0000000..95a4101
--- /dev/null
+++ b/examples/Makefile.am
@@ -0,0 +1,18 @@
+
+SUBDIRS = CgExamples \
+          DevIlExamples \
+          FFmpegExamples \
+          FreeGlutExamples \
+          GeWangExamples \
+          GlfwExamples \
+          LuaFunctions \
+          LuaSimple \
+          FtGlSimple \
+          FtGlScrolling \
+          NateRobins \
+          NeHe \
+          OdeExamples \
+          OpenAlExamples \
+          PhysFsExamples \
+          Redbook \
+          SdlExamples
diff --git a/examples/Makefile.in b/examples/Makefile.in
new file mode 100644
index 0000000..d87bf1b
--- /dev/null
+++ b/examples/Makefile.in
@@ -0,0 +1,500 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = examples
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = CgExamples \
+          DevIlExamples \
+          FFmpegExamples \
+          FreeGlutExamples \
+          GeWangExamples \
+          GlfwExamples \
+          LuaFunctions \
+          LuaSimple \
+          FtGlSimple \
+          FtGlScrolling \
+          NateRobins \
+          NeHe \
+          OdeExamples \
+          OpenAlExamples \
+          PhysFsExamples \
+          Redbook \
+          SdlExamples
+
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic ctags \
+	ctags-recursive distclean distclean-generic distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
+	tags-recursive uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/NateRobins/Area.cs b/examples/NateRobins/Area.cs
new file mode 100644
index 0000000..9eaf592
--- /dev/null
+++ b/examples/NateRobins/Area.cs
@@ -0,0 +1,161 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* 
+    area.c
+    Nate Robins, 1997
+
+    A simple program to compute the area of a rasterized triangle.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     A simple program to compute the area of a rasterized triangle.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Area {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_SINGLE);
+            Glut.glutInitWindowSize(320, 320);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Area");
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region int GetArea()
+        private static int GetArea() {
+            float[] buffer = new float[8];
+            int i, n, size;
+            float a = 0.0f;
+
+            Gl.glFeedbackBuffer(8, Gl.GL_2D, buffer);
+            Gl.glRenderMode(Gl.GL_FEEDBACK);
+            Draw();
+            size = Gl.glRenderMode(Gl.GL_RENDER);
+
+            i = 0;
+            while(i < size) {
+                if(buffer[i] == Gl.GL_POLYGON_TOKEN) {
+                    i++;
+                    n = (int) buffer[i];
+                    i++;
+
+                    // z component of cross product = twice triangle area, if area is negative,
+                    // the triangle is backfacing
+                    a = ((buffer[i + 2] - buffer[i + 0]) * (buffer[i + 5] - buffer[i + 1]) - (buffer[i + 4] - buffer[i + 0]) * (buffer[i + 3] - buffer[i + 1])) / 2;
+                    i += n * 2;
+                }
+                else {
+                    Console.WriteLine("Unknown token 0x{0} parsed at {1}.", (short) buffer[i], i);
+                    i++;
+                }
+            }
+
+            return (int) a;
+        }
+        #endregion int GetArea()
+
+        #region Draw()
+        private static void Draw() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3ub(255, 255, 255);
+            Gl.glBegin(Gl.GL_TRIANGLES);
+                Gl.glNormal3f(0.0f, 0.0f, 1.0f);
+                Gl.glColor3ub(255, 0, 0);
+                Gl.glVertex2i(1, 2);
+                Gl.glColor3ub(0, 255, 0);
+                Gl.glVertex2i(0, 0);
+                Gl.glColor3ub(0, 0, 255);
+                Gl.glVertex2i(2, 0);
+            Gl.glEnd();
+
+            Glut.glutSwapBuffers();
+        }
+        #endregion Draw()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Draw();
+            Console.WriteLine("Feedback triangle area = {0} pixels.", GetArea());
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int width, int height)
+        private static void Reshape(int width, int height) {
+            Console.WriteLine("Width = {0}, Height = {1}, Area / 2 = {2}", width, height, width * height / 2);
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0, 2, 0, 2, -1, 1);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+        }
+        #endregion Reshape(int width, int height)
+    }
+}
diff --git a/examples/NateRobins/COPYING b/examples/NateRobins/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/NateRobins/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/NateRobins/Maiden.cs b/examples/NateRobins/Maiden.cs
new file mode 100644
index 0000000..e76cf42
--- /dev/null
+++ b/examples/NateRobins/Maiden.cs
@@ -0,0 +1,719 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* 
+    maiden.c
+    Nate Robins, 1997
+
+    A killer "Iron Maiden rocks out with OpenGL" demo (according to
+    Mark Kilgard).
+ */
+#endregion Original Credits / License
+
+using System;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     A killer "Iron Maiden rocks out with OpenGL" demo (according to Mark Kilgard).
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Maiden {
+        // --- Fields ---
+        #region Private Constants
+        private static int RI = 4;                  // Inner radius of torus
+        private static int RO = 8;                  // Outer radius of torus
+        private static int COLORS = 12;
+        private static int NUMBERSTARS = 500;
+        private static int RANDOMMAX = 0x7fff;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static Random random = new Random();
+        private static Star[] stars = new Star[NUMBERSTARS];
+        private static int lod = 24;                // Level of detail
+        private static float spinX, spinY, spinZ;
+        private static int numberSpheres = 12;
+        private static int numberTextures = 4;
+        private static int mode = Gl.GL_MODULATE;   // Modulate, decal
+        private static int filter = Gl.GL_LINEAR;   // Texture filtering mode
+        private static bool drawBackground = true;  // Draw background image?
+        private static bool drawStars = true;       // Draw stars?
+        private static bool texturing = true;       // Texturing?
+        private static bool performanceTiming;      // Performance timing?
+        private static bool frozen;                 // Animation frozen?
+        private static int width, height;
+        private static int backgroundTexture = 1;
+        private static int i, start, last, end, step;
+
+        private static byte[/*COLORS*/,/*3*/] colors = {
+            {255,   0,   0},
+            {255, 128,   0},
+            {255, 255,   0},
+            {128, 255,   0},
+            {  0, 255,   0},
+            {  0, 255, 128},
+            {  0, 255, 255},
+            {  0, 128, 255},
+            {  0,   0, 255},
+            {128,   0, 255},
+            {255,   0, 255},
+            {255,   0, 128}
+        };
+
+        private static string[] textureNames = {
+            "NateRobins.Maiden.DeadOne.ppm",
+            "NateRobins.Maiden.Virus.ppm",
+            "NateRobins.Maiden.Ace.ppm",
+            "NateRobins.Maiden.Space.ppm"
+        };
+        #endregion Private Fields
+
+        #region Private Structs
+        private struct Star {
+            public float X, Y;
+            public float VX, VY;
+        }
+        #endregion Private Structs
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() 
+        {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DEPTH | Glut.GLUT_DOUBLE | Glut.GLUT_MULTISAMPLE | Glut.GLUT_RGBA);
+            Glut.glutInitWindowSize(800, 600);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Maiden");
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutSpecialFunc(new Glut.SpecialCallback(Special));
+
+            Glut.glutCreateMenu(new Glut.CreateMenuCallback(Menu));
+            Glut.glutAddMenuEntry("Toggle texture mapping", (int) 't');
+            Glut.glutAddMenuEntry("Toggle texture mode", (int) 'm');
+            Glut.glutAddMenuEntry("Toggle filter mode", (int) 'f');
+            Glut.glutAddMenuEntry("Toggle performance", (int) 'p');
+            Glut.glutAddMenuEntry("Toggle background", (int) 'b');
+            Glut.glutAddMenuEntry("Toggle animation", (int) ' ');
+            Glut.glutAddMenuEntry("Toggle culling", (int) 'c');
+            Glut.glutAddMenuEntry("Toggle stars", (int) '*');
+            Glut.glutAddMenuEntry("Time full frame (no swap)", (int) 'n');
+            Glut.glutAddMenuEntry("Print pixels/frame", (int) 'r');
+            Glut.glutAddMenuEntry("", 0);
+            Glut.glutAddMenuEntry("> and < keys change # of textures", 0);
+            Glut.glutAddMenuEntry("Arrows up/down change level of detail", 0);
+            Glut.glutAddMenuEntry("Arrows right/left change # of spheres", 0);
+            Glut.glutAddMenuEntry("1-4 keys change background image", 0);
+            Glut.glutAddMenuEntry("", 0);
+            Glut.glutAddMenuEntry("Quit", (int) 'r');
+            Glut.glutAttachMenu(Glut.GLUT_RIGHT_BUTTON);
+
+            Init();
+            LoadTextures();
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Color(byte color)
+        private static void Color(byte color) {
+            int index = COLORS / numberSpheres * color;
+
+            Gl.glColor3ub(colors[index, 0], colors[index, 1], colors[index, 2]);
+        }
+        #endregion Color(byte color)
+
+        #region Init()
+        private static void Init() {
+            float[] Ka = {0.2f, 0.2f, 0.2f, 1.0f};
+            float[] Ks = {1.0f, 1.0f, 1.0f, 1.0f};
+
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glEnable(Gl.GL_CULL_FACE);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
+            Gl.glColorMaterial(Gl.GL_FRONT, Gl.GL_DIFFUSE);
+            Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 64);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, Ks);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, Ka);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, filter);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, filter);
+        }
+        #endregion Init()
+
+        #region LoadTextures()
+        private static void LoadTextures() {
+            int w = 0;
+            int h = 0;
+            byte[] texture;
+
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+
+            // XXX - RE bug - must enable texture before bind.
+            Gl.glEnable(Gl.GL_TEXTURE_2D);
+
+            for(int i = 0; i < 4; i++) {
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, i + 1);
+                texture = PpmRead(textureNames[i], ref w, ref h);
+                Glu.gluBuild2DMipmaps(Gl.GL_TEXTURE_2D, 3, w, h, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, texture);
+                texture = null;
+            }
+
+            /* XXX - RE bug - must enable texture before bind. */
+            Gl.glDisable(Gl.GL_TEXTURE_2D);
+        }
+        #endregion LoadTextures()
+        
+        #region int Pixels()
+        private static int Pixels() {
+            int i, j, n, values;
+            float ax, ay, bx, by, area, acc = 0;
+            float[] buffer;
+
+            // Calculate the size of the feedback buffer:
+            //      lod * lod * 2 = number of triangles in the torus
+            //      lod * 2 = number of triangles in each cap of a sphere
+            //      lod * (lod - 2) * 2 = number of triangles in latitudinal strips of a sphere
+            //      *8 = 3 vertices (2 values each) + polygon token and a vertex count
+            //      NUMBERSTARS * 5 = line token + 2 vertices (2 values each)
+            //      5 * 3 = (possibly 5) bitmap tokens + 1 vertex each (2 values each)
+            buffer = new float[((lod * lod * 2 + (lod * 2 + lod * (lod - 2) * 2) * numberSpheres) * 8 + NUMBERSTARS * 5 + 5 * 3)];
+            Gl.glFeedbackBuffer((lod * lod * 2 + (lod * 2 + lod * (lod - 2) * 2) * numberSpheres) * 8 + NUMBERSTARS * 5 + 5 * 3, Gl.GL_2D, buffer);
+            Gl.glRenderMode(Gl.GL_FEEDBACK);
+            Display();
+            values = Gl.glRenderMode(Gl.GL_RENDER);
+            i = 0;
+            while(i < values) {
+                if(buffer[i] == Gl.GL_POLYGON_TOKEN) {
+                    i++;
+                    n = (int) buffer[i];
+                    i++;
+                    for(j = 0; j < n - 2; j++) {
+                        ax = buffer[i + 2 + 2 * j] - buffer[i + 0]; 
+                        ay = buffer[i + 3 + 2 * j] - buffer[i + 1];
+                        bx = buffer[i + 4 + 2 * j] - buffer[i + 0]; 
+                        by = buffer[i + 5 + 2 * j] - buffer[i + 1];
+                        area = ax * by - bx * ay;
+                        acc += (area < 0) ? -area : area; // -area = backfacing polygon
+                        i += n * 2;
+                    }
+                }
+                else if(buffer[i] == Gl.GL_LINE_RESET_TOKEN) {
+                    i++;
+                    // Assume left-to-right horizontal lines
+                    acc += buffer[i + 2] - buffer[i + 0];
+                    i += 4;
+                }
+                else if(buffer[i] == Gl.GL_BITMAP_TOKEN) {
+                    i++;
+                    // Skip past bitmap tokens
+                    i += 2;
+                }
+                else {
+                    Console.WriteLine("Unknown token found 0x{0:x4} at {1}!", buffer[i], i);
+                    i++;
+                }
+            }
+            buffer = null;
+    
+            acc /= 2.0f;
+
+            return (int) acc;
+        }
+        #endregion int Pixels()
+
+        #region byte[] PpmRead(string fileName, ref int width, ref int height)
+        /// <summary>
+        ///     Reads a PPM raw (type P6) file.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         The PPM file has a header that should look something like:
+        ///         P6
+        ///         # comment
+        ///         width height max_value
+        ///         rgbrgbrgb...
+        ///     </para>
+        ///     <para>
+        ///         "P6" is the magic cookie which identifies the file type and should be the
+        ///         only characters on the first line followed by a carriage return.  Any line
+        ///         starting with a # mark will be treated as a comment and discarded.  After the
+        ///         magic cookie, three integer values are expected: width, height of the image
+        ///         and the maximum value for a pixel (max_value must be < 256 for PPM raw
+        ///         files).  The data section consists of width*height rgb triplets (one byte
+        ///         each) in binary format (i.e., such as that written with fwrite() or
+        ///         equivalent).
+        ///     </para>
+        ///     <para>
+        ///         The rgb data is returned as an array of unsigned chars (packed rgb).  The
+        ///         malloc()'d memory should be free()'d by the caller.  If an error occurs, an
+        ///         error message is sent to stderr and NULL is returned.
+        ///     </para>
+        /// </remarks>
+        private static byte[] PpmRead(string fileName, ref int width, ref int height) {
+            FileStream file;
+            BinaryReader reader;
+            byte[] image;
+            byte[] head = new byte[70];
+            int maxValue = 0;
+            string header = "";
+            int dataPosition = 0;
+
+            try {
+                if(File.Exists(Path.Combine("Data", fileName))) {
+                    fileName = Path.Combine("Data", fileName);
+                }
+                else {
+                    fileName = Path.Combine(Path.Combine(Path.Combine("..", ".."), "Data"), fileName);
+                }
+
+                file = File.Open(fileName, FileMode.Open, FileAccess.Read);
+                reader = new BinaryReader(file);
+
+                // Grab first two chars of the file and make sure that it has the correct
+                // magic cookie for a raw PPM file.
+                head = reader.ReadBytes(70);
+                if(head[0] != (byte) 'P' && head[1] != (byte) '6') {
+                    Console.WriteLine(fileName + ": Not a raw PPM file!");
+                    return null;
+                }
+
+                // Grab the three elements in the header (width, height, maxval).
+                header = Encoding.ASCII.GetString(head);
+
+                // Strip magic
+                Regex magic = new Regex(@"P6\s*", RegexOptions.Compiled | RegexOptions.Multiline);
+                Match magicMatch = magic.Match(header);
+                if(magicMatch.Success) {
+                    header = header.Remove(magicMatch.Groups[0].Index, magicMatch.Groups[0].Length);
+                    dataPosition += magicMatch.Groups[0].Length;
+                }
+
+                Regex comment = new Regex(@"^#.*\s*", RegexOptions.Compiled | RegexOptions.Multiline);
+                Regex element = new Regex(@"\s*\d*\s*", RegexOptions.Compiled | RegexOptions.Multiline);
+
+                // Gather elements
+                int i = 0;
+                bool endComments = false;
+                while(i < 3) {
+                    // Strip comments
+                    if(!endComments) {
+                        Match commentMatch = comment.Match(header);
+                        if(commentMatch.Success) {
+                            header = header.Remove(commentMatch.Groups[0].Index, commentMatch.Groups[0].Length);
+                            dataPosition += commentMatch.Groups[0].Length;
+                            commentMatch = comment.Match(header);
+                            commentMatch.NextMatch();
+                        }
+                    }
+                    Match elementMatch = element.Match(header);
+                    if(elementMatch.Success) {
+                        if(i == 0) {
+                            width = Int32.Parse(elementMatch.Groups[0].ToString().Trim());
+                        }
+                        if(i == 1) {
+                            height = Int32.Parse(elementMatch.Groups[0].ToString().Trim());
+                        }
+                        if(i == 2) {
+                            maxValue = Int32.Parse(elementMatch.Groups[0].ToString().Trim());
+                        }
+                        header = header.Remove(elementMatch.Groups[0].Index, elementMatch.Groups[0].Length);
+                        dataPosition += elementMatch.Groups[0].Length;
+                        elementMatch = element.Match(header);
+                        elementMatch.NextMatch();
+                        endComments = true;
+                        i++;
+                    }
+                }
+                reader.Close();
+                file.Close();
+                file = File.Open(fileName, FileMode.Open, FileAccess.Read);
+                reader = new BinaryReader(file);
+                // Grab all the image data in one fell swoop
+                image = new byte[width * height * 3];
+                reader.ReadBytes(dataPosition);
+                image = reader.ReadBytes(width * height * 3);
+
+                reader.Close();
+                file.Close();
+
+                return image;
+            }
+            catch(Exception e) {
+                Console.WriteLine("Error loading PPM file: " + fileName);
+                Console.WriteLine(e.ToString());
+            }
+
+            return null;
+        }
+        #endregion byte[] PpmRead(string fileName, ref int width, ref int height)
+
+        #region Sphere(int texture)
+        private static void Sphere(int texture) {
+            if(texturing) {
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture);
+                Glut.glutSolidSphere(RI, lod, lod);
+            }
+            else {
+                Glut.glutSolidSphere(RI, lod, lod);
+            }
+        }
+        #endregion Sphere(int texture)
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            if(performanceTiming) {
+                start = Glut.glutGet(Glut.GLUT_ELAPSED_TIME);
+            }
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            if(drawBackground || drawStars || performanceTiming) {
+                Gl.glMatrixMode(Gl.GL_PROJECTION);
+                Gl.glPushMatrix();
+                    Gl.glLoadIdentity();
+                    Gl.glOrtho(0, width, 0, height, -1, 1);
+                    Gl.glMatrixMode(Gl.GL_MODELVIEW);
+                    Gl.glPushMatrix();
+                        Gl.glLoadIdentity();
+                        Gl.glDepthMask(false);
+                        Gl.glDisable(Gl.GL_DEPTH_TEST);
+                        Gl.glDisable(Gl.GL_LIGHTING);
+
+                        if(drawBackground) {
+                            Gl.glEnable(Gl.GL_TEXTURE_2D);
+                            Gl.glBindTexture(Gl.GL_TEXTURE_2D, backgroundTexture);
+                            Gl.glColor3ub(255, 255, 255);
+                            Gl.glBegin(Gl.GL_QUADS);
+                                Gl.glTexCoord2i(0, 0);
+                                Gl.glVertex2i(0, 0);
+                                Gl.glTexCoord2i(1, 0);
+                                Gl.glVertex2i(width, 0);
+                                Gl.glTexCoord2i(1, 1);
+                                Gl.glVertex2i(width, height);
+                                Gl.glTexCoord2i(0, 1);
+                                Gl.glVertex2i(0, height);
+                            Gl.glEnd();
+                            Gl.glDisable(Gl.GL_TEXTURE_2D);
+                        }
+
+                        if(drawStars) {
+                            Gl.glEnable(Gl.GL_BLEND);
+                            Gl.glBegin(Gl.GL_LINES);
+                                for(i = 0; i < NUMBERSTARS; i++) {
+                                    stars[i].X += stars[i].VX;
+                                    if(stars[i].X < width) {
+                                        Gl.glColor4ub(0, 0, 0, 0);
+                                        Gl.glVertex2i((int) (stars[i].X - stars[i].VX * 3), (int) stars[i].Y);
+                                        Gl.glColor4ub(255, 255, 255, 255);
+                                        Gl.glVertex2i((int) stars[i].X, (int) stars[i].Y);
+                                    }
+                                    else {
+                                        stars[i].X = 0;
+                                    }
+                                }
+                            Gl.glEnd();
+                            Gl.glDisable(Gl.GL_BLEND);
+                        }
+
+                        if(performanceTiming) {
+                            float fps = (1.0f / ((float) (end - last) / 1000.0f));
+                            string s = fps.ToString("F1") + " FPS";
+
+                            Gl.glColor3ub(255, 255, 255);
+                            Gl.glRasterPos2i(5, 5);
+                            foreach(char c in s) {
+                                Glut.glutBitmapCharacter(Glut.GLUT_BITMAP_HELVETICA_18, c);
+                            }
+                            last = start;
+                        }
+
+                        Gl.glEnable(Gl.GL_LIGHTING);
+                        Gl.glEnable(Gl.GL_DEPTH_TEST);
+                        Gl.glDepthMask(true);
+                        Gl.glMatrixMode(Gl.GL_PROJECTION);
+                    Gl.glPopMatrix();
+                    Gl.glMatrixMode(Gl.GL_MODELVIEW);
+                Gl.glPopMatrix();
+            }
+
+            Gl.glPushMatrix();
+                if(texturing) {
+                    Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
+                    Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
+                    Gl.glEnable(Gl.GL_TEXTURE_GEN_S);
+                    Gl.glEnable(Gl.GL_TEXTURE_GEN_T);
+                    Gl.glEnable(Gl.GL_TEXTURE_2D);
+                }
+
+                Gl.glRotatef(spinY, 0, 1, 0);
+                Gl.glColor3ub(196, 196, 196);
+                Glut.glutSolidTorus(RI, RO, lod, lod);
+
+                step = (int) (360.0 / numberSpheres);
+                for(i = 0; i < numberSpheres; i++) {
+                    Gl.glPushMatrix();
+                        Gl.glRotatef(step * i + spinZ, 0, 0, 1);
+                        Gl.glTranslatef(0, RO, 0);
+                        Gl.glRotatef(step * i + spinX, 1, 0, 0);
+                        Gl.glTranslatef(0, RI + RI, 0);
+                        Color((byte) i);
+                        Sphere(i % numberTextures + 1);
+                    Gl.glPopMatrix();
+                }
+
+                if(texturing) {
+                    Gl.glDisable(Gl.GL_TEXTURE_GEN_S);
+                    Gl.glDisable(Gl.GL_TEXTURE_GEN_T);
+                    Gl.glDisable(Gl.GL_TEXTURE_2D);
+                }
+            Gl.glPopMatrix();
+
+            Glut.glutSwapBuffers();
+
+            if(performanceTiming) {
+                end = Glut.glutGet(Glut.GLUT_ELAPSED_TIME);
+            }
+        }
+        #endregion Display()
+
+        #region Idle()
+        private static void Idle() {
+            if(!frozen) {
+                spinY += 0.5f;
+                if(spinY > 360) {
+                    spinY -= 360;
+                }
+
+                spinX += 10;
+                if(spinX > 360) {
+                    spinX -= 360;
+                }
+
+                spinZ += 1;
+                if(spinZ > 360) {
+                    spinZ -= 360;
+                }
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Idle()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'p':
+                case (byte) 'P':
+                    performanceTiming = !performanceTiming;
+                    break;
+                case (byte) 't':
+                case (byte) 'T':
+                    texturing = !texturing;
+                    break;
+                case (byte) 'm':
+                case (byte) 'M':
+                    if(mode == Gl.GL_REPLACE) {
+                        mode = Gl.GL_MODULATE;
+                    }
+                    else {
+                        mode = Gl.GL_REPLACE;
+                    }
+                    Gl.glTexEnvi(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, mode);
+                    Console.WriteLine("{0} mode.", mode == Gl.GL_MODULATE ? "GL_MODULATE" : "GL_REPLACE");
+                    break;
+                case (byte) 'f':
+                case (byte) 'F':
+                    if(filter == Gl.GL_NEAREST) {
+                        filter = Gl.GL_LINEAR;
+                    }
+                    else {
+                        filter = Gl.GL_NEAREST;
+                    }
+                    for(int i = 0; i < numberTextures; i++) {
+                        Gl.glBindTexture(Gl.GL_TEXTURE_2D, i + 1);
+                        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, filter);
+                        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, filter);
+                    }
+                    Console.WriteLine("{0} filtering.", filter == Gl.GL_LINEAR ? "GL_LINEAR" : "GL_NEAREST");
+                    break;
+                case (byte) '>':
+                case (byte) '.':
+                    numberTextures++;
+                    if(numberTextures > 4) {
+                        numberTextures = 4;
+                    }
+                    break;
+                case (byte) '<':
+                case (byte) ',':
+                    numberTextures--;
+                    if(numberTextures < 1) {
+                        numberTextures = 1;
+                    }
+                    break;
+                case (byte) 'b':
+                case (byte) 'B':
+                    drawBackground = !drawBackground;
+                    break;
+                case (byte) '*':
+                case (byte) '8':
+                    drawStars = !drawStars;
+                    break;
+                case (byte) 'r':
+                case (byte) 'R':
+                    Console.WriteLine("{0:F1} triangles, {1:F1} pixels.", lod * lod * 2 + (lod * 2 + lod * (lod - 2) * 2) * numberSpheres, Pixels());
+                    break;
+                case (byte) 'c':
+                case (byte) 'C':
+                    if(Gl.glIsEnabled(Gl.GL_CULL_FACE) == true) {
+                        Gl.glDisable(Gl.GL_CULL_FACE);
+                    }
+                    else {
+                        Gl.glEnable(Gl.GL_CULL_FACE);
+                    }
+                    Console.WriteLine("Culling {0}.", Gl.glIsEnabled(Gl.GL_CULL_FACE) ? "enabled" : "disabled");
+                    break;
+                case (byte) ' ':
+                    frozen = !frozen;
+                    break;
+                case (byte) '1':
+                case (byte) '!':
+                    backgroundTexture = 1;
+                    break;
+                case (byte) '2':
+                case (byte) '@':
+                    backgroundTexture = 2;
+                    break;
+                case (byte) '3':
+                case (byte) '#':
+                    backgroundTexture = 3;
+                    break;
+                case (byte) '4':
+                case (byte) '$':
+                    backgroundTexture = 4;
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Menu(int value)
+        private static void Menu(int value) {
+            Keyboard((byte) value, 0, 0);
+        }
+        #endregion Menu(int value)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            if(h <= 0) {
+                h = 1;
+            }
+            if(w <= 0) {
+                w = 1;
+            }
+            width = w;
+            height = h;
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(120, (float) width / (float) height, 0.1, 1000.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0);
+
+            for(int i = 0; i < NUMBERSTARS; i++) {
+                stars[i].X = random.Next(RANDOMMAX) % width;
+                stars[i].Y = random.Next(RANDOMMAX) % height;
+                stars[i].VX = random.Next(RANDOMMAX) / (float) RANDOMMAX * 5 + 2;
+                stars[i].VY = 0;
+            }
+        }
+        #endregion Reshape(int w, int h)
+
+        #region Special(int value, int x, int y)
+        private static void Special(int value, int x, int y) {
+            switch(value) {
+                case Glut.GLUT_KEY_UP:
+                    lod++;
+                    if(lod > 32) {
+                        lod = 32;
+                    }
+                    break;
+                case Glut.GLUT_KEY_DOWN:
+                    lod--;
+                    if(lod < 3) {
+                        lod = 3;
+                    }
+                    break;
+                case Glut.GLUT_KEY_RIGHT:
+                    numberSpheres++;
+                    if(numberSpheres > COLORS) {
+                        numberSpheres = COLORS;
+                    }
+                    break;
+                case Glut.GLUT_KEY_LEFT:
+                    numberSpheres--;
+                    if(numberSpheres < 1) {
+                        numberSpheres = 1;
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Special(int value, int x, int y)
+    }
+}
diff --git a/examples/NateRobins/Makefile.am b/examples/NateRobins/Makefile.am
new file mode 100644
index 0000000..3d37052
--- /dev/null
+++ b/examples/NateRobins/Makefile.am
@@ -0,0 +1,38 @@
+
+PROGRAM = NateRobins
+PACKAGES =
+BINARY_LIBS = \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+RESX = NateRobins.resx
+RESOURCES = $(PROGRAM).NateRobins.resources
+SOURCES = \
+        NateRobins.cs \
+        Area.cs \
+        Maiden.cs \
+        MultiView.cs \
+        NateRobins.Designer.cs \
+        Nii.cs \
+        Node.cs \
+        Null.cs \
+        Point.cs \
+        Program.cs \
+        Qix.cs \
+        Rotate.cs \
+        Starfield.cs \
+        Strip.cs \
+        Texture.cs \
+        Voronoi.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.FreeGlut/Tao.FreeGlut.snk
+
+$(PROGRAM).NateRobins.resources: NateRobins.resx
+	$(RESGEN) $< $@
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/NateRobins/Makefile.in b/examples/NateRobins/Makefile.in
new file mode 100644
index 0000000..3911f67
--- /dev/null
+++ b/examples/NateRobins/Makefile.in
@@ -0,0 +1,386 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/NateRobins
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = NateRobins
+PACKAGES = 
+BINARY_LIBS = \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+
+RESX = NateRobins.resx
+RESOURCES = $(PROGRAM).NateRobins.resources
+SOURCES = \
+        NateRobins.cs \
+        Area.cs \
+        Maiden.cs \
+        MultiView.cs \
+        NateRobins.Designer.cs \
+        Nii.cs \
+        Node.cs \
+        Null.cs \
+        Point.cs \
+        Program.cs \
+        Qix.cs \
+        Rotate.cs \
+        Starfield.cs \
+        Strip.cs \
+        Texture.cs \
+        Voronoi.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.FreeGlut/Tao.FreeGlut.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/NateRobins/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/NateRobins/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).NateRobins.resources: NateRobins.resx
+	$(RESGEN) $< $@
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/NateRobins/MultiView.cs b/examples/NateRobins/MultiView.cs
new file mode 100644
index 0000000..6eb1ee8
--- /dev/null
+++ b/examples/NateRobins/MultiView.cs
@@ -0,0 +1,285 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+	multiview.c
+	Nate Robins, 1997
+	
+	Program that shows how to use multiple viewports in a single
+	context (using scissoring).
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     Program that shows how to use multiple viewports in a single context (using
+    ///     scissoring).
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class MultiView {
+        // --- Fields ---
+        #region Private Fields
+        private static int torusList;
+        private static float spinX;
+        private static float spinY;
+        private static int oldX;
+        private static int oldY;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DEPTH | Glut.GLUT_DOUBLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(512, 512);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Multiple Viewports");
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMotionFunc(new Glut.MotionCallback(Motion));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            
+            Init();
+            BuildLists();
+            
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region BuildLists()
+        private static void BuildLists() {
+            float[] goldAmbient = {0.24725f, 0.1995f, 0.0745f, 1.0f};
+            float[] goldDiffuse = {0.75164f, 0.60648f, 0.22648f, 1.0f};
+            float[] goldSpecular = {0.628281f, 0.555802f, 0.366065f, 1.0f};
+            float goldShininess = 41.2f;
+            float[] silverAmbient = {0.05f, 0.05f, 0.05f, 1.0f};
+            float[] silverDiffuse = {0.4f, 0.4f, 0.4f, 1.0f};
+            float[] silverSpecular = {0.7f, 0.7f, 0.7f, 1.0f};
+            float silverShininess = 12.0f;
+    
+            torusList = Gl.glGenLists(1);
+            Gl.glNewList(torusList, Gl.GL_COMPILE);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, goldAmbient);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, goldDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, goldSpecular);
+                Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, goldShininess);
+                Gl.glMaterialfv(Gl.GL_BACK, Gl.GL_AMBIENT, silverAmbient);
+                Gl.glMaterialfv(Gl.GL_BACK, Gl.GL_DIFFUSE, silverDiffuse);
+                Gl.glMaterialfv(Gl.GL_BACK, Gl.GL_SPECULAR, silverSpecular);
+                Gl.glMaterialf(Gl.GL_BACK, Gl.GL_SHININESS, silverShininess);
+                Glut.glutWireTorus(0.3, 0.5, 16, 32);
+            Gl.glEndList();
+        }
+        #endregion BuildLists()
+
+        #region Init()
+        private static void Init() {
+            float[] lightPosition = {1.0f, 1.0f, 1.0f, 0.0f};
+
+            Gl.glLightModeli(Gl.GL_LIGHT_MODEL_TWO_SIDE, Gl.GL_TRUE);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glDisable(Gl.GL_CULL_FACE);
+        }
+        #endregion Init()
+
+        #region Projection(int width, int height, int perspective)
+        private static void Projection(int width, int height, int perspective) {
+            float ratio = (float) width / (float) height;
+
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(perspective > 0) {
+                Glu.gluPerspective(60, ratio, 1, 256);
+            }
+            else  {
+                Gl.glOrtho(-ratio, ratio, -ratio, ratio, 1, 256);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+        }
+        #endregion Projection(int width, int height, int perspective)
+
+        #region Text(string text)
+        private static void Text(string text) {
+            foreach(char c in text) {
+                Glut.glutBitmapCharacter(Glut.GLUT_BITMAP_HELVETICA_18, c);
+            }
+        }
+        #endregion Text(string text)
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            int width = Glut.glutGet(Glut.GLUT_WINDOW_WIDTH);
+            int height = Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT);
+
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluOrtho2D(0, width, 0, height);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glDisable(Gl.GL_LIGHTING);
+                Gl.glColor3ub(255, 255, 255);
+                Gl.glBegin(Gl.GL_LINES);
+                Gl.glVertex2i(width / 2, 0);
+                Gl.glVertex2i(width / 2, height);
+                Gl.glVertex2i(0, height / 2);
+                Gl.glVertex2i(width, height / 2);
+            Gl.glEnd();
+
+            Gl.glRasterPos2i(5, 5);
+            Text("Front");
+            Gl.glRasterPos2i(width / 2 + 5, 5);
+            Text("Right");
+            Gl.glRasterPos2i(5, height / 2 + 5);
+            Text("Top");
+            Gl.glRasterPos2i(width / 2 + 5, height / 2 + 5);
+            Text("Perspective");
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+
+            width = (width + 1) / 2;
+            height = (height + 1) / 2;
+
+            Gl.glEnable(Gl.GL_SCISSOR_TEST);
+
+            // Bottom Left
+            Gl.glViewport(0, 0, width, height);
+            Gl.glScissor(0, 0, width, height);
+
+            // Front
+            Projection(width, height, 0);
+            Gl.glRotatef(spinY, 1.0f, 0.0f, 0.0f);
+            Gl.glRotatef(spinX, 0.0f, 1.0f, 0.0f);
+
+            Gl.glCallList(torusList);
+    
+            // Bottom Right
+            Gl.glViewport(width, 0, width, height);
+            Gl.glScissor(width, 0, width, height);
+
+            // Right
+            Projection(width, height, 0);
+            Gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+            Gl.glRotatef(spinY, 1.0f, 0.0f, 0.0f);
+            Gl.glRotatef(spinX, 0.0f, 1.0f, 0.0f);
+
+            Gl.glCallList(torusList);
+
+            // Top Left
+            Gl.glViewport(0, height, width, height);
+            Gl.glScissor(0, height, width, height);
+
+            // Top
+            Projection(width, height, 0);
+            Gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+            Gl.glRotatef(spinY, 1.0f, 0.0f, 0.0f);
+            Gl.glRotatef(spinX, 0.0f, 1.0f, 0.0f);
+
+            Gl.glCallList(torusList);
+
+            // Top Right
+            Gl.glViewport(width, height, width, height);
+            Gl.glScissor(width, height, width, height);
+
+            // Perspective
+            Projection(width, height, 1);
+            Gl.glRotatef(30.0f, 0.0f, 1.0f, 0.0f);
+            Gl.glRotatef(20.0f, 1.0f, 0.0f, 0.0f);
+            Gl.glRotatef(spinY, 1.0f, 0.0f, 0.0f);
+            Gl.glRotatef(spinX, 0.0f, 1.0f, 0.0f);
+
+            Gl.glCallList(torusList);
+
+            Gl.glDisable(Gl.GL_SCISSOR_TEST);
+
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Motion(int x, int y)
+        private static void Motion(int x, int y) {
+            spinX = x - oldX;
+            spinY = y - oldY;
+            Glut.glutPostRedisplay();
+        }
+        #endregion Motion(int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            oldX = x;
+            oldY = y;
+            Glut.glutPostRedisplay();
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int width, int height)
+        private static void Reshape(int width, int height) {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        #endregion Reshape(int width, int height)
+    }
+}
diff --git a/examples/NateRobins/NateRobins.Designer.cs b/examples/NateRobins/NateRobins.Designer.cs
new file mode 100644
index 0000000..10b0cc6
--- /dev/null
+++ b/examples/NateRobins/NateRobins.Designer.cs
@@ -0,0 +1,79 @@
+namespace NateRobins
+{
+    partial class NateRobins
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NateRobins));
+            this.lstExamples = new System.Windows.Forms.ListBox();
+            this.btnRun = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // lstExamples
+            // 
+            this.lstExamples.FormattingEnabled = true;
+            this.lstExamples.Location = new System.Drawing.Point(13, 13);
+            this.lstExamples.Name = "lstExamples";
+            this.lstExamples.Size = new System.Drawing.Size(258, 173);
+            this.lstExamples.Sorted = true;
+            this.lstExamples.TabIndex = 0;
+            this.lstExamples.DoubleClick += new System.EventHandler(this.lstExamples_SelectedIndexChanged);
+            // 
+            // btnRun
+            // 
+            this.btnRun.Location = new System.Drawing.Point(94, 192);
+            this.btnRun.Name = "btnRun";
+            this.btnRun.Size = new System.Drawing.Size(95, 23);
+            this.btnRun.TabIndex = 1;
+            this.btnRun.Text = "Run";
+            this.btnRun.UseVisualStyleBackColor = true;
+            this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+            // 
+            // NateRobins
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(283, 224);
+            this.Controls.Add(this.btnRun);
+            this.Controls.Add(this.lstExamples);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "NateRobins";
+            this.Text = "NateRobinsExamples";
+            this.Load += new System.EventHandler(this.frmExamples_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ListBox lstExamples;
+        private System.Windows.Forms.Button btnRun;
+    }
+}
+
diff --git a/examples/NateRobins/NateRobins.cs b/examples/NateRobins/NateRobins.cs
new file mode 100644
index 0000000..7564753
--- /dev/null
+++ b/examples/NateRobins/NateRobins.cs
@@ -0,0 +1,82 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace NateRobins
+{
+    public partial class NateRobins : Form
+    {
+        public NateRobins()
+        {
+            InitializeComponent();
+        }
+
+        private void frmExamples_Load(object sender, EventArgs e)
+        {
+            Type[] types = Assembly.GetExecutingAssembly().GetTypes();
+            foreach (Type type in types)
+            {
+                MemberInfo[] runMethods = type.GetMember("Run");
+                foreach (MemberInfo run in runMethods)
+                {
+                    lstExamples.Items.Add(type.Name);
+                }
+                if (lstExamples.Items.Count > 0)
+                {
+                    this.lstExamples.SelectedIndex = 0;
+                }
+            }
+        }
+
+        private void btnRun_Click(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+
+        private void SelectExample()
+        {
+            if (lstExamples.SelectedItem != null)
+            {
+                Type example = Assembly.GetExecutingAssembly().GetType("NateRobins." + lstExamples.SelectedItem.ToString(), true, true);
+                example.InvokeMember("Run", BindingFlags.InvokeMethod, null, null, null);
+            }
+        }
+
+        private void lstExamples_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+    }
+}
diff --git a/examples/NateRobins/NateRobins.csproj b/examples/NateRobins/NateRobins.csproj
new file mode 100644
index 0000000..4276cdc
--- /dev/null
+++ b/examples/NateRobins/NateRobins.csproj
@@ -0,0 +1,166 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{07F2FB99-129A-482E-8ECC-8AC494F2C0D0}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>NateRobins</AssemblyName>
+    <AssemblyOriginatorKeyFile>../../src/Tao.OpenGl/Tao.OpenGl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>NateRobins</RootNamespace>
+    <StartupObject>NateRobins.Program</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.FreeGlut\Tao.FreeGlut.csproj">
+      <Name>Tao.FreeGlut</Name>
+      <Project>{87C95364-7158-4D81-83B8-97B649E27ABA}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="NateRobins.resx">
+      <DependentUpon>NateRobins.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="NateRobins.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Area.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Maiden.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="MultiView.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="NateRobins.Designer.cs">
+      <DependentUpon>NateRobins.cs</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Nii.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Node.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Null.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Point.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Qix.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Rotate.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Starfield.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Strip.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Texture.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Voronoi.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/NateRobins/NateRobins.resx b/examples/NateRobins/NateRobins.resx
new file mode 100644
index 0000000..06ec7be
--- /dev/null
+++ b/examples/NateRobins/NateRobins.resx
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAChl4QAopiGAKOZhgCjmYcAo5mIAKSahwCkmogApZuJAKaciQCmnIoAppyLAKiejACpn44ArKKRAK2j
+        kgCupZUAr6eXALGomACzqZkAsamaALOqmQCyqpsAtKuaALSsnQC0rJ4Atq2eALmxogC7s6UAvbSkALu0
+        pgC+t6sAwbuvAMW8rQDIv7AAycCxAMvFuwDLxrsA08y+ANDMwwDRzcQA08/GANfQwwDa08YA29THANfT
+        ywDY1MwA3dbKAODe2QDi4NoA5OHbAOPh3ADk4dwA5OLdAOTj3gDw6t8A7OnmAO7t6gDx8e8A9fXzAPX2
+        9AD4+fgA+fn4APj6+QD8/v4A/f//AP7//wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAQ0NDQ0NDQ0NDQ0NDMBcDDAwDFzFDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0M3Bw8cAAAAAAAAACsD
+        N0NDQ0NDQ0NDQ0NDQ0NDQ0NDFCctAAAAAAAAAAAAAAAAFENDQ0NDQ0NDQ0NDQ0NDERtAJgAAAAAAAAAA
+        AAAAAAAAABtDQ0NDQ0NDQ0NDQwY+QEAAAAAAAAAAAAAAAAAAAAAAAANDQ0NDQ0NDQ0MGQkBAEAAAAAAA
+        AAAAAAAAAAAAAAAAAAVDQ0NDQ0NDGz1AQEAgAAAAAAAAAAAAAAAAAAAAAAAAABFDQ0NDQ0MdQEBAQCkA
+        AAAAAAA0NQAAAAAAAAAAAAAAAENDQ0NDFkBAQEBAAAAAAAAAGkBAGgAAAAAAAAAAAAAAFENDQzknQEBA
+        QEAlAAAAAAAABwYAAAAAAAAAAAAAAAAAN0NDBkBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQ0MA
+        QEBAQEBAOAAAAAAAAAAAAAAAAAAAAAAAAAAAACtDMTJAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ADEZQkBAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAAFwNAQEBAQEBAQEBAJAAAAAAAAAAAAAAAAAAA
+        AAAAAAAEDkBAQEBAQEBAQEBAQRohAAAAAAAAAAAAAAAAAAAAAAwNQEBAQEBAQEBAQEBAQEA8IwsAAAAA
+        AAAAAAAAAAAADAVAQEBAQEBAQEBAQEBAQEBAQEEJAAAAAAAAAAAAAAADF0JAQEBAQEBAQEBAQEBAQEBA
+        QEA7AAAAAAAAAAAAABcwMEBAQEBAQEBAQEBAQEBAQEBAQEBALgAAAAAAAAAAMUMAQEBAQEBAQEBAQEBA
+        QEBAQEBAQEAtAAAAAAAAACtDQwhAQEBAQEBAQEBAQEBAQEBAQEBAQEAiAAAAAAAAA0NDNydAQEBAQEBA
+        QEBAQEAHCkBAQEBAQAEAAAAAAAA3Q0NDFkBAQEBAQEBAQEBAHjY2HkBAQEBAEwAAAAAAEkNDQ0NDHUBA
+        QEBAQEBAQEA/KipBQEBAQEATAAAAAABDQ0NDQ0MSPUBAQEBAQEBAQEBAQEBAQEBAQAwAAAAAG0NDQ0ND
+        Q0MHQkBAQEBAQEBAQEBAQEBAQEBBAAAAAAJDQ0NDQ0NDQ0MGPkBAQEBAQEBAQEBAQEBAQBEAAAADQ0ND
+        Q0NDQ0NDQ0MRGEBAQEBAQEBAQEBAQEA6AAAAG0NDQ0NDQ0NDQ0NDQ0NDFShBQEBAQEBAQEBAHwAAFEND
+        Q0NDQ0NDQ0NDQ0NDQ0NDNwYALEJAQEBALxIrAzdDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzFwYNDQMXMUND
+        Q0NDQ0NDQ0NDQ//wD///gAH//wAA//wAAD/4AAAf8AAAD+AAAAfgAAAHwAAAA4AAAAGAAAABgAAAAQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA+AAAAfgAAAH8AAAD/gA
+        AB/8AAA//wAA//+AAf//8A//
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/examples/NateRobins/NateRobins.sh b/examples/NateRobins/NateRobins.sh
new file mode 100755
index 0000000..5741fbb
--- /dev/null
+++ b/examples/NateRobins/NateRobins.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./NateRobins.exe "$@"
diff --git a/examples/NateRobins/Nii.cs b/examples/NateRobins/Nii.cs
new file mode 100644
index 0000000..dce2b28
--- /dev/null
+++ b/examples/NateRobins/Nii.cs
@@ -0,0 +1,396 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* 
+    nii.c
+    Nate Robins, 1997
+
+    Network Integration Incorporated logo.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     Network Integration Incorporated logo.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Nii {
+        // --- Fields ---
+        #region Private Fields
+        private static float spinX = -30.0f;
+        private static float spinY = 25.0f;
+        private static float spinC = 0.0f;
+        private static int oldX;
+        private static int oldY;
+        private static bool toggle;
+        
+        private static int logoTriangles = 52;
+        private static int spinnerTriangles = 12;
+
+        private static float[] logoVertices = {
+            -17.0f,  17.0f,  6.0f,      // Front
+            -17.0f, -17.0f,  6.0f,
+             -5.0f, -17.0f,  6.0f,
+             -5.0f,  -7.0f,  6.0f,
+              5.0f, -17.0f,  6.0f,
+             17.0f, -17.0f,  6.0f,
+             17.0f,   9.0f,  6.0f,
+              5.0f,   9.0f,  6.0f,
+              5.0f,   7.0f,  6.0f,
+             -5.0f,  17.0f,  6.0f,
+            -17.0f,  17.0f, -6.0f,      // Back
+            -17.0f, -17.0f, -6.0f,
+             -5.0f, -17.0f, -6.0f,
+             -5.0f,  -7.0f, -6.0f,
+              5.0f, -17.0f, -6.0f,
+             17.0f, -17.0f, -6.0f,
+             17.0f,   9.0f, -6.0f,
+              5.0f,   9.0f, -6.0f,
+              5.0f,   7.0f, -6.0f,
+             -5.0f,  17.0f, -6.0f,
+              6.0f,   8.0f,  6.0f,
+              6.0f, -16.0f,  6.0f,
+             16.0f, -16.0f,  6.0f,
+             16.0f,   8.0f,  6.0f,
+              6.0f,   8.0f, -6.0f,
+              6.0f, -16.0f, -6.0f,
+             16.0f, -16.0f, -6.0f,
+             16.0f,   8.0f, -6.0f
+        };
+
+        private static int[] logoIndices = {
+             0,  1,  2,                 // Front
+             0,  2,  9,
+             9,  3,  8,
+             8,  3,  4, 
+            10, 12, 11,                 // Back
+            10, 19, 12,
+            19, 18, 13,
+            18, 14, 13,
+             0,  9, 19,                 // Top Left
+             0, 19, 10,
+            19,  9,  8,                 // Top Slant
+             8, 18, 19,
+             8,  7, 17,                 // Small Step
+            17, 18,  8,
+            17,  7,  6,                 // Below Cube
+            17,  6, 16,
+             6,  5, 15,                 // Top Right
+            16,  6, 15,
+             5, 14, 15,                 // Bottom Right
+             5,  4, 14,
+             4,  3, 13,                 // Bottom Slant
+             4, 13, 14,
+             2, 12, 13,                 // Step
+             2, 13,  3,
+             2, 11, 12,                 // Bottom Left
+             2,  1, 11,
+             1,  0, 10,                 // Left
+             1, 10, 11,
+             7,  4, 20,                 // Hollow Front
+            20,  4, 21,
+            21,  4,  5,
+            21,  5, 22,
+            22,  5,  6,
+             6, 23, 22,
+             7, 23,  6,
+             7, 20, 23,
+            17, 24, 14,                 // Hollow Back
+            24, 25, 14,
+            25, 15, 14,
+            25, 26, 15,
+            26, 16, 15,
+            16, 26, 27,
+            17, 16, 27,
+            17, 27, 24,
+            20, 24, 23,                 // Hollow Top
+            24, 27, 23,
+            23, 27, 26,                 // Hollow Right
+            23, 26, 22,
+            20, 21, 25,                 // Hollow Left
+            20, 25, 24,
+            25, 21, 22,                 // Hollow Bottom
+            25, 22, 26
+        };
+
+        private static float[] logoNormals = {
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     1.0f,     0.0f,
+             0.0f,     1.0f,     0.0f,
+             0.7071f,  0.7071f,  0.0f,
+             0.7071f,  0.7071f,  0.0f,
+            -1.0f,     0.0f,     0.0f,
+            -1.0f,     0.0f,     0.0f,
+             0.0f,     1.0f,     0.0f,
+             0.0f,     1.0f,     0.0f,
+             1.0f,     0.0f,     0.0f,
+             1.0f,     0.0f,     0.0f,
+             0.0f,    -1.0f,     0.0f,
+             0.0f,    -1.0f,     0.0f,
+            -0.7071f, -0.7071f,  0.0f,
+            -0.7071f, -0.7071f,  0.0f,
+             1.0f,     0.0f,     0.0f,
+             1.0f,     0.0f,     0.0f,
+             0.0f,    -1.0f,     0.0f,
+             0.0f,    -1.0f,     0.0f,
+            -1.0f,     0.0f,     0.0f,
+            -1.0f,     0.0f,     0.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,     1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,     0.0f,    -1.0f,
+             0.0f,    -1.0f,     0.0f,
+             0.0f,    -1.0f,     0.0f,
+            -1.0f,     0.0f,     0.0f,
+            -1.0f,     0.0f,     0.0f,
+             1.0f,     0.0f,     0.0f,
+             1.0f,     0.0f,     0.0f,
+             0.0f,     1.0f,     0.0f,
+             0.0f,     1.0f,     0.0f
+        };
+
+        private static float[] spinnerVertices = {
+            -6.0f,  3.0f,  6.0f,
+            -6.0f, -3.0f,  6.0f,
+             6.0f, -3.0f,  6.0f,
+             6.0f,  3.0f,  6.0f,
+            -6.0f,  3.0f, -6.0f,
+            -6.0f, -3.0f, -6.0f,
+             6.0f, -3.0f, -6.0f,
+             6.0f,  3.0f, -6.0f
+        };
+
+        private static int[] spinnerIndices = {
+            0, 1, 2,
+            0, 2, 3,
+            0, 3, 7,
+            0, 7, 4,
+            3, 2, 6,
+            3, 6, 7,
+            7, 6, 5,
+            7, 5, 4,
+            6, 2, 1,
+            6, 1, 5,
+            4, 5, 1,
+            4, 1, 0
+        };
+
+        private static float[] spinnerNormals = {
+             0.0f,  0.0f,  1.0f,
+             0.0f,  0.0f,  1.0f,
+             0.0f,  1.0f,  0.0f,
+             0.0f,  1.0f,  0.0f,
+             1.0f,  0.0f,  0.0f,
+             1.0f,  0.0f,  0.0f,
+             0.0f,  0.0f, -1.0f,
+             0.0f,  0.0f, -1.0f,
+             0.0f, -1.0f,  0.0f,
+             0.0f, -1.0f,  0.0f,
+            -1.0f,  0.0f,  0.0f,
+            -1.0f,  0.0f,  0.0f
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DEPTH | Glut.GLUT_DOUBLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(640, 480);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Network Integration");
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            Glut.glutMotionFunc(new Glut.MotionCallback(Motion));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutVisibilityFunc(new Glut.VisibilityCallback(Visibility));
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            int i;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glRotatef(spinY, 1.0f, 0.0f, 0.0f);
+                Gl.glRotatef(spinX, 0.0f, 1.0f, 0.0f);
+
+                Gl.glColor3ub(165, 163, 160);
+                Gl.glBegin(Gl.GL_TRIANGLES);
+                    for(i = 0; i < logoTriangles; i++) {
+                        Gl.glNormal3f(logoNormals[3 * i], logoNormals[3 * i + 1], logoNormals[3 * i + 2]);
+                        Gl.glVertex3f(logoVertices[(3 * logoIndices[3 * i]) + 0], logoVertices[(3 * logoIndices[3 * i]) + 1], logoVertices[(3 * logoIndices[3 * i]) + 2]);
+                        Gl.glVertex3f(logoVertices[(3 * logoIndices[3 * i + 1]) + 0], logoVertices[(3 * logoIndices[3 * i + 1]) + 1], logoVertices[(3 * logoIndices[3 * i + 1]) + 2]);
+                        Gl.glVertex3f(logoVertices[(3 * logoIndices[3 * i + 2]) + 0], logoVertices[(3 * logoIndices[3 * i + 2]) + 1], logoVertices[(3 * logoIndices[3 * i + 2]) + 2]);
+                    }
+                Gl.glEnd();
+
+                Gl.glColor3ub(0, 90, 107);
+                Gl.glTranslatef(11.0f, 14.0f, 0.0f);
+                Gl.glRotatef(spinC, 0.0f, 1.0f, 0.0f);
+                Gl.glBegin(Gl.GL_TRIANGLES);
+                    for(i = 0; i < spinnerTriangles; i++) {
+                        Gl.glNormal3f(spinnerNormals[3 * i], spinnerNormals[3 * i + 1], spinnerNormals[3 * i + 2]);
+                        Gl.glVertex3f(spinnerVertices[(3 * spinnerIndices[3 * i]) + 0], spinnerVertices[(3 * spinnerIndices[3 * i]) + 1], spinnerVertices[(3 * spinnerIndices[3 * i]) + 2]);
+                        Gl.glVertex3f(spinnerVertices[(3 * spinnerIndices[3 * i + 1]) + 0], spinnerVertices[(3 * spinnerIndices[3 * i + 1]) + 1], spinnerVertices[(3 * spinnerIndices[3 * i + 1]) + 2]);
+                        Gl.glVertex3f(spinnerVertices[(3 * spinnerIndices[3 * i + 2]) + 0], spinnerVertices[(3 * spinnerIndices[3 * i + 2]) + 1], spinnerVertices[(3 * spinnerIndices[3 * i + 2]) + 2]);
+                    }
+                Gl.glEnd();
+            Gl.glPopMatrix();
+
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) ' ':
+                    spinC = 0;
+                    toggle = !toggle;
+                    if(toggle) {
+                        Glut.glutIdleFunc(null);
+                    }
+                    else {
+                        Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+                    }
+                    break;
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Idle()
+        private static void Idle() {
+            spinC += 1;
+            if(spinC > 360) {
+                spinC = 0;
+            }
+            Glut.glutPostRedisplay();
+        }
+        #endregion Idle()
+
+        #region Motion(int x, int y)
+        private static void Motion(int x, int y) {
+            spinX = x - oldX;
+            spinY = y - oldY;
+            Glut.glutPostRedisplay();
+        }
+        #endregion Motion(int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            oldX = x;
+            oldY = y;
+            Glut.glutPostRedisplay();
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int width, int height)
+        private static void Reshape(int width, int height) {
+            float[] lightPosition = {0.0f, 1.0f, 1.0f, 0.0f};
+
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float) width / (float) height, 1.0, 1200.0); 
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(0.0, 0.0, 60.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+            Gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glEnable(Gl.GL_CULL_FACE);
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+        }
+        #endregion Reshape(int width, int height)
+
+        #region Visibility(int state)
+        private static void Visibility(int state) {
+            if(state == Glut.GLUT_VISIBLE) {
+                Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            }
+            else {
+                Glut.glutIdleFunc(null);
+            }
+        }
+        #endregion Visibility(int state)
+    }
+}
diff --git a/examples/NateRobins/Node.cs b/examples/NateRobins/Node.cs
new file mode 100644
index 0000000..64236ac
--- /dev/null
+++ b/examples/NateRobins/Node.cs
@@ -0,0 +1,46 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+namespace NateRobins {
+    public sealed class Node {
+        public float X;
+        public float Y;
+        public byte R;
+        public byte G;
+        public byte B;
+        public Node Next;
+
+        public Node() {
+            X = 0.0f;
+            Y = 0.0f;
+            R = 0;
+            G = 0;
+            B = 0;
+            Next = null;
+        }
+    }
+}
diff --git a/examples/NateRobins/Null.cs b/examples/NateRobins/Null.cs
new file mode 100644
index 0000000..1ea2bd1
--- /dev/null
+++ b/examples/NateRobins/Null.cs
@@ -0,0 +1,155 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* 
+    null.c
+    Nate Robins, 1997
+
+    An example of using null bitmaps to place the rasterpos at
+    positions that may be clipped.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     An example of using null bitmaps to place the rasterpos at positions that may be
+    ///     clipped.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Null {
+        // --- Fields ---
+        #region Private Fields
+        private static byte[] image = new byte[256 * 256 * 3];
+        private static byte[] nullImage = null;
+        private static byte[] bitmap = {0};
+        private static int rasterX = 32;
+        private static int rasterY = 32;
+        private static int oldRasterX;
+        private static int oldRasterY;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            int i, j;
+
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGBA);
+            Glut.glutInitWindowSize(320, 320);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Null");
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMotionFunc(new Glut.MotionCallback(Motion));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            // Create a pretty color ramp
+            for(j = 0; j < 256; j++) {
+                for(i = 0; i < 256; i++) {
+                    image[(256 * j + i) * 3 + 0] = (byte) (255 - i * j / 255);
+                    image[(256 * j + i) * 3 + 1] = (byte) i;
+                    image[(256 * j + i) * 3 + 2] = (byte) j;
+                }
+            }
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            Gl.glRasterPos2i(0, 0);
+            Gl.glBitmap(0, 0, 0, 0, rasterX, rasterY, nullImage);
+            Gl.glDrawPixels(256, 256, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, image);
+
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Motion(int x, int y)
+        private static void Motion(int x, int y) {
+            y = Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT) - y;
+            rasterX = x - oldRasterX;
+            rasterY = y - oldRasterY;
+            Glut.glutPostRedisplay();
+        }
+        #endregion Motion(int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            y = Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT) - y;
+            oldRasterX = x - rasterX;
+            oldRasterY = y - rasterY;
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int width, int height)
+        private static void Reshape(int width, int height) {
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0, width, 0, height, -1, 1);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int width, int height)
+    }
+}
diff --git a/examples/NateRobins/Point.cs b/examples/NateRobins/Point.cs
new file mode 100644
index 0000000..434bbac
--- /dev/null
+++ b/examples/NateRobins/Point.cs
@@ -0,0 +1,40 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+namespace NateRobins {
+    public sealed class Point {
+        public float X;
+        public float Y;
+        public Point Next;
+
+        public Point() {
+            X = 0.0f;
+            Y = 0.0f;
+            Next = null;
+        }
+    }
+}
diff --git a/examples/NateRobins/Program.cs b/examples/NateRobins/Program.cs
new file mode 100644
index 0000000..052ad99
--- /dev/null
+++ b/examples/NateRobins/Program.cs
@@ -0,0 +1,47 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace NateRobins
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new NateRobins());
+        }
+    }
+}
diff --git a/examples/NateRobins/Properties/AssemblyInfo.cs b/examples/NateRobins/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..9235349
--- /dev/null
+++ b/examples/NateRobins/Properties/AssemblyInfo.cs
@@ -0,0 +1,60 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework - http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright �2003-2005 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("NateRobins")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Nate Robins' examples.")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+
+[assembly: AssemblyKeyName("")]
+#if DEBUG
+[assembly: AssemblyProduct("NateRobins *** Debug Build ***")]
+#else
+[assembly: AssemblyProduct("NateRobins")]
+#endif
+[assembly: AssemblyTitle("Nate Robins'examples.")]
+[assembly: AssemblyTrademark("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/NateRobins/Qix.cs b/examples/NateRobins/Qix.cs
new file mode 100644
index 0000000..e015f4b
--- /dev/null
+++ b/examples/NateRobins/Qix.cs
@@ -0,0 +1,427 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* 
+    qix.c
+    Nate Robins, 1997
+
+    An example of a 'qix'-like line demo, but without the traditional
+    erase lines, and with anti-aliased lines.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     An example of a 'qix'-like line demo, but without the traditional erase lines,
+    ///     and with anti-aliased lines.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Qix {
+        // --- Fields ---
+        #region Private Constants
+        private const int COLORS = 48;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static bool screensaver = false;
+        private static Point first;
+        private static Point second;
+        private static int beenHere;
+        private static int color;
+        private static int points = 73;
+        private static float step = 27.232743f;
+        private static float firstX = 0.223487f;
+        private static float firstY = 0.532978f;
+        private static float secondX = 0.63257f;
+        private static float secondY = 0.325897f;
+
+        private static byte[/*COLORS*/,/*3*/] colors = {
+            {255,   0,   0},
+            {255,  32,   0},
+            {255,  64,   0},
+            {255,  96,   0},
+            {255, 128,   0},
+            {255, 160,   0},
+            {255, 192,   0},
+            {255, 224,   0},
+            {255, 255,   0},
+            {224, 255,   0},
+            {192, 255,   0},
+            {160, 255,   0},
+            {128, 255,   0},
+            { 96, 255,   0},
+            { 64, 255,   0},
+            { 32, 255,   0},
+            {  0, 255,   0},
+            {  0, 255,  32},
+            {  0, 255,  64},
+            {  0, 255,  96},
+            {  0, 255, 128},
+            {  0, 255, 160},
+            {  0, 255, 192},
+            {  0, 255, 224},
+            {  0, 255, 255},
+            {  0, 224, 255},
+            {  0, 196, 255},
+            {  0, 160, 255},
+            {  0, 128, 255},
+            {  0,  96, 255},
+            {  0,  64, 255},
+            {  0,  32, 255},
+            {  0,   0, 255},
+            { 32,   0, 255},
+            { 64,   0, 255},
+            { 96,   0, 255},
+            {128,   0, 255},
+            {160,   0, 255},
+            {196,   0, 255},
+            {224,   0, 255},
+            {255,   0, 255},
+            {255,   0, 224},
+            {255,   0, 196},
+            {255,   0, 160},
+            {255,   0, 128},
+            {255,   0,  96},
+            {255,   0,  64},
+            {255,   0,  32}
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            try {
+                //if(args.Length > 1) {
+                //    if(args[1] == "-h") {
+                //        Console.WriteLine(args[0] + " [lines] [step]");
+                //        Environment.Exit(0);
+                //    }
+                //    else {
+                //        points = Int32.Parse(args[1]);
+                //        if(args.Length > 2) {
+                //            step = Single.Parse(args[2]);
+                //        }
+                //    }
+                //}
+            }
+            catch(Exception e) {
+                Console.WriteLine("Error parsing commandline.  lines should be an integer, step should be a float.  Try again.\n\n" + e.ToString());
+                Environment.Exit(-1);
+            }
+
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGBA);
+            Glut.glutInitWindowSize(320, 320);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Qix");
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            if(screensaver) {
+                FullscreenMode();
+            }
+            else {
+                WindowedMode();
+            }
+
+            InitLines();
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Bail(int code)
+        private static void Bail(int code) {
+            int i;
+            Point nuke;
+
+            for(i = 0; i < points; i++) {
+                nuke = first;
+                first = first.Next;
+                nuke = null;
+            }
+
+            for(i = 0; i < points; i++) {
+                nuke = second;
+                second = second.Next;
+                nuke = null;
+            }
+
+            Environment.Exit(code);
+        }
+        #endregion Bail(int code)
+
+        #region FullscreenMode()
+        private static void FullscreenMode() {
+            int oldX = 50;
+            int oldY = 50;
+            int oldWidth = 320;
+            int oldHeight = 320;
+
+            if(screensaver) {
+                Glut.glutKeyboardFunc(new Glut.KeyboardCallback(ScreensaverKeyboard));
+                Glut.glutPassiveMotionFunc(new Glut.PassiveMotionCallback(ScreensaverPassive));
+                Glut.glutMouseFunc(new Glut.MouseCallback(ScreensaverMouse));
+            }
+            else {
+                Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            }
+            Glut.glutSetCursor(Glut.GLUT_CURSOR_NONE);
+
+            oldX = Glut.glutGet(Glut.GLUT_WINDOW_X);
+            oldY = Glut.glutGet(Glut.GLUT_WINDOW_Y);
+            oldWidth = Glut.glutGet(Glut.GLUT_WINDOW_WIDTH);
+            oldHeight = Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT);
+
+            Glut.glutFullScreen();
+        }
+        #endregion FullscreenMode()
+
+        #region InitLines()
+        private static void InitLines() {
+            int i;
+            Point newborn;
+            Random random = new Random();
+
+            firstX *= step;
+            firstY *= step;
+            secondX *= step;
+            secondY *= step;
+
+            for(i = 0; i < points; i++) {
+                newborn = new Point();
+                newborn.Next = first;
+                newborn.X = -1.0f;
+                newborn.Y = -1.0f;
+                first = newborn;
+            }
+
+            newborn = first;
+            while(newborn.Next != null) {
+                newborn = newborn.Next;
+            }
+            newborn.Next = first;
+
+            first.X = random.Next() % Glut.glutGet(Glut.GLUT_WINDOW_WIDTH);
+            first.Y = random.Next() % Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT);
+
+            for(i = 0; i < points; i++) {
+                newborn = new Point();
+                newborn.Next = second;
+                newborn.X = -1.0f;
+                newborn.Y = -1.0f;
+                second = newborn;
+            }
+
+            newborn = second;
+            while(newborn.Next != null) {
+                newborn = newborn.Next;
+            }
+            newborn.Next = second;
+
+            second.X = random.Next() % Glut.glutGet(Glut.GLUT_WINDOW_WIDTH);
+            second.Y = random.Next() % Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT);
+        }
+        #endregion InitLines()
+
+        #region WindowedMode()
+        private static void WindowedMode() {
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutPassiveMotionFunc(null);
+            Glut.glutMouseFunc(null);
+            Glut.glutSetCursor(Glut.GLUT_CURSOR_INHERIT);
+            Glut.glutPositionWindow(50, 50);
+            Glut.glutReshapeWindow(320, 320);
+        }
+        #endregion WindowedMode()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            int i;
+        
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            first.Next.X = first.X + firstX;
+            first.Next.Y = first.Y + firstY;
+            first = first.Next;
+
+            if(first.X < 0) {
+                first.X = 0;
+                firstX = -firstX;
+            }
+            else if(first.X > Glut.glutGet(Glut.GLUT_WINDOW_WIDTH)) {
+                first.X = Glut.glutGet(Glut.GLUT_WINDOW_WIDTH);
+                firstX = -firstX;
+            }
+
+            if(first.Y < 0) {
+                first.Y = 0;
+                firstY = -firstY;
+            }
+            else if(first.Y > Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT)) {
+                first.Y = Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT);
+                firstY = -firstY;
+            }
+
+            second.Next.X = second.X + secondX;
+            second.Next.Y = second.Y + secondY;
+            second = second.Next;
+
+            if(second.X < 0) {
+                second.X = 0;
+                secondX = -secondX;
+            }
+            else if(second.X > Glut.glutGet(Glut.GLUT_WINDOW_WIDTH)) {
+                second.X = Glut.glutGet(Glut.GLUT_WINDOW_WIDTH);
+                secondX = -secondX;
+            }
+
+            if(second.Y < 0) {
+                second.Y = 0;
+                secondY = -secondY;
+            }
+            else if(second.Y > Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT)) {
+                second.Y = Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT);
+                secondY = -secondY;
+            }
+
+            Gl.glBegin(Gl.GL_LINES);
+                for(i = 0; i < points; i++) {
+                    Gl.glVertex2i((int) first.X, (int) first.Y);
+                    Gl.glVertex2i((int) second.X, (int) second.Y);
+                    Gl.glColor3ub(colors[((color + i) % COLORS), 0], colors[((color + i) % COLORS), 1], colors[((color + i) % COLORS), 2]);
+                    first = first.Next;
+                    second = second.Next;
+                }
+            Gl.glEnd();
+
+            color++;
+            if(color >= COLORS) {
+                color = 0;
+            }
+
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Idle()
+        private static void Idle() {
+            Glut.glutPostRedisplay();
+        }
+        #endregion Idle()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Bail(0);
+                    break;
+                case (byte) 'w':
+                case (byte) 'W':
+                    WindowedMode();
+                    break;
+                case (byte) 'f':
+                case (byte) 'F':
+                    FullscreenMode();
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int width, int height)
+        private static void Reshape(int width, int height) {
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0.0, width, 0.0, height, -1.0, 1.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glEnable(Gl.GL_BLEND);
+            Gl.glEnable(Gl.GL_LINE_SMOOTH);
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
+        }
+        #endregion Reshape(int width, int height)
+
+        #region ScreensaverKeyboard(byte key, int x, int y)
+        private static void ScreensaverKeyboard(byte key, int x, int y) {
+            Bail(0);
+        }
+        #endregion ScreensaverKeyboard(byte key, int x, int y)
+
+        #region ScreensaverMouse(int button, int state, int x, int y)
+        private static void ScreensaverMouse(int button, int state, int x, int y) {
+            Bail(0);
+        }
+        #endregion ScreensaverMouse(int button, int state, int x, int y)
+
+        #region ScreensaverPassive(int x, int y)
+        private static void ScreensaverPassive(int x, int y) {
+            // For some reason, GLUT sends an initial passive motion callback when a window is
+            // initialized, so this would immediately terminate the program.  To get around this,
+            // see if we've been here before.  (Actually if we've been here twice.)
+            if(beenHere > 1) {
+                Bail(0);
+            }
+            beenHere++;
+        }
+        #endregion ScreensaverPassive(int x, int y)
+
+        #region Visibility(int state)
+        private static void Visibility(int state) {
+            if(state == Glut.GLUT_VISIBLE) {
+                Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            }
+            else {
+                Glut.glutIdleFunc(null);
+            }
+        }
+        #endregion Visibility(int state)
+    }
+}
diff --git a/examples/NateRobins/README b/examples/NateRobins/README
new file mode 100644
index 0000000..8e070c4
--- /dev/null
+++ b/examples/NateRobins/README
@@ -0,0 +1,24 @@
+NateRobins
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are C# ports of some OpenGL examples developed by Nate Robins,
+the originals are available from http://www.xmission.com/~nate/sgi.html.
+
+These examples use Tao.OpenGl and Tao.FreeGlut.  Make sure you have the
+appropriate native libraries for your system installed.
+
+These examples are fairly well documented, however, do not take
+them to be 'best practices' for .NET OpenGL development.  The
+intent of these ports is as an introduction or as a comparison
+against the original native versions.
+
+Randy Ridge
+http://www.taoframework.com
+
+
+Change Log:
+
+April 24, 2004
+    Initial release, version 1.0.0.0.
diff --git a/examples/NateRobins/Rotate.cs b/examples/NateRobins/Rotate.cs
new file mode 100644
index 0000000..4385cc5
--- /dev/null
+++ b/examples/NateRobins/Rotate.cs
@@ -0,0 +1,192 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* 
+    rotate.c
+    Nate Robins, 1997
+
+    An example of rotating a bitmap (w/o OpenGL's help).
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     An example of rotating a bitmap (w/o OpenGL's help).
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Rotate {
+        // --- Fields ---
+        #region Private Fields
+        private static float theta = 0.0f;
+        private static int isize;
+        private static int width, height;
+        private static byte[] image;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(256, 256);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Rotate");
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region float DegreeToRadian(float degree)
+        private static float DegreeToRadian(float degree) {
+            return (float) (degree * 3.14159265 / 180.0);
+        }
+        #endregion float DegreeToRadian(float degree)
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            int x, y;
+            int i, j;
+            float minX, minY, maxX, maxY;
+            float isize2, tmp0, tmp1, tmp2, tmp3;
+            float sinTheta, cosTheta;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            isize2 = (float) isize / 2;
+            sinTheta = (float) Math.Sin(DegreeToRadian(theta));
+            cosTheta = (float) Math.Cos(DegreeToRadian(theta));
+
+            // Rotate the corners of the image to get the bounding box of the rotated image
+            tmp0 = -isize2 * cosTheta - -isize2 * sinTheta;
+            tmp1 =  isize2 * cosTheta - -isize2 * sinTheta;
+            tmp2 =  isize2 * cosTheta - isize2 * sinTheta;
+            tmp3 = -isize2 * cosTheta - isize2 * sinTheta;
+            minX = (float) (Math.Min(tmp0, Math.Min(tmp1, Math.Min(tmp2, tmp3))));
+            maxX = (float) (Math.Max(tmp0, Math.Max(tmp1, Math.Max(tmp2, tmp3))));
+
+            tmp0 = -isize2 * sinTheta + -isize2 * cosTheta;
+            tmp1 =  isize2 * sinTheta + -isize2 * cosTheta;
+            tmp2 =  isize2 * sinTheta +  isize2 * cosTheta;
+            tmp3 = -isize2 * sinTheta +  isize2 * cosTheta;
+            minY = (float) (Math.Min(tmp0, Math.Min(tmp1, Math.Min(tmp2, tmp3))));
+            maxY = (float) (Math.Max(tmp0, Math.Max(tmp1, Math.Max(tmp2, tmp3))));
+
+            Gl.glBegin(Gl.GL_POINTS);
+                for(j = (int) minY; j < maxY; j++) {
+                    for(i = (int) minX; i < maxX; i++) {
+                        // Calculate the sample point
+                        x = (int) ((i * cosTheta - j * sinTheta) + isize2);
+                        y = (int) ((i * sinTheta + j * cosTheta) + isize2);
+
+                        // Skip out if we're going to sample outside the bitmap
+                        if(x < 0 || x >= isize || y < 0 || y >= isize) {
+                            continue;
+                        }
+
+                        Gl.glColor3ub(image[(isize * y + x) * 3 + 0], image[(isize * y + x) * 3 + 1], image[(isize * y + x) * 3 + 2]);
+                        Gl.glVertex2i(width / 2 + i, width / 2 + j);
+                    }
+                }
+            Gl.glEnd();
+
+            theta += 6.0f;
+            if(theta > 360.0f) {
+                theta -= 360.0f;
+            }
+
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Idle()
+        private static void Idle() {
+            Glut.glutPostRedisplay();
+        }
+        #endregion Idle()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            width = w;
+            height = h;
+            isize = width > height ? width / 2 : height / 2;
+
+            image = new byte[isize * isize * 3];
+
+            // Create a pretty color ramp
+            for(int j = 0; j < isize; j++) {
+                for(int i = 0; i < isize; i++) {
+                    image[(isize * j + i) * 3 + 0] = (byte) (255 - (i * j / 255 * 255 / isize));
+                    image[(isize * j + i) * 3 + 1] = (byte) (i * 256 / isize);
+                    image[(isize * j + i) * 3 + 2] = (byte) (j * 256 / isize);
+                }
+            }
+
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0, width, 0, height, -1, 1);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/NateRobins/Starfield.cs b/examples/NateRobins/Starfield.cs
new file mode 100644
index 0000000..b30284e
--- /dev/null
+++ b/examples/NateRobins/Starfield.cs
@@ -0,0 +1,265 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* 
+    starfield.c
+    Nate Robins, 1997
+
+    An example of starfields in OpenGL.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     An example of starfields in OpenGL.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Starfield {
+        // --- Fields ---
+        #region Private Constants
+        private const int RANDOMMAX = 0x7fff;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static bool screensaver = false;
+        private static int beenHere = 0;
+        private static int numberStars = 150;
+        private static Star[] stars;
+        private static Random random = new Random();
+        #endregion Private Fields
+
+        #region Private Structs
+        private struct Star {
+            public float X;
+            public float Y;
+            public float VX;
+            public float VY;
+        }
+        #endregion Private Structs
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() 
+        {
+            try 
+            {
+                //if(args.Length > 1) 
+                //{
+                //    if(args[1] == "-h") {
+                //        Console.WriteLine(args[0] + " [stars]");
+                //        Environment.Exit(0);
+                //    }
+                //    else {
+                //        numberStars = Int32.Parse(args[1]);
+                //    }
+                //}
+            }
+            catch(Exception e) {
+                Console.WriteLine("Error parsing commandline.  stars should be an integer.  Try again.\n\n" + e.ToString());
+                Environment.Exit(-1);
+            }
+
+            stars = new Star[numberStars];
+
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGBA);
+            Glut.glutInitWindowSize(320, 320);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Starfield");
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            if(screensaver) {
+                FullscreenMode();
+            }
+            else {
+                WindowedMode();
+            }
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Bail(int code)
+        private static void Bail(int code) {
+            stars = null;
+            Environment.Exit(code);
+        }
+        #endregion Bail(int code)
+
+        #region FullscreenMode()
+        private static void FullscreenMode() {
+            int oldX = 50;
+            int oldY = 50;
+            int oldWidth = 320;
+            int oldHeight = 320;
+
+            if(screensaver) {
+                Glut.glutKeyboardFunc(new Glut.KeyboardCallback(ScreensaverKeyboard));
+                Glut.glutPassiveMotionFunc(new Glut.PassiveMotionCallback(ScreensaverPassive));
+                Glut.glutMouseFunc(new Glut.MouseCallback(ScreensaverMouse));
+            }
+            else {
+                Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            }
+            Glut.glutSetCursor(Glut.GLUT_CURSOR_NONE);
+
+            oldX = Glut.glutGet(Glut.GLUT_WINDOW_X);
+            oldY = Glut.glutGet(Glut.GLUT_WINDOW_Y);
+            oldWidth = Glut.glutGet(Glut.GLUT_WINDOW_WIDTH);
+            oldHeight = Glut.glutGet(Glut.GLUT_WINDOW_HEIGHT);
+
+            Glut.glutFullScreen();
+        }
+        #endregion FullscreenMode()
+
+        #region WindowedMode()
+        private static void WindowedMode() {
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutPassiveMotionFunc(null);
+            Glut.glutMouseFunc(null);
+            Glut.glutSetCursor(Glut.GLUT_CURSOR_INHERIT);
+            Glut.glutPositionWindow(50, 50);
+            Glut.glutReshapeWindow(320, 320);
+        }
+        #endregion WindowedMode()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            int i;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            for(i = 0; i < numberStars; i++) {
+                stars[i].X += stars[i].VX;
+                if(stars[i].X < Glut.glutGet(Glut.GLUT_WINDOW_WIDTH)) {
+                    Gl.glBegin(Gl.GL_LINE_STRIP);
+                        Gl.glColor3ub(0, 0, 0);
+                        Gl.glVertex2i((int) (stars[i].X - stars[i].VX * 4), (int) stars[i].Y);
+                        Gl.glColor3ub(255, 255, 255);
+                        Gl.glVertex2i((int) stars[i].X, (int) stars[i].Y);
+                    Gl.glEnd();
+                } else {
+                    stars[i].X = 0;
+                }
+            }
+    
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Idle()
+        private static void Idle() {
+            Glut.glutPostRedisplay();
+        }
+        #endregion Idle()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Bail(0);
+                    break;
+                case (byte) 'w':
+                case (byte) 'W':
+                    WindowedMode();
+                    break;
+                case (byte) 'f':
+                case (byte) 'F':
+                    FullscreenMode();
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int width, int height)
+        private static void Reshape(int width, int height) {
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0.0, width, 0.0, height, -1.0, 1.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glColor3ub(255, 255, 255);
+
+            for(int i = 0; i < numberStars; i++) {
+                stars[i].X = random.Next(RANDOMMAX) % width;
+                stars[i].Y = random.Next(RANDOMMAX) % height;
+                stars[i].VX = random.Next(RANDOMMAX) / (float) RANDOMMAX * 5 + 2;
+                stars[i].VY = 0;
+            }
+        }
+        #endregion Reshape(int width, int height)
+
+        #region ScreensaverKeyboard(byte key, int x, int y)
+        private static void ScreensaverKeyboard(byte key, int x, int y) {
+            Bail(0);
+        }
+        #endregion ScreensaverKeyboard(byte key, int x, int y)
+
+        #region ScreensaverMouse(int button, int state, int x, int y)
+        private static void ScreensaverMouse(int button, int state, int x, int y) {
+            Bail(0);
+        }
+        #endregion ScreensaverMouse(int button, int state, int x, int y)
+
+        #region ScreensaverPassive(int x, int y)
+        private static void ScreensaverPassive(int x, int y) {
+            // For some reason, GLUT sends an initial passive motion callback when a window is
+            // initialized, so this would immediately terminate the program.  To get around this,
+            // see if we've been here before.  (Actually if we've been here twice.)
+            if(beenHere > 1) {
+                Bail(0);
+            }
+            beenHere++;
+        }
+        #endregion ScreensaverPassive(int x, int y)
+    }
+}
diff --git a/examples/NateRobins/Strip.cs b/examples/NateRobins/Strip.cs
new file mode 100644
index 0000000..990c51c
--- /dev/null
+++ b/examples/NateRobins/Strip.cs
@@ -0,0 +1,208 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* 
+    strip.c
+    Nate Robins, 1997
+
+    A simple program to show how to do a 'swaptmesh' to generate a
+    longer triangle strip in OpenGL.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     A simple program to show how to do a 'swaptmesh' to generate a longer triangle
+    ///     strip in OpenGL.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Strip {
+        // --- Fields ---
+        #region Private Constants
+        private const int MAXMESH = 10;
+        private const float PI = 3.1415926f;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static bool wireframe;
+        private static float[ , ] mesh = new float[MAXMESH, MAXMESH];
+        private static float oldX, oldY, spinX, spinY;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DEPTH | Glut.GLUT_RGB | Glut.GLUT_SINGLE);
+            Glut.glutInitWindowSize(320, 320);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Strip (Click to draw)");
+
+            for(int k = 0; k < MAXMESH; k++) {
+                for(int i = 0; i < MAXMESH; i++) {
+                    mesh[k, i] = (float) (Math.Sin((float) (i + k) / MAXMESH * PI) * 3);
+                }
+            }
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMotionFunc(new Glut.MotionCallback(Motion));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            bool swap = false;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-MAXMESH / 2, 0, -MAXMESH * 2);
+                Gl.glRotatef(spinX, 0, 1, 0);
+                Gl.glRotatef(spinY, 1, 0, 0);
+
+                Gl.glColor3ub(255, 255, 255);
+                Gl.glBegin(Gl.GL_TRIANGLE_STRIP);
+                    for(int k = 0; k < MAXMESH - 1; k++) {
+                        if(swap) {
+                            for(int i = MAXMESH - 1; i >= 0; i--) {
+                                Gl.glColor3ub(255, 0, 0);
+                                Gl.glVertex3f(i, mesh[k, i], k);
+                                Gl.glColor3ub(0, 0, 255);
+                                Gl.glVertex3f(i, mesh[k + 1, i], k + 1);
+                                if(i == 0) {
+                                    Gl.glVertex3f(i, mesh[k + 1, i], k + 1); // degenerate
+                                }
+                            }
+                        }
+                        else {
+                            for(int i = 0; i < MAXMESH; i++) {
+                                Gl.glColor3ub(255, 0, 0);
+                                Gl.glVertex3f(i, mesh[k, i], k);
+                                Gl.glColor3ub(0, 0, 255);
+                                Gl.glVertex3f(i, mesh[k + 1, i], k + 1);
+                                if(i == MAXMESH - 1) {
+                                    Gl.glVertex3f(i, mesh[k + 1, i], k + 1); // degenerate
+                                }
+                            }
+                        }
+                        swap = !swap;
+                    }
+                Gl.glEnd();
+            Gl.glPopMatrix();
+
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'w':
+                case (byte) 'W':
+                    wireframe = !wireframe;
+                    if(wireframe) {
+                        Gl.glPolygonMode(Gl.GL_FRONT, Gl.GL_LINE);
+                    }
+                    else {
+                        Gl.glPolygonMode(Gl.GL_FRONT, Gl.GL_FILL);
+                    }
+                    break;
+                case (byte) 'c':
+                case (byte) 'C':
+                    if(Gl.glIsEnabled(Gl.GL_CULL_FACE)) {
+                        Gl.glDisable(Gl.GL_CULL_FACE);
+                    }
+                    else {
+                        Gl.glEnable(Gl.GL_CULL_FACE);
+                    }
+                    break;
+                default:
+                    break;
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Motion(int x, int y)
+        private static void Motion(int x, int y) {
+            spinX = x - oldX;
+            spinY = y - oldY;
+            Glut.glutPostRedisplay();
+        }
+        #endregion Motion(int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            oldX = x;
+            oldY = y;
+            Glut.glutPostRedisplay();
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int width, int height)
+        private static void Reshape(int width, int height) {
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float) width / (float) height, 0.1, 1000.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+            Gl.glShadeModel(Gl.GL_FLAT);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glPolygonMode(Gl.GL_BACK, Gl.GL_LINE);
+        }
+        #endregion Reshape(int width, int height)
+    }
+}
diff --git a/examples/NateRobins/Texture.cs b/examples/NateRobins/Texture.cs
new file mode 100644
index 0000000..1718efd
--- /dev/null
+++ b/examples/NateRobins/Texture.cs
@@ -0,0 +1,142 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* 
+    texture.c
+    Nate Robins, 1997
+
+    A simple program to show how to do texture mapping.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     A simple program to show how to do texture mapping.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Texture {
+        // --- Fields ---
+        #region Private Fields
+        private static byte[] texture = {
+            0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff,
+            0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80,
+            0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff,
+            0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80,
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_SINGLE);
+            Glut.glutInitWindowSize(320, 320);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Texture");
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            Gl.glColor3ub(255, 255, 255);
+            Gl.glBegin(Gl.GL_TRIANGLES);
+                Gl.glNormal3f(0.0f, 0.0f, 1.0f);
+                Gl.glColor3ub(255, 0, 0);
+                Gl.glTexCoord2f(0.5f, 1.0f);
+                Gl.glVertex2f(0.0f, 2.0f);
+                Gl.glColor3ub(0, 255, 0);
+                Gl.glTexCoord2f(0.0f, 0.0f);
+                Gl.glVertex2f(-2.0f, -2.0f);
+                Gl.glColor3ub(0, 0, 255);
+                Gl.glTexCoord2f(1.0f, 0.0f);
+                Gl.glVertex2f(2.0f, -2.0f);
+            Gl.glEnd();
+
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int width, int height)
+        private static void Reshape(int width, int height) {
+            Gl.glViewport(0, 0, width, height);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60, 1.0, 0.1, 1000.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_TEXTURE_2D);
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, 3, 4, 4, 0, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, texture);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+            Gl.glTexEnvi(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_MODULATE);
+        }
+        #endregion Reshape(int width, int height)
+    }
+}
diff --git a/examples/NateRobins/Voronoi.cs b/examples/NateRobins/Voronoi.cs
new file mode 100644
index 0000000..0d3d61b
--- /dev/null
+++ b/examples/NateRobins/Voronoi.cs
@@ -0,0 +1,231 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* 
+   voronoi.c
+   Nate Robins, 1997.
+
+   Uses the depth buffer to intersect cones drawn at each point
+   selected by the user, thus creating a voronoi diagram.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace NateRobins {
+    #region Class Documentation
+    /// <summary>
+    ///     Uses the depth buffer to intersect cones drawn at each point selected by the
+    ///     user, thus creating a voronoi diagram.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Nate Robins
+    ///         http://www.xmission.com/~nate/sgi.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Voronoi {
+        // --- Fields ---
+        #region Private Fields
+        private static Node points;
+        private static int width = 256;
+        private static int height = 256;
+        private static bool drawPoints = false;
+        private static Random random = new Random();
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DEPTH | Glut.GLUT_DOUBLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Voronoi");
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            Glut.glutCreateMenu(new Glut.CreateMenuCallback(Menu));
+            Glut.glutAddMenuEntry("Voronoi", 0);
+            Glut.glutAddMenuEntry("", 0);
+            Glut.glutAddMenuEntry("[r] Reset", (int) 'r');
+            Glut.glutAddMenuEntry("[p] Toggle points", (int) 'p');
+            Glut.glutAddMenuEntry("", 0);
+            Glut.glutAddMenuEntry("Quit", 27);
+            Glut.glutAttachMenu(Glut.GLUT_RIGHT_BUTTON);
+
+            Init();
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Node point;
+
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glDepthFunc(Gl.GL_LEQUAL);
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glPointSize(4.0f);
+
+            while(points != null) {
+                point = points;
+                points = points.Next;
+                point = null;
+            }
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Node point;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            point = points;
+            while(point != null) {
+                Gl.glPushMatrix();
+                    Gl.glColor3ub(point.R, point.G, point.B);
+                    Gl.glTranslatef(point.X, point.Y, 0.0f);
+                    Glut.glutSolidCone(width > height ? width : height, 1.0, 32, 1);
+                    if(drawPoints) {
+                        Gl.glDepthFunc(Gl.GL_ALWAYS);
+                        Gl.glColor3ub(255, 255, 255);
+                        Gl.glBegin(Gl.GL_POINTS);
+                            Gl.glVertex2i(0, 0);
+                        Gl.glEnd();
+                        Gl.glDepthFunc(Gl.GL_LEQUAL);
+                    }
+                Gl.glPopMatrix();
+                point = point.Next;
+            }
+  
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            Node point;
+
+            switch(key) {
+                case 27:
+                    while(points != null) {
+                        point = points;
+                        points = points.Next;
+                        point = null;
+                    }
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'r':
+                case (byte) 'R':
+                    while(points != null) {
+                        point = points;
+                        points = points.Next;
+                        point = null;
+                    }
+                    break;
+                case (byte) 'p':
+                case (byte) 'P':
+                    drawPoints = !drawPoints;
+                    break;
+                case (byte) '\r':
+                    Init();
+                    break;
+                default:
+                    break;
+            }
+
+            Glut.glutPostRedisplay();
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Menu(int value)
+        private static void Menu(int value) {
+            Keyboard((byte) value, 0, 0);
+        }
+        #endregion Menu(int value)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            Node point;
+
+            if(button == Glut.GLUT_LEFT_BUTTON && state == Glut.GLUT_DOWN) {
+                point = new Node();
+                point.Next = points;
+                point.X = x;
+                point.Y = y;
+                point.R = (byte) (random.Next() % 256);
+                point.G = (byte) (random.Next() % 256);
+                point.B = (byte) (random.Next() % 256);
+                points = point;
+                Glut.glutPostRedisplay();
+            }
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Node point;
+
+            // Rescale points so they are in their 'relative' position when the window size
+            // changes.
+            point = points;
+            while(point != null) {
+                point.X *= (float) w / width;
+                point.Y *= (float) h / height;
+                point = point.Next;
+            }
+            width = w;
+            height = h;
+
+            Gl.glViewport(0, 0, width, height);
+  
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0, width, height, 0, -1, 1);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/NeHe/COPYING b/examples/NeHe/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/NeHe/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/NeHe/Lesson01.cs b/examples/NeHe/Lesson01.cs
new file mode 100644
index 0000000..3937263
--- /dev/null
+++ b/examples/NeHe/Lesson01.cs
@@ -0,0 +1,518 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing This Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+               OpenGL Lesson 01:  Creating An OpenGL Window
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 01:  Creating An OpenGL Window.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=01
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson01 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson01
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson01() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson01
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's OpenGL Framework", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                if(active && (form != null)) {                                  // Program Active?
+                    if(keys[(int) Keys.Escape]) {                               // Was ESC Pressed?
+                        done = true;                                            // ESC Signalled A Quit
+                    }
+                    else {                                                      // Not Time To Quit, Update Screen
+                        DrawGLScene();                                          // Draw The Scene
+                        Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+                    }
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe's OpenGL Framework", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson01();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            return true;
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson02.cs b/examples/NeHe/Lesson02.cs
new file mode 100644
index 0000000..ff32371
--- /dev/null
+++ b/examples/NeHe/Lesson02.cs
@@ -0,0 +1,529 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+           OpenGL Lesson 02:  Creating Your First Polygon & Quad
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 02:  Creating Your First Polygon & Quad.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=02
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson02 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson02
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson02() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson02
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's First Polygon Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe's First Polygon Tutorial", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson02();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            Gl.glTranslatef(-1.5f, 0, -6);                                      // Move Left 1.5 Units And Into The Screen 6.0
+            Gl.glBegin(Gl.GL_TRIANGLES);                                        // Drawing Using Triangles
+                Gl.glVertex3f(0, 1, 0);                                         // Top
+                Gl.glVertex3f(-1, -1, 0);                                       // Bottom Left
+                Gl.glVertex3f(1, -1, 0);                                        // Bottom Right
+            Gl.glEnd();                                                         // Finished Drawing The Triangle
+            Gl.glTranslatef(3, 0, 0);                                           // Move Right 3 Units
+            Gl.glBegin(Gl.GL_QUADS);                                            // Draw A Quad
+                Gl.glVertex3f(-1, 1, 0);                                        // Top Left
+                Gl.glVertex3f(1, 1, 0);                                         // Top Right
+                Gl.glVertex3f(1, -1, 0);                                        // Bottom Right
+                Gl.glVertex3f(-1, -1, 0);                                       // Bottom Left
+            Gl.glEnd();                                                         // Done Drawing The Quad
+            return true;
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson03.cs b/examples/NeHe/Lesson03.cs
new file mode 100644
index 0000000..76b4d23
--- /dev/null
+++ b/examples/NeHe/Lesson03.cs
@@ -0,0 +1,533 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+                 OpenGL Lesson 03:  Flat and Smooth Colors
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 03:  Flat and Smooth Colors.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=03
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson03 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson03
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson03() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson03
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Color Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe's Color Tutorial", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson03();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            Gl.glTranslatef(-1.5f, 0, -6);                                      // Move Left 1.5 Units And Into The Screen 6.0
+            Gl.glBegin(Gl.GL_TRIANGLES);                                        // Drawing Using Triangles
+                Gl.glColor3f(1, 0, 0);                                          // Set The Color To Red
+                Gl.glVertex3f(0, 1, 0);                                         // Top
+                Gl.glColor3f(0, 1, 0);                                          // Set The Color To Green
+                Gl.glVertex3f(-1, -1, 0);                                       // Bottom Left
+                Gl.glColor3f(0, 0, 1);                                          // Set The Color To Blue
+                Gl.glVertex3f(1, -1, 0);                                        // Bottom Right
+            Gl.glEnd();                                                         // Finished Drawing The Triangle
+            Gl.glTranslatef(3, 0, 0);                                           // Move Right 3 Units
+            Gl.glColor3f(0.5f, 0.5f, 1);                                        // Set The Color To Blue One Time Only
+            Gl.glBegin(Gl.GL_QUADS);                                            // Draw A Quad
+                Gl.glVertex3f(-1, 1, 0);                                        // Top Left
+                Gl.glVertex3f(1, 1, 0);                                         // Top Right
+                Gl.glVertex3f(1, -1, 0);                                        // Bottom Right
+                Gl.glVertex3f(-1, -1, 0);                                       // Bottom Left
+            Gl.glEnd();                                                         // Done Drawing The Quad
+            return true;
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson04.cs b/examples/NeHe/Lesson04.cs
new file mode 100644
index 0000000..83d75fa
--- /dev/null
+++ b/examples/NeHe/Lesson04.cs
@@ -0,0 +1,541 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+                   OpenGL Lesson 04:  Rotating A Polygon
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 04:  Rotating A Polygon.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=04
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson04 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static float rtri;                                              // Angle For The Triangle ( NEW )
+        private static float rquad;                                             // Angle For The Quad ( NEW )
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson04
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson04() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson04
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Rotation Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe's Rotation Tutorial", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson04();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            Gl.glTranslatef(-1.5f, 0, -6);                                      // Move Left 1.5 Units And Into The Screen 6.0
+            Gl.glRotatef(rtri, 0, 1, 0);                                        // Rotate The Triangle On The Y axis ( NEW )
+            Gl.glBegin(Gl.GL_TRIANGLES);                                        // Drawing Using Triangles
+                Gl.glColor3f(1, 0, 0);                                          // Set The Color To Red
+                Gl.glVertex3f(0, 1, 0);                                         // Top
+                Gl.glColor3f(0, 1, 0);                                          // Set The Color To Green
+                Gl.glVertex3f(-1, -1, 0);                                       // Bottom Left
+                Gl.glColor3f(0, 0, 1);                                          // Set The Color To Blue
+                Gl.glVertex3f(1, -1, 0);                                        // Bottom Right
+            Gl.glEnd();                                                         // Finished Drawing The Triangle
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            Gl.glTranslatef(1.5f, 0, -6);                                       // Move Right 1.5 Units And Into The Screen 6.0
+            Gl.glRotatef(rquad, 1, 0, 0);                                       // Rotate The Quad On The X axis ( NEW )
+            Gl.glColor3f(0.5f, 0.5f, 1);                                        // Set The Color To Blue One Time Only
+            Gl.glBegin(Gl.GL_QUADS);                                            // Draw A Quad
+                Gl.glVertex3f(-1, 1, 0);                                        // Top Left
+                Gl.glVertex3f(1, 1, 0);                                         // Top Right
+                Gl.glVertex3f(1, -1, 0);                                        // Bottom Right
+                Gl.glVertex3f(-1, -1, 0);                                       // Bottom Left
+            Gl.glEnd();                                                         // Done Drawing The Quad
+            rtri += 0.2f;                                                       // Increase The Rotation Variable For The Triangle ( NEW )
+            rquad -= 0.15f;                                                     // Decrease The Rotation Variable For The Quad ( NEW )
+            return true;
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson05.cs b/examples/NeHe/Lesson05.cs
new file mode 100644
index 0000000..1e53eb4
--- /dev/null
+++ b/examples/NeHe/Lesson05.cs
@@ -0,0 +1,586 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+                     OpenGL Lesson 05:  Solid Objects
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 05:  Solid Objects.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=05
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson05 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static float rtri;                                              // Angle For The Triangle ( NEW )
+        private static float rquad;                                             // Angle For The Quad ( NEW )
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson05
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson05() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson05
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Solid Object Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe's Solid Object Tutorial", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson05();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            Gl.glTranslatef(-1.5f, 0, -6);                                      // Move Left 1.5 Units And Into The Screen 6.0
+            Gl.glRotatef(rtri, 0, 1, 0);                                        // Rotate The Triangle On The Y axis ( NEW )
+            Gl.glBegin(Gl.GL_TRIANGLES);                                        // Drawing Using Triangles
+                Gl.glColor3f(1, 0, 0);                                          // Red
+                Gl.glVertex3f(0, 1, 0);                                         // Top Of Triangle (Front)
+                Gl.glColor3f(0, 1, 0);                                          // Green
+                Gl.glVertex3f(-1, -1, 1);                                       // Left Of Triangle (Front)
+                Gl.glColor3f(0, 0, 1);                                          // Blue
+                Gl.glVertex3f(1, -1, 1);                                        // Right Of Triangle (Front)
+                Gl.glColor3f(1, 0, 0);                                          // Red
+                Gl.glVertex3f(0, 1, 0);                                         // Top Of Triangle (Right)
+                Gl.glColor3f(0, 0, 1);                                          // Blue
+                Gl.glVertex3f(1, -1, 1);                                        // Left Of Triangle (Right)
+                Gl.glColor3f(0, 1, 0);                                          // Green
+                Gl.glVertex3f(1, -1, -1);                                       // Right Of Triangle (Right)
+                Gl.glColor3f(1, 0, 0);                                          // Red
+                Gl.glVertex3f(0, 1, 0);                                         // Top Of Triangle (Back)
+                Gl.glColor3f(0, 1, 0);                                          // Green
+                Gl.glVertex3f(1, -1, -1);                                       // Left Of Triangle (Back)
+                Gl.glColor3f(0, 0, 1);                                          // Blue
+                Gl.glVertex3f(-1, -1, -1);                                      // Right Of Triangle (Back)
+                Gl.glColor3f(1, 0, 0);                                          // Red
+                Gl.glVertex3f(0, 1, 0);                                         // Top Of Triangle (Left)
+                Gl.glColor3f(0, 0, 1);                                          // Blue
+                Gl.glVertex3f(-1, -1, -1);                                      // Left Of Triangle (Left)
+                Gl.glColor3f(0, 1, 0);                                          // Green
+                Gl.glVertex3f(-1, -1, 1);                                       // Right Of Triangle (Left)
+            Gl.glEnd();                                                         // Finished Drawing The Triangle
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            Gl.glTranslatef(1.5f, 0, -7);                                       // Move Right 1.5 Units And Into The Screen 7.0
+            Gl.glRotatef(rquad, 1, 1, 1);                                       // Rotate The Quad On The X, Y, and Z Axis ( NEW )
+            Gl.glColor3f(0.5f, 0.5f, 1);                                        // Set The Color To Blue One Time Only
+            Gl.glBegin(Gl.GL_QUADS);                                            // Draw A Quad
+                Gl.glColor3f(0, 1, 0);                                          // Set The Color To Green
+                Gl.glVertex3f(1, 1, -1);                                        // Top Right Of The Quad (Top)
+                Gl.glVertex3f(-1, 1, -1);                                       // Top Left Of The Quad (Top)
+                Gl.glVertex3f(-1, 1, 1);                                        // Bottom Left Of The Quad (Top)
+                Gl.glVertex3f(1, 1, 1);                                         // Bottom Right Of The Quad (Top)
+                Gl.glColor3f(1, 0.5f, 0);                                       // Set The Color To Orange
+                Gl.glVertex3f(1, -1, 1);                                        // Top Right Of The Quad (Bottom)
+                Gl.glVertex3f(-1, -1, 1);                                       // Top Left Of The Quad (Bottom)
+                Gl.glVertex3f(-1, -1, -1);                                      // Bottom Left Of The Quad (Bottom)
+                Gl.glVertex3f(1, -1, -1);                                       // Bottom Right Of The Quad (Bottom)
+                Gl.glColor3f(1, 0, 0);                                          // Set The Color To Red
+                Gl.glVertex3f(1, 1, 1);                                         // Top Right Of The Quad (Front)
+                Gl.glVertex3f(-1, 1, 1);                                        // Top Left Of The Quad (Front)
+                Gl.glVertex3f(-1, -1, 1);                                       // Bottom Left Of The Quad (Front)
+                Gl.glVertex3f(1, -1, 1);                                        // Bottom Right Of The Quad (Front)
+                Gl.glColor3f(1, 1, 0);                                          // Set The Color To Yellow
+                Gl.glVertex3f(1, -1, -1);                                       // Top Right Of The Quad (Back)
+                Gl.glVertex3f(-1, -1, -1);                                      // Top Left Of The Quad (Back)
+                Gl.glVertex3f(-1, 1, -1);                                       // Bottom Left Of The Quad (Back)
+                Gl.glVertex3f(1, 1, -1);                                        // Bottom Right Of The Quad (Back)
+                Gl.glColor3f(0, 0, 1);                                          // Set The Color To Blue
+                Gl.glVertex3f(-1, 1, 1);                                        // Top Right Of The Quad (Left)
+                Gl.glVertex3f(-1, 1, -1);                                       // Top Left Of The Quad (Left)
+                Gl.glVertex3f(-1, -1, -1);                                      // Bottom Left Of The Quad (Left)
+                Gl.glVertex3f(-1, -1, 1);                                       // Bottom Right Of The Quad (Left)
+                Gl.glColor3f(1, 0, 1);                                          // Set The Color To Violet
+                Gl.glVertex3f(1, 1, -1);                                        // Top Right Of The Quad (Right)
+                Gl.glVertex3f(1, 1, 1);                                         // Top Left Of The Quad (Right)
+                Gl.glVertex3f(1, -1, 1);                                        // Bottom Left Of The Quad (Right)
+                Gl.glVertex3f(1, -1, -1);                                       // Bottom Right Of The Quad (Right)
+            Gl.glEnd();                                                         // Done Drawing The Quad
+
+            rtri += 0.2f;                                                       // Increase The Rotation Variable For The Triangle ( NEW )
+            rquad -= 0.15f;                                                     // Decrease The Rotation Variable For The Quad ( NEW )
+            return true;
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson06.cs b/examples/NeHe/Lesson06.cs
new file mode 100644
index 0000000..b727e84
--- /dev/null
+++ b/examples/NeHe/Lesson06.cs
@@ -0,0 +1,652 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+                    OpenGL Lesson 06:  Texture Mapping
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 06:  Texture Mapping.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson06 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static float xrot;                                              // X Rotation ( NEW )
+        private static float yrot;                                              // Y Rotation ( NEW )
+        private static float zrot;                                              // Z Rotation ( NEW )
+        private static int[] texture = new int[1];                              // Storage For One Texture ( NEW )
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson06
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson06() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson06
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Texture Mapping Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe's Texture Mapping Tutorial", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson06();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The View
+            Gl.glTranslatef(0, 0, -5);
+
+            Gl.glRotatef(xrot, 1, 0, 0);
+            Gl.glRotatef(yrot, 0, 1, 0);
+            Gl.glRotatef(zrot, 0, 0, 1);
+
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+
+            Gl.glBegin(Gl.GL_QUADS);
+                // Front Face
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, 1);
+                // Back Face
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, -1);
+                // Top Face
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                // Bottom Face
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                // Right face
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                // Left Face
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+            Gl.glEnd();
+
+            xrot += 0.3f;
+            yrot += 0.2f;
+            zrot += 0.4f;
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine ( NEW )
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping ( NEW )
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson06.NeHe.bmp");                // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(1, texture);                            // Create The Texture
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Typical Texture Generation Using Data From The Bitmap
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson07.cs b/examples/NeHe/Lesson07.cs
new file mode 100644
index 0000000..0e84ea2
--- /dev/null
+++ b/examples/NeHe/Lesson07.cs
@@ -0,0 +1,725 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+   OpenGL Lesson 07:  Texture Filters, Basic Lighting & Keyboard Control
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 07:  Texture Filters, Basic Lighting & Keyboard Control.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=07
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson07 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static bool light;                                              // Lighting ON/OFF ( NEW )
+        private static bool lp;                                                 // L Pressed? ( NEW )
+        private static bool fp;                                                 // F Pressed? ( NEW )
+        private static float xrot;                                              // X Rotation
+        private static float yrot;                                              // Y Rotation
+        private static float xspeed;                                            // X Rotation Speed
+        private static float yspeed;                                            // Y Rotation Speed
+        private static float z = -5;                                            // Depth Into The Screen
+        private static float[] lightAmbient = {0.5f, 0.5f, 0.5f, 1};
+        private static float[] lightDiffuse = {1, 1, 1, 1};
+        private static float[] lightPosition = {0, 0, 2, 1};
+        private static int filter;                                              // Which Filter To Use
+        private static int[] texture = new int[3];                              // Storage For 3 Textures
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson07
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson07() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson07
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Textures, Lighting & Keyboard Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.L] && !lp) {
+                        lp = true;
+                        light = !light;
+                        if(!light) {
+                            Gl.glDisable(Gl.GL_LIGHTING);
+                        }
+                        else {
+                            Gl.glEnable(Gl.GL_LIGHTING);
+                        }
+                    }
+                    if(!keys[(int) Keys.L]) {
+                        lp = false;
+                    }
+                    if(keys[(int) Keys.F] && !fp) {
+                        fp = true;
+                        filter += 1;
+                        if(filter > 2) {
+                            filter = 0;
+                        }
+                    }
+                    if(!keys[(int) Keys.F]) {
+                        fp = false;
+                    }
+                    if(keys[(int) Keys.PageUp]) {
+                        z -= 0.02f;
+                    }
+                    if(keys[(int) Keys.PageDown]) {
+                        z += 0.02f;
+                    }
+                    if(keys[(int) Keys.Up]) {
+                        xspeed -= 0.01f;
+                    }
+                    if(keys[(int) Keys.Down]) {
+                        xspeed += 0.01f;
+                    }
+                    if(keys[(int) Keys.Right]) {
+                        yspeed += 0.01f;
+                    }
+                    if(keys[(int) Keys.Left]) {
+                        yspeed -= 0.01f;
+                    }
+
+                    if(keys[(int) Keys.F1]) {                               // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                        // If So Make Key false
+                        KillGLWindow();                                     // Kill Our Current Window
+                        fullscreen = !fullscreen;                           // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("NeHe's Textures, Lighting & Keyboard Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                         // Quit If Window Was Not Created
+                        }
+                        done = false;                                       // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson07();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The View
+            Gl.glTranslatef(0, 0, z);
+
+            Gl.glRotatef(xrot, 1, 0, 0);
+            Gl.glRotatef(yrot, 0, 1, 0);
+
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[filter]);
+
+            Gl.glBegin(Gl.GL_QUADS);
+                // Front Face
+                Gl.glNormal3f(0, 0, 1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, 1);
+                // Back Face
+                Gl.glNormal3f(0, 0, -1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, -1);
+                // Top Face
+                Gl.glNormal3f(0, 1, 0);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                // Bottom Face
+                Gl.glNormal3f(0, -1, 0);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                // Right face
+                Gl.glNormal3f(1, 0, 0);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                // Left Face
+                Gl.glNormal3f(-1, 0, 0);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+            Gl.glEnd();
+
+            xrot += xspeed;
+            yrot += yspeed;
+
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT, lightAmbient);            // Setup The Ambient Light
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, lightDiffuse);            // Setup The Diffuse Light
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, lightPosition);          // Position The Light
+            Gl.glEnable(Gl.GL_LIGHT1);                                          // Enable Light One
+
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson07.Crate.bmp");               // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(3, texture);                                   // Create Three Textures
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Create Nearest Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                // Create Linear Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[1]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                // Create MipMapped Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[2]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_NEAREST);
+                Glu.gluBuild2DMipmaps(Gl.GL_TEXTURE_2D, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson08.cs b/examples/NeHe/Lesson08.cs
new file mode 100644
index 0000000..f7efc9c
--- /dev/null
+++ b/examples/NeHe/Lesson08.cs
@@ -0,0 +1,746 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Tom Stanis / Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+                        OpenGL Lesson 08:  Blending
+==========================================================================
+
+  Authors Name: Tom Stanis
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 08:  Blending.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Tom Stanis & Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=08
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson08 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static bool light;                                              // Lighting ON/OFF
+        private static bool blend;                                              // Blending OFF/ON? ( NEW )
+        private static bool lp;                                                 // L Pressed?
+        private static bool fp;                                                 // F Pressed?
+        private static bool bp;                                                 // B Pressed? ( NEW )
+        private static float xrot;                                              // X Rotation
+        private static float yrot;                                              // Y Rotation
+        private static float xspeed;                                            // X Rotation Speed
+        private static float yspeed;                                            // Y Rotation Speed
+        private static float z = -5;                                            // Depth Into The Screen
+        private static float[] lightAmbient = {0.5f, 0.5f, 0.5f, 1};
+        private static float[] lightDiffuse = {1, 1, 1, 1};
+        private static float[] lightPosition = {0, 0, 2, 1};
+        private static int filter;                                              // Which Filter To Use
+        private static int[] texture = new int[3];                              // Storage For 3 Textures
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson08
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson08() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson08
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("Tom Stanis & NeHe's Blending Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.L] && !lp) {
+                        lp = true;
+                        light = !light;
+                        if(!light) {
+                            Gl.glDisable(Gl.GL_LIGHTING);
+                        }
+                        else {
+                            Gl.glEnable(Gl.GL_LIGHTING);
+                        }
+                    }
+                    if(!keys[(int) Keys.L]) {
+                        lp = false;
+                    }
+                    if(keys[(int) Keys.F] && !fp) {
+                        fp = true;
+                        filter += 1;
+                        if(filter > 2) {
+                            filter = 0;
+                        }
+                    }
+                    if(!keys[(int) Keys.F]) {
+                        fp = false;
+                    }
+                    if(keys[(int) Keys.PageUp]) {
+                        z -= 0.02f;
+                    }
+                    if(keys[(int) Keys.PageDown]) {
+                        z += 0.02f;
+                    }
+                    if(keys[(int) Keys.Up]) {
+                        xspeed -= 0.01f;
+                    }
+                    if(keys[(int) Keys.Down]) {
+                        xspeed += 0.01f;
+                    }
+                    if(keys[(int) Keys.Right]) {
+                        yspeed += 0.01f;
+                    }
+                    if(keys[(int) Keys.Left]) {
+                        yspeed -= 0.01f;
+                    }
+                    // Blending Code Starts Here
+                    if(keys[(int) Keys.B] && !bp) {
+                        bp = true;
+                        blend = !blend;
+                        if(blend) {
+                            Gl.glEnable(Gl.GL_BLEND);                           // Turn Blending On
+                            Gl.glDisable(Gl.GL_DEPTH_TEST);                     // Turn Depth Testing Off
+                        }
+                        else {
+                            Gl.glDisable(Gl.GL_BLEND);                          // Turn Blending Off
+                            Gl.glEnable(Gl.GL_DEPTH_TEST);                      // Turn Depth Testing On
+                        }
+                    }
+                    if(!keys[(int) Keys.B]) {
+                        bp = false;
+                    }
+                    // Blending Code Ends Here
+
+                    if(keys[(int) Keys.F1]) {                               // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                        // If So Make Key false
+                        KillGLWindow();                                     // Kill Our Current Window
+                        fullscreen = !fullscreen;                           // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("Tom Stanis & NeHe's Blending Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                         // Quit If Window Was Not Created
+                        }
+                        done = false;                                       // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson08();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The View
+            Gl.glTranslatef(0, 0, z);
+
+            Gl.glRotatef(xrot, 1, 0, 0);
+            Gl.glRotatef(yrot, 0, 1, 0);
+
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[filter]);
+
+            Gl.glBegin(Gl.GL_QUADS);
+                // Front Face
+                Gl.glNormal3f(0, 0, 1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, 1);
+                // Back Face
+                Gl.glNormal3f(0, 0, -1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, -1);
+                // Top Face
+                Gl.glNormal3f(0, 1, 0);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                // Bottom Face
+                Gl.glNormal3f(0, -1, 0);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                // Right face
+                Gl.glNormal3f(1, 0, 0);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                // Left Face
+                Gl.glNormal3f(-1, 0, 0);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+            Gl.glEnd();
+
+            xrot += xspeed;
+            yrot += yspeed;
+
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT, lightAmbient);            // Setup The Ambient Light
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, lightDiffuse);            // Setup The Diffuse Light
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, lightPosition);          // Position The Light
+            Gl.glEnable(Gl.GL_LIGHT1);                                          // Enable Light One
+            Gl.glColor4f(1, 1, 1, 0.5f);                                        // Full Brightness.  50% Alpha
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);                         // Set The Blending Function For Translucency
+
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson08.Glass.bmp");               // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(3, texture);                                   // Create Three Textures
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Create Nearest Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                // Create Linear Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[1]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                // Create MipMapped Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[2]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_NEAREST);
+                Glu.gluBuild2DMipmaps(Gl.GL_TEXTURE_2D, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson09.cs b/examples/NeHe/Lesson09.cs
new file mode 100644
index 0000000..b91b1c1
--- /dev/null
+++ b/examples/NeHe/Lesson09.cs
@@ -0,0 +1,684 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+         OpenGL Lesson 09:  Animated Scenes With Blended Textures
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 09:  Animated Scenes With Blended Textures.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=09
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson09 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static Random rand = new Random();                              // Random Number Generator
+        private static bool twinkle;                                            // Twinkling Stars
+        private static bool tp;                                                 // 'T' Key Pressed?
+        private const int num = 50;                                             // Number Of Stars To Draw
+        private struct star {                                                   // Create A Structure For Star
+            public byte r, g, b;                                                // Stars Color
+            public float dist;                                                  // Stars Distance From Center
+            public float angle;                                                 // Stars Current Angle
+        }
+        private static star[] stars = new star[num];                            // Need To Keep Track Of 'num' Stars
+        private static float zoom = -15;                                        // Distance Away From Stars
+        private static float tilt = 90;                                         // Tilt The View
+        private static float spin;                                              // Spin Stars
+        private static int loop;                                                // General Loop Variable
+        private static int[] texture = new int[1];                              // Storage For One Texture
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson09
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson09() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson09
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Animated Blended Textures Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.T] && !tp) {
+                        tp = true;
+                        twinkle = !twinkle;
+                    }
+                    if(!keys[(int) Keys.T]) {
+                        tp = false;
+                    }
+                    if(keys[(int) Keys.Up]) {
+                        tilt -= 0.5f;
+                    }
+                    if(keys[(int) Keys.Down]) {
+                        tilt += 0.5f;
+                    }
+                    if(keys[(int) Keys.PageUp]) {
+                        zoom -= 0.2f;
+                    }
+                    if(keys[(int) Keys.PageDown]) {
+                        zoom += 0.2f;
+                    }
+
+                    if(keys[(int) Keys.F1]) {                               // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                        // If So Make Key false
+                        KillGLWindow();                                     // Kill Our Current Window
+                        fullscreen = !fullscreen;                           // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("NeHe's Animated Blended Textures Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                         // Quit If Window Was Not Created
+                        }
+                        done = false;                                       // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson09();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);                     // Select Our Texture
+
+            for(loop = 0; loop < num; loop++) {                                 // Loop Through All The Stars
+                Gl.glLoadIdentity();                                            // Reset The View Before We Draw Each Star
+                Gl.glTranslatef(0, 0, zoom);                                    // Zoom Into The Screen (Using The Value In 'zoom')
+                Gl.glRotatef(tilt, 1, 0, 0);                                    // Tilt The View (Using The Value In 'tilt')
+                Gl.glRotatef(stars[loop].angle, 0, 1, 0);                       // Rotate To The Current Stars Angle
+                Gl.glTranslatef(stars[loop].dist, 0, 0);                        // Move Forward On The X Plane
+                Gl.glRotatef(-stars[loop].angle, 0, 1, 0);                      // Cancel The Current Stars Angle
+                Gl.glRotatef(-tilt, 1, 0, 0);                                   // Cancel The Screen Tilt
+                if(twinkle) {
+                    Gl.glColor4ub(stars[(num - loop) - 1].r, stars[(num - loop) - 1].g, stars[(num - loop) - 1].b, 255);
+                    Gl.glBegin(Gl.GL_QUADS);
+                        Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, 0);
+                        Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, 0);
+                        Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, 0);
+                        Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, 0);
+                    Gl.glEnd();
+                }
+                Gl.glRotatef(spin, 0, 0, 1);
+                Gl.glColor4ub(stars[loop].r, stars[loop].g, stars[loop].b, 255);
+                Gl.glBegin(Gl.GL_QUADS);
+                    Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, 0);
+                    Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, 0);
+                    Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, 0);
+                    Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, 0);
+                Gl.glEnd();
+                spin += 0.01f;
+                stars[loop].angle += ((float) loop / num);
+                stars[loop].dist -= 0.01f;
+                if(stars[loop].dist < 0) {
+                    stars[loop].dist += 5;
+                    stars[loop].r = (byte) (rand.Next() % 256);
+                    stars[loop].g = (byte) (rand.Next() % 256);
+                    stars[loop].b = (byte) (rand.Next() % 256);
+                }
+            }
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);                         // Set The Blending Function For Translucency
+            Gl.glEnable(Gl.GL_BLEND);
+
+            for(loop = 0; loop < num; loop++) {
+                stars[loop].angle = 0;
+                stars[loop].dist = ((float) loop / num) * 5;
+                stars[loop].r = (byte) (rand.Next() % 256);
+                stars[loop].g = (byte) (rand.Next() % 256);
+                stars[loop].b = (byte) (rand.Next() % 256);
+            }
+
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson09.Star.bmp");                // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(1, texture);                            // Create The Texture
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Create Linear Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson10.cs b/examples/NeHe/Lesson10.cs
new file mode 100644
index 0000000..05caab3
--- /dev/null
+++ b/examples/NeHe/Lesson10.cs
@@ -0,0 +1,829 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Lionel Brits & Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+         OpenGL Lesson 10:  Loading And Moving Through A 3D World
+==========================================================================
+
+  Authors Name: Lionel Brits
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 10:  Loading And Moving Through A 3D World.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Lionel Brits & Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=10
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson10 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static bool blend;                                              // Blending ON/OFF
+        private static bool bp;                                                 // B Pressed?
+        private static bool fp;                                                 // F Pressed?
+        private const float piover180 = 0.0174532925f;
+        private static float heading;
+        private static float xpos;
+        private static float zpos;
+        private static float yrot;                                              // Y Rotation
+        private static float walkbias = 0;
+        private static float walkbiasangle = 0;
+        private static float lookupdown = 0;
+        private static float z = 0;                                             // Depth Into The Screen
+        private static int filter;                                              // Which Filter To Use
+        private static int[] texture = new int[3];                              // Storage For 3 Textures
+        private struct Vertex {
+            public float x, y, z;
+            public float u, v;
+        }
+        private struct Triangle {
+            public Vertex[] vertex;
+        }
+        private struct Sector {
+            public int numtriangles;
+            public Triangle[] triangle;
+        };
+        private static Sector sector;                                           // Our Model Goes Here:
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson10
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson10() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson10
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("Lionel Brits & NeHe's 3D World Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.B] && !bp) {
+                        bp = true;
+                        blend = !blend;
+                        if(!blend) {
+                            Gl.glDisable(Gl.GL_BLEND);
+                            Gl.glEnable(Gl.GL_DEPTH_TEST);
+                        }
+                        else {
+                            Gl.glEnable(Gl.GL_BLEND);
+                            Gl.glDisable(Gl.GL_DEPTH_TEST);
+                        }
+                    }
+                    if(!keys[(int) Keys.B]) {
+                        bp = false;
+                    }
+                    if(keys[(int) Keys.F] && !fp) {
+                        fp = true;
+                        filter += 1;
+                        if(filter > 2) {
+                            filter = 0;
+                        }
+                    }
+                    if(!keys[(int) Keys.F]) {
+                        fp = false;
+                    }
+                    if(keys[(int) Keys.PageUp]) {
+                        z -= 0.02f;
+                    }
+                    if(keys[(int) Keys.PageDown]) {
+                        z += 0.02f;
+                    }
+                    if(keys[(int) Keys.Up]) {
+                        xpos -= (float) Math.Sin(heading * piover180) * 0.05f;
+                        zpos -= (float) Math.Cos(heading * piover180) * 0.05f;
+                        if(walkbiasangle >= 359) {
+                            walkbiasangle = 0;
+                        }
+                        else {
+                            walkbiasangle += 10;
+                        }
+                        walkbias = (float) Math.Sin(walkbiasangle * piover180) / 20;
+                    }
+                    if(keys[(int) Keys.Down]) {
+                        xpos += (float) Math.Sin(heading * piover180) * 0.05f;
+                        zpos += (float) Math.Cos(heading * piover180) * 0.05f;
+                        if(walkbiasangle <= 1) {
+                            walkbiasangle = 359;
+                        }
+                        else {
+                            walkbiasangle -= 10;
+                        }
+                        walkbias = (float) Math.Sin(walkbiasangle * piover180) / 20;
+                    }
+                    if(keys[(int) Keys.Right]) {
+                        heading -= 1;
+                        yrot = heading;
+                    }
+                    if(keys[(int) Keys.Left]) {
+                        heading += 1;
+                        yrot = heading;
+                    }
+                    if(keys[(int) Keys.PageUp]) {
+                        lookupdown -= 1;
+                    }
+                    if(keys[(int) Keys.PageDown]) {
+                        lookupdown += 1;
+                    }
+
+                    if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                                // If So Make Key false
+                        KillGLWindow();                                             // Kill Our Current Window
+                        fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("Lionel Brits & NeHe's 3D World Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                                 // Quit If Window Was Not Created
+                        }
+                        done = false;                                               // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson10();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The View
+
+            float x_m, y_m, z_m, u_m, v_m;
+            float xtrans = -xpos;
+            float ztrans = -zpos;
+            float ytrans = -walkbias - 0.25f;
+            float sceneroty = 360 - yrot;
+            int numtriangles;
+
+            Gl.glRotatef(lookupdown, 1, 0, 0);
+            Gl.glRotatef(sceneroty, 0, 1, 0);
+            Gl.glTranslatef(xtrans, ytrans, ztrans);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[filter]);
+            numtriangles = sector.numtriangles;
+            // Process Each Triangle
+            for(int loop_m = 0; loop_m < numtriangles; loop_m++) {
+                Gl.glBegin(Gl.GL_TRIANGLES);
+                    Gl.glNormal3f(0, 0, 1);
+                    x_m = sector.triangle[loop_m].vertex[0].x;
+                    y_m = sector.triangle[loop_m].vertex[0].y;
+                    z_m = sector.triangle[loop_m].vertex[0].z;
+                    u_m = sector.triangle[loop_m].vertex[0].u;
+                    v_m = sector.triangle[loop_m].vertex[0].v;
+                    Gl.glTexCoord2f(u_m, v_m); Gl.glVertex3f(x_m, y_m, z_m);
+
+                    x_m = sector.triangle[loop_m].vertex[1].x;
+                    y_m = sector.triangle[loop_m].vertex[1].y;
+                    z_m = sector.triangle[loop_m].vertex[1].z;
+                    u_m = sector.triangle[loop_m].vertex[1].u;
+                    v_m = sector.triangle[loop_m].vertex[1].v;
+                    Gl.glTexCoord2f(u_m, v_m); Gl.glVertex3f(x_m, y_m, z_m);
+
+                    x_m = sector.triangle[loop_m].vertex[2].x;
+                    y_m = sector.triangle[loop_m].vertex[2].y;
+                    z_m = sector.triangle[loop_m].vertex[2].z;
+                    u_m = sector.triangle[loop_m].vertex[2].u;
+                    v_m = sector.triangle[loop_m].vertex[2].v;
+                    Gl.glTexCoord2f(u_m, v_m); Gl.glVertex3f(x_m, y_m, z_m);
+                Gl.glEnd();
+            }
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);                         // Set The Blending Function For Translucency
+            Gl.glClearColor(0, 0, 0, 0);                                        // This Will Clear The Background Color To Black
+            Gl.glClearDepth(1);                                                 // Enables Clearing Of The Depth Buffer
+            Gl.glDepthFunc(Gl.GL_LESS);                                         // The Type Of Depth Test To Do
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enables Smooth Color Shading
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            return SetupWorld();                                                // Return Success Based On Successfully Loading World
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson10.Mud.bmp");                 // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(3, texture);                            // Create Three Texture
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Create Nearest Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                // Create Linear Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[1]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                // Create MipMapped Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[2]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_NEAREST);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Glu.gluBuild2DMipmaps(Gl.GL_TEXTURE_2D, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        #region SetupWorld()
+        /// <summary>
+        ///     Loads and parses the world.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful load, otherwise <c>false</c>.
+        /// </returns>
+        private static bool SetupWorld() {
+            // This Method Is Pretty Ugly.  The .Net Framework Doesn't Have An Analogous Implementation
+            // Of C/C++'s sscanf().  As Such You Have To Manually Parse A File, You Can Either Do So
+            // Procedurally Like I'm Doing Here, Or Use Some RegEx's.  To Make It A Bit Easier I Modified
+            // The World.txt File To Remove Comments, Empty Lines And Excess Spaces.  Sorry For The
+            // Ugliness, I'm Too Lazy To Clean It Up.
+            float x, y, z, u, v;                                                // Local Vertex Information
+            int numtriangles;                                                   // Local Number Of Triangles
+            string oneline = "";                                                // The Line We've Read
+            string[] splitter;                                                  // Array For Split Values
+            StreamReader reader = null;                                         // Our StreamReader
+            ASCIIEncoding encoding = new ASCIIEncoding();                       // ASCII Encoding
+            string fileName = @"NeHe.Lesson10.World.txt";                       // The File To Load
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return false;                                                   // If Not Return False
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                //fileName = fileName;                                            // Do Nothing
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                fileName = fileName1;                                           // Swap Filename
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                fileName = fileName2;                                           // Swap Filename
+            }
+
+            reader = new StreamReader(fileName, encoding);                      // Open The File As ASCII Text
+
+            oneline = reader.ReadLine();                                        // Read The First Line
+            splitter = oneline.Split();                                         // Split The Line On Spaces
+
+            // The First Item In The Array Will Contain The String "NUMPOLLIES", Which We Will Ignore
+            numtriangles = Convert.ToInt32(splitter[1]);                        // Save The Number Of Triangles As An int
+
+            sector.triangle = new Triangle[numtriangles];                       // Initialize The Triangles And Save To sector
+            sector.numtriangles = numtriangles;                                 // Save The Number Of Triangles In sector
+
+            for(int triloop = 0; triloop < numtriangles; triloop++) {           // For Every Triangle
+                sector.triangle[triloop].vertex = new Vertex[3];                // Initialize The Vertices In sector
+                for(int vertloop = 0; vertloop < 3; vertloop++) {               // For Every Vertex
+                    oneline = reader.ReadLine();                                // Read A Line
+                    if(oneline != null) {                                       // If The Line Isn't null
+                        splitter = oneline.Split();                             // Split The Line On Spaces
+                        x = Single.Parse(splitter[0]);                          // Save x As A float
+                        y = Single.Parse(splitter[1]);                          // Save y As A float
+                        z = Single.Parse(splitter[2]);                          // Save z As A float
+                        u = Single.Parse(splitter[3]);                          // Save u As A float
+                        v = Single.Parse(splitter[4]);                          // Save v As A float
+                        sector.triangle[triloop].vertex[vertloop].x = x;        // Save x To sector's Current triangle's vertex x
+                        sector.triangle[triloop].vertex[vertloop].y = y;        // Save y To sector's Current triangle's vertex y
+                        sector.triangle[triloop].vertex[vertloop].z = z;        // Save z To sector's Current triangle's vertex z
+                        sector.triangle[triloop].vertex[vertloop].u = u;        // Save u To sector's Current triangle's vertex u
+                        sector.triangle[triloop].vertex[vertloop].v = v;        // Save v To sector's Current triangle's vertex v
+                    }
+                }
+            }
+            if(reader != null) {
+                reader.Close();                                                 // Close The StreamReader
+            }
+
+            return true;                                                        // We've Made It
+        }
+        #endregion SetupWorld()
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson11.cs b/examples/NeHe/Lesson11.cs
new file mode 100644
index 0000000..8f63cf8
--- /dev/null
+++ b/examples/NeHe/Lesson11.cs
@@ -0,0 +1,664 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By bosco / Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+        OpenGL Lesson 11:  Waving Texture Map (Modifying The Mesh)
+==========================================================================
+
+  Authors Name: Bosco
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 11:  Waving Texture Map (Modifying The Mesh).
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    bosco & Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=11
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson11 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static float[ , , ] points = new float[45, 45, 3];              // The Array For The Points On The Grid Of Our "Wave"
+        private static int wiggle_count = 0;                                    // Counter Used To Control How Fast Flag Waves
+        private static float xrot;                                              // X Rotation ( NEW )
+        private static float yrot;                                              // Y Rotation ( NEW )
+        private static float zrot;                                              // Z Rotation ( NEW )
+        private static float hold;                                              // Temporarily Holds A Floating Point Value
+        private static int[] texture = new int[1];                              // Storage For One Texture ( NEW )
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson11
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson11() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson11
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("bosco & NeHe's Waving Texture Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("bosco & NeHe's Waving Texture Tutorial", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson11();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            int x, y;
+            float float_x, float_y, float_xb, float_yb;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The View
+            Gl.glTranslatef(0, 0, -12);
+            Gl.glRotatef(xrot, 1, 0, 0);
+            Gl.glRotatef(yrot, 0, 1, 0);
+            Gl.glRotatef(zrot, 0, 0, 1);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+            Gl.glBegin(Gl.GL_QUADS);
+                for(x = 0; x < 44; x++) {
+                    for( y = 0; y < 44; y++ ) {
+                        float_x = x / 44.0f;
+                        float_y = y / 44.0f;
+                        float_xb = (x + 1) / 44.0f;
+                        float_yb = (y + 1) / 44.0f;
+                        Gl.glTexCoord2f(float_x, float_y);
+                        Gl.glVertex3f(points[x, y, 0], points[x, y, 1], points[x, y, 2]);
+                        Gl.glTexCoord2f(float_x, float_yb);
+                        Gl.glVertex3f(points[x, y + 1, 0], points[x, y + 1, 1], points[x, y + 1, 2]);
+                        Gl.glTexCoord2f(float_xb, float_yb);
+                        Gl.glVertex3f(points[x + 1, y + 1, 0], points[x + 1, y + 1, 1], points[x + 1, y + 1, 2]);
+                        Gl.glTexCoord2f(float_xb, float_y);
+                        Gl.glVertex3f(points[x + 1, y, 0], points[x + 1, y, 1], points[x + 1, y, 2]);
+                    }
+                }
+            Gl.glEnd();
+
+            if(wiggle_count == 2) {
+                for(y = 0; y < 45; y++) {
+                    hold = points[0, y, 2];
+                    for(x = 0; x < 44; x++) {
+                        points[x, y, 2] = points[x + 1, y, 2];
+                    }
+                    points[44, y, 2] = hold;
+                }
+                wiggle_count = 0;
+            }
+
+            wiggle_count++;
+
+            xrot += 0.3f;
+            yrot += 0.2f;
+            zrot += 0.4f;
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine ( NEW )
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping ( NEW )
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            Gl.glPolygonMode(Gl.GL_BACK, Gl.GL_FILL );                          // Back Face Is Solid
+            Gl.glPolygonMode(Gl.GL_FRONT, Gl.GL_LINE );                         // Front Face Is Made Of Lines
+            for(int x = 0; x < 45; x++) {
+                for(int y = 0; y < 45; y++) {
+                    points[x, y, 0] = (float) (x / 5.0f) - 4.5f;
+                    points[x, y, 1] = (float) (y / 5.0f) - 4.5f;
+                    points[x, y, 2] = (float) Math.Sin((((x / 5.0f) * 40.0f) / 360.0f) * 3.141592654 * 2.0f);
+                }
+            }
+
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson11.Tim.bmp");                 // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(1, texture);                            // Create The Texture
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Typical Texture Generation Using Data From The Bitmap
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson12.cs b/examples/NeHe/Lesson12.cs
new file mode 100644
index 0000000..909c35d
--- /dev/null
+++ b/examples/NeHe/Lesson12.cs
@@ -0,0 +1,706 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+                     OpenGL Lesson 12:  Display Lists
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 12:  Display Lists.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=12
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson12 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static int[] texture = new int[1];                              // Storage For 1 Texture
+        private static int box;                                                 // Storage For The Box Display List
+        private static int top;                                                 // Storage For The Top Display List
+        private static int xloop;                                               // Loop For X Axis
+        private static int yloop;                                               // Loop For Y Axis
+        private static float xrot;                                              // Rotates Cube On The X Axis
+        private static float yrot;                                              // Rotates Cube On The Y Axis
+        private static float[][] boxcol = new float[5][] {                      // Array For Box Colors
+            new float[] {1, 0, 0},                                              // Bright Red
+            new float[] {1, 0.5f, 0},                                           // Bright Orange
+            new float[] {1, 1, 0},                                              // Bright Yellow
+            new float[] {0, 1, 0},                                              // Bright Green
+            new float[] {0, 1, 1}                                               // Bright Blue
+        };
+        private static float[][] topcol = new float[5][] {                      // Array For Top Colors
+            new float[] {0.5f, 0, 0},                                           // Dark Red
+            new float[] {0.5f, 0.25f, 0},                                       // Dark Orange
+            new float[] {0.5f, 0.5f, 0},                                        // Dark Yellow
+            new float[] {0, 0.5f, 0},                                           // Dark Green
+            new float[] {0, 0.5f, 0.5f}                                         // Dark Blue
+        };
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson12
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson12() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson12
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Display List Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                                // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                          // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                       // Swap Buffers (Double Buffering)
+                    if(keys[(int) Keys.Left]) {
+                        yrot -= 0.2f;
+                    }
+                    if(keys[(int) Keys.Right]) {
+                        yrot += 0.2f;
+                    }
+                    if(keys[(int) Keys.Up]) {
+                        xrot -= 0.2f;
+                    }
+                    if(keys[(int) Keys.Down]) {
+                        xrot += 0.2f;
+                    }
+
+                    if(keys[(int) Keys.F1]) {                                   // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                            // If So Make Key false
+                        KillGLWindow();                                         // Kill Our Current Window
+                        fullscreen = !fullscreen;                               // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("NeHe's Display List Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                             // Quit If Window Was Not Created
+                        }
+                        done = false;                                           // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region BuildLists()
+        /// <summary>
+        ///     Builds cube display lists.
+        /// </summary>
+        private static void BuildLists() {
+            box = Gl.glGenLists(2);                                             // Generate 2 Different Lists
+            Gl.glNewList(box, Gl.GL_COMPILE);                                   // Start With The Box List
+                Gl.glBegin(Gl.GL_QUADS);
+                    // Bottom Face
+                    Gl.glNormal3f(0, -1, 0);
+                    Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, -1, -1);
+                    Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, -1, -1);
+                    Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                    Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                    // Front Face
+                    Gl.glNormal3f(0, 0, 1);
+                    Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, 1);
+                    Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, 1);
+                    Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, 1);
+                    Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, 1);
+                    // Back Face
+                    Gl.glNormal3f(0, 0,-1);
+                    Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, -1);
+                    Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, -1);
+                    Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, -1);
+                    Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, -1);
+                    // Right face
+                    Gl.glNormal3f(1, 0, 0);
+                    Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, -1);
+                    Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                    Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, 1);
+                    Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                    // Left Face
+                    Gl.glNormal3f(-1, 0, 0);
+                    Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, -1);
+                    Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                    Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, 1);
+                    Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glEnd();
+            Gl.glEndList();
+            top = box + 1;                                                      // Storage For "Top" Is "Box" Plus One
+            Gl.glNewList(top, Gl.GL_COMPILE);                                   // Now The "Top" Display List
+                Gl.glBegin(Gl.GL_QUADS);
+                    // Top Face
+                    Gl.glNormal3f(0, 1, 0);
+                    Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+                    Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, 1, 1);
+                    Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, 1, 1);
+                    Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glEnd();
+            Gl.glEndList();
+        }
+        #endregion BuildLists()
+
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson12();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+            for(yloop = 1; yloop < 6; yloop++) {
+                for(xloop = 0; xloop < yloop; xloop++) {
+                    Gl.glLoadIdentity();                                        // Reset The View
+                    Gl.glTranslatef(1.4f + (xloop *2.8f) - (yloop * 1.4f), ((6 - yloop) * 2.4f) - 7, -20);
+                    Gl.glRotatef(45 - (2 * yloop) + xrot, 1, 0, 0);
+                    Gl.glRotatef(45 + yrot, 0, 1, 0);
+                    Gl.glColor3fv(boxcol[yloop - 1]);
+                    Gl.glCallList(box);
+                    Gl.glColor3fv(topcol[yloop - 1]);
+                    Gl.glCallList(top);
+                }
+            }
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+            BuildLists();                                                       // Jump To The Code That Creates Our Display Lists
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glEnable(Gl.GL_LIGHT0);                                          // Quick And Dirty Lighting (Assumes Light0 Is Set Up)
+            Gl.glEnable(Gl.GL_LIGHTING);                                        // Enable Lighting
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);                                  // Enable Material Coloring
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson12.Cube.bmp");                // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(1, texture);                            // Create The Texture
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Typical Texture Generation Using Data From The Bitmap
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson13.cs b/examples/NeHe/Lesson13.cs
new file mode 100644
index 0000000..003de10
--- /dev/null
+++ b/examples/NeHe/Lesson13.cs
@@ -0,0 +1,595 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  Modified by Shawn T. to handle (%3.2f, num) parameters.
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+                   OpenGL Lesson 13:  Using Bitmap Fonts
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 13:  Using Bitmap Fonts.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=13
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson13 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static int fontbase;                                            // Base Display List For The Font Set
+        private static float cnt1;                                              // 1st Counter Used To Move Text & For Coloring
+        private static float cnt2;                                              // 2nd Counter Used To Move Text & For Coloring
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson13
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson13() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson13
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Bitmap Font Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                                // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                          // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                       // Swap Buffers (Double Buffering)
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe's Bitmap Font Tutorial", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region BuildFont()
+        /// <summary>
+        ///     Builds our bitmap font.
+        /// </summary>
+        private static void BuildFont() {
+            IntPtr font;                                                        // Windows Font ID
+            IntPtr oldfont;                                                     // Used For Good House Keeping
+            fontbase = Gl.glGenLists(96);                                       // Storage For 96 Characters
+
+            font = Gdi.CreateFont(                                              // Create The Font
+                -24,                                                            // Height Of Font
+                0,                                                              // Width Of Font
+                0,                                                              // Angle Of Escapement
+                0,                                                              // Orientation Angle
+                Gdi.FW_BOLD,                                                    // Font Weight
+                false,                                                          // Italic
+                false,                                                          // Underline
+                false,                                                          // Strikeout
+                Gdi.ANSI_CHARSET,                                               // Character Set Identifier
+                Gdi.OUT_TT_PRECIS,                                              // Output Precision
+                Gdi.CLIP_DEFAULT_PRECIS,                                        // Clipping Precision
+                Gdi.ANTIALIASED_QUALITY,                                        // Output Quality
+                Gdi.FF_DONTCARE | Gdi.DEFAULT_PITCH,                            // Family And Pitch
+                "Courier New");                                                 // Font Name
+
+            oldfont = Gdi.SelectObject(hDC, font);                              // Selects The Font We Want
+            Wgl.wglUseFontBitmapsA(hDC, 32, 96, fontbase);                       // Builds 96 Characters Starting At Character 32
+            Gdi.SelectObject(hDC, oldfont);                                     // Selects The Font We Want
+            Gdi.DeleteObject(font);                                             // Delete The Font
+        }
+        #endregion BuildFont()
+
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson13();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            Gl.glTranslatef(0, 0, -1);                                          // Move One Unit Into The Screen
+            // Pulsing Colors Based On Text Position
+            Gl.glColor3f(1.0f * ((float) (Math.Cos(cnt1))), 1.0f * ((float) (Math.Sin(cnt2))), 1.0f - 0.5f* ((float) (Math.Cos(cnt1 + cnt2))));
+            // Position The Text On The Screen
+            Gl.glRasterPos2f(-0.45f + 0.05f * ((float) (Math.Cos(cnt1))), 0.32f * ((float) (Math.Sin(cnt2))));
+            // Print GL Text To The Screen
+            glPrint(string.Format("Active OpenGL Text With NeHe - {0:0.00}", cnt1));
+            cnt1 += 0.051f;                                                     // Increase The First Counter
+            cnt2 += 0.005f;                                                     // Increase The First Counter
+            return true;
+        }
+        #endregion bool DrawGLScene()
+
+        #region glPrint(string text)
+        /// <summary>
+        ///     Custom GL "print" routine.
+        /// </summary>
+        /// <param name="text">
+        ///     The text to print.
+        /// </param>
+        private static void glPrint(string text) {
+            if(text == null || text.Length == 0) {                              // If There's No Text
+                return;                                                         // Do Nothing
+            }
+            Gl.glPushAttrib(Gl.GL_LIST_BIT);                                    // Pushes The Display List Bits
+                Gl.glListBase(fontbase - 32);                                   // Sets The Base Character to 32
+// .NET -- we can't just pass text, we need to convert
+                byte [] textbytes = new byte[text.Length];
+                for (int i = 0; i < text.Length; i++) textbytes[i] = (byte) text[i];
+                Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_BYTE, textbytes);        // Draws The Display List Text
+            Gl.glPopAttrib();                                                   // Pops The Display List Bits
+        }
+        #endregion glPrint(string text)
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            BuildFont();                                                        // Build The Font
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillFont()
+        /// <summary>
+        ///     Delete the font list.
+        /// </summary>
+        private static void KillFont() {
+            Gl.glDeleteLists(fontbase, 96);                                     // Delete All 96 Characters
+        }
+        #endregion KillFont()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+
+            KillFont();
+        }
+        #endregion KillGLWindow()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson14.cs b/examples/NeHe/Lesson14.cs
new file mode 100644
index 0000000..ae4e8a6
--- /dev/null
+++ b/examples/NeHe/Lesson14.cs
@@ -0,0 +1,611 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  Modified by Shawn T. to handle (%3.2f, num) parameters.
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+ */
+/*
+==========================================================================
+                  OpenGL Lesson 14:  Using Outline Fonts
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 14:  Using Outline Fonts.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson14 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static int fontbase;                                            // Base Display List For The Font Set
+        private static float rot;                                               // Used To Rotate The Text
+        // Storage For Information About Our Outline Font Characters
+        private static Gdi.GLYPHMETRICSFLOAT[] gmf = new Gdi.GLYPHMETRICSFLOAT[256];
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson14
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson14() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson14
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Outline Font Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                                // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                          // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                       // Swap Buffers (Double Buffering)
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe's Outline Font Tutorial", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region BuildFont()
+        /// <summary>
+        ///     Builds our bitmap font.
+        /// </summary>
+        private static void BuildFont() {
+            IntPtr font;                                                        // Windows Font ID
+            fontbase = Gl.glGenLists(256);                                      // Storage For 256 Characters
+
+            font = Gdi.CreateFont(                                              // Create The Font
+                -12,                                                            // Height Of Font
+                0,                                                              // Width Of Font
+                0,                                                              // Angle Of Escapement
+                0,                                                              // Orientation Angle
+                Gdi.FW_BOLD,                                                    // Font Weight
+                false,                                                          // Italic
+                false,                                                          // Underline
+                false,                                                          // Strikeout
+                Gdi.ANSI_CHARSET,                                               // Character Set Identifier
+                Gdi.OUT_TT_PRECIS,                                              // Output Precision
+                Gdi.CLIP_DEFAULT_PRECIS,                                        // Clipping Precision
+                Gdi.ANTIALIASED_QUALITY,                                        // Output Quality
+                Gdi.FF_DONTCARE | Gdi.DEFAULT_PITCH,                            // Family And Pitch
+                "Comic Sans MS");                                               // Font Name
+
+            Gdi.SelectObject(hDC, font);                                        // Selects The Font We Created
+            Wgl.wglUseFontOutlinesA(
+                hDC,                                                            // Select The Current DC
+                0,                                                              // Starting Character
+                255,                                                            // Number Of Display Lists To Build
+                fontbase,                                                       // Starting Display Lists
+                0,                                                              // Deviation From The True Outlines
+                0.2f,                                                           // Font Thickness In The Z Direction
+                Wgl.WGL_FONT_POLYGONS,                                          // Use Polygons, Not Lines
+                gmf);                                                           // Address Of Buffer To Recieve Data
+        }
+        #endregion BuildFont()
+
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson14();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            Gl.glTranslatef(0, 0, -10);                                         // Move One Unit Into The Screen
+            Gl.glRotatef(rot, 1, 0, 0);                                         // Rotate On The X Axis
+            Gl.glRotatef(rot * 1.5f, 0, 1, 0);                                  // Rotate On The Y Axis
+            Gl.glRotatef(rot * 1.4f, 0, 0, 1);                                  // Rotate On The Z Axis
+            // Pulsing Colors Based On The Rotation
+            Gl.glColor3f(1.0f * ((float) (Math.Cos(rot / 20.0f))), 1.0f * ((float) (Math.Sin(rot / 25.0f))), 1.0f - 0.5f * ((float) (Math.Cos(rot / 17.0f))));
+            glPrint(string.Format("NeHe - {0:0.00}", rot / 50));                // Print GL Text To The Screen
+            rot += 0.5f;                                                        // Increase The Rotation Variable
+            return true;
+        }
+        #endregion bool DrawGLScene()
+
+        #region glPrint(string text)
+        /// <summary>
+        ///     Custom GL "print" routine.
+        /// </summary>
+        /// <param name="text">
+        ///     The text to print.
+        /// </param>
+        private static void glPrint(string text) {
+            if(text == null || text.Length == 0) {                              // If There's No Text
+                return;                                                         // Do Nothing
+            }
+            float length = 0;                                                   // Used To Find The Length Of The Text
+            char[] chars = text.ToCharArray();                                  // Holds Our String
+
+            for(int loop = 0; loop < text.Length; loop++) {                     // Loop To Find Text Length
+                length += gmf[chars[loop]].gmfCellIncX;                         // Increase Length By Each Characters Width
+            }
+
+            Gl.glTranslatef(-length / 2, 0, 0);                                 // Center Our Text On The Screen
+            Gl.glPushAttrib(Gl.GL_LIST_BIT);                                    // Pushes The Display List Bits
+                Gl.glListBase(fontbase);                                        // Sets The Base Character to 0
+// .NET - can't call text, it's a string!
+                byte [] textbytes = new byte[text.Length];
+                for (int i = 0; i < text.Length; i++) textbytes[i] = (byte) text[i];
+                Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_BYTE, textbytes);         // Draws The Display List Text
+            Gl.glPopAttrib();                                                   // Pops The Display List Bits
+        }
+        #endregion glPrint(string text)
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            Gl.glEnable(Gl.GL_LIGHT0);                                          // Enable Default Light (Quick And Dirty)
+            Gl.glEnable(Gl.GL_LIGHTING);                                        // Enable Lighting
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);                                  // Enable Coloring Of Material
+            BuildFont();                                                        // Build The Font
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillFont()
+        /// <summary>
+        ///     Delete the font list.
+        /// </summary>
+        private static void KillFont() {
+            Gl.glDeleteLists(fontbase, 256);                                    // Delete All 256 Characters
+        }
+        #endregion KillFont()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+
+            KillFont();
+        }
+        #endregion KillGLWindow()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson15.cs b/examples/NeHe/Lesson15.cs
new file mode 100644
index 0000000..7c85a38
--- /dev/null
+++ b/examples/NeHe/Lesson15.cs
@@ -0,0 +1,693 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+            OpenGL Lesson 15:  Adding Textures To Outline Fonts
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 15:  Adding Textures To Outline Fonts.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=15
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson15 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static int[] texture = new int[1];                              // One Texture Map
+        private static int fontbase;                                            // Base Display List For The Font Set
+        private static float rot;                                               // Used To Rotate The Text
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson15
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson15() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson15
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Texturemapped Outline Font Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                                // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                          // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                       // Swap Buffers (Double Buffering)
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe's Texturemapped Outline Font Tutorial", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region BuildFont()
+        /// <summary>
+        ///     Builds our bitmap font.
+        /// </summary>
+        private static void BuildFont() {
+            Gdi.GLYPHMETRICSFLOAT[] gmf = new Gdi.GLYPHMETRICSFLOAT[256];       // Address Buffer For Font Storage
+            IntPtr font;                                                        // Windows Font ID
+            fontbase = Gl.glGenLists(256);                                      // Storage For 256 Characters
+
+            font = Gdi.CreateFont(                                              // Create The Font
+                -12,                                                            // Height Of Font
+                0,                                                              // Width Of Font
+                0,                                                              // Angle Of Escapement
+                0,                                                              // Orientation Angle
+                Gdi.FW_BOLD,                                                    // Font Weight
+                false,                                                          // Italic
+                false,                                                          // Underline
+                false,                                                          // Strikeout
+                Gdi.SYMBOL_CHARSET,                                             // Character Set Identifier
+                Gdi.OUT_TT_PRECIS,                                              // Output Precision
+                Gdi.CLIP_DEFAULT_PRECIS,                                        // Clipping Precision
+                Gdi.ANTIALIASED_QUALITY,                                        // Output Quality
+                Gdi.FF_DONTCARE | Gdi.DEFAULT_PITCH,                            // Family And Pitch
+                "Wingdings");                                                   // Font Name
+
+            Gdi.SelectObject(hDC, font);                                        // Selects The Font We Created
+            Wgl.wglUseFontOutlinesA(
+                hDC,                                                            // Select The Current DC
+                0,                                                              // Starting Character
+                255,                                                            // Number Of Display Lists To Build
+                fontbase,                                                       // Starting Display Lists
+                0.1f,                                                           // Deviation From The True Outlines
+                0.2f,                                                           // Font Thickness In The Z Direction
+                Wgl.WGL_FONT_POLYGONS,                                          // Use Polygons, Not Lines
+                gmf);                                                           // Address Of Buffer To Recieve Data
+        }
+        #endregion BuildFont()
+
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson15();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            Gl.glTranslatef(1.1f * ((float) (Math.Cos(rot / 16.0f))), 0.8f * ((float) (Math.Sin(rot / 20.0f))), -3.0f);
+            Gl.glRotatef(rot, 1, 0, 0);                                         // Rotate On The X Axis
+            Gl.glRotatef(rot * 1.2f, 0, 1, 0);                                  // Rotate On The Y Axis
+            Gl.glRotatef(rot * 1.4f, 0, 0, 1);                                  // Rotate On The Z Axis
+            Gl.glTranslatef(-0.35f, -0.35f, 0.1f);                              // Center On X, Y, Z Axis
+            glPrint("N");                                                       // Draw A Skull And Crossbones Symbol
+            rot += 0.1f;                                                        // Increase The Rotation Variable
+            return true;
+        }
+        #endregion bool DrawGLScene()
+
+        #region glPrint(string text)
+        /// <summary>
+        ///     Custom GL "print" routine.
+        /// </summary>
+        /// <param name="text">
+        ///     The text to print.
+        /// </param>
+        private static void glPrint(string text) {
+            if(text == null || text.Length == 0) {                              // If There's No Text
+                return;                                                         // Do Nothing
+            }
+
+            Gl.glPushAttrib(Gl.GL_LIST_BIT);                                    // Pushes The Display List Bits
+                Gl.glListBase(fontbase);                                        // Sets The Base Character to 0
+		// .NET: We can't draw text directly, it's a string!
+		byte [] textbytes = new byte [text.Length];
+		for (int i = 0; i < text.Length; i++) textbytes[i] = (byte) text[i];
+                Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_BYTE, textbytes);    // Draws The Display List Text
+            Gl.glPopAttrib();                                                   // Pops The Display List Bits
+        }
+        #endregion glPrint(string text)
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+            BuildFont();                                                        // Build The Font
+
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glEnable(Gl.GL_LIGHT0);                                          // Quick And Dirty Lighting (Assumes Light0 Is Set Up)
+            Gl.glEnable(Gl.GL_LIGHTING);                                        // Enable Lighting
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);                     // Select The Texture
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillFont()
+        /// <summary>
+        ///     Delete the font list.
+        /// </summary>
+        private static void KillFont() {
+            Gl.glDeleteLists(fontbase, 256);                                    // Delete All 256 Characters
+        }
+        #endregion KillFont()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+
+            KillFont();
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson15.Lights.bmp");              // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(1, texture);                            // Create The Texture
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Typical Texture Generation Using Data From The Bitmap
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Glu.gluBuild2DMipmaps(Gl.GL_TEXTURE_2D, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_NEAREST);
+                Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_OBJECT_LINEAR);
+                Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_OBJECT_LINEAR);
+                Gl.glEnable(Gl.GL_TEXTURE_GEN_S);
+                Gl.glEnable(Gl.GL_TEXTURE_GEN_T);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson16.cs b/examples/NeHe/Lesson16.cs
new file mode 100644
index 0000000..41e53cf
--- /dev/null
+++ b/examples/NeHe/Lesson16.cs
@@ -0,0 +1,746 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Christopher Aliotta & Jeff Molofee 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up And Optimizing
+ *  The Base Code, Making It More Flexible!  If You've Found This Code
+ *  Useful, Please Let Me Know.  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+                    OpenGL Lesson 16:  Cool Looking Fog
+==========================================================================
+
+  Authors Name: Christopher Aliotta
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 16:  Cool Looking Fog.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Christopher Aliotta & Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=16
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson16 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static bool light;                                              // Lighting ON/OFF
+        private static bool lp;                                                 // L Pressed?
+        private static bool fp;                                                 // F Pressed?
+        private static bool gp;                                                 // G Pressed? ( NEW )
+        private static float xrot;                                              // X Rotation
+        private static float yrot;                                              // Y Rotation
+        private static float xspeed;                                            // X Rotation Speed
+        private static float yspeed;                                            // Y Rotation Speed
+        private static float z = -5;                                            // Depth Into The Screen
+        private static float[] lightAmbient = {0.5f, 0.5f, 0.5f, 1};
+        private static float[] lightDiffuse = {1, 1, 1, 1};
+        private static float[] lightPosition = {0, 0, 2, 1};
+        private static int filter;                                              // Which Filter To Use
+        private static int[] fogMode = { Gl.GL_EXP, Gl.GL_EXP2, Gl.GL_LINEAR }; // Storage For Three Types Of Fog
+        private static int fogfilter = 0;                                       // Which Fog Mode To Use 
+        private static float[] fogColor = {0.5f, 0.5f, 0.5f, 1};                // Fog Color
+        private static int[] texture = new int[3];                              // Storage For 3 Textures
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson16
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson16() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson16
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("Chris Aliotta & NeHe's Fog Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                                // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                          // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                       // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.L] && !lp) {
+                        lp = true;
+                        light = !light;
+                        if(!light) {
+                            Gl.glDisable(Gl.GL_LIGHTING);
+                        }
+                        else {
+                            Gl.glEnable(Gl.GL_LIGHTING);
+                        }
+                    }
+                    if(!keys[(int) Keys.L]) {
+                        lp = false;
+                    }
+                    if(keys[(int) Keys.F] && !fp) {
+                        fp = true;
+                        filter += 1;
+                        if(filter > 2) {
+                            filter = 0;
+                        }
+                    }
+                    if(!keys[(int) Keys.F]) {
+                        fp = false;
+                    }
+                    if(keys[(int) Keys.PageUp]) {
+                        z -= 0.02f;
+                    }
+                    if(keys[(int) Keys.PageDown]) {
+                        z += 0.02f;
+                    }
+                    if(keys[(int) Keys.Up]) {
+                        xspeed -= 0.01f;
+                    }
+                    if(keys[(int) Keys.Down]) {
+                        xspeed += 0.01f;
+                    }
+                    if(keys[(int) Keys.Right]) {
+                        yspeed += 0.01f;
+                    }
+                    if(keys[(int) Keys.Left]) {
+                        yspeed -= 0.01f;
+                    }
+                    if(keys[(int) Keys.G] && !gp) {
+                        gp = true;
+                        fogfilter += 1;
+                        if(fogfilter > 2) {
+                            fogfilter = 0;
+                        }
+                        Gl.glFogi(Gl.GL_FOG_MODE, fogMode[fogfilter]);          // Fog Mode
+                    }
+                    if(!keys[(int) Keys.G]) {
+                        gp = false;
+                    }
+
+                    if(keys[(int) Keys.F1]) {                                   // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                            // If So Make Key false
+                        KillGLWindow();                                         // Kill Our Current Window
+                        fullscreen = !fullscreen;                               // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("Chris Aliotta & NeHe's Fog Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                             // Quit If Window Was Not Created
+                        }
+                        done = false;                                           // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson16();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The View
+            Gl.glTranslatef(0, 0, z);
+
+            Gl.glRotatef(xrot, 1, 0, 0);
+            Gl.glRotatef(yrot, 0, 1, 0);
+
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[filter]);
+
+            Gl.glBegin(Gl.GL_QUADS);
+                // Front Face
+                Gl.glNormal3f(0, 0, 1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, 1);
+                // Back Face
+                Gl.glNormal3f(0, 0, -1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, -1);
+                // Top Face
+                Gl.glNormal3f(0, 1, 0);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                // Bottom Face
+                Gl.glNormal3f(0, -1, 0);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                // Right face
+                Gl.glNormal3f(1, 0, 0);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                // Left Face
+                Gl.glNormal3f(-1, 0, 0);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+            Gl.glEnd();
+
+            xrot += xspeed;
+            yrot += yspeed;
+
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0.5f, 0.5f, 0.5f, 1);                               // We'll Clear To The Color Of The Fog
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT, lightAmbient);            // Setup The Ambient Light
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, lightDiffuse);            // Setup The Diffuse Light
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, lightPosition);          // Position The Light
+            Gl.glEnable(Gl.GL_LIGHT1);                                          // Enable Light One
+            Gl.glFogi(Gl.GL_FOG_MODE, fogMode[fogfilter]);                      // Fog Mode
+            Gl.glFogfv(Gl.GL_FOG_COLOR, fogColor);                              // Set Fog Color
+            Gl.glFogf(Gl.GL_FOG_DENSITY, 0.35f);                                // How Dense Will The Fog Be
+            Gl.glHint(Gl.GL_FOG_HINT, Gl.GL_DONT_CARE);                         // Fog Hint Value
+            Gl.glFogf(Gl.GL_FOG_START, 1);                                      // Fog Start Depth
+            Gl.glFogf(Gl.GL_FOG_END, 5);                                        // Fog End Depth
+            Gl.glEnable(Gl.GL_FOG);                                             // Enables GL_FOG
+
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson16.Crate.bmp");               // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(3, texture);                                   // Create Three Textures
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Create Nearest Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                // Create Linear Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[1]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                // Create MipMapped Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[2]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_NEAREST);
+                Glu.gluBuild2DMipmaps(Gl.GL_TEXTURE_2D, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson17.cs b/examples/NeHe/Lesson17.cs
new file mode 100644
index 0000000..ea39b13
--- /dev/null
+++ b/examples/NeHe/Lesson17.cs
@@ -0,0 +1,738 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  And Modified By Giuseppe D'Agata (waveform at tiscalinet.it)
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+                 OpenGL Lesson 17:  2D Bitmap Texture Font
+==========================================================================
+
+  Authors Name: Giuseppe D'Agata
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 17:  2D Bitmap Texture Font.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Giuseppe D'Agata & Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson17 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static int fontbase;                                            // Base Display List For The Font
+        private static int[] texture = new int[2];                              // Storage For Our Font Texture
+        private static int loop;                                                // Generic Loop Variable
+        private static float cnt1;                                              // 1st Counter Used To Move Text & For Coloring
+        private static float cnt2;                                              // 2nd Counter Used To Move Text & For Coloring
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson17
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson17() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson17
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe & Giuseppe D'Agata's 2D Font Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                                // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                          // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                       // Swap Buffers (Double Buffering)
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe & Giuseppe D'Agata's 2D Font Tutorial", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region BuildFont()
+        /// <summary>
+        ///     Build our font display list.
+        /// </summary>
+        private static void BuildFont() {
+            float cx;                                                           // Holds Our X Character Coord
+            float cy;                                                           // Holds Our Y Character Coord
+            fontbase = Gl.glGenLists(256);                                      // Creating 256 Display Lists
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);                     // Select Our Font Texture
+            for(loop = 0; loop < 256; loop++) {                                 // Loop Through All 256 Lists
+                cx = ((float) (loop % 16)) / 16.0f;                             // X Position Of Current Character
+                cy = ((float) (loop / 16)) / 16.0f;                             // Y Position Of Current Character
+                Gl.glNewList(fontbase + loop, Gl.GL_COMPILE);                   // Start Building A List
+                    Gl.glBegin(Gl.GL_QUADS);                                    // Use A Quad For Each Character
+                        Gl.glTexCoord2f(cx, 1 - cy - 0.0625f);                  // Texture Coord (Bottom Left)
+                        Gl.glVertex2i(0, 0);                                    // Vertex Coord (Bottom Left)
+                        Gl.glTexCoord2f(cx + 0.0625f, 1 - cy - 0.0625f);        // Texture Coord (Bottom Right)
+                        Gl.glVertex2i(16, 0);                                   // Vertex Coord (Bottom Right)
+                        Gl.glTexCoord2f(cx + 0.0625f, 1 - cy);                  // Texture Coord (Top Right)
+                        Gl.glVertex2i(16, 16);                                  // Vertex Coord (Top Right)
+                        Gl.glTexCoord2f(cx, 1 - cy);                            // Texture Coord (Top Left)
+                        Gl.glVertex2i(0, 16);                                   // Vertex Coord (Top Left)
+                    Gl.glEnd();                                                 // Done Building Our Quad (Character)
+                    Gl.glTranslated(10, 0, 0);                                  // Move To The Right Of The Character
+                Gl.glEndList();                                                 // Done Building The Display List
+            }                                                                   // Loop Until All 256 Are Built
+        }
+        #endregion BuildFont()
+
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson17();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[1]);                     // Select Our Second Texture
+            Gl.glTranslatef(0, 0, -5);                                          // Move Into The Screen 5 Units
+            Gl.glRotatef(45, 0, 0, 1);                                          // Rotate On The Z Axis 45 Degrees (Clockwise)
+            Gl.glRotatef(cnt1 * 30, 1, 1, 0);                                   // Rotate On The X & Y Axis By cnt1 (Left To Right)
+            Gl.glDisable(Gl.GL_BLEND);                                          // Disable Blending Before We Draw In 3D
+            Gl.glColor3f(1, 1, 1);                                              // Bright White
+            Gl.glBegin(Gl.GL_QUADS);                                            // Draw Our First Texture Mapped Quad
+                Gl.glTexCoord2d(0, 0);                                          // First Texture Coord
+                Gl.glVertex2f(-1, 1);                                           // First Vertex
+                Gl.glTexCoord2d(1, 0);                                          // Second Texture Coord
+                Gl.glVertex2f(1, 1);                                            // Second Vertex
+                Gl.glTexCoord2d(1, 1);                                          // Third Texture Coord
+                Gl.glVertex2f(1, -1);                                           // Third Vertex
+                Gl.glTexCoord2d(0, 1);                                          // Fourth Texture Coord
+                Gl.glVertex2f(-1, -1);                                          // Fourth Vertex
+            Gl.glEnd();                                                         // Done Drawing The First Quad
+            Gl.glRotatef(90, 1, 1, 0);                                          // Rotate On The X & Y Axis By 90 Degrees (Left To Right)
+            Gl.glBegin(Gl.GL_QUADS);                                            // Draw Our Second Texture Mapped Quad
+                Gl.glTexCoord2d(0, 0);                                          // First Texture Coord
+                Gl.glVertex2f(-1, 1);                                           // First Vertex
+                Gl.glTexCoord2d(1, 0);                                          // Second Texture Coord
+                Gl.glVertex2f(1, 1);                                            // Second Vertex
+                Gl.glTexCoord2d(1, 1);                                          // Third Texture Coord
+                Gl.glVertex2f(1, -1);                                           // Third Vertex
+                Gl.glTexCoord2d(0, 1);                                          // Fourth Texture Coord
+                Gl.glVertex2f(-1, -1);                                          // Fourth Vertex
+            Gl.glEnd();                                                         // Done Drawing Our Second Quad
+            Gl.glEnable(Gl.GL_BLEND);                                           // Enable Blending
+
+            Gl.glLoadIdentity();                                                // Reset The View
+            // Pulsing Colors Based On Text Position
+            Gl.glColor3f(1.0f * ((float) (Math.Cos(cnt1))), 1.0f * ((float) (Math.Sin(cnt2))), 1.0f - 0.5f * ((float) (Math.Cos(cnt1 + cnt2))));
+            // Print GL Text To The Screen
+            glPrint((int) ((280 + 250 * Math.Cos(cnt1))), (int) (235 + 200 * Math.Sin(cnt2)), "NeHe", 0);
+            Gl.glColor3f(1.0f * ((float) (Math.Sin(cnt2))), 1.0f - 0.5f * ((float) (Math.Cos(cnt1 + cnt2))), 1.0f * ((float) (Math.Cos(cnt1))));
+            // Print GL Text To The Screen
+            glPrint((int) ((280 + 230 * Math.Cos(cnt2))), (int) (235 + 200 * Math.Sin(cnt1)), "OpenGL", 1);
+            Gl.glColor3f(0, 0, 1);                                              // Set Color To Blue
+            glPrint((int) (240 + 200 * Math.Cos((cnt2 + cnt1) / 5)), 2, "Giuseppe D'Agata", 0);
+            Gl.glColor3f(1, 1, 1);                                              // Set Color To White
+            glPrint((int) (242 + 200 * Math.Cos((cnt2+cnt1) / 5)), 2, "Giuseppe D'Agata", 0);
+            cnt1 += 0.01f;                                                      // Increase The First Counter
+            cnt2 += 0.0081f;                                                    // Increase The Second Counter
+            return true;
+        }
+        #endregion bool DrawGLScene()
+
+        #region glPrint(int x, int y, string text, int charset)
+        /// <summary>
+        ///     Where the printing happens.
+        /// </summary>
+        /// <param name="x">
+        ///     X coordinate.
+        /// </param>
+        /// <param name="y">
+        ///     Y coordinate.
+        /// </param>
+        /// <param name="text">
+        ///     The text to print.
+        /// </param>
+        /// <param name="charset">
+        ///     The character set.
+        /// </param>
+        private static void glPrint(int x, int y, string text, int charset) {
+            if(charset > 1) {
+                charset = 1;
+            }
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);                     // Select Our Font Texture
+            Gl.glDisable(Gl.GL_DEPTH_TEST);                                     // Disables Depth Testing
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glPushMatrix();                                                  // Store The Projection Matrix
+                Gl.glLoadIdentity();                                            // Reset The Projection Matrix
+                Gl.glOrtho(0, 640, 0, 480, -1, 1);                              // Set Up An Ortho Screen
+                Gl.glMatrixMode(Gl.GL_MODELVIEW);                               // Select The Modelview Matrix
+                Gl.glPushMatrix();                                              // Store The Modelview Matrix
+                    Gl.glLoadIdentity();                                        // Reset The Modelview Matrix
+                    Gl.glTranslated(x, y, 0);                                   // Position The Text (0,0 - Bottom Left)
+                    Gl.glListBase(fontbase - 32 + (128 * charset));             // Choose The Font Set (0 or 1)
+		    // .NET: We can't draw text directly, it's a string!
+		    byte [] textbytes = new byte [text.Length];
+		    for (int i = 0; i < text.Length; i++) textbytes[i] = (byte) text[i];
+                    Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_BYTE, textbytes);// Write The Text To The Screen
+                    Gl.glMatrixMode(Gl.GL_PROJECTION);                          // Select The Projection Matrix
+                Gl.glPopMatrix();                                               // Restore The Old Projection Matrix
+                Gl.glMatrixMode(Gl.GL_MODELVIEW);                               // Select The Modelview Matrix
+            Gl.glPopMatrix();                                                   // Restore The Old Projection Matrix
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+        }
+        #endregion glPrint(int x, int y, string text, int charset)
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+            BuildFont();                                                        // Build The Font
+            Gl.glClearColor(0, 0, 0, 0);                                        // Clear The Background Color To Black
+            Gl.glClearDepth(1);                                                 // Enables Clearing Of The Depth Buffer
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Test To Do
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);                         // Select The Type Of Blending
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enables Smooth Color Shading
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable 2D Texture Mapping
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillFont()
+        /// <summary>
+        ///     Delete the font from memory.
+        /// </summary>
+        private static void KillFont() {
+            Gl.glDeleteLists(fontbase, 256);                                    // Delete All 256 Display Lists
+        }
+        #endregion KillFont()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+
+            KillFont();                                                         // Kill The Font
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[2];                              // Create Storage Space For The Textures
+
+            textureImage[0] = LoadBMP("NeHe.Lesson17.Font.bmp");                // Load The Bitmaps
+            textureImage[1] = LoadBMP("NeHe.Lesson17.Bumps.bmp");
+
+            // Check For Errors, If The Bitmaps Are Not Found, Quit
+            if(textureImage[0] != null && textureImage[1] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(2, texture);                            // Create Two Textures
+
+                for(loop = 0; loop < textureImage.Length; loop++) {
+                    // Flip The Bitmap Along The Y-Axis
+                    textureImage[loop].RotateFlip(RotateFlipType.RotateNoneFlipY);
+                    // Rectangle For Locking The Bitmap In Memory
+                    Rectangle rectangle = new Rectangle(0, 0, textureImage[loop].Width, textureImage[loop].Height);
+                    // Get The Bitmap's Pixel Data From The Locked Bitmap
+                    BitmapData bitmapData = textureImage[loop].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                    // Typical Texture Generation Using Data From The Bitmap
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[loop]);
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                    Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[loop].Width, textureImage[loop].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                    if(textureImage[loop] != null) {                            // If Texture Exists
+                        textureImage[loop].UnlockBits(bitmapData);              // Unlock The Pixel Data From Memory
+                        textureImage[loop].Dispose();                           // Dispose The Bitmap
+                    }
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson18.cs b/examples/NeHe/Lesson18.cs
new file mode 100644
index 0000000..3e672ea
--- /dev/null
+++ b/examples/NeHe/Lesson18.cs
@@ -0,0 +1,788 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee and GB Schmick 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit Our Sites At www.tiptup.com and nehe.gamedev.net
+*/
+/*
+==========================================================================
+                       OpenGL Lesson 18:  Quadratics
+==========================================================================
+
+  Authors Name: GB Schmick ( TipTup )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 18:  Quadratics.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    GB Schmick & Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=18
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson18 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static bool light;                                              // Lighting ON/OFF
+        private static bool lp;                                                 // L Pressed?
+        private static bool fp;                                                 // F Pressed?
+        private static bool sp;                                                 // Spacebar Pressed? ( NEW )
+        private static int part1;                                               // Start Of Disc ( NEW )
+        private static int part2;                                               // End Of Disc ( NEW )
+        private static int p1 = 0;                                              // Increase 1 ( NEW )
+        private static int p2 = 1;                                              // Increase 2 ( NEW )
+        private static float xrot;                                              // X Rotation
+        private static float yrot;                                              // Y Rotation
+        private static float xspeed;                                            // X Rotation Speed
+        private static float yspeed;                                            // Y Rotation Speed
+        private static float z = -5;                                            // Depth Into The Screen
+        private static Glu.GLUquadric quadratic;                                // Storage For Our Quadratic Objects ( NEW )
+        private static float[] lightAmbient = {0.5f, 0.5f, 0.5f, 1};
+        private static float[] lightDiffuse = {1, 1, 1, 1};
+        private static float[] lightPosition = {0, 0, 2, 1};
+        private static int filter;                                              // Which Filter To Use
+        private static int[] texture = new int[3];                              // Storage For 3 Textures
+        private static int qobject = 0;                                         // Which Object To Draw (NEW)
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson18
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson18() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson18
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe & TipTup's Quadratics Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.L] && !lp) {
+                        lp = true;
+                        light = !light;
+                        if(!light) {
+                            Gl.glDisable(Gl.GL_LIGHTING);
+                        }
+                        else {
+                            Gl.glEnable(Gl.GL_LIGHTING);
+                        }
+                    }
+                    if(!keys[(int) Keys.L]) {
+                        lp = false;
+                    }
+                    if(keys[(int) Keys.F] && !fp) {
+                        fp = true;
+                        filter += 1;
+                        if(filter > 2) {
+                            filter = 0;
+                        }
+                    }
+                    if(!keys[(int) Keys.F]) {
+                        fp = false;
+                    }
+                    if(keys[(int) Keys.Space] && !sp) {
+                        sp = true;
+                        qobject++;
+                        if(qobject > 5) {
+                            qobject = 0;
+                        }
+                    }
+                    if(!keys[(int) Keys.Space]) {
+                        sp = false;
+                    }
+                    if(keys[(int) Keys.PageUp]) {
+                        z -= 0.02f;
+                    }
+                    if(keys[(int) Keys.PageDown]) {
+                        z += 0.02f;
+                    }
+                    if(keys[(int) Keys.Up]) {
+                        xspeed -= 0.01f;
+                    }
+                    if(keys[(int) Keys.Down]) {
+                        xspeed += 0.01f;
+                    }
+                    if(keys[(int) Keys.Right]) {
+                        yspeed += 0.01f;
+                    }
+                    if(keys[(int) Keys.Left]) {
+                        yspeed -= 0.01f;
+                    }
+
+                    if(keys[(int) Keys.F1]) {                               // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                        // If So Make Key false
+                        KillGLWindow();                                     // Kill Our Current Window
+                        fullscreen = !fullscreen;                           // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("NeHe & TipTup's Quadratics Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                         // Quit If Window Was Not Created
+                        }
+                        done = false;                                       // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson18();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The View
+            Gl.glTranslatef(0, 0, z);
+            Gl.glRotatef(xrot, 1, 0, 0);
+            Gl.glRotatef(yrot, 0, 1, 0);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[filter]);
+
+            switch(qobject) {
+                case 0:
+                    glDrawCube();
+                    break;
+                case 1:
+                    Gl.glTranslatef(0, 0, -1.5f);                               // Center The Cylinder
+                    Glu.gluCylinder(quadratic, 1, 1, 3, 32, 32);                // A Cylinder With A Radius Of 0.5 And A Height Of 2
+                    break;
+                case 2:
+                    Glu.gluDisk(quadratic, 0.5f, 1.5f, 32, 32);                 // Draw A Disc (CD Shape) With An Inner Radius Of 0.5, And An Outer Radius Of 2.  Plus A Lot Of Segments ;)
+                    break;
+                case 3:
+                    Glu.gluSphere(quadratic, 1.3f, 32, 32);                     // Draw A Sphere With A Radius Of 1 And 16 Longitude And 16 Latitude Segments
+                    break;
+                case 4:
+                    Gl.glTranslatef(0, 0, -1.5f);                               // Center The Cone
+                    Glu.gluCylinder(quadratic, 1, 0, 3, 32, 32);                // A Cone With A Bottom Radius Of .5 And A Height Of 2
+                    break;
+                case 5:
+                    part1 += p1;
+                    part2 += p2;
+
+                    if(part1 > 359) {                                           // 360 Degrees
+                        p1 = 0;
+                        part1 = 0;
+                        p2 = 1;
+                        part2 = 0;
+                    }
+                    if(part2 > 359) {                                           // 360 Degrees
+                        p1 = 1;
+                        p2 = 0;
+                    }
+                    // A Disk Like The One Before
+                    Glu.gluPartialDisk(quadratic, 0.5f, 1.5f, 32, 32, part1, part2 - part1);
+                    break;
+            };
+
+            xrot += xspeed;
+            yrot += yspeed;
+
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region glDrawCube()
+        /// <summary>
+        ///     Draws our cube.
+        /// </summary>
+        private static void glDrawCube() {
+            Gl.glBegin(Gl.GL_QUADS);
+                // Front Face
+                Gl.glNormal3f(0, 0, 1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, 1);
+                // Back Face
+                Gl.glNormal3f(0, 0,-1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, -1);
+                // Top Face
+                Gl.glNormal3f(0, 1, 0);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                // Bottom Face
+                Gl.glNormal3f(0,-1, 0);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                // Right Face
+                Gl.glNormal3f(1, 0, 0);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                // Left Face
+                Gl.glNormal3f(-1, 0, 0);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+            Gl.glEnd();
+        }
+        #endregion glDrawCube()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT, lightAmbient);            // Setup The Ambient Light
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, lightDiffuse);            // Setup The Diffuse Light
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, lightPosition);          // Position The Light
+            Gl.glEnable(Gl.GL_LIGHT1);                                          // Enable Light One
+            quadratic = Glu.gluNewQuadric();                                    // Create A Pointer To The Quadric Object (Return 0 If No Memory) (NEW)
+            Glu.gluQuadricNormals(quadratic, Glu.GLU_SMOOTH);                   // Create Smooth Normals (NEW)
+            Glu.gluQuadricTexture(quadratic, Gl.GL_TRUE);                       // Create Texture Coords (NEW)
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            Glu.gluDeleteQuadric(quadratic);                                    // Delete The Quadratic To Free System Resources
+
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson18.Wall.bmp");                // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(3, texture);                                   // Create Three Textures
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Create Nearest Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                // Create Linear Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[1]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                // Create MipMapped Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[2]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_NEAREST);
+                Glu.gluBuild2DMipmaps(Gl.GL_TEXTURE_2D, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson19.cs b/examples/NeHe/Lesson19.cs
new file mode 100644
index 0000000..11cde43
--- /dev/null
+++ b/examples/NeHe/Lesson19.cs
@@ -0,0 +1,807 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+            OpenGL Lesson 19:  Triangle Strip & Particle Engine
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 19:  Triangle Strip & Particle Engine.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=19
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson19 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private const int MAX_PARTICLES = 1000;                                 // Number Of Particles To Create
+        private static Random rand = new Random();                              // Random Number Generator
+        private static bool rainbow = true;                                     // Rainbow Mode?
+        private static bool sp;                                                 // Spacebar Pressed?
+        private static bool rp;                                                 // Enter Key Pressed?
+        private static float slowdown = 2;                                      // Slow Down Particles
+        private static float xspeed;                                            // Base X Speed (To Allow Keyboard Direction Of Tail)
+        private static float yspeed;                                            // Base Y Speed (To Allow Keyboard Direction Of Tail)
+        private static float zoom = -40;                                        // Used To Zoom Out
+        private static int loop;                                                // Misc Loop Variable
+        private static int col;                                                 // Current Color Selection
+        private static int delay;                                               // Rainbow Effect Delay
+        private static int[] texture = new int[1];                              // Storage For Our Particle Texture
+        private struct particle {                                               // Create A Structure For Particle
+            public bool active;                                                 // Active (Yes/No)
+            public float life;                                                  // Particle Life
+            public float fade;                                                  // Fade Speed
+            public float r;                                                     // Red Value
+            public float g;                                                     // Green Value
+            public float b;                                                     // Blue Value
+            public float x;                                                     // X Position
+            public float y;                                                     // Y Position
+            public float z;                                                     // Z Position
+            public float xi;                                                    // X Direction
+            public float yi;                                                    // Y Direction
+            public float zi;                                                    // Z Direction
+            public float xg;                                                    // X Gravity
+            public float yg;                                                    // Y Gravity
+            public float zg;                                                    // Z Gravity
+        }
+        private static particle[] particles = new particle[MAX_PARTICLES];      // Particle Array (Room For Particle Info)
+
+        private static float[][] colors = new float[12][] {                     // Rainbow Of Colors
+            new float[] {1, 0.5f, 0.5f},
+            new float[] {1, 0.75f, 0.5f},
+            new float[] {1, 1, 0.5f},
+            new float[] {0.75f, 1, 0.5f},
+            new float[] {0.5f, 1, 0.5f},
+            new float[] {0.5f, 1, 0.75f},
+            new float[] {0.5f, 1, 1},
+            new float[] {0.5f, 0.75f, 1},
+            new float[] {0.5f, 0.5f, 1},
+            new float[] {0.75f, 0.5f, 1},
+            new float[] {1, 0.5f, 1},
+            new float[] {1, 0.5f, 0.75f}
+        };
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson19
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson19() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson19
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Particle Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode
+                slowdown = 1;                                                   // If So, Speed Up The Particles (3dfx Issue)
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.Add] && ( slowdown > 1)) {
+                        slowdown -= 0.01f;                                  // Speed Up Particles
+                    }
+                    if(keys[(int) Keys.Subtract] && (slowdown < 4)) {
+                        slowdown += 0.01f;                                  // Slow Down Particles
+                    }
+                    if(keys[(int) Keys.PageUp]) {
+                        zoom += 0.1f;                                       // Zoom In
+                    }
+                    if(keys[(int) Keys.PageDown]) {
+                        zoom -= 0.1f;                                       // Zoom Out
+                    }
+                    if(keys[(int) Keys.Enter] && !rp) {                     // Return Key Pressed
+                        rp = true;                                          // Set Flag Telling Us It's Pressed
+                        rainbow = !rainbow;                                 // Toggle Rainbow Mode On / Off
+                    }
+                    if(!keys[(int) Keys.Enter]) {
+                        rp = false;                                         // If Return Is Released Clear Flag
+                    }
+                    // Space Or Rainbow Mode
+                    if((keys[(int) Keys.Space] && !sp) || (rainbow && (delay > 25))) {
+                        if(keys[(int) Keys.Space]) {
+                            rainbow = false;                                // If Spacebar Is Pressed Disable Rainbow Mode
+                        }
+                        sp = true;                                          // Set Flag Telling Us Space Is Pressed
+                        delay = 0;                                          // Reset The Rainbow Color Cycling Delay
+                        col++;                                              // Change The Particle Color
+                        if(col > 11) {
+                            col = 0;                                        // If Color Is To High Reset It
+                        }
+                    }
+                    if(!keys[(int) Keys.Space]) {
+                        sp = false;                                         // If Spacebar Is Released Clear Flag
+                    }
+                    // If Up Arrow And Y Speed Is Less Than 200 Increase Upward Speed
+                    if(keys[(int) Keys.Up] && (yspeed < 200)) {
+                        yspeed += 1;
+                    }
+                    // If Down Arrow And Y Speed Is Greater Than -200 Increase Downward Speed
+                    if(keys[(int) Keys.Down] && (yspeed > -200)) {
+                        yspeed -= 1;
+                    }
+                    // If Right Arrow And X Speed Is Less Than 200 Increase Speed To The Right
+                    if(keys[(int) Keys.Right] && (xspeed < 200)) {
+                        xspeed += 1;
+                    }
+                    // If Left Arrow And X Speed Is Greater Than -200 Increase Speed To The Left
+                    if(keys[(int) Keys.Left] && (xspeed > -200)) {
+                        xspeed -= 1;
+                    }
+                    delay++;                                                // Increase Rainbow Mode Color Cycling Delay Counter
+
+                    if(keys[(int) Keys.F1]) {                               // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                        // If So Make Key false
+                        KillGLWindow();                                     // Kill Our Current Window
+                        fullscreen = !fullscreen;                           // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("NeHe's Particle Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                         // Quit If Window Was Not Created
+                        }
+                        done = false;                                       // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson19();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The ModelView Matrix
+
+            for(loop = 0; loop < MAX_PARTICLES; loop++) {                       // Loop Through All The Particles
+                if(particles[loop].active) {                                    // If The Particle Is Active
+                    float x = particles[loop].x;                                // Grab Our Particle X Position
+                    float y = particles[loop].y;                                // Grab Our Particle Y Position
+                    float z = particles[loop].z + zoom;                         // Particle Z Pos + Zoom
+
+                    // Draw The Particle Using Our RGB Values, Fade The Particle Based On It's Life
+                    Gl.glColor4f(particles[loop].r, particles[loop].g, particles[loop].b, particles[loop].life);
+
+                    Gl.glBegin(Gl.GL_TRIANGLE_STRIP);                           // Build Quad From A Triangle Strip
+                        // Top Right
+                        Gl.glTexCoord2d(1, 1); Gl.glVertex3f(x + 0.5f, y + 0.5f, z);
+                        // Top Left
+                        Gl.glTexCoord2d(0, 1); Gl.glVertex3f(x - 0.5f, y + 0.5f, z);
+                        // Bottom Right
+                        Gl.glTexCoord2d(1, 0); Gl.glVertex3f(x + 0.5f, y - 0.5f, z);
+                        // Bottom Left
+                        Gl.glTexCoord2d(0, 0); Gl.glVertex3f(x - 0.5f, y - 0.5f, z);
+                    Gl.glEnd();                                                 // Done Building Triangle Strip
+
+                    particles[loop].x += particles[loop].xi / (slowdown * 1000);// Move On The X Axis By X Speed
+                    particles[loop].y += particles[loop].yi / (slowdown * 1000);// Move On The Y Axis By Y Speed
+                    particles[loop].z += particles[loop].zi / (slowdown * 1000);// Move On The Z Axis By Z Speed
+                    particles[loop].xi += particles[loop].xg;                   // Take Pull On X Axis Into Account
+                    particles[loop].yi += particles[loop].yg;                   // Take Pull On Y Axis Into Account
+                    particles[loop].zi += particles[loop].zg;                   // Take Pull On Z Axis Into Account
+                    particles[loop].life -= particles[loop].fade;               // Reduce Particles Life By 'Fade'
+
+                    if(particles[loop].life < 0) {                              // If Particle Is Burned Out
+                        particles[loop].life = 1;                               // Give It New Life
+                        // Random Fade Value
+                        particles[loop].fade = ((float) (rand.Next() % 100)) / 1000.0f + 0.003f;
+                        particles[loop].x = 0;                                  // Center On X Axis
+                        particles[loop].y = 0;                                  // Center On Y Axis
+                        particles[loop].z = 0;                                  // Center On Z Axis
+                        // X Axis Speed And Direction
+                        particles[loop].xi = xspeed + ((float) ((rand.Next() % 60)) - 32.0f);
+                        // Y Axis Speed And Direction
+                        particles[loop].yi = yspeed + ((float) ((rand.Next() % 60)) - 30.0f);
+                        // Z Axis Speed And Direction
+                        particles[loop].zi = ((float) ((rand.Next() % 60)) - 30.0f);
+                        particles[loop].r = colors[col][0];                     // Select Red From Color Table
+                        particles[loop].g = colors[col][1];                     // Select Green From Color Table
+                        particles[loop].b = colors[col][2];                     // Select Blue From Color Table
+                    }
+
+                    // If Number Pad 8 And Y Gravity Is Less Than 1.5 Increase Pull Upwards
+                    if(keys[(int) Keys.NumPad8] && (particles[loop].yg < 1.5f)) {
+                        particles[loop].yg += 0.01f;
+                    }
+
+                    // If Number Pad 2 And Y Gravity Is Greater Than -1.5 Increase Pull Downwards
+                    if(keys[(int) Keys.NumPad2] && (particles[loop].yg > -1.5f)) {
+                        particles[loop].yg -= 0.01f;
+                    }
+
+                    // If Number Pad 6 And X Gravity Is Less Than 1.5 Increase Pull Right
+                    if(keys[(int) Keys.NumPad6] && (particles[loop].xg < 1.5f)) {
+                        particles[loop].xg += 0.01f;
+                    }
+
+                    // If Number Pad 4 And X Gravity Is Greater Than -1.5 Increase Pull Left
+                    if(keys[(int) Keys.NumPad4] && (particles[loop].xg > -1.5f)) {
+                        particles[loop].xg -= 0.01f;
+                    }
+
+                    if(keys[(int) Keys.Tab]) {                                  // Tab Key Causes A Burst
+                        particles[loop].x = 0;                                  // Center On X Axis
+                        particles[loop].y = 0;                                  // Center On Y Axis
+                        particles[loop].z = 0;                                  // Center On Z Axis
+                        // Random Speed On X Axis
+                        particles[loop].xi = ((float) ((rand.Next() % 50) - 26.0f)) * 10.0f;
+                        // Random Speed On Y Axis
+                        particles[loop].yi = ((float) ((rand.Next() % 50) - 25.0f)) * 10.0f;
+                        // Random Speed On Z Axis
+                        particles[loop].zi = ((float) ((rand.Next() % 50) - 25.0f)) * 10.0f;
+                    }
+                }
+            }
+
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0);                                        // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glDisable(Gl.GL_DEPTH_TEST);                                     // Disable Depth Testing
+            Gl.glEnable(Gl.GL_BLEND);                                           // Enable Blending
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);                         // Type Of Blending To Perform
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            Gl.glHint(Gl.GL_POINT_SMOOTH_HINT, Gl.GL_NICEST);                   // Really Nice Point Smoothing
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);                     // Select Our Texture
+            for(loop = 0; loop < MAX_PARTICLES; loop++) {                       // Initials All The Textures
+                particles[loop].active = true;                                  // Make All The Particles Active
+                particles[loop].life = 1;                                       // Give All The Particles Full Life
+                // Random Fade Speed
+                particles[loop].fade = ((float) (rand.Next() % 100)) / 1000.0f + 0.003f;
+                particles[loop].r = colors[loop * (12 / MAX_PARTICLES)][0];     // Select Red Rainbow Color
+                particles[loop].g = colors[loop * (12 / MAX_PARTICLES)][1];     // Select Red Rainbow Color
+                particles[loop].b = colors[loop * (12 / MAX_PARTICLES)][2];     // Select Red Rainbow Color
+                // Random Speed On X Axis
+                particles[loop].xi = ((float) ((rand.Next() % 50) - 26.0f)) * 10.0f;
+                // Random Speed On Y Axis
+                particles[loop].yi = ((float) ((rand.Next() % 50) - 25.0f)) * 10.0f;
+                // Random Speed On Z Axis
+                particles[loop].zi = ((float) ((rand.Next() % 50) - 25.0f)) * 10.0f;
+                particles[loop].xg = 0;                                         // Set Horizontal Pull To Zero
+                particles[loop].yg = -0.8f;                                     // Set Vertical Pull Downward
+                particles[loop].zg = 0;                                         // Set Pull On Z Axis To Zero
+            }
+
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[1];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson19.Particle.bmp");            // Load The Bitmap
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(1, texture);                                   // Create The Textures
+
+                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
+                // Rectangle For Locking The Bitmap In Memory
+                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
+                // Get The Bitmap's Pixel Data From The Locked Bitmap
+                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Create Linear Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[0].Width, textureImage[0].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                if(textureImage[0] != null) {                                   // If Texture Exists
+                    textureImage[0].UnlockBits(bitmapData);                     // Unlock The Pixel Data From Memory
+                    textureImage[0].Dispose();                                  // Dispose The Bitmap
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 200);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson20.cs b/examples/NeHe/Lesson20.cs
new file mode 100644
index 0000000..7a86a22
--- /dev/null
+++ b/examples/NeHe/Lesson20.cs
@@ -0,0 +1,703 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  And Modified By Giuseppe D'Agata (waveform at tiscalinet.it)
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+                        OpenGL Lesson 20:  Masking
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 20:  Masking.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=20
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson20 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static bool masking = true;                                     // Masking On/Off
+        private static bool mp;                                                 // M Pressed?
+        private static bool sp;                                                 // Space Pressed?
+        private static bool scene;                                              // Which Scene To Draw
+        private static int[] texture = new int[5];                              // Storage For Our Five Textures
+        private static int loop;                                                // Generic Loop Variable
+        private static float roll;                                              // Rolling Texture
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson20
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson20() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson20
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's Masking Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.Space] && !sp) {                     // Is Space Being Pressed?
+                        sp = true;                                          // Tell Program Spacebar Is Being Held
+                        scene = !scene;                                     // Toggle From One Scene To The Other
+                    }
+                    if(!keys[(int) Keys.Space]) {                           // Has Spacebar Been Released?
+                        sp = false;                                         // Tell Program Spacebar Has Been Released
+                    }
+
+                    if(keys[(int) Keys.M] && !mp) {                         // Is M Being Pressed?
+                        mp = true;                                          // Tell Program M Is Being Held
+                        masking = !masking;                                 // Toggle Masking Mode OFF/ON
+                    }
+                    if(!keys[(int) Keys.M]) {                               // Has M Been Released?
+                        mp = false;                                         // Tell Program That M Has Been Released
+                    }
+
+                    if(keys[(int) Keys.F1]) {                               // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                        // If So Make Key false
+                        KillGLWindow();                                     // Kill Our Current Window
+                        fullscreen = !fullscreen;                           // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("NeHe's Masking Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                         // Quit If Window Was Not Created
+                        }
+                        done = false;                                       // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson20();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+            Gl.glTranslatef(0, 0, -2);                                          // Move Into The Screen 5 Units
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);                     // Select Our Logo Texture
+            Gl.glBegin(Gl.GL_QUADS);                                            // Start Drawing A Textured Quad
+                Gl.glTexCoord2f(0, -roll + 0); Gl.glVertex3f(-1.1f, -1.1f, 0);  // Bottom Left
+                Gl.glTexCoord2f(3, -roll + 0); Gl.glVertex3f(1.1f, -1.1f, 0);   // Bottom Right
+                Gl.glTexCoord2f(3, -roll + 3); Gl.glVertex3f(1.1f, 1.1f, 0);    // Top Right
+                Gl.glTexCoord2f(0, -roll + 3); Gl.glVertex3f(-1.1f, 1.1f, 0);   // Top Left
+            Gl.glEnd();                                                         // Done Drawing The Quad
+            Gl.glEnable(Gl.GL_BLEND);                                           // Enable Blending
+            Gl.glDisable(Gl.GL_DEPTH_TEST);                                     // Disable Depth Testing
+            if(masking) {                                                       // Is Masking Enabled?
+                Gl.glBlendFunc(Gl.GL_DST_COLOR, Gl.GL_ZERO);                    // Blend Screen Color With Zero (Black)
+            }
+            if(scene) {                                                         // Are We Drawing The Second Scene?
+                Gl.glTranslatef(0, 0, -1);                                      // Translate Into The Screen One Unit
+                Gl.glRotatef(roll * 360, 0, 0, 1);                              // Rotate On The Z Axis 360 Degrees.
+                if(masking) {                                                   // Is Masking On?
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[3]);             // Select The Second Mask Texture
+                    Gl.glBegin(Gl.GL_QUADS);                                    // Start Drawing A Textured Quad
+                        Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1.1f, -1.1f, 0);  // Bottom Left
+                        Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1.1f, -1.1f, 0);   // Bottom Right
+                        Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1.1f, 1.1f, 0);    // Top Right
+                        Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1.1f, 1.1f, 0);   // Top Left
+                    Gl.glEnd();                                                 // Done Drawing The Quad
+                }
+                Gl.glBlendFunc(Gl.GL_ONE, Gl.GL_ONE);                           // Copy Image 2 Color To The Screen
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[4]);                 // Select The Second Image Texture
+                Gl.glBegin(Gl.GL_QUADS);                                        // Start Drawing A Textured Quad
+                    Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1.1f, -1.1f, 0);      // Bottom Left
+                    Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1.1f, -1.1f, 0);       // Bottom Right
+                    Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1.1f, 1.1f, 0);        // Top Right
+                    Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1.1f, 1.1f, 0);       // Top Left
+                Gl.glEnd();                                                     // Done Drawing The Quad
+            }
+            else {                                                              // Otherwise
+                if(masking) {                                                   // Is Masking On?
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[1]);             // Select The First Mask Texture
+                    Gl.glBegin(Gl.GL_QUADS);                                    // Start Drawing A Textured Quad
+                        // Bottom Left
+                        Gl.glTexCoord2f(roll + 0, 0); Gl.glVertex3f(-1.1f, -1.1f, 0);
+                        // Bottom Right
+                        Gl.glTexCoord2f(roll + 4, 0); Gl.glVertex3f(1.1f, -1.1f, 0);
+                        // Top Right
+                        Gl.glTexCoord2f(roll + 4, 4); Gl.glVertex3f(1.1f, 1.1f, 0);
+                        // Top Left
+                        Gl.glTexCoord2f(roll + 0, 4); Gl.glVertex3f(-1.1f, 1.1f, 0);
+                    Gl.glEnd();                                                 // Done Drawing The Quad
+                }
+                Gl.glBlendFunc(Gl.GL_ONE, Gl.GL_ONE);                           // Copy Image 1 Color To The Screen
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[2]);                 // Select The First Image Texture
+                Gl.glBegin(Gl.GL_QUADS);                                        // Start Drawing A Textured Quad
+                    // Bottom Left
+                    Gl.glTexCoord2f(roll + 0, 0); Gl.glVertex3f(-1.1f, -1.1f, 0);
+                    // Bottom Right
+                    Gl.glTexCoord2f(roll + 4, 0); Gl.glVertex3f(1.1f, -1.1f, 0);
+                    // Top Right
+                    Gl.glTexCoord2f(roll + 4, 4); Gl.glVertex3f(1.1f, 1.1f, 0);
+                    // Top Left
+                    Gl.glTexCoord2f(roll + 0, 4); Gl.glVertex3f(-1.1f, 1.1f, 0);
+                Gl.glEnd();                                                     // Done Drawing The Quad
+            }
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enable Depth Testing
+            Gl.glDisable(Gl.GL_BLEND);                                          // Disable Blending
+            roll += 0.002f;                                                     // Increase Our Texture Roll Variable
+            if(roll > 1) {                                                      // Is Roll Greater Than One
+                roll -= 1;                                                      // Subtract 1 From Roll
+            }
+
+            return true;                                                        // Keep Going
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            if(!LoadGLTextures()) {                                             // Jump To Texture Loading Routine
+                return false;                                                   // If Texture Didn't Load Return False
+            }
+
+            Gl.glClearColor(0, 0, 0, 0);                                        // Clear The Background Color To Black
+            Gl.glClearDepth(1);                                                 // Enables Clearing Of The Depth Buffer
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enable Depth Testing
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enables Smooth Color Shading
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable 2D Texture Mapping
+
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[5];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson20.Logo.bmp");               // Logo Texture
+            textureImage[1] = LoadBMP("NeHe.Lesson20.Mask1.bmp");              // First Mask
+            textureImage[2] = LoadBMP("NeHe.Lesson20.Image1.bmp");             // First Image
+            textureImage[3] = LoadBMP("NeHe.Lesson20.Mask2.bmp");              // Second Mask
+            textureImage[4] = LoadBMP("NeHe.Lesson20.Image2.bmp");             // Second Image
+
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null && textureImage[1] != null &&
+                textureImage[2] != null && textureImage[3] != null &&
+                textureImage[4] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(5, texture);                                   // Create Five Textures
+
+                for(loop = 0; loop < textureImage.Length; loop++) {             // Loop Through All 5 Textures
+                    // Flip The Bitmap Along The Y-Axis
+                    textureImage[loop].RotateFlip(RotateFlipType.RotateNoneFlipY);
+                    // Rectangle For Locking The Bitmap In Memory
+                    Rectangle rectangle = new Rectangle(0, 0, textureImage[loop].Width, textureImage[loop].Height);
+                    // Get The Bitmap's Pixel Data From The Locked Bitmap
+                    BitmapData bitmapData = textureImage[loop].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                    // Create Linear Filtered Texture
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[loop]);
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                    Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[loop].Width, textureImage[loop].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                    if(textureImage[loop] != null) {                            // If Texture Exists
+                        textureImage[loop].UnlockBits(bitmapData);              // Unlock The Pixel Data From Memory
+                        textureImage[loop].Dispose();                           // Dispose The Bitmap
+                    }
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson21.cs b/examples/NeHe/Lesson21.cs
new file mode 100644
index 0000000..aa60b83
--- /dev/null
+++ b/examples/NeHe/Lesson21.cs
@@ -0,0 +1,516 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee 2000
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit My Site At nehe.gamedev.net
+*/
+/*
+==========================================================================
+   OpenGL Lesson 21:  Lines, Anti-Aliasing, Timing, Ortho View and Sound
+==========================================================================
+
+  Authors Name: Jeff Molofee ( NeHe )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 21:  Lines, Anti-Aliasing, Timing, Ortho View and Sound.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=21
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson21 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson21
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson21() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson21
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe's OpenGL Framework", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                if(active && (form != null)) {                                  // Program Active?
+                    if(keys[(int) Keys.Escape]) {                               // Was ESC Pressed?
+                        done = true;                                            // ESC Signalled A Quit
+                    }
+                    else {                                                      // Not Time To Quit, Update Screen
+                        DrawGLScene();                                          // Draw The Scene
+                        Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+                    }
+                }
+
+                if(keys[(int) Keys.F1]) {                                       // Is F1 Being Pressed?
+                    keys[(int) Keys.F1] = false;                                // If So Make Key false
+                    KillGLWindow();                                             // Kill Our Current Window
+                    fullscreen = !fullscreen;                                   // Toggle Fullscreen / Windowed Mode
+                    // Recreate Our OpenGL Window
+                    if(!CreateGLWindow("NeHe's OpenGL Framework", 640, 480, 16, fullscreen)) {
+                        return;                                                 // Quit If Window Was Not Created
+                    }
+                    done = false;                                               // We're Not Done Yet
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson21();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Here's where we do all the drawing.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful drawing, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Current Modelview Matrix
+            return true;
+        }
+        #endregion bool DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on successful initialization, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            return true;
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson23.cs b/examples/NeHe/Lesson23.cs
new file mode 100644
index 0000000..347b35c
--- /dev/null
+++ b/examples/NeHe/Lesson23.cs
@@ -0,0 +1,789 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Jeff Molofee and GB Schmick 2000
+ *  A HUGE Thanks To Fredric Echols For Cleaning Up
+ *  And Optimizing The Base Code, Making It More Flexible!
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit Our Sites At www.tiptup.com and nehe.gamedev.net
+*/
+/*
+==========================================================================
+                     OpenGL Lesson 23:  Sphere Mapping
+==========================================================================
+
+  Authors Name: GB Schmick ( TipTup )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 23: Sphere Mapping.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:   GB Schmick (TipTup) & Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=23
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Morten Lerudjordet & Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public class Lesson23 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static bool light;                                              // Lighting ON/OFF
+        private static bool lp;                                                 // L Pressed?
+        private static bool fp;                                                 // F Pressed?
+        private static bool sp;                                                 // Spacebar Pressed?
+        private static float xrot;                                              // X Rotation
+        private static float yrot;                                              // Y Rotation
+        private static float xspeed;                                            // X Rotation Speed
+        private static float yspeed;                                            // Y Rotation Speed
+        private static float z = -10;                                           // Depth Into The Screen
+        private static Glu.GLUquadric quadratic;                                // Storage For Our Quadratic Objects
+        private static float[] LightAmbient = {0.5f, 0.5f, 0.5f, 1};
+        private static float[] LightDiffuse = {1, 1, 1, 1};
+        private static float[] LightPosition = {0, 0, 2, 1};
+        private static int filter;                                              // Which Filter To Use
+        private static int[] texture = new int[6];                              // Storage For 6 Textures (MODIFIED)
+        private static int objectToDraw = 1;                                    // Which Object To Draw
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson23
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson23() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson23
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                              // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe & TipTup's Environment Mapping Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {   //  Active?  Was There A Quit Received?
+                    done = true;                                                // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                          // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                       // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.L] && !lp) {
+                        lp = true;
+                        light = !light;
+                        if(!light) {
+                            Gl.glDisable(Gl.GL_LIGHTING);
+                        }
+                        else {
+                            Gl.glEnable(Gl.GL_LIGHTING);
+                        }
+                    }
+                    if(!keys[(int) Keys.L]) {
+                        lp = false;
+                    }
+                    if (keys[(int) Keys.F] && !fp) {
+                        fp = true;
+                        filter += 1;
+                        if(filter > 2) {
+                            filter = 0;
+                        }
+                    }
+                    if(!keys[(int) Keys.F]) {
+                        fp = false;
+                    }
+                    if(keys[(int) Keys.Space] && !sp) {
+                        sp = true;
+                        objectToDraw++;
+                        if(objectToDraw > 3) {
+                            objectToDraw = 0;
+                        }
+                    }
+                    if(!keys[(int) Keys.Space]) {
+                        sp = false;
+                    }
+                    if(keys[(int) Keys.PageUp]) {
+                        z -= 0.02f;
+                    }
+                    if(keys[(int) Keys.PageDown]) {
+                        z += 0.02f;
+                    }
+                    if(keys[(int) Keys.Up]) {
+                        xspeed -= 0.01f;
+                    }
+                    if(keys[(int) Keys.Down]) {
+                        xspeed += 0.01f;
+                    }
+                    if(keys[(int) Keys.Right]) {
+                        yspeed += 0.01f;
+                    }
+                    if(keys[(int) Keys.Left]) {
+                        yspeed -= 0.01f;
+                    }
+
+                    if(keys[(int) Keys.F1]) {                                   // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                            // If So Make Key false
+                        KillGLWindow();                                         // Kill Our Current Window
+                        fullscreen = !fullscreen;                               // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("NeHe & TipTup's Environment Mapping Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                             // Quit If Window Was Not Created
+                        }
+                        done = false;                                           // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson23();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Draws everything.
+        /// </summary>
+        /// <returns>
+        ///     Returns <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {                                     // Here's Where We Do All The Drawing
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The View
+
+            Gl.glTranslatef(0, 0, z);
+
+            Gl.glEnable(Gl.GL_TEXTURE_GEN_S);                                   // Enable Texture Coord Generation For S (NEW)
+            Gl.glEnable(Gl.GL_TEXTURE_GEN_T);                                   // Enable Texture Coord Generation For T (NEW)
+
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[filter + (filter + 1)]); // This Will Select The Sphere Map
+            Gl.glPushMatrix();
+                Gl.glRotatef(xrot, 1, 0, 0);
+                Gl.glRotatef(yrot, 0, 1, 0);
+                switch(objectToDraw) {
+                    case 0:
+                        GlDrawCube();
+                        break;
+                    case 1:
+                        Gl.glTranslatef(0, 0, -1.5f);                           // Center The Cylinder
+                        Glu.gluCylinder(quadratic, 1, 1, 3, 32, 32);            // A Cylinder With A Radius Of 0.5 And A Height Of 2
+                        break;
+                    case 2:
+                        Glu.gluSphere(quadratic, 1.3, 32, 32);                  // Draw A Sphere With A Radius Of 1 And 16 Longitude And 16 Latitude Segments
+                        break;
+                    case 3:
+                        Gl.glTranslatef(0, 0, -1.5f);                           // Center The Cone
+                        Glu.gluCylinder(quadratic, 1, 0, 3, 32, 32);            // A Cone With A Bottom Radius Of .5 And A Height Of 2
+                        break;
+                };
+            Gl.glPopMatrix();
+            Gl.glDisable(Gl.GL_TEXTURE_GEN_S);
+            Gl.glDisable(Gl.GL_TEXTURE_GEN_T);
+
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[filter * 2]);            // This Will Select The BG Maps...
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0, 0, -24);
+                Gl.glBegin(Gl.GL_QUADS);
+                    Gl.glNormal3f(0, 0, 1);
+                    Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-13.3f, -10, 10);
+                    Gl.glTexCoord2f(1, 0); Gl.glVertex3f( 13.3f, -10, 10);
+                    Gl.glTexCoord2f(1, 1); Gl.glVertex3f( 13.3f, 10, 10);
+                    Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-13.3f, 10, 10);
+                Gl.glEnd();
+            Gl.glPopMatrix();
+
+            xrot += xspeed;
+            yrot += yspeed;
+            return true;                                                        // Everything Went OK
+        }
+        #endregion bool DrawGLScene()
+
+        #region GlDrawCube()
+        /// <summary>
+        ///     Draws The Cube
+        /// </summary>
+        private static void GlDrawCube() {
+            Gl.glBegin(Gl.GL_QUADS);
+                // Front Face
+                Gl.glNormal3f(0, 0, 0.5f);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, 1);
+                // Back Face
+                Gl.glNormal3f(0, 0,-0.5f);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, -1);
+                // Top Face
+                Gl.glNormal3f(0, 0.5f, 0);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f( 1, 1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f( 1, 1, -1);
+                // Bottom Face
+                Gl.glNormal3f(0,-0.5f, 0);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                // Right Face
+                Gl.glNormal3f(0.5f, 0, 0);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(1, -1, -1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(1, 1, -1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(1, 1, 1);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(1, -1, 1);
+                // Left Face
+                Gl.glNormal3f(-0.5f, 0, 0);
+                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1, -1, -1);
+                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1, -1, 1);
+                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-1, 1, 1);
+                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-1, 1, -1);
+            Gl.glEnd();
+        }
+        #endregion GlDrawCube()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     Returns <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {                                          // All Setup For OpenGL Goes Here
+            if(!LoadGLTextures()) {                                             // If Loading The Textures Failed
+                return false;                                                   // Return False
+            }
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable Texture Mapping
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT, LightAmbient);            // Setup The Ambient Light
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, LightDiffuse);            // Setup The Diffuse Light
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION,LightPosition);           // Position The Light
+            Gl.glEnable(Gl.GL_LIGHT1);                                          // Enable Light One
+
+            quadratic = Glu.gluNewQuadric();                                    // Create A Pointer To The Quadric Object (Return 0 If No Memory)
+            Glu.gluQuadricNormals(quadratic, Glu.GLU_SMOOTH);                   // Create Smooth Normals 
+            Glu.gluQuadricTexture(quadratic, Gl.GL_TRUE);                       // Create Texture Coords 
+
+            Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);    // Set The Texture Generation Mode For S To Sphere Mapping (NEW)
+            Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);    // Set The Texture Generation Mode For T To Sphere Mapping (NEW)
+            return true;                                                        // Initialization Went OK
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[2];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson23.BG.bmp");
+            textureImage[1] = LoadBMP("NeHe.Lesson23.Reflect.bmp");
+
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null && textureImage[1] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(6, texture);                                   // Create Three Textures
+                for(int loop = 0; loop <= 1; loop++) {                          // Loop Through All 3 Textures
+                    // Flip The Bitmap Along The Y-Axis
+                    textureImage[loop].RotateFlip(RotateFlipType.RotateNoneFlipY);
+                    // Rectangle For Locking The Bitmap In Memory
+                    Rectangle rectangle = new Rectangle(0, 0, textureImage[loop].Width, textureImage[loop].Height);
+                    // Get The Bitmap's Pixel Data From The Locked Bitmap
+                    BitmapData bitmapData = textureImage[loop].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                    // Create Nearest Filtered Texture
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[loop]);          // Gen Tex 0 and 1
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+                    Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[loop].Width, textureImage[loop].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                    // Create Linear Filtered Texture
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[loop+2]);        // Gen Tex 2 and 3
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                    Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[loop].Width, textureImage[loop].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                    // Create MipMapped Texture
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[loop+4]);        // Gen Tex 4 and 5
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_NEAREST);
+                    Glu.gluBuild2DMipmaps(Gl.GL_TEXTURE_2D, Gl.GL_RGB8, textureImage[loop].Width, textureImage[loop].Height, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                    if(textureImage[loop] != null) {                            // If Texture Exists
+                        textureImage[loop].UnlockBits(bitmapData);              // Unlock The Pixel Data From Memory
+                        textureImage[loop].Dispose();                           // Dispose The Bitmap
+                    }
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson25.cs b/examples/NeHe/Lesson25.cs
new file mode 100644
index 0000000..f3362da
--- /dev/null
+++ b/examples/NeHe/Lesson25.cs
@@ -0,0 +1,796 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Pet & Commented/Cleaned Up By Jeff Molofee
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit NeHe Productions At http://nehe.gamedev.net
+ */
+/*
+==========================================================================
+                    OpenGL Lesson 25:  Morphing Points
+==========================================================================
+
+  Authors Name: Piotr Cieslak
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 25: Morphing Points.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:   Piotr Cieslak & Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=25
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public class Lesson25 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static float xrot;                                              // X Rotation
+        private static float yrot;                                              // Y Rotation
+        private static float zrot;                                              // Z Rotation
+        private static float xspeed;                                            // X Rotation Speed
+        private static float yspeed;                                            // Y Rotation Speed
+        private static float zspeed;                                            // Z Rotation Speed
+        private static float cx;                                                // X Position
+        private static float cy;                                                // Y Position
+        private static float cz = -15;                                          // Z Position
+
+        private static int key = 1;                                             // Make Sure Same Morph Key Is Not Pressed
+        private static int step = 0;                                            // Step Counter
+        private static int steps = 200;                                         // Maximum Number Of Steps
+        private static bool morph;                                              // Morphing?
+
+        private static int maxver;                                              // Maximum Number Of Vertices
+        private static Thing morph1, morph2, morph3, morph4;                    // Our 4 Morphable Objects
+        private static Thing helper, source, destination;                       // Helper Object, Source Object, Destination Object
+
+        private static Random rand = new Random();                              // Random Number Generator
+
+        private struct Vertex {                                                 // Structure For 3d Points
+            public float X;                                                     // X Coordinate
+            public float Y;                                                     // Y Coordinate
+            public float Z;                                                     // Z Coordinate
+        }
+
+        private struct Thing {                                                  // Structure For An Object
+            public int Verts;                                                   // Number Of Vertices For The Object
+            public Vertex[] Points;                                             // Vertices
+        }
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson25
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson25() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson25
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                              // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("Piotr Cieslak & NeHe's Morphing Points Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if(active && keys[(int) Keys.Escape] || form == null) {         //  Active?  Was There A Quit Received?
+                    done = true;                                                // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                          // Not Time To Quit, Update Screen
+                    DrawGLScene();                                              // Draw
+                    Gdi.SwapBuffers(hDC);                                       // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.PageUp]) {                               // Is Page Up Being Pressed?
+                        zspeed += 0.01f;                                        // Increase zspeed
+                    }
+                    if(keys[(int) Keys.PageDown]) {                             // Is Page Down Being Pressed?
+                        zspeed -= 0.01f;                                        // Decrease zspeed
+                    }
+                    if(keys[(int) Keys.Down]) {                                 // Is Down Arrow Being Pressed?
+                        xspeed += 0.01f;                                        // Increase xspeed
+                    }
+                    if(keys[(int) Keys.Up]) {                                   // Is Up Arrow Being Pressed?
+                        xspeed -= 0.01f;                                        // Decrease xspeed
+                    }
+                    if(keys[(int) Keys.Right]) {                                // Is Right Arrow Being Pressed?
+                        yspeed += 0.01f;                                        // Increase yspeed
+                    }
+                    if(keys[(int) Keys.Left]) {                                 // Is Left Arrow Being Pressed?
+                        yspeed -= 0.01f;                                        // Decrease yspeed
+                    }
+                    if(keys[(int) Keys.Q]) {                                    // Is Q Key Being Pressed?
+                        cz -= 0.01f;                                            // Move Object Away From Viewer
+                    }
+                    if(keys[(int) Keys.Z]) {                                    // Is Z Key Being Pressed?
+                        cz += 0.01f;                                            // Move Object Towards Viewer
+                    }
+                    if(keys[(int) Keys.W]) {                                    // Is W Key Being Pressed?
+                        cy += 0.01f;                                            // Move Object Up
+                    }
+                    if(keys[(int) Keys.S]) {                                    // Is S Key Being Pressed?
+                        cy -= 0.01f;                                            // Move Object Down
+                    }
+                    if(keys[(int) Keys.D]) {                                    // Is W Key Being Pressed?
+                        cx += 0.01f;                                            // Move Object Right
+                    }
+                    if(keys[(int) Keys.A]) {                                    // Is S Key Being Pressed?
+                        cx -= 0.01f;                                            // Move Object Left
+                    }
+
+                    if(keys[(int) Keys.D1] && (key != 1) && !morph) {           // Is 1 Pressed, key Not Equal To 1 And Morph False?
+                        key = 1;                                                // Sets key To 1 (To Prevent Pressing 1 2x In A Row)
+                        morph = true;                                           // Set morph To True (Starts Morphing Process)
+                        destination = morph1;                                   // Destination Object To Morph To Becomes morph1
+                    }
+                    if(keys[(int) Keys.D2] && (key != 2) && !morph) {           // Is 2 Pressed, key Not Equal To 2 And Morph False?
+                        key = 2;                                                // Sets key To 2 (To Prevent Pressing 2 2x In A Row)
+                        morph = true;                                           // Set morph To True (Starts Morphing Process)
+                        destination = morph2;                                   // Destination Object To Morph To Becomes morph2
+                    }
+                    if(keys[(int) Keys.D3] && (key != 3) && !morph) {           // Is 3 Pressed, key Not Equal To 3 And Morph False?
+                        key = 3;                                                // Sets key To 3 (To Prevent Pressing 3 2x In A Row)
+                        morph = true;                                           // Set morph To True (Starts Morphing Process)
+                        destination = morph3;                                   // Destination Object To Morph To Becomes morph3
+                    }
+                    if(keys[(int) Keys.D4] && (key != 4) && !morph) {           // Is 4 Pressed, key Not Equal To 4 And Morph False?
+                        key = 4;                                                // Sets key To 4 (To Prevent Pressing 4 2x In A Row)
+                        morph = true;                                           // Set morph To True (Starts Morphing Process)
+                        destination = morph4;                                   // Destination Object To Morph To Becomes morph4
+                    }
+
+                    if(keys[(int) Keys.F1]) {                                   // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                            // If So Make Key false
+                        KillGLWindow();                                         // Kill Our Current Window
+                        fullscreen = !fullscreen;                               // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("NeHe & TipTup's Environment Mapping Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                             // Quit If Window Was Not Created
+                        }
+                        done = false;                                           // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region AllocateThing(ref Thing thing, int number)
+        /// <summary>
+        ///     Allocate memory for each object.
+        /// </summary>
+        /// <param name="thing">
+        ///     The object.
+        /// </param>
+        /// <param name="number">
+        ///     The number of points to allocate.
+        /// </param>
+        private static void AllocateThing(ref Thing thing, int number) {
+            thing.Points = new Vertex[number];
+        }
+        #endregion AllocateThing(ref Thing thing, int number)
+
+        #region Vertex Calculate(int i)
+        /// <summary>
+        ///     Calculates movement of points during morphing.
+        /// </summary>
+        /// <param name="i">
+        ///     The number of the point to calculate.
+        /// </param>
+        /// <returns>
+        ///     A Vertex.
+        /// </returns>
+        private static Vertex Calculate(int i) {
+            // This Makes Points Move At A Speed So They All Get To Their Destination At The Same Time
+            Vertex a;                                                                   // Temporary Vertex Called a
+            a.X = (source.Points[i].X - destination.Points[i].X) / steps;               // a.X Value Equals Source X - Destination X Divided By Steps
+            a.Y = (source.Points[i].Y - destination.Points[i].Y) / steps;               // a.Y Value Equals Source Y - Destination Y Divided By Steps
+            a.Z = (source.Points[i].Z - destination.Points[i].Z) / steps;               // a.Z Value Equals Source Z - Destination Z Divided By Steps
+            return a;                                                                   // Return The Results
+        }
+        #endregion Vertex Calculate(int i)
+
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson25();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region DrawGLScene()
+        /// <summary>
+        ///     Draws everything.
+        /// </summary>
+        /// <returns>
+        ///     Returns <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static void DrawGLScene() {                                     // Here's Where We Do All The Drawing
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The View
+            Gl.glTranslatef(cx, cy, cz);                                        // Translate The The Current Position To Start Drawing
+            Gl.glRotatef(xrot, 1, 0, 0);                                        // Rotate On The X Axis By xrot
+            Gl.glRotatef(yrot, 0, 1, 0);                                        // Rotate On The Y Axis By yrot
+            Gl.glRotatef(zrot, 0, 0, 1);                                        // Rotate On The Z Axis By zrot
+
+            xrot += xspeed;
+            yrot += yspeed;
+            zrot += zspeed;                                                     // Increase xrot,yrot & zrot by xspeed, yspeed & zspeed
+
+            float tx, ty, tz;                                                   // Temp X, Y & Z Variables
+            Vertex q;                                                           // Holds Returned Calculated Values For One Vertex
+
+            Gl.glBegin(Gl.GL_POINTS);                                           // Begin Drawing Points
+            for(int i = 0; i < morph1.Verts; i++) {                             // Loop Through All The Verts Of morph1 (All Objects Have
+                if(morph) {                                                     // The Same Amount Of Verts For Simplicity, Could Use maxver Also)
+                    q = Calculate(i);
+                }
+                else {
+                    q.X = q.Y = q.Z = 0;                                        // If morph Is True Calculate Movement Otherwise Movement=0
+                }
+                helper.Points[i].X -= q.X;                                      // Subtract q.x Units From helper.points[i].x (Move On X Axis)
+                helper.Points[i].Y -= q.Y;                                      // Subtract q.y Units From helper.points[i].y (Move On Y Axis)
+                helper.Points[i].Z -= q.Z;                                      // Subtract q.z Units From helper.points[i].z (Move On Z Axis)
+                tx = helper.Points[i].X;                                        // Make Temp X Variable Equal To Helper's X Variable
+                ty = helper.Points[i].Y;                                        // Make Temp Y Variable Equal To Helper's Y Variable
+                tz = helper.Points[i].Z;                                        // Make Temp Z Variable Equal To Helper's Z Variable
+
+                Gl.glColor3f(0, 1, 1);                                          // Set Color To A Bright Shade Of Off Blue
+                Gl.glVertex3f(tx, ty, tz);                                      // Draw A Point At The Current Temp Values (Vertex)
+                Gl.glColor3f(0, 0.5f, 1);                                       // Darken Color A Bit
+                tx -= 2 * q.X;
+                ty -= 2 * q.Y;
+                ty -= 2 * q.Y;                                                  // Calculate Two Positions Ahead
+                Gl.glVertex3f(tx, ty, tz);                                      // Draw A Second Point At The Newly Calculate Position
+                Gl.glColor3f(0, 0, 1);                                          // Set Color To A Very Dark Blue
+                tx -= 2 * q.X;
+                ty -= 2 * q.Y;
+                ty -= 2 * q.Y;                                                  // Calculate Two More Positions Ahead
+                Gl.glVertex3f(tx, ty, tz);                                      // Draw A Third Point At The Second New Position
+            }                                                                   // This Creates A Ghostly Tail As Points Move
+            Gl.glEnd();                                                         // Done Drawing Points
+
+            // If We're Morphing And We Haven't Gone Through All 200 Steps Increase Our Step Counter
+            // Otherwise Set Morphing To False, Make Source=Destination And Set The Step Counter Back To Zero.
+            if(morph && step <= steps) {
+                step++;
+            }
+            else {
+                morph = false;
+                source = destination;
+                step = 0;
+            }
+        }
+        #endregion DrawGLScene()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     Returns <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {                                          // All Setup For OpenGL Goes Here
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);                         // Set The Blending Function For Translucency
+            Gl.glClearColor(0, 0, 0, 0);                                        // This Will Clear The Background Color To Black
+            Gl.glClearDepth(1);                                                 // Enables Clearing Of The Depth Buffer
+            Gl.glDepthFunc(Gl.GL_LESS);                                         // The Type Of Depth Test To Do
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enables Smooth Color Shading
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+
+            maxver = 0;                                                         // Sets Max Vertices To 0 By Default
+
+            LoadThing("NeHe.Lesson25.Sphere.txt", ref morph1);                  // Load The First Object Into morph1 From File sphere.txt
+            LoadThing("NeHe.Lesson25.Torus.txt", ref morph2);                   // Load The Second Object Into morph2 From File torus.txt
+            LoadThing("NeHe.Lesson25.Tube.txt", ref morph3);                    // Load The Third Object Into morph3 From File tube.txt
+
+            AllocateThing(ref morph4, 486);                                     // Manually Reserver Ram For A 4th 468 Vertice Object (morph4)
+            for(int i = 0; i < 486; i++) {                                      // Loop Through All 468 Vertices
+                morph4.Points[i].X = ((float) (rand.Next() % 14000) / 1000) - 7;// morph4 X Point Becomes A Random Float Value From -7 to 7
+                morph4.Points[i].Y = ((float) (rand.Next() % 14000) / 1000) - 7;// morph4 Y Point Becomes A Random Float Value From -7 to 7
+                morph4.Points[i].Z = ((float) (rand.Next() % 14000) / 1000) - 7;// morph4 Z Point Becomes A Random Float Value From -7 to 7
+            }
+
+            LoadThing("NeHe.Lesson25.Sphere.txt", ref helper);                  // Load sphere.txt Object Into Helper (Used As Starting Point)
+            source = destination = morph1;                                      // Source & Destination Are Set To Equal First Object (morph1)
+
+            return true;                                                        // Initialization Went OK
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region LoadThing(string filename, ref Thing k)
+        /// <summary>
+        ///     Loads Object from a file.
+        /// </summary>
+        /// <param name="filename">
+        ///     The file to load.
+        /// </param>
+        /// <param name="k">
+        ///     The Object to save to.
+        /// </param>
+        private static void LoadThing(string filename, ref Thing k) {
+            int ver;                                                                    // Will Hold Vertice Count
+            float rx, ry, rz;                                                           // Hold Vertex X, Y & Z Position
+            string oneline = "";                                                        // The Line We've Read
+            string[] splitter;                                                          // Array For Split Values
+            StreamReader reader = null;                                                 // Our StreamReader
+            ASCIIEncoding encoding = new ASCIIEncoding();                               // ASCII Encoding
+
+            try {
+                if(filename == null || filename == string.Empty) {                      // Make Sure A Filename Was Given
+                    return;                                                             // If Not Return
+                }
+
+                string fileName1 = string.Format("Data{0}{1}",                          // Look For Data\Filename
+                    Path.DirectorySeparatorChar, filename);
+                string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",              // Look For ..\..\Data\Filename
+                    "..", Path.DirectorySeparatorChar, filename);
+
+                // Make Sure The File Exists In One Of The Usual Directories
+                if(!File.Exists(filename) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                    return;                                                             // If Not Return Null
+                }
+
+                if(File.Exists(filename)) {                                             // Does The File Exist Here?
+                    reader = new StreamReader(filename, encoding);                          // Open The File As ASCII Text
+                }
+                else if(File.Exists(fileName1)) {                                       // Does The File Exist Here?
+                    reader = new StreamReader(fileName1, encoding);                     // Open The File As ASCII Text
+                }
+                else if(File.Exists(fileName2)) {                                       // Does The File Exist Here?
+                    reader = new StreamReader(fileName2, encoding);                     // Open The File As ASCII Text
+                }
+
+                oneline = reader.ReadLine();                                            // Read The First Line
+                splitter = oneline.Split();                                             // Split The Line On Spaces
+
+                // The First Item In The Array Will Contain The String "Vertices:", Which We Will Ignore
+                ver = Convert.ToInt32(splitter[1]);                                     // Save The Number Of Triangles To ver As An int
+                k.Verts = ver;                                                          // Sets PointObjects (k) verts Variable To Equal The Value Of ver
+                AllocateThing(ref k, ver);                                              // Jumps To Code That Allocates Ram To Hold The Object
+
+                for(int vertloop = 0; vertloop < ver; vertloop++) {                     // Loop Through The Vertices
+                    oneline = reader.ReadLine();                                        // Reads In The Next Line Of Text
+                    if(oneline != null) {                                               // If The Line's Not null
+                        splitter = oneline.Split();                                     // Split The Line On Spaces
+                        rx = float.Parse(splitter[0]);                                  // Save The X Value As A Float
+                        ry = float.Parse(splitter[1]);                                  // Save The Y Value As A Float
+                        rz = float.Parse(splitter[2]);                                  // Save The Z Value As A Float
+                        k.Points[vertloop].X = rx;                                      // Sets PointObjects (k) points.x Value To rx
+                        k.Points[vertloop].Y = ry;                                      // Sets PointObjects (k) points.y Value To ry
+                        k.Points[vertloop].Z = rz;                                      // Sets PointObjects (k) points.z Value To rz
+                    }
+                }
+
+                if(ver > maxver) {                                                      // If ver Is Greater Than maxver
+                    // maxver Keeps Track Of The Highest Number Of Vertices Used In Any Of The Objects
+                    maxver = ver;                                                       // Set maxver Equal To ver
+                }
+            }
+            catch(Exception e) {
+                // Handle Any Exceptions While Loading Object Data, Exit App
+                string errorMsg = "An Error Occurred While Loading And Parsing Object Data:\n\t" + filename + "\n" + "\n\nStack Trace:\n\t" + e.StackTrace + "\n";
+                MessageBox.Show(errorMsg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                done = true;
+            }
+            finally {
+                if(reader != null) {
+                    reader.Close();                                                     // Close The StreamReader
+                }
+            }
+        }
+        #endregion LoadThing(string filename, ref Thing k)
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson26.cs b/examples/NeHe/Lesson26.cs
new file mode 100644
index 0000000..8fa9518
--- /dev/null
+++ b/examples/NeHe/Lesson26.cs
@@ -0,0 +1,757 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*  This code has been created by Banu Octavian aka Choko - 20 may 2000
+ *  and uses NeHe tutorials as a starting point (window initialization,
+ *  texture loading, GL initialization and code for keypresses) - very good
+ *  tutorials, Jeff. If anyone is interested about the presented algorithm
+ *  please e-mail me at boct at romwest.ro
+ *
+ *  Code Commmenting And Clean Up By Jeff Molofee ( NeHe )
+ *  NeHe Productions  http://nehe.gamedev.net
+*/
+/*
+==========================================================================
+                  OpenGL Lesson 26:  Stencil & Reflection
+==========================================================================
+
+  Authors Name: Banu Octavian
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 26:  Stencil & Reflection.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Banu Octavian (Choko) & Jeff Molofee (NeHe)
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=26
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Morten Lerudjordet & Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson26 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private static float[] LightAmb = {0.7f, 0.7f, 0.7f, 1};                // Ambient Light
+        private static float[] LightDif = {1, 1, 1, 1};                         // Diffuse Light
+        private static float[] LightPos = {4, 4, 6, 1};                         // Light Position
+        private static Glu.GLUquadric q;                                        // Quadratic For Drawing A Sphere
+        private static float xrot = 0;                                          // X Rotation
+        private static float yrot = 0;                                          // Y Rotation
+        private static float xrotspeed = 0;                                     // X Rotation Speed
+        private static float yrotspeed = 0;                                     // Y Rotation Speed
+        private static float zoom = -7;                                         // Depth Into The Screen
+        private static float height = 2;                                        // Height Of Ball From Floor
+        private static int[] texture = new int[3];                              // 3 Textures
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson26
+        /// <summary>
+        ///     Creates a new instance.
+        /// </summary>
+        public Lesson26() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson26
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("Banu Octavian & NeHe's Stencil & Reflection Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {//  Active?  Was There A Quit Received?
+                    done = true;                                            // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                      // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                   // Swap Buffers (Double Buffering)
+
+                    ProcessKeyboard();                                      // Processed Keyboard Presses
+
+                    if(keys[(int) Keys.F1]) {                               // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                        // If So Make Key false
+                        KillGLWindow();                                     // Kill Our Current Window
+                        fullscreen = !fullscreen;                           // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("Banu Octavian & NeHe's Stencil & Reflection Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                         // Quit If Window Was Not Created
+                        }
+                        done = false;                                       // We're Not Done Yet
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson26();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 1;                                               // Use Stencil Buffer ( * Important * )
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region DrawFloor()
+        /// <summary>
+        ///     Draws the floor.
+        /// </summary>
+        private static void DrawFloor() {
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);                     // Select Texture 1 (0)
+            Gl.glBegin(Gl.GL_QUADS);                                            // Begin Drawing A Quad
+                Gl.glNormal3f(0, 1, 0);                                         // Normal Pointing Up
+                Gl.glTexCoord2f(0, 1);                                          // Bottom Left Of Texture
+                Gl.glVertex3f(-2, 0, 2);                                        // Bottom Left Corner Of Floor
+                Gl.glTexCoord2f(0, 0);                                          // Top Left Of Texture
+                Gl.glVertex3f(-2, 0, -2);                                       // Top Left Corner Of Floor
+                Gl.glTexCoord2f(1, 0);                                          // Top Right Of Texture
+                Gl.glVertex3f(2, 0,-2);                                         // Top Right Corner Of Floor
+                Gl.glTexCoord2f(1, 1);                                          // Bottom Right Of Texture
+                Gl.glVertex3f(2, 0, 2);                                         // Bottom Right Corner Of Floor
+            Gl.glEnd();                                                         // Done Drawing The Quad
+        }
+        #endregion DrawFloor()
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Draws everything.
+        /// </summary>
+        /// <returns>
+        ///     Returns <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            // Clear Screen, Depth Buffer & Stencil Buffer
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT | Gl.GL_STENCIL_BUFFER_BIT);
+
+            // Clip Plane Equations
+            double[] eqr = {0,-1, 0, 0};                                        // Plane Equation To Use For The Reflected Objects
+
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+            Gl.glTranslatef(0, -0.6f, zoom);                                    // Zoom And Raise Camera Above The Floor (Up 0.6 Units)
+            Gl.glColorMask(false, false, false, false);                         // Set Color Mask
+            Gl.glEnable(Gl.GL_STENCIL_TEST);                                    // Enable Stencil Buffer For "marking" The Floor
+            Gl.glStencilFunc(Gl.GL_ALWAYS, 1, 1);                               // Always Passes, 1 Bit Plane, 1 As Mask
+            Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_REPLACE);              // We Set The Stencil Buffer To 1 Where We Draw Any Polygon
+                                                                                // Keep If Test Fails, Keep If Test Passes But Buffer Test Fails
+                                                                                // Replace If Test Passes
+            Gl.glDisable(Gl.GL_DEPTH_TEST);                                     // Disable Depth Testing
+            DrawFloor();                                                        // Draw The Floor (Draws To The Stencil Buffer)
+                                                                                // We Only Want To Mark It In The Stencil Buffer
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enable Depth Testing
+            Gl.glColorMask(true, true, true, true);                             // Set Color Mask to TRUE, TRUE, TRUE, TRUE
+            Gl.glStencilFunc(Gl.GL_EQUAL, 1, 1);                                // We Draw Only Where The Stencil Is 1
+                                                                                // (I.E. Where The Floor Was Drawn)
+            Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_KEEP);                 // Don't Change The Stencil Buffer
+            Gl.glEnable(Gl.GL_CLIP_PLANE0);                                     // Enable Clip Plane For Removing Artifacts
+            // (When The Object Crosses The Floor)
+            Gl.glClipPlane(Gl.GL_CLIP_PLANE0, eqr);                             // Equation For Reflected Objects
+            Gl.glPushMatrix();                                                  // Push The Matrix Onto The Stack
+                Gl.glScalef(1, -1, 1);                                          // Mirror Y Axis
+                Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, LightPos);           // Set Up Light0
+                Gl.glTranslatef(0, height, 0);                                  // Position The Object
+                Gl.glRotatef(xrot, 1, 0, 0);                                    // Rotate Local Coordinate System On X Axis
+                Gl.glRotatef(yrot, 0, 1, 0);                                    // Rotate Local Coordinate System On Y Axis
+                DrawObject();                                                   // Draw The Sphere (Reflection)
+            Gl.glPopMatrix();                                                   // Pop The Matrix Off The Stack
+            Gl.glDisable(Gl.GL_CLIP_PLANE0);                                    // Disable Clip Plane For Drawing The Floor
+            Gl.glDisable(Gl.GL_STENCIL_TEST);                                   // We Don't Need The Stencil Buffer Any More (Disable)
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, LightPos);               // Set Up Light0 Position
+            Gl.glEnable(Gl.GL_BLEND);                                           // Enable Blending (Otherwise The Reflected Object Wont Show)
+            Gl.glDisable(Gl.GL_LIGHTING);                                       // Since We Use Blending, We Disable Lighting
+            Gl.glColor4f(1, 1, 1, 0.8f);                                        // Set Color To White With 80% Alpha
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);         // Blending Based On Source Alpha And 1 Minus Dest Alpha
+            DrawFloor();                                                        // Draw The Floor To The Screen
+            Gl.glEnable(Gl.GL_LIGHTING);                                        // Enable Lighting
+            Gl.glDisable(Gl.GL_BLEND);                                          // Disable Blending
+            Gl.glTranslatef(0, height, 0);                                      // Position The Ball At Proper Height
+            Gl.glRotatef(xrot, 1, 0, 0);                                        // Rotate On The X Axis
+            Gl.glRotatef(yrot, 0, 1, 0);                                        // Rotate On The Y Axis
+            DrawObject();                                                       // Draw The Ball
+            xrot += xrotspeed;                                                  // Update X Rotation Angle By xrotspeed
+            yrot += yrotspeed;                                                  // Update Y Rotation Angle By yrotspeed
+            Gl.glFlush();                                                       // Flush The GL Pipeline
+            return true;                                                        // Everything Went OK
+        }
+        #endregion bool DrawGLScene()
+
+        #region DrawObject()
+        /// <summary>
+        ///     Draws our ball.
+        /// </summary>
+        private static void DrawObject() {
+            Gl.glColor3f(1, 1, 1);                                              // Set Color To White
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[1]);                     // Select Texture 2 (1)
+            Glu.gluSphere(q, 0.35f, 32, 16);                                    // Draw First Sphere
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[2]);                     // Select Texture 3 (2)
+            Gl.glColor4f(1, 1, 1, 0.4f);                                        // Set Color To White With 40% Alpha
+            Gl.glEnable(Gl.GL_BLEND);                                           // Enable Blending
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);                         // Set Blending Mode To Mix Based On SRC Alpha
+            Gl.glEnable(Gl.GL_TEXTURE_GEN_S);                                   // Enable Sphere Mapping
+            Gl.glEnable(Gl.GL_TEXTURE_GEN_T);                                   // Enable Sphere Mapping
+            Glu.gluSphere(q, 0.35f, 32, 16);                                    // Draw Another Sphere Using New Texture
+            // Textures Will Mix Creating A MultiTexture Effect (Reflection)
+            Gl.glDisable(Gl.GL_TEXTURE_GEN_S);                                  // Disable Sphere Mapping
+            Gl.glDisable(Gl.GL_TEXTURE_GEN_T);                                  // Disable Sphere Mapping
+            Gl.glDisable(Gl.GL_BLEND);                                          // Disable Blending
+        }
+        #endregion DrawObject()
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     Returns <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {                                          // All Setup For OpenGL Goes Here
+            if(!LoadGLTextures()) {                                             // If Loading The Textures Failed
+                return false;                                                   // Return False
+            }
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0.2f, 0.5f, 1, 1);                                  // Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glClearStencil(0);                                               // Clear The Stencil Buffer To 0
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                      // Enable 2D Texture Mapping
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, LightAmb);                // Set The Ambient Lighting For Light0
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, LightDif);                // Set The Diffuse Lighting For Light0
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, LightPos);               // Set The Position For Light0
+            Gl.glEnable(Gl.GL_LIGHT0);                                          // Enable Light 0
+            Gl.glEnable(Gl.GL_LIGHTING);                                        // Enable Lighting
+            q = Glu.gluNewQuadric();                                            // Create A New Quadratic
+            Glu.gluQuadricNormals(q, Gl.GL_SMOOTH);                             // Generate Smooth Normals For The Quad
+            Glu.gluQuadricTexture(q, Gl.GL_TRUE);                               // Enable Texture Coords For The Quad
+            Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);    // Set Up Sphere Mapping
+            Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);    // Set Up Sphere Mapping
+
+            return true;                                                        // Initialization Went OK
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region bool LoadGLTextures()
+        /// <summary>
+        ///     Load bitmaps and convert to textures.
+        /// </summary>
+        /// <returns>
+        ///     <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool LoadGLTextures() {
+            bool status = false;                                                // Status Indicator
+            Bitmap[] textureImage = new Bitmap[3];                              // Create Storage Space For The Texture
+
+            textureImage[0] = LoadBMP("NeHe.Lesson26.EnvWall.bmp");             // Load The Floor Texture
+            textureImage[1] = LoadBMP("NeHe.Lesson26.Ball.bmp");                // Load the Light Texture
+            textureImage[2] = LoadBMP("NeHe.Lesson26.EnvRoll.bmp");             // Load the Wall Texture
+            // Check For Errors, If Bitmap's Not Found, Quit
+            if(textureImage[0] != null && textureImage[1] != null &&
+                textureImage[2] != null) {
+                status = true;                                                  // Set The Status To True
+
+                Gl.glGenTextures(3, texture);                                   // Create Three Textures
+                for(int loop = 0; loop < textureImage.Length; loop++) {         // Loop Through All 3 Textures
+                    // Flip The Bitmap Along The Y-Axis
+                    textureImage[loop].RotateFlip(RotateFlipType.RotateNoneFlipY);
+                    // Rectangle For Locking The Bitmap In Memory
+                    Rectangle rectangle = new Rectangle(0, 0, textureImage[loop].Width, textureImage[loop].Height);
+                    // Get The Bitmap's Pixel Data From The Locked Bitmap
+                    BitmapData bitmapData = textureImage[loop].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                    // Create Linear Filtered Texture
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[loop]);
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                    Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureImage[loop].Width, textureImage[loop].Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
+
+                    if(textureImage[loop] != null) {                            // If Texture Exists
+                        textureImage[loop].UnlockBits(bitmapData);              // Unlock The Pixel Data From Memory
+                        textureImage[loop].Dispose();                           // Dispose The Bitmap
+                    }
+                }
+            }
+
+            return status;                                                      // Return The Status
+        }
+        #endregion bool LoadGLTextures()
+
+        #region Bitmap LoadBMP(string fileName)
+        /// <summary>
+        ///     Loads a bitmap image.
+        /// </summary>
+        /// <param name="fileName">
+        ///     The filename to load.
+        /// </param>
+        /// <returns>
+        ///     The bitmap if it exists, otherwise <c>null</c>.
+        /// </returns>
+        private static Bitmap LoadBMP(string fileName) {
+            if(fileName == null || fileName == string.Empty) {                  // Make Sure A Filename Was Given
+                return null;                                                    // If Not Return Null
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, fileName);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, fileName);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(fileName) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                return null;                                                    // If Not Return Null
+            }
+
+            if(File.Exists(fileName)) {                                         // Does The File Exist Here?
+                return new Bitmap(fileName);                                    // Load The Bitmap
+            }
+            else if(File.Exists(fileName1)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName1);                                   // Load The Bitmap
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                return new Bitmap(fileName2);                                   // Load The Bitmap
+            }
+
+            return null;                                                        // If Load Failed Return Null
+        }
+        #endregion Bitmap LoadBMP(string fileName)
+
+        #region ProcessKeyboard()
+        /// <summary>
+        ///     Prcess keyboard results.
+        /// </summary>
+        private static void ProcessKeyboard() {
+            if(keys[(int) Keys.Right]) {
+                yrotspeed += 0.08f;                                 // Right Arrow Pressed (Increase yrotspeed)
+            }
+            if(keys[(int) Keys.Left]) {
+                yrotspeed -= 0.08f;                                 // Left Arrow Pressed (Decrease yrotspeed)
+            }
+            if(keys[(int) Keys.Down]) {
+                xrotspeed += 0.08f;                                 // Down Arrow Pressed (Increase xrotspeed)
+            }
+            if(keys[(int) Keys.Up]) {
+                xrotspeed -= 0.08f;                                 // Up Arrow Pressed (Decrease xrotspeed)
+            }
+            if(keys[(int) Keys.A]) {
+                zoom += 0.05f;                                      // 'A' Key Pressed ... Zoom In
+            }
+            if(keys[(int) Keys.Z]) {
+                zoom -= 0.05f;                                      // 'Z' Key Pressed ... Zoom Out
+            }
+            if(keys[(int) Keys.PageUp]) {
+                height += 0.03f;                                    // Page Up Key Pressed Move Ball Up
+            }
+            if(keys[(int) Keys.PageDown]) {
+                height -= 0.03f;                                    // Page Down Key Pressed Move Ball Down
+            }
+        }
+        #endregion ProcessKeyboard()
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            Glu.gluPerspective(45, width / (double) height, 0.1, 100);          // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Lesson34.cs b/examples/NeHe/Lesson34.cs
new file mode 100644
index 0000000..7538fd1
--- /dev/null
+++ b/examples/NeHe/Lesson34.cs
@@ -0,0 +1,715 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This Code Was Created By Ben Humphrey 2001
+ *  If You've Found This Code Useful, Please Let Me Know.
+ *  Visit NeHe Productions At http://nehe.gamedev.net
+*/
+/*
+==========================================================================
+                     OpenGL Lesson 34:  Height Mapping
+==========================================================================
+
+  Authors Name: Ben Humphrey ( DigiBen )
+
+  Disclaimer:
+
+  This program may crash your system or run poorly depending on your
+  hardware.  The program and code contained in this archive was scanned
+  for virii and has passed all test before it was put online.  If you
+  use this code in project of your own, send a shout out to the author!
+
+==========================================================================
+                        NeHe Productions 1997-2004
+==========================================================================
+*/
+#endregion Original Credits / License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+using Tao.Platform.Windows;
+
+namespace NeHe {
+    #region Class Documentation
+    /// <summary>
+    ///     Lesson 34:  Height Mapping.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Ben Humphrey ( DigiBen )
+    ///         http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=34
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Morten Lerudjordet & Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public class Lesson34 : Form {
+        // --- Fields ---
+        #region Private Static Fields
+        private static IntPtr hDC;                                              // Private GDI Device Context
+        private static IntPtr hRC;                                              // Permanent Rendering Context
+        private static Form form;                                               // Our Current Windows Form
+        private static bool[] keys = new bool[256];                             // Array Used For The Keyboard Routine
+        private static bool active = true;                                      // Window Active Flag, Set To True By Default
+        private static bool fullscreen = true;                                  // Fullscreen Flag, Set To Fullscreen Mode By Default
+        private static bool done = false;                                       // Bool Variable To Exit Main Loop
+
+        private const int MAP_SIZE = 1024;                                      // Size Of Our .RAW Height Map (NEW)
+        private const int STEP_SIZE = 16;                                       // Width And Height Of Each Quad (NEW)
+        private const float HEIGHT_RATIO = 1.5f;                                // Ratio That The Y Is Scaled According To The X And Z (NEW)
+        private static bool bRender = true;                                     // Polygon Flag Set To TRUE By Default (NEW)
+        private static byte[] heightMap = new byte[MAP_SIZE * MAP_SIZE];        // Holds The Height Map Data (NEW)
+        private static float scaleValue = 0.15f;                                // Scale Value For The Terrain (NEW)
+        #endregion Private Static Fields
+
+        // --- Constructors & Destructors ---
+        #region Lesson34()
+        public Lesson34() {
+            this.CreateParams.ClassStyle = this.CreateParams.ClassStyle |       // Redraw On Size, And Own DC For Window.
+                User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);            // No Need To Erase Form Background
+            this.SetStyle(ControlStyles.DoubleBuffer, true);                    // Buffer Control
+            this.SetStyle(ControlStyles.Opaque, true);                          // No Need To Draw Form Background
+            this.SetStyle(ControlStyles.ResizeRedraw, true);                    // Redraw On Resize
+            this.SetStyle(ControlStyles.UserPaint, true);                       // We'll Handle Painting Ourselves
+
+            this.Activated += new EventHandler(this.Form_Activated);            // On Activate Event Call Form_Activated
+            this.Closing += new CancelEventHandler(this.Form_Closing);          // On Closing Event Call Form_Closing
+            this.Deactivate += new EventHandler(this.Form_Deactivate);          // On Deactivate Event Call Form_Deactivate
+            this.KeyDown += new KeyEventHandler(this.Form_KeyDown);             // On KeyDown Event Call Form_KeyDown
+            this.KeyUp += new KeyEventHandler(this.Form_KeyUp);                 // On KeyUp Event Call Form_KeyUp
+            this.MouseDown += new MouseEventHandler(this.Form_MouseDown);       // On MouseDown Even Call Form_MouseDown
+            this.Resize += new EventHandler(this.Form_Resize);                  // On Resize Event Call Form_Resize
+        }
+        #endregion Lesson34()
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     The application's entry point.
+        /// </summary>
+        /// <param name="commandLineArguments">
+        ///     Any supplied command line arguments.
+        /// </param>
+        [STAThread]
+        public static void Run() {
+            // Ask The User Which Screen Mode They Prefer
+            if(MessageBox.Show("Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
+                fullscreen = false;                                             // Windowed Mode
+            }
+
+            // Create Our OpenGL Window
+            if(!CreateGLWindow("NeHe & Ben Humphrey's Height Map Tutorial", 640, 480, 16, fullscreen)) {
+                return;                                                         // Quit If Window Was Not Created
+            }
+
+            while(!done) {                                                      // Loop That Runs While done = false
+                Application.DoEvents();                                         // Process Events
+
+                // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
+                if((active && (form != null) && !DrawGLScene()) || keys[(int) Keys.Escape]) {
+                    //  Active?  Was There A Quit Received?
+                    done = true;                                                // ESC Or DrawGLScene Signalled A Quit
+                }
+                else {                                                          // Not Time To Quit, Update Screen
+                    Gdi.SwapBuffers(hDC);                                       // Swap Buffers (Double Buffering)
+
+                    if(keys[(int) Keys.F1]) {                                   // Is F1 Being Pressed?
+                        keys[(int) Keys.F1] = false;                            // If So Make Key false
+                        KillGLWindow();                                         // Kill Our Current Window
+                        fullscreen = !fullscreen;                               // Toggle Fullscreen / Windowed Mode
+                        // Recreate Our OpenGL Window
+                        if(!CreateGLWindow("NeHe & Ben Humphrey's Height Map Tutorial", 640, 480, 16, fullscreen)) {
+                            return;                                             // Quit If Window Was Not Created
+                        }
+                        done = false;                                           // We're Not Done Yet
+                    }
+
+                    if(keys[(int) Keys.Up]) {                                   // Is the UP ARROW key Being Pressed?
+                        scaleValue += 0.001f;                                   // Increase the scale value to zoom in
+                    }
+
+                    if(keys[(int) Keys.Down]) {                                 // Is the DOWN ARROW key Being Pressed?
+                        scaleValue -= 0.001f;                                   // Decrease the scale value to zoom out
+                    }
+                }
+            }
+
+            // Shutdown
+            KillGLWindow();                                                     // Kill The Window
+            return;                                                             // Exit The Program
+        }
+        #endregion Run()
+
+        // --- Private Static Methods ---
+        #region bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+        /// <summary>
+        ///     Creates our OpenGL Window.
+        /// </summary>
+        /// <param name="title">
+        ///     The title to appear at the top of the window.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the GL window or fullscreen mode.
+        /// </param>
+        /// <param name="bits">
+        ///     The number of bits to use for color (8/16/24/32).
+        /// </param>
+        /// <param name="fullscreenflag">
+        ///     Use fullscreen mode (<c>true</c>) or windowed mode (<c>false</c>).
+        /// </param>
+        /// <returns>
+        ///     <c>true</c> on successful window creation, otherwise <c>false</c>.
+        /// </returns>
+        private static bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) {
+            int pixelFormat;                                                    // Holds The Results After Searching For A Match
+            fullscreen = fullscreenflag;                                        // Set The Global Fullscreen Flag
+            form = null;                                                        // Null The Form
+
+            GC.Collect();                                                       // Request A Collection
+            // This Forces A Swap
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+
+            if(fullscreen) {                                                    // Attempt Fullscreen Mode?
+                Gdi.DEVMODE dmScreenSettings = new Gdi.DEVMODE();               // Device Mode
+                // Size Of The Devmode Structure
+                dmScreenSettings.dmSize = (short) Marshal.SizeOf(dmScreenSettings);
+                dmScreenSettings.dmPelsWidth = width;                           // Selected Screen Width
+                dmScreenSettings.dmPelsHeight = height;                         // Selected Screen Height
+                dmScreenSettings.dmBitsPerPel = bits;                           // Selected Bits Per Pixel
+                dmScreenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
+
+                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+                if(User.ChangeDisplaySettings(ref dmScreenSettings, User.CDS_FULLSCREEN) != User.DISP_CHANGE_SUCCESSFUL) {
+                    // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
+                    if(MessageBox.Show("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card.  Use Windowed Mode Instead?", "NeHe GL",
+                        MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) {
+                        fullscreen = false;                                     // Windowed Mode Selected.  Fullscreen = false
+                    }
+                    else {
+                        // Pop up A Message Box Lessing User Know The Program Is Closing.
+                        MessageBox.Show("Program Will Now Close.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                        return false;                                           // Return false
+                    }
+                }
+            }
+
+            form = new Lesson34();                                              // Create The Window
+
+            if(fullscreen) {                                                    // Are We Still In Fullscreen Mode?
+                form.FormBorderStyle = FormBorderStyle.None;                    // No Border
+                Cursor.Hide();                                                  // Hide Mouse Pointer
+            }
+            else {                                                              // If Windowed
+                form.FormBorderStyle = FormBorderStyle.Sizable;                 // Sizable
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            form.Width = width;                                                 // Set Window Width
+            form.Height = height;                                               // Set Window Height
+            form.Text = title;                                                  // Set Window Title
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();    // pfd Tells Windows How We Want Things To Be
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                            // Size Of This Pixel Format Descriptor
+            pfd.nVersion = 1;                                                   // Version Number
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                              // Format Must Support Window
+                Gdi.PFD_SUPPORT_OPENGL |                                        // Format Must Support OpenGL
+                Gdi.PFD_DOUBLEBUFFER;                                           // Format Must Support Double Buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                          // Request An RGBA Format
+            pfd.cColorBits = (byte) bits;                                       // Select Our Color Depth
+            pfd.cRedBits = 0;                                                   // Color Bits Ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                                 // No Alpha Buffer
+            pfd.cAlphaShift = 0;                                                // Shift Bit Ignored
+            pfd.cAccumBits = 0;                                                 // No Accumulation Buffer
+            pfd.cAccumRedBits = 0;                                              // Accumulation Bits Ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = 16;                                                // 16Bit Z-Buffer (Depth Buffer)
+            pfd.cStencilBits = 0;                                               // No Stencil Buffer
+            pfd.cAuxBuffers = 0;                                                // No Auxiliary Buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                         // Main Drawing Layer
+            pfd.bReserved = 0;                                                  // Reserved
+            pfd.dwLayerMask = 0;                                                // Layer Masks Ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            hDC = User.GetDC(form.Handle);                                      // Attempt To Get A Device Context
+            if(hDC == IntPtr.Zero) {                                            // Did We Get A Device Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd);                  // Attempt To Find An Appropriate Pixel Format
+            if(pixelFormat == 0) {                                              // Did Windows Find A Matching Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) {                // Are We Able To Set The Pixel Format?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            hRC = Wgl.wglCreateContext(hDC);                                    // Attempt To Get The Rendering Context
+            if(hRC == IntPtr.Zero) {                                            // Are We Able To Get A Rendering Context?
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            if(!Wgl.wglMakeCurrent(hDC, hRC)) {                                 // Try To Activate The Rendering Context
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            form.Show();                                                        // Show The Window
+            form.TopMost = true;                                                // Topmost Window
+            form.Focus();                                                       // Focus The Window
+
+            if(fullscreen) {                                                    // This Shouldn't Be Necessary, But Is
+                Cursor.Hide();
+            }
+            ReSizeGLScene(width, height);                                       // Set Up Our Perspective GL Screen
+
+            if(!InitGL()) {                                                     // Initialize Our Newly Created GL Window
+                KillGLWindow();                                                 // Reset The Display
+                MessageBox.Show("Initialization Failed.", "ERROR",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return false;
+            }
+
+            return true;                                                        // Success
+        }
+        #endregion bool CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag)
+
+        #region bool DrawGLScene()
+        /// <summary>
+        ///     Draws everything.
+        /// </summary>
+        /// <returns>
+        ///     Returns <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool DrawGLScene() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);        // Clear The Screen And The Depth Buffer
+            Gl.glLoadIdentity();                                                // Reset The Matrix
+
+            Glu.gluLookAt(212, 60, 194, 186, 55, 171, 0, 1, 0);                 // This Determines Where The Camera's Position And View Is
+            Gl.glScalef(scaleValue, scaleValue * HEIGHT_RATIO, scaleValue);
+
+            if(!RenderHeightMap(heightMap)) {                                   // Render The Height Map
+                return false;
+            }
+            return true;                                                        // Everything Went OK
+        }
+        #endregion bool DrawGLScene()
+
+        #region int GetHeight(byte[] heightMap, int x, int y)
+        /// <summary>
+        ///     Returns the height from a height map index.
+        /// </summary>
+        /// <param name="heightMap">
+        ///     Height map data.
+        /// </param>
+        /// <param name="x">
+        ///     X coordinate value.
+        /// </param>
+        /// <param name="y">
+        ///     Y coordinate value.
+        /// </param>
+        /// <returns>
+        ///     Returns int with height data.
+        /// </returns>
+        private static int GetHeight(byte[] heightMap, int x, int y) {          // This Returns The Height From A Height Map Index
+            x = x % MAP_SIZE;                                                   // Error Check Our x Value
+            y = y % MAP_SIZE;                                                   // Error Check Our y Value
+
+            return heightMap[x + (y * MAP_SIZE)];                               // Index Into Our Height Array And Return The Height
+        }
+        #endregion int GetHeight(byte[] heightMap, int x, int y)
+
+        #region bool InitGL()
+        /// <summary>
+        ///     All setup for OpenGL goes here.
+        /// </summary>
+        /// <returns>
+        ///     Returns <c>true</c> on success, otherwise <c>false</c>.
+        /// </returns>
+        private static bool InitGL() {                                          // All Setup For OpenGL Goes Here
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                      // Enable Smooth Shading
+            Gl.glClearColor(0, 0, 0, 0.5f);                                     // Black Background
+            Gl.glClearDepth(1);                                                 // Depth Buffer Setup
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                      // Enables Depth Testing
+            Gl.glDepthFunc(Gl.GL_LEQUAL);                                       // The Type Of Depth Testing To Do
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);         // Really Nice Perspective Calculations
+
+            if(!LoadRawFile("NeHe.Lesson34.Terrain.raw", MAP_SIZE * MAP_SIZE, ref heightMap)) {
+                return false;                                                   // (NEW) Try To Open Terrain Data
+            }
+
+            return true;                                                        // Initialization Went OK
+        }
+        #endregion bool InitGL()
+
+        #region KillGLWindow()
+        /// <summary>
+        ///     Properly kill the window.
+        /// </summary>
+        private static void KillGLWindow() {
+            if(fullscreen) {                                                    // Are We In Fullscreen Mode?
+                User.ChangeDisplaySettings(IntPtr.Zero, 0);                     // If So, Switch Back To The Desktop
+                Cursor.Show();                                                  // Show Mouse Pointer
+            }
+
+            if(hRC != IntPtr.Zero) {                                            // Do We Have A Rendering Context?
+                if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) {             // Are We Able To Release The DC and RC Contexts?
+                    MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                if(!Wgl.wglDeleteContext(hRC)) {                                // Are We Able To Delete The RC?
+                    MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                hRC = IntPtr.Zero;                                              // Set RC To Null
+            }
+
+            if(hDC != IntPtr.Zero) {                                            // Do We Have A Device Context?
+                if(form != null && !form.IsDisposed) {                          // Do We Have A Window?
+                    if(form.Handle != IntPtr.Zero) {                            // Do We Have A Window Handle?
+                        if(!User.ReleaseDC(form.Handle, hDC)) {                 // Are We Able To Release The DC?
+                            MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
+                                MessageBoxButtons.OK, MessageBoxIcon.Error);
+                        }
+                    }
+                }
+
+                hDC = IntPtr.Zero;                                              // Set DC To Null
+            }
+
+            if(form != null) {                                                  // Do We Have A Windows Form?
+                form.Hide();                                                    // Hide The Window
+                form.Close();                                                   // Close The Form
+                form = null;                                                    // Set form To Null
+            }
+        }
+        #endregion KillGLWindow()
+
+        #region bool LoadRawFile(string name, int size, ref byte[] heightMap)
+        /// <summary>
+        ///     Read data from file.
+        /// </summary>
+        /// <param name="name">
+        ///     Name of file where data resides.
+        /// </param>
+        /// <param name="size">
+        ///     Size of file to be read.
+        /// </param>
+        /// <param name="heightMap">
+        ///     Where data is put when read.
+        /// </param>
+        /// <returns>
+        ///     Returns <c>true</c> if success, <c>false</c> failure.
+        /// </returns>
+        private static bool LoadRawFile(string name, int size, ref byte[] heightMap) {
+            if(name == null || name == string.Empty) {                          // Make Sure A Filename Was Given
+                return false;                                                   // If Not Return false
+            }
+
+            string fileName1 = string.Format("Data{0}{1}",                      // Look For Data\Filename
+                Path.DirectorySeparatorChar, name);
+            string fileName2 = string.Format("{0}{1}{0}{1}Data{1}{2}",          // Look For ..\..\Data\Filename
+                "..", Path.DirectorySeparatorChar, name);
+
+            // Make Sure The File Exists In One Of The Usual Directories
+            if(!File.Exists(name) && !File.Exists(fileName1) && !File.Exists(fileName2)) {
+                MessageBox.Show("Can't Find The Height Map!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+                return false;                                                   // File Could Not Be Found
+            }
+
+            if(File.Exists(fileName1)) {                                        // Does The File Exist Here?
+                name = fileName1;                                               // Set To Correct File Path
+            }
+            else if(File.Exists(fileName2)) {                                   // Does The File Exist Here?
+                name = fileName2;                                               // Set To Correct File Path
+            }
+
+            // Open The File In Read / Binary Mode
+            using(FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read)) {
+                BinaryReader r = new BinaryReader(fs);
+                heightMap = r.ReadBytes(size);
+            }
+            return true;                                                        // Found And Loaded Data In File
+        }
+        #endregion bool LoadRawFile(string name, int size, ref byte[] heightMap)
+
+        #region bool RenderHeightMap(byte[] heightMap)
+        /// <summary>
+        ///     This renders the height map as quads.
+        /// </summary>
+        /// <param name="heightMap">
+        ///     Height map data.
+        /// </param>
+        private static bool RenderHeightMap(byte[] heightMap) {                 // This Renders The Height Map As Quads
+            int X, Y;                                                           // Create Some Variables To Walk The Array With.
+            int x, y, z;                                                        // Create Some Variables For Readability
+
+            if(heightMap == null) {                                             // Make Sure Our Height Data Is Valid
+                return false;
+            }
+
+            if(bRender) {                                                       // What We Want To Render
+                Gl.glBegin(Gl.GL_QUADS);                                        // Render Polygons
+            }
+            else {
+                Gl.glBegin(Gl.GL_LINES);                                        // Render Lines Instead
+            }
+
+            for(X = 0; X < (MAP_SIZE - STEP_SIZE); X += STEP_SIZE) {
+                for (Y = 0; Y < (MAP_SIZE-STEP_SIZE); Y += STEP_SIZE) {
+                    // Get The (X, Y, Z) Value For The Bottom Left Vertex
+                    x = X;
+                    y = GetHeight(heightMap, X, Y);
+                    z = Y;
+
+                    SetVertexColor(heightMap, x, z);                            // Set The Color Value Of The Current Vertex
+                    Gl.glVertex3i(x, y, z);                                     // Send This Vertex To OpenGL To Be Rendered (Integer Points Are Faster)
+
+                    // Get The (X, Y, Z) Value For The Top Left Vertex
+                    x = X;
+                    y = GetHeight(heightMap, X, Y + STEP_SIZE);
+                    z = Y + STEP_SIZE;
+
+                    SetVertexColor(heightMap, x, z);                            // Set The Color Value Of The Current Vertex
+                    Gl.glVertex3i(x, y, z);                                     // Send This Vertex To OpenGL To Be Rendered
+
+                    // Get The (X, Y, Z) Value For The Top Right Vertex
+                    x = X + STEP_SIZE;
+                    y = GetHeight(heightMap, X + STEP_SIZE, Y + STEP_SIZE);
+                    z = Y + STEP_SIZE;
+
+                    SetVertexColor(heightMap, x, z);                            // Set The Color Value Of The Current Vertex
+                    Gl.glVertex3i(x, y, z);                                     // Send This Vertex To OpenGL To Be Rendered
+
+                    // Get The (X, Y, Z) Value For The Bottom Right Vertex
+                    x = X + STEP_SIZE;
+                    y = GetHeight(heightMap, X + STEP_SIZE, Y);
+                    z = Y;
+
+                    SetVertexColor(heightMap, x, z);                            // Set The Color Value Of The Current Vertex
+                    Gl.glVertex3i(x, y, z);                                     // Send This Vertex To OpenGL To Be Rendered
+                }
+            }
+            Gl.glEnd();
+            Gl.glColor4f(1, 1, 1, 1);                                           // Reset The Color
+            return true;                                                        // All Good
+        }
+        #endregion bool RenderHeightMap(byte[] heightMap)
+
+        #region SetVertexColor(byte[] heightMap, int x, int y)
+        /// <summary>
+        ///     Sets the color value for a particular index, depending on the height index.
+        /// </summary>
+        /// <param name="heightMap">
+        ///     Height map data.
+        /// </param>
+        /// <param name="x">
+        ///     X coordinate value.
+        /// </param>
+        /// <param name="y">
+        ///     Y coordinate value.
+        /// </param>
+        private static void SetVertexColor(byte[] heightMap, int x, int y) {
+            float fColor = -0.15f + (GetHeight(heightMap, x, y ) / 256.0f);
+            Gl.glColor3f(0, 0, fColor);                                         // Assign This Blue Shade To The Current Vertex
+        }
+        #endregion SetVertexColor(byte[] heightMap, int x, int y)
+
+        #region ReSizeGLScene(int width, int height)
+        /// <summary>
+        ///     Resizes and initializes the GL window.
+        /// </summary>
+        /// <param name="width">
+        ///     The new window width.
+        /// </param>
+        /// <param name="height">
+        ///     The new window height.
+        /// </param>
+        private static void ReSizeGLScene(int width, int height) {
+            if(height == 0) {                                                   // Prevent A Divide By Zero...
+                height = 1;                                                     // By Making Height Equal To One
+            }
+
+            Gl.glViewport(0, 0, width, height);                                 // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                                  // Select The Projection Matrix
+            Gl.glLoadIdentity();                                                // Reset The Projection Matrix
+            // Calculate The Aspect Ratio Of The Window.  Farthest Distance Changed To 500.0f (NEW)
+            Glu.gluPerspective(45, width / (double) height, 0.1, 500);          
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                                   // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                                // Reset The Modelview Matrix
+        }
+        #endregion ReSizeGLScene(int width, int height)
+
+        // --- Private Instance Event Handlers ---
+        #region Form_Activated
+        /// <summary>
+        ///     Handles the form's activated event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Activated(object sender, EventArgs e) {
+            active = true;                                                      // Program Is Active
+        }
+        #endregion Form_Activated
+
+        #region Form_Closing(object sender, CancelEventArgs e)
+        /// <summary>
+        ///     Handles the form's closing event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Closing(object sender, CancelEventArgs e) {
+            done = true;                                                        // Send A Quit Message
+        }
+        #endregion Form_Closing(object sender, CancelEventArgs e)
+
+        #region Form_Deactivate(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's deactivate event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Deactivate(object sender, EventArgs e) {
+            active = false;                                                     // Program Is No Longer Active
+        }
+        #endregion Form_Deactivate(object sender, EventArgs e)
+
+        #region Form_KeyDown(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyDown(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = true;                                            // Key Has Been Pressed, Mark It As true
+        }
+        #endregion Form_KeyDown(object sender, KeyEventArgs e)
+
+        #region Form_KeyUp(object sender, KeyEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_KeyUp(object sender, KeyEventArgs e) {
+            keys[e.KeyValue] = false;                                           // Key Has Been Released, Mark It As false
+        }
+        #endregion Form_KeyUp(object sender, KeyEventArgs e)
+
+        #region Form_MouseDown(object sender, MouseEventArgs e)
+        /// <summary>
+        ///     Handles the form's key down event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        public void Form_MouseDown(object sender, MouseEventArgs e) {
+            if(e.Button == MouseButtons.Left) {
+                bRender = !bRender;                                             // Change The Rendering State Between Fill And Wireframe
+            }
+        }
+        #endregion Form_MouseDown(object sender, MouseEventArgs e)
+
+        #region Form_Resize(object sender, EventArgs e)
+        /// <summary>
+        ///     Handles the form's resize event.
+        /// </summary>
+        /// <param name="sender">
+        ///     The event sender.
+        /// </param>
+        /// <param name="e">
+        ///     The event arguments.
+        /// </param>
+        private void Form_Resize(object sender, EventArgs e) {
+            ReSizeGLScene(form.Width, form.Height);                             // Resize The OpenGL Window
+        }
+        #endregion Form_Resize(object sender, EventArgs e)
+    }
+}
diff --git a/examples/NeHe/Makefile.am b/examples/NeHe/Makefile.am
new file mode 100644
index 0000000..e303a4f
--- /dev/null
+++ b/examples/NeHe/Makefile.am
@@ -0,0 +1,51 @@
+
+PROGRAM = NeHe
+PACKAGES =
+BINARY_LIBS = \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll \
+        Tao.Platform.Windows.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+RESX = NeHe.resx
+RESOURCES = $(PROGRAM).NeHe.resources
+SOURCES = \
+        NeHe.cs \
+        Lesson01.cs \
+        Lesson02.cs \
+        Lesson03.cs \
+        Lesson04.cs \
+        Lesson05.cs \
+        Lesson06.cs \
+        Lesson07.cs \
+        Lesson08.cs \
+        Lesson09.cs \
+        Lesson10.cs \
+        Lesson11.cs \
+        Lesson12.cs \
+        Lesson13.cs \
+        Lesson14.cs \
+        Lesson15.cs \
+        Lesson16.cs \
+        Lesson17.cs \
+        Lesson18.cs \
+        Lesson19.cs \
+        Lesson20.cs \
+        Lesson21.cs \
+        Lesson23.cs \
+        Lesson25.cs \
+        Lesson26.cs \
+        Lesson34.cs \
+        NeHe.Designer.cs \
+        Program.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.FreeGlut/Tao.FreeGlut.snk
+
+$(PROGRAM).NeHe.resources: NeHe.resx
+	$(RESGEN) $< $@
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/NeHe/Makefile.in b/examples/NeHe/Makefile.in
new file mode 100644
index 0000000..a30971f
--- /dev/null
+++ b/examples/NeHe/Makefile.in
@@ -0,0 +1,399 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/NeHe
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = NeHe
+PACKAGES = 
+BINARY_LIBS = \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll \
+        Tao.Platform.Windows.dll
+
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+
+RESX = NeHe.resx
+RESOURCES = $(PROGRAM).NeHe.resources
+SOURCES = \
+        NeHe.cs \
+        Lesson01.cs \
+        Lesson02.cs \
+        Lesson03.cs \
+        Lesson04.cs \
+        Lesson05.cs \
+        Lesson06.cs \
+        Lesson07.cs \
+        Lesson08.cs \
+        Lesson09.cs \
+        Lesson10.cs \
+        Lesson11.cs \
+        Lesson12.cs \
+        Lesson13.cs \
+        Lesson14.cs \
+        Lesson15.cs \
+        Lesson16.cs \
+        Lesson17.cs \
+        Lesson18.cs \
+        Lesson19.cs \
+        Lesson20.cs \
+        Lesson21.cs \
+        Lesson23.cs \
+        Lesson25.cs \
+        Lesson26.cs \
+        Lesson34.cs \
+        NeHe.Designer.cs \
+        Program.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.FreeGlut/Tao.FreeGlut.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/NeHe/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/NeHe/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).NeHe.resources: NeHe.resx
+	$(RESGEN) $< $@
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/NeHe/NeHe.Designer.cs b/examples/NeHe/NeHe.Designer.cs
new file mode 100644
index 0000000..d13a3e4
--- /dev/null
+++ b/examples/NeHe/NeHe.Designer.cs
@@ -0,0 +1,106 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+namespace NeHe
+{
+    partial class NeHe
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NeHe));
+            this.lstExamples = new System.Windows.Forms.ListBox();
+            this.btnRun = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // lstExamples
+            // 
+            this.lstExamples.FormattingEnabled = true;
+            this.lstExamples.Location = new System.Drawing.Point(13, 13);
+            this.lstExamples.Name = "lstExamples";
+            this.lstExamples.Size = new System.Drawing.Size(258, 173);
+            this.lstExamples.Sorted = true;
+            this.lstExamples.TabIndex = 0;
+            this.lstExamples.DoubleClick += new System.EventHandler(this.lstExamples_SelectedIndexChanged);
+            // 
+            // btnRun
+            // 
+            this.btnRun.Location = new System.Drawing.Point(94, 192);
+            this.btnRun.Name = "btnRun";
+            this.btnRun.Size = new System.Drawing.Size(95, 23);
+            this.btnRun.TabIndex = 1;
+            this.btnRun.Text = "Run";
+            this.btnRun.UseVisualStyleBackColor = true;
+            this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+            // 
+            // NeHe
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(283, 224);
+            this.Controls.Add(this.btnRun);
+            this.Controls.Add(this.lstExamples);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "NeHe";
+            this.Text = "NeHeExamples";
+            this.Load += new System.EventHandler(this.frmExamples_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ListBox lstExamples;
+        private System.Windows.Forms.Button btnRun;
+    }
+}
+
diff --git a/examples/NeHe/NeHe.cs b/examples/NeHe/NeHe.cs
new file mode 100644
index 0000000..730d062
--- /dev/null
+++ b/examples/NeHe/NeHe.cs
@@ -0,0 +1,82 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace NeHe
+{
+    public partial class NeHe : Form
+    {
+        public NeHe()
+        {
+            InitializeComponent();
+        }
+
+        private void frmExamples_Load(object sender, EventArgs e)
+        {
+            Type[] types = Assembly.GetExecutingAssembly().GetTypes();
+            foreach (Type type in types)
+            {
+                MemberInfo[] runMethods = type.GetMember("Run");
+                foreach (MemberInfo run in runMethods)
+                {
+                    lstExamples.Items.Add(type.Name);
+                }
+                if (lstExamples.Items.Count > 0)
+                {
+                    this.lstExamples.SelectedIndex = 0;
+                }
+            }
+        }
+
+        private void btnRun_Click(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+
+        private void SelectExample()
+        {
+            if (lstExamples.SelectedItem != null)
+            {
+                Type example = Assembly.GetExecutingAssembly().GetType("NeHe." + lstExamples.SelectedItem.ToString(), true, true);
+                example.InvokeMember("Run", BindingFlags.InvokeMethod, null, null, null);
+            }
+        }
+
+        private void lstExamples_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+    }
+}
diff --git a/examples/NeHe/NeHe.csproj b/examples/NeHe/NeHe.csproj
new file mode 100644
index 0000000..f733031
--- /dev/null
+++ b/examples/NeHe/NeHe.csproj
@@ -0,0 +1,207 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{FCC053CE-BC45-4687-84BF-8F8B731089ED}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>NeHe</AssemblyName>
+    <AssemblyOriginatorKeyFile>../../src/Tao.OpenGl/Tao.OpenGl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>NeHe</RootNamespace>
+    <StartupObject>NeHe.Program</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.FreeGlut\Tao.FreeGlut.csproj">
+      <Name>Tao.FreeGlut</Name>
+      <Project>{87C95364-7158-4D81-83B8-97B649E27ABA}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.Platform.Windows\Tao.Platform.Windows.csproj">
+      <Name>Tao.Platform.Windows</Name>
+      <Project>{228201EB-1A36-4E25-B59F-52255CBBE270}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="NeHe.resx">
+      <DependentUpon>NeHe.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="NeHe.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson01.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson02.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson03.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson04.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson05.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson06.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson07.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson08.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson09.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson10.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson11.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson12.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson13.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson14.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson15.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson16.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson17.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson18.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson19.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson20.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson21.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson23.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson25.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson26.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Lesson34.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="NeHe.Designer.cs">
+      <DependentUpon>NeHe.cs</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/NeHe/NeHe.resx b/examples/NeHe/NeHe.resx
new file mode 100644
index 0000000..06ec7be
--- /dev/null
+++ b/examples/NeHe/NeHe.resx
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAChl4QAopiGAKOZhgCjmYcAo5mIAKSahwCkmogApZuJAKaciQCmnIoAppyLAKiejACpn44ArKKRAK2j
+        kgCupZUAr6eXALGomACzqZkAsamaALOqmQCyqpsAtKuaALSsnQC0rJ4Atq2eALmxogC7s6UAvbSkALu0
+        pgC+t6sAwbuvAMW8rQDIv7AAycCxAMvFuwDLxrsA08y+ANDMwwDRzcQA08/GANfQwwDa08YA29THANfT
+        ywDY1MwA3dbKAODe2QDi4NoA5OHbAOPh3ADk4dwA5OLdAOTj3gDw6t8A7OnmAO7t6gDx8e8A9fXzAPX2
+        9AD4+fgA+fn4APj6+QD8/v4A/f//AP7//wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAQ0NDQ0NDQ0NDQ0NDMBcDDAwDFzFDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0M3Bw8cAAAAAAAAACsD
+        N0NDQ0NDQ0NDQ0NDQ0NDQ0NDFCctAAAAAAAAAAAAAAAAFENDQ0NDQ0NDQ0NDQ0NDERtAJgAAAAAAAAAA
+        AAAAAAAAABtDQ0NDQ0NDQ0NDQwY+QEAAAAAAAAAAAAAAAAAAAAAAAANDQ0NDQ0NDQ0MGQkBAEAAAAAAA
+        AAAAAAAAAAAAAAAAAAVDQ0NDQ0NDGz1AQEAgAAAAAAAAAAAAAAAAAAAAAAAAABFDQ0NDQ0MdQEBAQCkA
+        AAAAAAA0NQAAAAAAAAAAAAAAAENDQ0NDFkBAQEBAAAAAAAAAGkBAGgAAAAAAAAAAAAAAFENDQzknQEBA
+        QEAlAAAAAAAABwYAAAAAAAAAAAAAAAAAN0NDBkBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQ0MA
+        QEBAQEBAOAAAAAAAAAAAAAAAAAAAAAAAAAAAACtDMTJAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ADEZQkBAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAAFwNAQEBAQEBAQEBAJAAAAAAAAAAAAAAAAAAA
+        AAAAAAAEDkBAQEBAQEBAQEBAQRohAAAAAAAAAAAAAAAAAAAAAAwNQEBAQEBAQEBAQEBAQEA8IwsAAAAA
+        AAAAAAAAAAAADAVAQEBAQEBAQEBAQEBAQEBAQEEJAAAAAAAAAAAAAAADF0JAQEBAQEBAQEBAQEBAQEBA
+        QEA7AAAAAAAAAAAAABcwMEBAQEBAQEBAQEBAQEBAQEBAQEBALgAAAAAAAAAAMUMAQEBAQEBAQEBAQEBA
+        QEBAQEBAQEAtAAAAAAAAACtDQwhAQEBAQEBAQEBAQEBAQEBAQEBAQEAiAAAAAAAAA0NDNydAQEBAQEBA
+        QEBAQEAHCkBAQEBAQAEAAAAAAAA3Q0NDFkBAQEBAQEBAQEBAHjY2HkBAQEBAEwAAAAAAEkNDQ0NDHUBA
+        QEBAQEBAQEA/KipBQEBAQEATAAAAAABDQ0NDQ0MSPUBAQEBAQEBAQEBAQEBAQEBAQAwAAAAAG0NDQ0ND
+        Q0MHQkBAQEBAQEBAQEBAQEBAQEBBAAAAAAJDQ0NDQ0NDQ0MGPkBAQEBAQEBAQEBAQEBAQBEAAAADQ0ND
+        Q0NDQ0NDQ0MRGEBAQEBAQEBAQEBAQEA6AAAAG0NDQ0NDQ0NDQ0NDQ0NDFShBQEBAQEBAQEBAHwAAFEND
+        Q0NDQ0NDQ0NDQ0NDQ0NDNwYALEJAQEBALxIrAzdDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzFwYNDQMXMUND
+        Q0NDQ0NDQ0NDQ//wD///gAH//wAA//wAAD/4AAAf8AAAD+AAAAfgAAAHwAAAA4AAAAGAAAABgAAAAQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA+AAAAfgAAAH8AAAD/gA
+        AB/8AAA//wAA//+AAf//8A//
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/examples/NeHe/NeHe.sh b/examples/NeHe/NeHe.sh
new file mode 100755
index 0000000..012ac2a
--- /dev/null
+++ b/examples/NeHe/NeHe.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./NeHe.exe "$@"
diff --git a/examples/NeHe/Program.cs b/examples/NeHe/Program.cs
new file mode 100644
index 0000000..de93bc3
--- /dev/null
+++ b/examples/NeHe/Program.cs
@@ -0,0 +1,47 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace NeHe
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new NeHe());
+        }
+    }
+}
diff --git a/examples/NeHe/Properties/AssemblyInfo.cs b/examples/NeHe/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..6869447
--- /dev/null
+++ b/examples/NeHe/Properties/AssemblyInfo.cs
@@ -0,0 +1,60 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework - http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright �2003-2005 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("NeHe")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("NeHe examples")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+
+[assembly: AssemblyKeyName("")]
+#if DEBUG
+[assembly: AssemblyProduct("NeHe Examples *** Debug Build ***")]
+#else
+[assembly: AssemblyProduct("NeHe Examples")]
+#endif
+[assembly: AssemblyTitle("NeHe examples")]
+[assembly: AssemblyTrademark("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/NeHe/README b/examples/NeHe/README
new file mode 100644
index 0000000..66a798f
--- /dev/null
+++ b/examples/NeHe/README
@@ -0,0 +1,20 @@
+NeHe
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are C# ports of examples found at http://nehe.gamedev.net.
+They make use of Windows API calls.
+
+These examples are well documented, however, do not take them to be 'best
+practices' for .NET OpenGL development.  The intent of these ports is as
+an introduction or as a comparison against the original native versions.
+
+Randy Ridge
+http://www.taoframework.com
+
+
+Change Log:
+
+April 25, 2004
+    Initial release, version 1.0.0.0.
diff --git a/examples/OdeExamples/Basic.cs b/examples/OdeExamples/Basic.cs
new file mode 100644
index 0000000..469c10c
--- /dev/null
+++ b/examples/OdeExamples/Basic.cs
@@ -0,0 +1,129 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ *  This code is roughly a port of:
+ *  http://pyode.sourceforge.net/tutorials/tutorial1.html
+ *  by Matthias Baas
+*/
+#endregion Original Credits / License
+
+using System;
+using Tao.Ode;
+
+namespace OdeExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     Basic: A basic ODE example.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         This tutorial shows you the very basics of ODE: creating a world including
+    ///         a rigid body and doing a simulation loop. The example program does without
+    ///         any fancy graphics output, but just displays the bare numbers. Adding eye
+    ///         catchy 3D graphics is left as an exercise for the reader.
+    ///     </para>
+    ///     <para>
+    ///         Original Author:    Matthias Baas
+    ///         http://pyode.sourceforge.net/tutorials/tutorial1.html
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Basic {
+        #region Main()
+        /// <summary>
+        ///     Application's entry point.
+        /// </summary>
+        public static void Main() {
+            // Create a world
+            IntPtr world = Ode.dWorldCreate();
+
+            // Add gravity to the world (pull down on the Y axis 9.81 meters/second
+            Ode.dWorldSetGravity(world, 0, -9.81f, 0);
+
+            // Create a rigid body (in the world)
+            IntPtr body = Ode.dBodyCreate(world);
+
+            // Create some mass, we're creating a sphere with a radius of 0.05 centimeters
+            // and a constant density of 2500 (about that of glass)
+            Ode.dMass mass = new Ode.dMass();
+            Ode.dMassSetSphere(ref mass, 2500, 0.05f);
+
+            // If you printed the values of mass now, you'd see the mass would be about 1.3 kilograms
+            // We'll change that to 1 kilogram here
+            mass.mass = 1;
+            // If you printed the values of mass now, you'd notice that the inertia tensions values
+            // were also updated
+
+            // We'll set the body's mass to the mass we just created
+            Ode.dBodySetMass(body, ref mass);
+
+            // Set the body's position (in the world) to 2 meters above the 'ground'
+            Ode.dBodySetPosition(body, 0, 2, 0);
+
+            // Apply a force to the body, we're sending it vertical, up the Y axis
+            // This force is only applied for the first step, forces will be reset to zero
+            // at the end of each step
+            Ode.dBodyAddForce(body, 0, 200, 0);
+
+            // The simulation loop's 'time', in seconds
+            float time = 0;
+
+            // The 'time' increment, in seconds
+            float deltaTime = 0.04f;
+
+            // Run the simulation loop for 2 seconds
+            while(time < 2) {
+                // Get the body's current position
+                Ode.dVector3 position = Ode.dBodyGetPosition(body);
+
+                // Get the body's current linear velocity
+				Ode.dVector3 velocity = Ode.dBodyGetLinearVel(body);
+				
+                // Print out the 'time', the body's position, and its velocity
+                Console.WriteLine("{0:0.00} sec: pos=({1:0.00}, {2:0.00}, {3:0.00})  vel={4:0.00}, {5:0.00}, {6:0.00})",
+                    time, position[0], position[1], position[2], velocity[0], velocity[1], velocity[2]);
+
+                // Move the bodies in the world
+                Ode.dWorldStep(world, deltaTime);
+
+                // Increment the time
+                time += deltaTime;
+            }
+
+            Console.WriteLine();
+            Console.WriteLine("Press Enter to exit...");
+            Console.ReadLine();
+        }
+        #endregion Main()
+    }
+}
diff --git a/examples/OdeExamples/COPYING b/examples/OdeExamples/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/OdeExamples/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/OdeExamples/Makefile.am b/examples/OdeExamples/Makefile.am
new file mode 100644
index 0000000..9aa47c5
--- /dev/null
+++ b/examples/OdeExamples/Makefile.am
@@ -0,0 +1,18 @@
+
+PROGRAM = OdeExamples
+PACKAGES =
+BINARY_LIBS = Tao.Ode.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+RESX =
+RESOURCES =
+SOURCES = \
+        Basic.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.Ode/Tao.Ode.snk
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/OdeExamples/Makefile.in b/examples/OdeExamples/Makefile.in
new file mode 100644
index 0000000..6831ec1
--- /dev/null
+++ b/examples/OdeExamples/Makefile.in
@@ -0,0 +1,365 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/OdeExamples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = OdeExamples
+PACKAGES = 
+BINARY_LIBS = Tao.Ode.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+
+RESX = 
+RESOURCES = 
+SOURCES = \
+        Basic.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.Ode/Tao.Ode.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/OdeExamples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/OdeExamples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/OdeExamples/OdeExamples.csproj b/examples/OdeExamples/OdeExamples.csproj
new file mode 100644
index 0000000..a6a037c
--- /dev/null
+++ b/examples/OdeExamples/OdeExamples.csproj
@@ -0,0 +1,143 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F4D6DE83-4CC0-43A0-8796-1279B4B5F26F}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>OdeExamples</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.Ode.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>OdeExamples</RootNamespace>
+    <StartupObject>OdeExamples.Basic</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Basic.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.Ode.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.Ode\Tao.Ode.csproj">
+      <Project>{FF441462-B6DB-480C-844B-1281C439D514}</Project>
+      <Name>Tao.Ode</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/OdeExamples/OdeExamples.sh b/examples/OdeExamples/OdeExamples.sh
new file mode 100755
index 0000000..9085b20
--- /dev/null
+++ b/examples/OdeExamples/OdeExamples.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./OdeExamples.exe "$@"
diff --git a/examples/OdeExamples/Properties/AssemblyInfo.cs b/examples/OdeExamples/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..e1bed40
--- /dev/null
+++ b/examples/OdeExamples/Properties/AssemblyInfo.cs
@@ -0,0 +1,59 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework - http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright �2003-2005 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("OdeExamples.Basic")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("A basic ODE example.")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+[assembly: AssemblyKeyName("")]
+#if DEBUG
+[assembly: AssemblyProduct("OdeExamples.Basic.exe *** Debug Build ***")]
+#else
+[assembly: AssemblyProduct("OdeExamples.Basic.exe")]
+#endif
+[assembly: AssemblyTitle("A basic ODE example.")]
+[assembly: AssemblyTrademark("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/OdeExamples/README b/examples/OdeExamples/README
new file mode 100644
index 0000000..59b07a4
--- /dev/null
+++ b/examples/OdeExamples/README
@@ -0,0 +1,17 @@
+OdeExamples
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Various ODE examples taken from all around, see the info in the source files.
+
+These examples use Tao.Ode, Tao.DevIl, Tao.FreeGlut, and Tao.OpenGl.  Make
+sure you have the appropriate native libraries for your system installed.
+
+Randy Ridge
+http://www.taoframework.com
+
+Change Log:
+
+December 07, 2004
+    Initial release, version 1.0.0.0.
diff --git a/examples/OpenAlExamples/Boxes.cs b/examples/OpenAlExamples/Boxes.cs
new file mode 100644
index 0000000..0402782
--- /dev/null
+++ b/examples/OpenAlExamples/Boxes.cs
@@ -0,0 +1,317 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+// http://www.dev-gallery.com
+#endregion Original Credits / License
+
+using System;
+using System.IO;
+using System.Text;
+using Tao.FreeGlut;
+using Tao.OpenAl;
+using Tao.OpenGl;
+
+namespace OpenAlExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     Using OpenAL (Open Audio Library) and OpenGL to create a 3D application with 3D sound
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    http://www.dev-gallery.com
+    ///         http://www.dev-gallery.com/programming/openAL/basic/basicOpenAL_1.htm
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    ///     <para>
+    ///         The author's original code had many ifdefs for linux/windows specific things.
+    ///         Using the Tao implementation of OpenAL this should not be necessary.  Also,
+    ///         the author used some IASIG methods from OpenAL to set some environments up on
+    ///         Windows.  These are poorly documented by OpenAL and I'm not sure what state
+    ///         they're in currently, so I've left them out here.
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Boxes {
+        // --- Fields ---
+        #region Private Constants
+        private const int NUM_BUFFERS = 3;
+        private const int NUM_SOURCES = 3;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static float[] listenerPosition = {0, 0, 4};
+        private static float[] listenerVelocity = {0, 0, 0};
+        private static float[] listenerOrientation = {0, 0, -1, 0, 1, 0};
+        private static float[] redPosition = {-2, 0, 0};
+        private static float[] redVelocity = {0, 0, 0};
+        private static float[] greenPosition = {2, 0, 0};
+        private static float[] greenVelocity = {0, 0, 0};
+        private static float[] bluePosition = {0, 0, -4};
+        private static float[] blueVelocity = {0, 0, 0};
+        private static int[] buffer = new int[NUM_BUFFERS];
+        private static int[] source = new int[NUM_SOURCES];
+        private static int window;
+        private static int size;
+        private static float frequency;
+        private static int format;
+        private static IntPtr data = IntPtr.Zero;
+        //private static int loop;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+		/// <summary>
+		/// 
+		/// </summary>
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DEPTH | Glut.GLUT_DOUBLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(400, 400);
+            Alut.alutInit();
+            window = Glut.glutCreateWindow("OpenAL & OpenGL | www.dev-gallery.com");
+            Init();
+            Console.WriteLine("Controls:");
+            Console.WriteLine("1: Activate Red Sound");
+            Console.WriteLine("2: Activate Green Sound");
+            Console.WriteLine("3: Activate Blue Sound");
+            Console.WriteLine("4: Deactivate Red Sound");
+            Console.WriteLine("5: Deactivate Green Sound");
+            Console.WriteLine("6: Deactivate Blue Sound");
+            Console.WriteLine("W: Move Forward");
+            Console.WriteLine("A: Move Left");
+            Console.WriteLine("S: Move Backward");
+            Console.WriteLine("D: Move Right");
+            Console.WriteLine("ESC: Exit");
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Lesson Methods ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glPushMatrix();
+                Gl.glRotatef(20, 1, 1, 0);
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(redPosition[0], redPosition[1], redPosition[2]);
+                    Gl.glColor3f(1, 0, 0);
+                    Glut.glutWireCube(0.5);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(greenPosition[0], greenPosition[1], greenPosition[2]);
+                    Gl.glColor3f(0, 1, 0);
+                    Glut.glutWireCube(0.5);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(bluePosition[0], bluePosition[1], bluePosition[2]);
+                    Gl.glColor3f(0, 0, 1);
+                    Glut.glutWireCube(0.5);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(listenerPosition[0], listenerPosition[1], listenerPosition[2]);
+                    Gl.glColor3f(1, 1, 1);
+                    Glut.glutWireCube(0.5);
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region string FindFile(string fileName)
+        private static string FindFile(string fileName) {
+            string originalName = fileName;
+
+            string filePath = Path.Combine("..", "..");
+            string fileDirectory = "Data";
+
+            if (File.Exists(fileName))
+            {
+                filePath = "";
+                fileDirectory = "";
+            }
+            else if (File.Exists(Path.Combine(fileDirectory, fileName)))
+            {
+                filePath = "";
+            }
+            //else {
+            //    Console.WriteLine("Could not locate file: " + originalName);
+            //    return null;
+            //}
+            return Path.Combine(Path.Combine(filePath, fileDirectory), fileName);
+        }
+        #endregion string FindFile(string fileName)
+
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+            Al.alListenerfv(Al.AL_POSITION, listenerPosition);
+            Al.alListenerfv(Al.AL_VELOCITY, listenerVelocity);
+            Al.alListenerfv(Al.AL_ORIENTATION, listenerOrientation);
+
+            Al.alGetError();
+            Al.alGenBuffers(NUM_BUFFERS, buffer);
+            if(Al.alGetError() != Al.AL_NO_ERROR) {
+                Console.WriteLine("Error creating buffers.");
+                Environment.Exit(-1);
+            }
+
+            string fileName = "";
+            fileName = FindFile("OpenAlExamples.Boxes.C.wav");
+            if(fileName == null) {
+                Environment.Exit(-1);
+            }
+            data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+			Al.alBufferData(buffer[0], format, data, size, (int)frequency);
+            //Alut.alutUnloadWAV(format, out data, size, frequency);
+
+            fileName = FindFile("OpenAlExamples.Boxes.B.wav");
+            if(fileName == null) {
+                Environment.Exit(-1);
+            }
+            data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+            Al.alBufferData(buffer[1], format, data, size, (int)frequency);
+            //Alut.alutUnloadWAV(format, out data, size, frequency);
+
+            fileName = FindFile("OpenAlExamples.Boxes.A.wav");
+            if(fileName == null) {
+                Environment.Exit(-1);
+            }
+            data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+            Al.alBufferData(buffer[2], format, data, size, (int)frequency);
+            //Alut.alutUnloadWAV(format, out data, size, frequency);
+
+            Al.alGetError();
+            Al.alGenSources(NUM_SOURCES, source);
+            if(Al.alGetError() != Al.AL_NO_ERROR) {
+                Console.WriteLine("Error creating sources.");
+                Environment.Exit(-1);
+            }
+
+            Al.alSourcef(source[0], Al.AL_PITCH, 1.0f);
+            Al.alSourcef(source[0], Al.AL_GAIN, 1.0f);
+            Al.alSourcefv(source[0], Al.AL_POSITION, redPosition);
+            Al.alSourcefv(source[0], Al.AL_VELOCITY, redVelocity);
+            Al.alSourcei(source[0], Al.AL_BUFFER, buffer[0]);
+            Al.alSourcei(source[0], Al.AL_LOOPING, Al.AL_TRUE);
+
+            Al.alSourcef(source[1], Al.AL_PITCH, 1.0f);
+            Al.alSourcef(source[1], Al.AL_GAIN, 1.0f);
+            Al.alSourcefv(source[1], Al.AL_POSITION, greenPosition);
+            Al.alSourcefv(source[1], Al.AL_VELOCITY, greenVelocity);
+            Al.alSourcei(source[1], Al.AL_BUFFER, buffer[1]);
+            Al.alSourcei(source[1], Al.AL_LOOPING, Al.AL_TRUE);
+
+            Al.alSourcef(source[2], Al.AL_PITCH, 1.0f);
+            Al.alSourcef(source[2], Al.AL_GAIN, 1.0f);
+            Al.alSourcefv(source[2], Al.AL_POSITION, bluePosition);
+            Al.alSourcefv(source[2], Al.AL_VELOCITY, blueVelocity);
+            Al.alSourcei(source[2], Al.AL_BUFFER, buffer[2]);
+            Al.alSourcei(source[2], Al.AL_LOOPING, Al.AL_TRUE);
+        }
+        #endregion Init()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) '1':
+                    Al.alSourcePlay(source[0]);
+                    break;
+                case (byte) '2':
+                    Al.alSourcePlay(source[1]);
+                    break;
+                case (byte) '3':
+                    Al.alSourcePlay(source[2]);
+                    break;
+                case (byte) '4':
+                    Al.alSourceStop(source[0]);
+                    break;
+                case (byte) '5':
+                    Al.alSourceStop(source[1]);
+                    break;
+                case (byte) '6':
+                    Al.alSourceStop(source[2]);
+                    break;
+                case (byte) 'w':
+                case (byte) 'W':
+                    listenerPosition[2] -= 0.1f;
+                    Al.alListenerfv(Al.AL_POSITION, listenerPosition);
+                    break;
+                case (byte) 'a':
+                case (byte) 'A':
+                    listenerPosition[0] -= 0.1f;
+                    Al.alListenerfv(Al.AL_POSITION, listenerPosition);
+                    break;
+                case (byte) 's':
+                case (byte) 'S':
+                    listenerPosition[2] += 0.1f;
+                    Al.alListenerfv(Al.AL_POSITION, listenerPosition);
+                    break;
+                case (byte) 'd':
+                case (byte) 'D':
+                    listenerPosition[0] += 0.1f;
+                    Al.alListenerfv(Al.AL_POSITION, listenerPosition);
+                    break;
+                case 27:
+                    Al.alSourceStop(source[2]);
+                    Al.alSourceStop(source[1]);
+                    Al.alSourceStop(source[0]);
+                    Alut.alutExit();
+                    Glut.glutDestroyWindow(window);
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+            Glut.glutPostRedisplay();
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float)w / (float) h, 1.0, 30.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -6.6f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/OpenAlExamples/COPYING b/examples/OpenAlExamples/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/OpenAlExamples/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/OpenAlExamples/Lesson01.cs b/examples/OpenAlExamples/Lesson01.cs
new file mode 100644
index 0000000..bfa3d00
--- /dev/null
+++ b/examples/OpenAlExamples/Lesson01.cs
@@ -0,0 +1,229 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+// Jesse Maurais (lightonthewater at hotmail.com)
+#endregion Original Credits / License
+
+using System;
+using System.IO;
+using Tao.OpenAl;
+
+namespace OpenAlExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     OpenAL Lesson 1: Simple Static Sound
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jesse Maurais
+    ///         http://devmaster.net/articles/openal-tutorials/lesson1.php
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson01 {
+        // --- Fields ---
+        #region Private Fields
+        /*
+         * These are OpenAL "names" (or "objects"). They store and id of a buffer
+         * or a source object. Generally you would expect to see the implementation
+         * use values that scale up from '1', but don't count on it. The spec does
+         * not make this mandatory (as it is OpenGL). The id's can easily be memory
+         * pointers as well. It will depend on the implementation.
+         */
+        private static int buffer;                                          // Buffers to hold sound data.
+        private static int source;                                          // Sources are points of emitting sound.
+
+        /*
+         * These are 3D cartesian vector coordinates. A structure or class would be
+         * a more flexible of handling these, but for the sake of simplicity we will
+         * just leave it as is.
+         */
+        private static float[] sourcePosition = {0, 0, 0};                  // Position of the source sound.
+        private static float[] sourceVelocity = {0, 0, 0};                  // Velocity of the source sound.
+        private static float[] listenerPosition = {0, 0, 0};                // Position of the Listener.
+        private static float[] listenerVelocity = {0, 0, 0};                // Velocity of the Listener.
+        
+        // Orientation of the Listener. (first 3 elements are "at", second 3 are "up")
+        // Also note that these should be units of '1'.
+        private static float[] listenerOrientation = {0, 0, -1, 0, 1, 0};
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+		/// <summary>
+		/// 
+		/// </summary>
+        public static void Run() {
+            Console.WriteLine("MindCode's OpenAL Lesson 1: Single Static Source");
+            Console.WriteLine();
+            Console.WriteLine("Controls (followed by Enter):");
+            Console.WriteLine("p) Play");
+            Console.WriteLine("s) Stop");
+            Console.WriteLine("h) Hold (pause)");
+            Console.WriteLine("q) Quit");
+            Console.WriteLine();
+
+            // Initialize OpenAL and clear the error bit.
+            Alut.alutInit();
+            Al.alGetError();
+
+            // Load the wav data.
+            if(!LoadALData()) {
+                Console.WriteLine("Error loading data.");
+                return;
+            }
+
+            // Initialize the listener in OpenAL.
+            SetListenerValues();
+
+            // Loop.
+            char c = ' ';
+            while(c != 'q' && c != 'Q') {
+                c = (char) Console.Read();
+                switch(c) {
+                    // Pressing 'p' will begin playing the sample.
+                    case 'p':
+                    case 'P':
+                        Al.alSourcePlay(source);
+                        break;
+                    // Pressing 's' will stop the sample from playing.
+                    case 's':
+                    case 'S':
+                        Al.alSourceStop(source);
+                        break;
+                    // Pressing 'h' will pause the sample.
+                    case 'h':
+                    case 'H':
+                        Al.alSourcePause(source);
+                        break;
+                }
+            }
+
+            // Exit procedure to clean up and free OpenAL resources.
+            KillALData();
+        }
+        #endregion Run()
+
+        // --- Lesson Methods ---
+        #region KillALData()
+        /*
+         * We have allocated memory for our buffers and sources which needs
+         * to be returned to the system. This function frees that memory.
+         */
+        private static void KillALData() {
+            Al.alDeleteBuffers(1, ref buffer);
+            Al.alDeleteSources(1, ref source);
+            Alut.alutExit();
+        }
+        #endregion KillALData()
+
+        #region bool LoadALData()
+        /*
+         * This function will load our sample data from the disk using the Alut
+         * utility and send the data into OpenAL as a buffer. A source is then
+         * also created to play that buffer.
+         */
+        private static bool LoadALData() {
+            // Variables to load into.
+            int format;
+            int size;
+            IntPtr data = IntPtr.Zero;
+            float frequency;
+            //int loop;
+
+            // Generate an OpenAL buffer.
+            Al.alGenBuffers(1, out buffer);
+            if(Al.alGetError() != Al.AL_NO_ERROR) {
+                return false;
+            }
+
+            // Attempt to locate the file.
+            string fileName = "OpenAlExamples.Lesson01.FancyPants.wav";
+            if(File.Exists(fileName)) {
+                //fileName = fileName;
+            }
+            else if(File.Exists("Data/" + fileName)) {
+                fileName = "Data/" + fileName;
+            }
+            else if(File.Exists("../../Data/" + fileName)) {
+                fileName = "../../Data/" + fileName;
+            }
+            else {
+                return false;
+            }
+
+            // Load wav.
+            data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+            if(data == IntPtr.Zero) {
+                return false;
+            }
+
+            // Load wav data into the generated buffer.
+            Al.alBufferData(buffer, format, data, size, (int)frequency);
+           // Alut.alutUnloadWAV(format, out data, size, frequency);
+
+            // Generate an OpenAL source.
+            Al.alGenSources(1, out source);
+            if(Al.alGetError() != Al.AL_NO_ERROR) {
+                return false;
+            }
+
+            // Bind the buffer with the source.
+            Al.alSourcei(source, Al.AL_BUFFER, buffer);
+            Al.alSourcef(source, Al.AL_PITCH, 1.0f);
+            Al.alSourcef(source, Al.AL_GAIN, 1.0f);
+            Al.alSourcefv(source, Al.AL_POSITION, sourcePosition);
+            Al.alSourcefv(source, Al.AL_VELOCITY, sourceVelocity);
+            Al.alSourcei(source, Al.AL_LOOPING, 0);
+
+            // Do a final error check and then return.
+            if(Al.alGetError() == Al.AL_NO_ERROR) {
+                return true;
+            }
+
+            return false;
+        }
+        #endregion bool LoadALData()
+
+        #region SetListenerValues()
+        /*
+         * We already defined certain values for the Listener, but we need
+         * to tell OpenAL to use that data. This function does just that.
+         */
+        private static void SetListenerValues() {
+            Al.alListenerfv(Al.AL_POSITION, listenerPosition);
+            Al.alListenerfv(Al.AL_VELOCITY, listenerVelocity);
+            Al.alListenerfv(Al.AL_ORIENTATION, listenerOrientation);
+        }
+        #endregion SetListenerValues()
+    }
+}
diff --git a/examples/OpenAlExamples/Lesson02.cs b/examples/OpenAlExamples/Lesson02.cs
new file mode 100644
index 0000000..9b1e867
--- /dev/null
+++ b/examples/OpenAlExamples/Lesson02.cs
@@ -0,0 +1,229 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+// Jesse Maurais (lightonthewater at hotmail.com)
+#endregion Original Credits / License
+
+using System;
+using System.IO;
+using System.Timers;
+using Tao.OpenAl;
+
+namespace OpenAlExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     OpenAL Lesson 2: Looping and Fadeaway
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jesse Maurais
+    ///         http://devmaster.net/articles/openal-tutorials/lesson2.php
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson02 {
+        // --- Fields ---
+        #region Private Fields
+        /*
+         * These are OpenAL "names" (or "objects"). They store and id of a buffer
+         * or a source object. Generally you would expect to see the implementation
+         * use values that scale up from '1', but don't count on it. The spec does
+         * not make this mandatory (as it is OpenGL). The id's can easily be memory
+         * pointers as well. It will depend on the implementation.
+         */
+        private static int buffer;                                          // Buffers to hold sound data.
+        private static int source;                                          // Sources are points of emitting sound.
+
+        /*
+         * These are 3D cartesian vector coordinates. A structure or class would be
+         * a more flexible of handling these, but for the sake of simplicity we will
+         * just leave it as is.
+         */
+        private static float[] sourcePosition = {0, 0, 0};                  // Position of the source sound.
+        private static float[] sourceVelocity = {0, 0, 0.1f};               // Velocity of the source sound.
+        private static float[] listenerPosition = {0, 0, 0};                // Position of the Listener.
+        private static float[] listenerVelocity = {0, 0, 0};                // Velocity of the Listener.
+        
+        // Orientation of the Listener. (first 3 elements are "at", second 3 are "up")
+        // Also note that these should be units of '1'.
+        private static float[] listenerOrientation = {0, 0, -1, 0, 1, 0};
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+		/// <summary>
+		/// 
+		/// </summary>
+        public static void Run() {
+            Console.WriteLine("MindCode's OpenAL Lesson 2: Looping and Fadeaway");
+            Console.WriteLine();
+            Console.WriteLine("Footsteps will slowly start to fade into the distance.");
+            Console.WriteLine("(Press Enter key to quit.)");
+
+            // Initialize OpenAL and clear the error bit.
+            Alut.alutInit();
+            Al.alGetError();
+
+            // Load the wav data.
+            if(!LoadALData()) {
+                Console.WriteLine("Error loading data.");
+                return;
+            }
+
+            // Initialize the listener in OpenAL.
+            SetListenerValues();
+
+            // Begin playing the source.
+            Al.alSourcePlay(source);
+
+            // Loop
+            int key = 0;
+            Timer timer = new Timer();
+            timer.Elapsed += new ElapsedEventHandler(Timer_Elapsed);
+            timer.Interval = 200;
+            timer.Enabled = true;
+
+            while(key == 0) {
+                key = Console.Read();
+            }
+
+            timer.Stop();
+
+            // Exit procedure to clean up and free OpenAL resources.
+            KillALData();
+        }
+        #endregion Run()
+
+        // --- Lesson Methods ---
+        #region KillALData()
+        /*
+         * We have allocated memory for our buffers and sources which needs
+         * to be returned to the system. This function frees that memory.
+         */
+        private static void KillALData() {
+            Al.alDeleteBuffers(1, ref buffer);
+            Al.alDeleteSources(1, ref source);
+            Alut.alutExit();
+        }
+        #endregion KillALData()
+
+        #region bool LoadALData()
+        /*
+         * This function will load our sample data from the disk using the Alut
+         * utility and send the data into OpenAL as a buffer. A source is then
+         * also created to play that buffer.
+         */
+        private static bool LoadALData() {
+            // Variables to load into.
+            int format;
+            int size;
+            IntPtr data = IntPtr.Zero;
+            float frequency;
+            //int loop;
+
+            // Generate an OpenAL buffer.
+            Al.alGenBuffers(1, out buffer);
+            if(Al.alGetError() != Al.AL_NO_ERROR) {
+                return false;
+            }
+
+            // Attempt to locate the file.
+            string fileName = "OpenAlExamples.Lesson02.Footsteps.wav";
+            if(File.Exists(fileName)) {
+                //fileName = fileName;
+            }
+            else if(File.Exists("Data/" + fileName)) {
+                fileName = "Data/" + fileName;
+            }
+            else if(File.Exists("../../Data/" + fileName)) {
+                fileName = "../../Data/" + fileName;
+            }
+            else {
+                return false;
+            }
+
+            // Load wav.
+            data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+            if(data == IntPtr.Zero) {
+                return false;
+            }
+
+            // Load wav data into the generated buffer.
+            Al.alBufferData(buffer, format, data, size, (int)frequency);
+            //Alut.alutUnloadWAV(format, out data, size, frequency);
+
+            // Generate an OpenAL source.
+            Al.alGenSources(1, out source);
+            if(Al.alGetError() != Al.AL_NO_ERROR) {
+                return false;
+            }
+
+            // Bind the buffer with the source.
+            Al.alSourcei(source, Al.AL_BUFFER, buffer);
+            Al.alSourcef(source, Al.AL_PITCH, 1.0f);
+            Al.alSourcef(source, Al.AL_GAIN, 1.0f);
+            Al.alSourcefv(source, Al.AL_POSITION, sourcePosition);
+            Al.alSourcefv(source, Al.AL_VELOCITY, sourceVelocity);
+            Al.alSourcei(source, Al.AL_LOOPING, Al.AL_TRUE);
+
+            // Do a final error check and then return.
+            if(Al.alGetError() == Al.AL_NO_ERROR) {
+                return true;
+            }
+
+            return false;
+        }
+        #endregion bool LoadALData()
+
+        #region SetListenerValues()
+        /*
+         * We already defined certain values for the Listener, but we need
+         * to tell OpenAL to use that data. This function does just that.
+         */
+        private static void SetListenerValues() {
+            Al.alListenerfv(Al.AL_POSITION, listenerPosition);
+            Al.alListenerfv(Al.AL_VELOCITY, listenerVelocity);
+            Al.alListenerfv(Al.AL_ORIENTATION, listenerOrientation);
+        }
+        #endregion SetListenerValues()
+
+        // --- Event Handlers ---
+        #region Timer_Elapsed(object source, ElapsedEventArgs e)
+        private static void Timer_Elapsed(object s, ElapsedEventArgs e) {
+            sourcePosition[0] += sourceVelocity[0];
+            sourcePosition[1] += sourceVelocity[1];
+            sourcePosition[2] += sourceVelocity[2];
+            Al.alSourcefv(source, Al.AL_POSITION, sourcePosition);
+        }
+        #endregion Timer_Elapsed(object source, ElapsedEventArgs e)
+    }
+}
diff --git a/examples/OpenAlExamples/Lesson03.cs b/examples/OpenAlExamples/Lesson03.cs
new file mode 100644
index 0000000..81ce465
--- /dev/null
+++ b/examples/OpenAlExamples/Lesson03.cs
@@ -0,0 +1,308 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+// Jesse Maurais (lightonthewater at hotmail.com)
+#endregion Original Credits / License
+
+using System;
+using System.IO;
+using System.Timers;
+using Tao.OpenAl;
+
+namespace OpenAlExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     OpenAL Lesson 3: Multiple Sources
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jesse Maurais
+    ///         http://devmaster.net/articles/openal-tutorials/lesson3.php
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson03 {
+        // --- Fields ---
+        #region Private Fields
+        private const int NUM_BUFFERS = 3;                                  // Maximum data buffers we will need.
+        private const int NUM_SOURCES = 3;                                  // Maximum emissions we will need.
+        private const int BATTLE = 0;                                       // These index the buffers and sources.
+        private const int GUN1 = 1;
+        private const int GUN2 = 2;
+
+        /*
+         * These are OpenAL "names" (or "objects"). They store and id of a buffer
+         * or a source object. Generally you would expect to see the implementation
+         * use values that scale up from '1', but don't count on it. The spec does
+         * not make this mandatory (as it is OpenGL). The id's can easily be memory
+         * pointers as well. It will depend on the implementation.
+         */
+        private static int[] buffer = new int[NUM_BUFFERS];                 // Buffers to hold sound data.
+        private static int[] source = new int[NUM_SOURCES];                 // Sources are points of emitting sound.
+
+        /*
+         * These are 3D cartesian vector coordinates. A structure or class would be
+         * a more flexible of handling these, but for the sake of simplicity we will
+         * just leave it as is.
+         */
+
+        // Position of the source sound.
+        private static float[][] sourcePosition = new float[NUM_SOURCES][];
+
+        // Velocity of the source sound.
+        private static float[][] sourceVelocity = new float[NUM_SOURCES][];
+
+        private static float[] listenerPosition = {0, 0, 0};                // Position of the Listener.
+        private static float[] listenerVelocity = {0, 0, 0};                // Velocity of the Listener.
+        
+        // Orientation of the Listener. (first 3 elements are "at", second 3 are "up")
+        // Also note that these should be units of '1'.
+        private static float[] listenerOrientation = {0, 0, -1, 0, 1, 0};
+
+        private static Random rand = new Random();                          // Random number generator.
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+		/// <summary>
+		/// 
+		/// </summary>
+        public static void Run() {
+            Console.WriteLine("MindCode's OpenAL Lesson 3: Multiple Sources");
+            Console.WriteLine();
+            Console.WriteLine("(Press Enter key to quit.)");
+
+            for(int i = 0; i < NUM_SOURCES; i++) {
+                sourcePosition[i] = new float[3];
+                sourceVelocity[i] = new float[3];
+            }
+
+            // Initialize OpenAL and clear the error bit.
+            Alut.alutInit();
+            Al.alGetError();
+
+            // Load the wav data.
+            if(!LoadALData()) {
+                Console.WriteLine("Error loading data.");
+                return;
+            }
+
+            // Initialize the listener in OpenAL.
+            SetListenerValues();
+
+            // Begin playing the source.
+            Al.alSourcePlay(source[BATTLE]);
+
+            int state;
+            int key = 0;
+
+            while(key == 0) {
+                key = Console.Read();
+
+                for(int i = 1; i < NUM_SOURCES; i++) {
+                    Al.alGetSourcei(source[i], Al.AL_SOURCE_STATE, out state);
+
+                    if(state != Al.AL_PLAYING) {
+                        // Pick a random position around the listener to play the source.
+                        double theta = (double) (rand.Next() % 360) * 3.14 / 180.0;
+
+                        sourcePosition[i][0] = -(float)(Math.Cos(theta));
+                        sourcePosition[i][1] = -(float)(rand.Next() % 2);
+                        sourcePosition[i][2] = -(float)(Math.Sin(theta));
+
+                        Al.alSourcefv(source[i], Al.AL_POSITION, sourcePosition[i]);
+
+                        Al.alSourcePlay(source[i]);
+                    }
+                }
+            }
+
+            // Exit procedure to clean up and free OpenAL resources.
+            KillALData();
+        }
+        #endregion Run()
+
+        // --- Lesson Methods ---
+        #region string FindFile(string fileName)
+        private static string FindFile(string fileName) {
+            if(File.Exists(fileName)) {
+                return fileName;
+            }
+            else if(File.Exists("Data/" + fileName)) {
+                return "Data/" + fileName;
+            }
+            else if(File.Exists("../../Data/" + fileName)) {
+                return "../../Data/" + fileName;
+            }
+            else {
+                return null;
+            }
+        }
+        #endregion string FindFile(string fileName)
+
+        #region KillALData()
+        /*
+         * We have allocated memory for our buffers and sources which needs
+         * to be returned to the system. This function frees that memory.
+         */
+        private static void KillALData() {
+            Al.alDeleteBuffers(NUM_BUFFERS, buffer);
+            Al.alDeleteSources(NUM_SOURCES, source);
+            Alut.alutExit();
+        }
+        #endregion KillALData()
+
+        #region bool LoadALData()
+        /*
+         * This function will load our sample data from the disk using the Alut
+         * utility and send the data into OpenAL as a buffer. A source is then
+         * also created to play that buffer.
+         */
+        private static bool LoadALData() {
+            // Variables to load into.
+            int format;
+            int size;
+            IntPtr data = IntPtr.Zero;
+            float frequency;
+            //int loop;
+
+            // Generate an OpenAL buffer.
+            Al.alGenBuffers(NUM_BUFFERS, buffer);
+            if(Al.alGetError() != Al.AL_NO_ERROR) {
+                return false;
+            }
+
+            string fileName = "";
+
+            // Attempt to locate the file.
+            fileName = FindFile("OpenAlExamples.Lesson03.Battle.wav");
+            if(fileName != null) {
+                // Load wav.
+                data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+                if(data == IntPtr.Zero) {
+                    return false;
+                }
+
+                // Load wav data into the generated buffer.
+                Al.alBufferData(buffer[BATTLE], format, data, size, (int)frequency);
+                //Alut.a(format, out data, size, frequency);
+            }
+            else {
+                return false;
+            }
+
+            // Attempt to locate the file.
+            fileName = FindFile("OpenAlExamples.Lesson03.Gun1.wav");
+            if(fileName != null) {
+                // Load wav.
+				data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+				if(data == IntPtr.Zero) 
+				{
+                    return false;
+                }
+
+                // Load wav data into the generated buffer.
+                Al.alBufferData(buffer[GUN1], format, data, size, (int)frequency);
+                //Alut.alutUnloadWAV(format, out data, size, frequency);
+            }
+            else {
+                return false;
+            }
+
+            // Attempt to locate the file.
+            fileName = FindFile("OpenAlExamples.Lesson03.Gun2.wav");
+            if(fileName != null) {
+                // Load wav.
+				data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+				if(data == IntPtr.Zero) 
+				{
+                    return false;
+                }
+
+                // Load wav data into the generated buffer.
+                Al.alBufferData(buffer[GUN2], format, data, size, (int)frequency);
+               // Alut.alutUnloadWAV(format, out data, size, frequency);
+            }
+            else {
+                return false;
+            }
+
+            // Generate an OpenAL source.
+            Al.alGenSources(NUM_SOURCES, source);
+            if(Al.alGetError() != Al.AL_NO_ERROR) {
+                return false;
+            }
+
+            // Bind the buffer with the source.
+            Al.alSourcei(source[BATTLE], Al.AL_BUFFER, buffer[BATTLE]);
+            Al.alSourcef(source[BATTLE], Al.AL_PITCH, 1.0f);
+            Al.alSourcef(source[BATTLE], Al.AL_GAIN, 1.0f);
+            Al.alSourcefv(source[BATTLE], Al.AL_POSITION, sourcePosition[BATTLE]);
+            Al.alSourcefv(source[BATTLE], Al.AL_VELOCITY, sourceVelocity[BATTLE]);
+            Al.alSourcei(source[BATTLE], Al.AL_LOOPING, Al.AL_TRUE);
+
+            Al.alSourcei(source[GUN1], Al.AL_BUFFER, buffer[GUN1]);
+            Al.alSourcef(source[GUN1], Al.AL_PITCH, 1.0f);
+            Al.alSourcef(source[GUN1], Al.AL_GAIN, 1.0f);
+            Al.alSourcefv(source[GUN1], Al.AL_POSITION, sourcePosition[GUN1]);
+            Al.alSourcefv(source[GUN1], Al.AL_VELOCITY, sourceVelocity[GUN1]);
+            Al.alSourcei(source[GUN1], Al.AL_LOOPING, Al.AL_FALSE);
+
+            Al.alSourcei(source[GUN2], Al.AL_BUFFER, buffer[GUN2]);
+            Al.alSourcef(source[GUN2], Al.AL_PITCH, 1.0f);
+            Al.alSourcef(source[GUN2], Al.AL_GAIN, 1.0f);
+            Al.alSourcefv(source[GUN2], Al.AL_POSITION, sourcePosition[GUN2]);
+            Al.alSourcefv(source[GUN2], Al.AL_VELOCITY, sourceVelocity[GUN2]);
+            Al.alSourcei(source[GUN2], Al.AL_LOOPING, Al.AL_FALSE);
+
+            // Do a final error check and then return.
+            if(Al.alGetError() == Al.AL_NO_ERROR) {
+                return true;
+            }
+
+            return false;
+        }
+        #endregion bool LoadALData()
+
+        #region SetListenerValues()
+        /*
+         * We already defined certain values for the Listener, but we need
+         * to tell OpenAL to use that data. This function does just that.
+         */
+        private static void SetListenerValues() {
+            Al.alListenerfv(Al.AL_POSITION, listenerPosition);
+            Al.alListenerfv(Al.AL_VELOCITY, listenerVelocity);
+            Al.alListenerfv(Al.AL_ORIENTATION, listenerOrientation);
+        }
+        #endregion SetListenerValues()
+    }
+}
diff --git a/examples/OpenAlExamples/Lesson05.cs b/examples/OpenAlExamples/Lesson05.cs
new file mode 100644
index 0000000..82967b4
--- /dev/null
+++ b/examples/OpenAlExamples/Lesson05.cs
@@ -0,0 +1,371 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+// Jesse Maurais (lightonthewater at hotmail.com)
+#endregion Original Credits / License
+
+using System;
+using System.IO;
+using System.Timers;
+using Tao.OpenAl;
+
+namespace OpenAlExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     OpenAL Lesson 5: Sources Sharing Buffers
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Jesse Maurais
+    ///         http://devmaster.net/articles/openal-tutorials/lesson5.php
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    ///     <para>
+    ///         Note the original author supplies two methods, InitOpenAL, and ExitOpenAL, that manually
+    ///         set up the OpenAL device and context and destroys them.  These methods do *exactly* what
+    ///         Alut.alutInit() and Alut.alutExit() do.  You can manually do so if you wish, but here
+    ///         I've elected just to use the Alut methods...  You should however understand how to deal
+    ///         with this manually even if you're using Alut, just so you can have a clear understanding
+    ///         of what is going on.
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lesson05 {
+        // --- Fields ---
+        #region Private Fields
+        // These index the buffers.
+        private const int THUNDER = 0;
+        private const int WATERDROP = 1;
+        private const int STREAM = 2;
+        private const int RAIN = 3;
+        private const int CHIMES = 4;
+        private const int OCEAN = 5;
+        private const int NUM_BUFFERS = 6;
+
+        /*
+         * These are OpenAL "names" (or "objects"). They store and id of a buffer
+         * or a source object. Generally you would expect to see the implementation
+         * use values that scale up from '1', but don't count on it. The spec does
+         * not make this mandatory (as it is OpenGL). The id's can easily be memory
+         * pointers as well. It will depend on the implementation.
+         */
+        private static int[] buffer = new int[NUM_BUFFERS];                 // Buffers to hold sound data.
+        private static int source;                                          // Sources are points of emitting sound.
+
+        /*
+         * These are 3D cartesian vector coordinates. A structure or class would be
+         * a more flexible of handling these, but for the sake of simplicity we will
+         * just leave it as is.
+         */
+
+        // Position of the source sound.
+        private static float[] sourcePosition = {0, 0, 0};
+
+        // Velocity of the source sound.
+        private static float[] sourceVelocity = {0, 0, 0};
+
+        private static float[] listenerPosition = {0, 0, 0};                // Position of the Listener.
+        private static float[] listenerVelocity = {0, 0, 0};                // Velocity of the Listener.
+        
+        // Orientation of the Listener. (first 3 elements are "at", second 3 are "up")
+        // Also note that these should be units of '1'.
+        private static float[] listenerOrientation = {0, 0, -1, 0, 1, 0};
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+		/// <summary>
+		/// 
+		/// </summary>
+        public static void Run() {
+            Console.WriteLine("MindCode's OpenAL Lesson 5: Sources Sharing Buffers");
+            Console.WriteLine();
+            Console.WriteLine("Controls (followed by Enter):");
+            Console.WriteLine("w) Water drops.");
+            Console.WriteLine("t) Rolling thunder.");
+            Console.WriteLine("s) Stream of trickling water.");
+            Console.WriteLine("r) Rain.");
+            Console.WriteLine("o) Lapping ocean waves.");
+            Console.WriteLine("c) Wind chimes.");
+            Console.WriteLine("q) Quit program.");
+
+            // Initialize OpenAL and clear the error bit.
+            Alut.alutInit();
+            Al.alGetError();
+
+            // Load the wav data.
+            if(!LoadALData()) {
+                Console.WriteLine("Error loading data.");
+                return;
+            }
+
+            // Initialize the listener in OpenAL.
+            SetListenerValues();
+
+            int c = 0;
+            while(c != 'q' && c != 'Q') {
+                c = Console.Read();
+
+                switch(c) {
+                    case 'w':
+                    case 'W':
+                        AddSource(WATERDROP);
+                        break;
+                    case 't':
+                    case 'T':
+                        AddSource(THUNDER);
+                        break;
+                    case 's':
+                    case 'S':
+                        AddSource(STREAM);
+                        break;
+                    case 'r':
+                    case 'R':
+                        AddSource(RAIN);
+                        break;
+                    case 'o':
+                    case 'O':
+                        AddSource(OCEAN);
+                        break;
+                    case 'c':
+                    case 'C':
+                        AddSource(CHIMES);
+                        break;
+                };
+            }
+
+            // Exit procedure to clean up and free OpenAL resources.
+            KillALData();
+        }
+        #endregion Run()
+
+        // --- Lesson Methods ---
+        #region AddSource(int type)
+        private static void AddSource(int type) {
+            Al.alGenSources(1, out source);
+            if(Al.alGetError() != Al.AL_NO_ERROR) {
+                Console.WriteLine("Error generating audio source.");
+                Environment.Exit(-1);
+            }
+
+            Al.alSourcei(source, Al.AL_BUFFER, buffer[type]);
+            Al.alSourcei(source, Al.AL_BUFFER, buffer[type]);
+            Al.alSourcef(source, Al.AL_PITCH, 1.0f);
+            Al.alSourcef(source, Al.AL_GAIN, 1.0f);
+            Al.alSourcefv(source, Al.AL_POSITION, sourcePosition);
+            Al.alSourcefv(source, Al.AL_VELOCITY, sourceVelocity);
+            Al.alSourcei(source, Al.AL_LOOPING, Al.AL_TRUE);
+
+            Al.alSourcePlay(source);
+        }
+        #endregion AddSource(int type)
+
+        #region string FindFile(string fileName)
+        private static string FindFile(string fileName) {
+            if(File.Exists(fileName)) {
+                return fileName;
+            }
+            else if(File.Exists("Data/" + fileName)) {
+                return "Data/" + fileName;
+            }
+            else if(File.Exists("../../Data/" + fileName)) {
+                return "../../Data/" + fileName;
+            }
+            else {
+                return null;
+            }
+        }
+        #endregion string FindFile(string fileName)
+
+        #region KillALData()
+        /*
+         * We have allocated memory for our buffers and sources which needs
+         * to be returned to the system. This function frees that memory.
+         */
+        private static void KillALData() {
+            Al.alDeleteBuffers(NUM_BUFFERS, buffer);
+            Al.alDeleteSources(1, ref source);
+            Alut.alutExit();
+        }
+        #endregion KillALData()
+
+        #region bool LoadALData()
+        /*
+         * This function will load our sample data from the disk using the Alut
+         * utility and send the data into OpenAL as a buffer. A source is then
+         * also created to play that buffer.
+         */
+        private static bool LoadALData() {
+            // Variables to load into.
+            int format;
+            int size;
+            IntPtr data = IntPtr.Zero;
+            float frequency;
+            //int loop;
+
+            // Generate an OpenAL buffer.
+            Al.alGenBuffers(NUM_BUFFERS, buffer);
+            if(Al.alGetError() != Al.AL_NO_ERROR) {
+                return false;
+            }
+
+            string fileName = "";
+
+            // Attempt to locate the file.
+            fileName = FindFile("OpenAlExamples.Lesson05.Thunder.wav");
+            if(fileName != null) {
+                // Load wav.
+				data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+				if(data == IntPtr.Zero) 
+				{
+                    return false;
+                }
+
+                // Load wav data into the generated buffer.
+                Al.alBufferData(buffer[THUNDER], format, data, size, (int)frequency);
+                //Alut.alutUnloadWAV(format, out data, size, frequency);
+            }
+            else {
+                return false;
+            }
+
+            // Attempt to locate the file.
+            fileName = FindFile("OpenAlExamples.Lesson05.Waterdrop.wav");
+            if(fileName != null) {
+                // Load wav.
+				data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+				if(data == IntPtr.Zero) 
+				{
+                    return false;
+                }
+
+                // Load wav data into the generated buffer.
+                Al.alBufferData(buffer[WATERDROP], format, data, size, (int)frequency);
+                //Alut.alutUnloadWAV(format, out data, size, frequency);
+            }
+            else {
+                return false;
+            }
+
+            // Attempt to locate the file.
+            fileName = FindFile("OpenAlExamples.Lesson05.Stream.wav");
+            if(fileName != null) {
+                // Load wav.
+				data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+				if(data == IntPtr.Zero) 
+				{
+                    return false;
+                }
+
+                // Load wav data into the generated buffer.
+                Al.alBufferData(buffer[STREAM], format, data, size, (int)frequency);
+                //Alut.alutUnloadWAV(format, out data, size, frequency);
+            }
+            else {
+                return false;
+            }
+
+            // Attempt to locate the file.
+            fileName = FindFile("OpenAlExamples.Lesson05.Rain.wav");
+            if(fileName != null) {
+                // Load wav.
+				data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+				if(data == IntPtr.Zero) 
+				{
+                    return false;
+                }
+
+                // Load wav data into the generated buffer.
+                Al.alBufferData(buffer[RAIN], format, data, size, (int)frequency);
+                //Alut.alutUnloadWAV(format, out data, size, frequency);
+            }
+            else {
+                return false;
+            }
+
+            // Attempt to locate the file.
+            fileName = FindFile("OpenAlExamples.Lesson05.Ocean.wav");
+            if(fileName != null) {
+                // Load wav.
+				data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+				if(data == IntPtr.Zero) 
+				{
+                    return false;
+                }
+
+                // Load wav data into the generated buffer.
+                Al.alBufferData(buffer[OCEAN], format, data, size, (int)frequency);
+               // Alut.alutUnloadWAV(format, out data, size, frequency);
+            }
+            else {
+                return false;
+            }
+
+            // Attempt to locate the file.
+            fileName = FindFile("OpenAlExamples.Lesson05.Chimes.wav");
+            if(fileName != null) {
+                // Load wav.
+				data = Alut.alutLoadMemoryFromFile(fileName, out format, out size, out frequency);
+				if(data == IntPtr.Zero) 
+				{
+                    return false;
+                }
+
+                // Load wav data into the generated buffer.
+                Al.alBufferData(buffer[CHIMES], format, data, size, (int)frequency);
+                //Alut.alutUnloadWAV(format, out data, size, frequency);
+            }
+            else {
+                return false;
+            }
+
+            // Do a final error check and then return.
+            if(Al.alGetError() == Al.AL_NO_ERROR) {
+                return true;
+            }
+
+            return false;
+        }
+        #endregion bool LoadALData()
+
+        #region SetListenerValues()
+        /*
+         * We already defined certain values for the Listener, but we need
+         * to tell OpenAL to use that data. This function does just that.
+         */
+        private static void SetListenerValues() {
+            Al.alListenerfv(Al.AL_POSITION, listenerPosition);
+            Al.alListenerfv(Al.AL_VELOCITY, listenerVelocity);
+            Al.alListenerfv(Al.AL_ORIENTATION, listenerOrientation);
+        }
+        #endregion SetListenerValues()
+    }
+}
diff --git a/examples/OpenAlExamples/Makefile.am b/examples/OpenAlExamples/Makefile.am
new file mode 100644
index 0000000..e27a63b
--- /dev/null
+++ b/examples/OpenAlExamples/Makefile.am
@@ -0,0 +1,33 @@
+
+PROGRAM = OpenAlExamples
+PACKAGES =
+BINARY_LIBS = \
+        Tao.OpenAl.dll \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+RESX = OpenAlExamples.resx
+RESOURCES = $(PROGRAM).OpenAlExamples.resources
+SOURCES = \
+        OpenAlExamples.cs \
+        Boxes.cs \
+        Lesson01.cs \
+        Lesson02.cs \
+        Lesson03.cs \
+        Lesson05.cs \
+        OpenAlExamples.Designer.cs \
+        Program.cs \
+        Sound.cs \
+        Waterfall.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.OpenAl/Tao.OpenAl.snk
+
+$(PROGRAM).OpenAlExamples.resources: OpenAlExamples.resx
+	$(RESGEN) $< $@
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/OpenAlExamples/Makefile.in b/examples/OpenAlExamples/Makefile.in
new file mode 100644
index 0000000..ef4cfd4
--- /dev/null
+++ b/examples/OpenAlExamples/Makefile.in
@@ -0,0 +1,381 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/OpenAlExamples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = OpenAlExamples
+PACKAGES = 
+BINARY_LIBS = \
+        Tao.OpenAl.dll \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+
+RESX = OpenAlExamples.resx
+RESOURCES = $(PROGRAM).OpenAlExamples.resources
+SOURCES = \
+        OpenAlExamples.cs \
+        Boxes.cs \
+        Lesson01.cs \
+        Lesson02.cs \
+        Lesson03.cs \
+        Lesson05.cs \
+        OpenAlExamples.Designer.cs \
+        Program.cs \
+        Sound.cs \
+        Waterfall.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.OpenAl/Tao.OpenAl.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/OpenAlExamples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/OpenAlExamples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).OpenAlExamples.resources: OpenAlExamples.resx
+	$(RESGEN) $< $@
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/OpenAlExamples/OpenAlExamples.Designer.cs b/examples/OpenAlExamples/OpenAlExamples.Designer.cs
new file mode 100644
index 0000000..783d656
--- /dev/null
+++ b/examples/OpenAlExamples/OpenAlExamples.Designer.cs
@@ -0,0 +1,79 @@
+namespace OpenAlExamples
+{
+    partial class OpenAlExamples
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OpenAlExamples));
+            this.lstExamples = new System.Windows.Forms.ListBox();
+            this.btnRun = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // lstExamples
+            // 
+            this.lstExamples.FormattingEnabled = true;
+            this.lstExamples.Location = new System.Drawing.Point(13, 13);
+            this.lstExamples.Name = "lstExamples";
+            this.lstExamples.Size = new System.Drawing.Size(258, 173);
+            this.lstExamples.Sorted = true;
+            this.lstExamples.TabIndex = 0;
+            this.lstExamples.DoubleClick += new System.EventHandler(this.lstExamples_SelectedIndexChanged);
+            // 
+            // btnRun
+            // 
+            this.btnRun.Location = new System.Drawing.Point(94, 192);
+            this.btnRun.Name = "btnRun";
+            this.btnRun.Size = new System.Drawing.Size(95, 23);
+            this.btnRun.TabIndex = 1;
+            this.btnRun.Text = "Run";
+            this.btnRun.UseVisualStyleBackColor = true;
+            this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+            // 
+            // OpenAlExamples
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(283, 224);
+            this.Controls.Add(this.btnRun);
+            this.Controls.Add(this.lstExamples);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "OpenAlExamples";
+            this.Text = "OpenAlExamplesExamples";
+            this.Load += new System.EventHandler(this.frmExamples_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ListBox lstExamples;
+        private System.Windows.Forms.Button btnRun;
+    }
+}
+
diff --git a/examples/OpenAlExamples/OpenAlExamples.cs b/examples/OpenAlExamples/OpenAlExamples.cs
new file mode 100644
index 0000000..024854d
--- /dev/null
+++ b/examples/OpenAlExamples/OpenAlExamples.cs
@@ -0,0 +1,82 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace OpenAlExamples
+{
+    public partial class OpenAlExamples : Form
+    {
+        public OpenAlExamples()
+        {
+            InitializeComponent();
+        }
+
+        private void frmExamples_Load(object sender, EventArgs e)
+        {
+            Type[] types = Assembly.GetExecutingAssembly().GetTypes();
+            foreach (Type type in types)
+            {
+                MemberInfo[] runMethods = type.GetMember("Run");
+                foreach (MemberInfo run in runMethods)
+                {
+                    lstExamples.Items.Add(type.Name);
+                }
+                if (lstExamples.Items.Count > 0)
+                {
+                    this.lstExamples.SelectedIndex = 0;
+                }
+            }
+        }
+
+        private void btnRun_Click(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+
+        private void SelectExample()
+        {
+            if (lstExamples.SelectedItem != null)
+            {
+                Type example = Assembly.GetExecutingAssembly().GetType("OpenAlExamples." + lstExamples.SelectedItem.ToString(), true, true);
+                example.InvokeMember("Run", BindingFlags.InvokeMethod, null, null, null);
+            }
+        }
+
+        private void lstExamples_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+    }
+}
diff --git a/examples/OpenAlExamples/OpenAlExamples.csproj b/examples/OpenAlExamples/OpenAlExamples.csproj
new file mode 100644
index 0000000..509194b
--- /dev/null
+++ b/examples/OpenAlExamples/OpenAlExamples.csproj
@@ -0,0 +1,153 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{15DF8877-A758-4D78-BAE8-1E3290548D1D}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>OpenAlExamples</AssemblyName>
+    <AssemblyOriginatorKeyFile>../../src/Tao.OpenAl/Tao.OpenAl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>OpenAlExamples</RootNamespace>
+    <StartupObject>OpenAlExamples.Program</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.OpenAl\Tao.OpenAl.csproj">
+      <Name>Tao.OpenAl</Name>
+      <Project>{7B619BB0-3AB4-4DC9-BA37-BC5B461BEF17}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.FreeGlut\Tao.FreeGlut.csproj">
+      <Name>Tao.FreeGlut</Name>
+      <Project>{87C95364-7158-4D81-83B8-97B649E27ABA}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="OpenAlExamples.resx">
+      <DependentUpon>OpenAlExamples.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="OpenAlExamples.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Boxes.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Lesson01.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Lesson02.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Lesson03.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Lesson05.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="OpenAlExamples.Designer.cs">
+      <DependentUpon>OpenAlExamples.cs</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Sound.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Waterfall.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/OpenAlExamples/OpenAlExamples.resx b/examples/OpenAlExamples/OpenAlExamples.resx
new file mode 100644
index 0000000..06ec7be
--- /dev/null
+++ b/examples/OpenAlExamples/OpenAlExamples.resx
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAChl4QAopiGAKOZhgCjmYcAo5mIAKSahwCkmogApZuJAKaciQCmnIoAppyLAKiejACpn44ArKKRAK2j
+        kgCupZUAr6eXALGomACzqZkAsamaALOqmQCyqpsAtKuaALSsnQC0rJ4Atq2eALmxogC7s6UAvbSkALu0
+        pgC+t6sAwbuvAMW8rQDIv7AAycCxAMvFuwDLxrsA08y+ANDMwwDRzcQA08/GANfQwwDa08YA29THANfT
+        ywDY1MwA3dbKAODe2QDi4NoA5OHbAOPh3ADk4dwA5OLdAOTj3gDw6t8A7OnmAO7t6gDx8e8A9fXzAPX2
+        9AD4+fgA+fn4APj6+QD8/v4A/f//AP7//wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAQ0NDQ0NDQ0NDQ0NDMBcDDAwDFzFDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0M3Bw8cAAAAAAAAACsD
+        N0NDQ0NDQ0NDQ0NDQ0NDQ0NDFCctAAAAAAAAAAAAAAAAFENDQ0NDQ0NDQ0NDQ0NDERtAJgAAAAAAAAAA
+        AAAAAAAAABtDQ0NDQ0NDQ0NDQwY+QEAAAAAAAAAAAAAAAAAAAAAAAANDQ0NDQ0NDQ0MGQkBAEAAAAAAA
+        AAAAAAAAAAAAAAAAAAVDQ0NDQ0NDGz1AQEAgAAAAAAAAAAAAAAAAAAAAAAAAABFDQ0NDQ0MdQEBAQCkA
+        AAAAAAA0NQAAAAAAAAAAAAAAAENDQ0NDFkBAQEBAAAAAAAAAGkBAGgAAAAAAAAAAAAAAFENDQzknQEBA
+        QEAlAAAAAAAABwYAAAAAAAAAAAAAAAAAN0NDBkBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQ0MA
+        QEBAQEBAOAAAAAAAAAAAAAAAAAAAAAAAAAAAACtDMTJAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ADEZQkBAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAAFwNAQEBAQEBAQEBAJAAAAAAAAAAAAAAAAAAA
+        AAAAAAAEDkBAQEBAQEBAQEBAQRohAAAAAAAAAAAAAAAAAAAAAAwNQEBAQEBAQEBAQEBAQEA8IwsAAAAA
+        AAAAAAAAAAAADAVAQEBAQEBAQEBAQEBAQEBAQEEJAAAAAAAAAAAAAAADF0JAQEBAQEBAQEBAQEBAQEBA
+        QEA7AAAAAAAAAAAAABcwMEBAQEBAQEBAQEBAQEBAQEBAQEBALgAAAAAAAAAAMUMAQEBAQEBAQEBAQEBA
+        QEBAQEBAQEAtAAAAAAAAACtDQwhAQEBAQEBAQEBAQEBAQEBAQEBAQEAiAAAAAAAAA0NDNydAQEBAQEBA
+        QEBAQEAHCkBAQEBAQAEAAAAAAAA3Q0NDFkBAQEBAQEBAQEBAHjY2HkBAQEBAEwAAAAAAEkNDQ0NDHUBA
+        QEBAQEBAQEA/KipBQEBAQEATAAAAAABDQ0NDQ0MSPUBAQEBAQEBAQEBAQEBAQEBAQAwAAAAAG0NDQ0ND
+        Q0MHQkBAQEBAQEBAQEBAQEBAQEBBAAAAAAJDQ0NDQ0NDQ0MGPkBAQEBAQEBAQEBAQEBAQBEAAAADQ0ND
+        Q0NDQ0NDQ0MRGEBAQEBAQEBAQEBAQEA6AAAAG0NDQ0NDQ0NDQ0NDQ0NDFShBQEBAQEBAQEBAHwAAFEND
+        Q0NDQ0NDQ0NDQ0NDQ0NDNwYALEJAQEBALxIrAzdDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzFwYNDQMXMUND
+        Q0NDQ0NDQ0NDQ//wD///gAH//wAA//wAAD/4AAAf8AAAD+AAAAfgAAAHwAAAA4AAAAGAAAABgAAAAQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA+AAAAfgAAAH8AAAD/gA
+        AB/8AAA//wAA//+AAf//8A//
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/examples/OpenAlExamples/OpenAlExamples.sh b/examples/OpenAlExamples/OpenAlExamples.sh
new file mode 100755
index 0000000..580d36b
--- /dev/null
+++ b/examples/OpenAlExamples/OpenAlExamples.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./OpenAlExamples.exe "$@"
diff --git a/examples/OpenAlExamples/Program.cs b/examples/OpenAlExamples/Program.cs
new file mode 100644
index 0000000..d4c2450
--- /dev/null
+++ b/examples/OpenAlExamples/Program.cs
@@ -0,0 +1,47 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace OpenAlExamples
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new OpenAlExamples());
+        }
+    }
+}
diff --git a/examples/OpenAlExamples/Properties/AssemblyInfo.cs b/examples/OpenAlExamples/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..5451325
--- /dev/null
+++ b/examples/OpenAlExamples/Properties/AssemblyInfo.cs
@@ -0,0 +1,60 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework - http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright �2003-2005 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("OpenAlExamples")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("OpenAL examples")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+
+[assembly: AssemblyKeyName("")]
+#if DEBUG
+[assembly: AssemblyProduct("OpenAlExamples *** Debug Build ***")]
+#else
+[assembly: AssemblyProduct("OpenAlExamples")]
+#endif
+[assembly: AssemblyTitle("OpenAL examples")]
+[assembly: AssemblyTrademark("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/OpenAlExamples/README b/examples/OpenAlExamples/README
new file mode 100644
index 0000000..04bacf9
--- /dev/null
+++ b/examples/OpenAlExamples/README
@@ -0,0 +1,29 @@
+OpenAlExamples
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are C# ports of various OpenAL examples, most of which can be
+found at http://www.devmaster.net/articles.php?catID=6.  They make use of
+OpenAL and some use FreeGLUT, make sure to have the appropriate native
+libraries for your system installed.
+
+These examples aren't well documented, but they should be fairly easy
+to understand, particularly if you follow along with the originals,
+however, do not take them to be 'best practices' for .NET OpenAL and
+OpenGL development.  The intent of these ports is as an introduction or
+as a comparison against the original native versions.
+
+If you'd like to contribute you may want to try porting further OpenAL
+examples from http://www.devmaster.net/articles.php?catID=6 particularly
+lesson 08 and you might like to try porting the examples from the native
+OpenAL distribution.
+
+Randy Ridge
+http://www.taoframework.com
+
+
+Change Log:
+
+April 24, 2004
+    Initial release, version 1.0.0.0.
diff --git a/examples/OpenAlExamples/Sound.cs b/examples/OpenAlExamples/Sound.cs
new file mode 100644
index 0000000..99be976
--- /dev/null
+++ b/examples/OpenAlExamples/Sound.cs
@@ -0,0 +1,173 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+// Dan Ricart (ricart3 at tcnj.edu)
+#endregion Original Credits / License
+
+using System;
+using Tao.OpenAl;
+
+namespace OpenAlExamples {
+	/// <summary>
+	/// 
+	/// </summary>
+    public class Sound {
+        // --- Fields ---
+        #region Private Fields
+        private IntPtr buffer = IntPtr.Zero;
+        private int format;
+        private float frequency;
+        private int length;
+        private int sourceId;
+        private int bufferId;
+        #endregion Private Fields
+
+        // --- Public Methods ---
+        #region Destroy()
+		/// <summary>
+		/// 
+		/// </summary>
+        public void Destroy() {
+            Al.alDeleteSources(1, ref sourceId);
+            Al.alDeleteBuffers(1, ref bufferId);
+        }
+        #endregion Destroy()
+
+        #region Play()
+		/// <summary>
+		/// 
+		/// </summary>
+        public void Play() {
+            Al.alSourcePlay(sourceId);
+        }
+        #endregion Play()
+
+        #region Load(string fileName, bool shouldLoop)
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="fileName"></param>
+		/// <param name="shouldLoop"></param>
+        public void Load(string fileName, bool shouldLoop) {
+            // Load our sound
+            //int looping;
+            buffer = Alut.alutLoadMemoryFromFile(fileName, out format, out length, out frequency);
+            //looping = shouldLoop ? Al.AL_TRUE : Al.AL_FALSE;
+
+            Al.alGenSources(1, out sourceId);
+            Al.alGenBuffers(1, out bufferId);
+            Al.alBufferData(bufferId, format, buffer, length, (int)frequency);
+            Al.alSourcei(sourceId, Al.AL_BUFFER, bufferId);
+
+            //Alut.alutUnloadWAV(format, out buffer, length, frequency);
+
+            // Set the pitch
+            Al.alSourcef(sourceId, Al.AL_PITCH, 1.0f);
+            // Set the gain
+            Al.alSourcef(sourceId, Al.AL_GAIN, 1.0f);
+            // Set looping to loop
+            Al.alSourcei(sourceId, Al.AL_LOOPING, 0);
+        }
+        #endregion Load(string fileName, bool shouldLoop)
+
+        #region SetListenerOrientation(float fx, float fy, float fz, float ux, float uy, float uz)
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="fx"></param>
+		/// <param name="fy"></param>
+		/// <param name="fz"></param>
+		/// <param name="ux"></param>
+		/// <param name="uy"></param>
+		/// <param name="uz"></param>
+        public void SetListenerOrientation(float fx, float fy, float fz, float ux, float uy, float uz) {
+            //set the orientation using an array of floats
+            float[] vec = new float[6];
+            vec[0] = fx;
+            vec[1] = fy;
+            vec[2] = fz;
+            vec[3] = ux;
+            vec[4] = uy;
+            vec[5] = uz;
+            Al.alListenerfv(Al.AL_ORIENTATION, vec);
+        }
+        #endregion SetListenerOrientation(float fx, float fy, float fz, float ux, float uy, float uz)
+
+        #region SetListenerPosition(float x, float y, float z)
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <param name="z"></param>
+        public void SetListenerPosition(float x, float y, float z) {
+            // Set the position using 3 seperate floats
+            Al.alListener3f(Al.AL_POSITION, x, y, z);
+        }
+        #endregion SetListenerPosition(float x, float y, float z)
+
+        #region SetProperties(float x, float y, float z, float vx, float vy, float vz)
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <param name="z"></param>
+		/// <param name="vx"></param>
+		/// <param name="vy"></param>
+		/// <param name="vz"></param>
+        public void SetProperties(float x, float y, float z, float vx, float vy, float vz) {
+            // Set the sounds position and velocity
+            Al.alSource3f(sourceId, Al.AL_POSITION, x, y, z);
+            Al.alSource3f(sourceId, Al.AL_VELOCITY, vx, vy, vz);
+        }
+        #endregion SetProperties(float x, float y, float z, float vx, float vy, float vz)
+
+        #region SetSourceRelative()
+        // This function makes a sound source relative so all direction and velocity
+        // parameters become relative to the source rather than the listener.  This is
+        // useful for background music that you want to stay constant relative to the listener
+        // no matter where they go.
+		/// <summary>
+		/// 
+		/// </summary>
+        public void SetSourceRelative() {
+            Al.alSourcei(sourceId, Al.AL_SOURCE_RELATIVE, Al.AL_TRUE);
+        }
+        #endregion SetSourceRelative()
+
+        #region Stop()
+		/// <summary>
+		/// 
+		/// </summary>
+        public void Stop() {
+            Al.alSourceStop(sourceId);
+        }
+        #endregion Stop()
+    }
+}
diff --git a/examples/OpenAlExamples/Waterfall.cs b/examples/OpenAlExamples/Waterfall.cs
new file mode 100644
index 0000000..4fa6a42
--- /dev/null
+++ b/examples/OpenAlExamples/Waterfall.cs
@@ -0,0 +1,568 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+// Dan Ricart (ricart3 at tcnj.edu)
+#endregion Original Credits / License
+
+using System;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using Tao.FreeGlut;
+using Tao.OpenAl;
+using Tao.OpenGl;
+
+namespace OpenAlExamples {
+    #region Class Documentation
+    /// <summary>
+    ///     Programming 3D Sound With OpenAL
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Dan Ricart
+    ///         http://devmaster.net/articles/openal/openal.php
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    ///     <para>
+    ///         The author's original code used Windows-specific code for window management, OpenGL
+    ///         context creation, timing, and input.  I've taken the liberty of using GLUT such that
+    ///         it cross-platform for those non-Windows users.  It's not quite as smooth in the
+    ///         animation and control due to TickCount being a poor timer and my poor conversion of
+    ///         the mouse handling, however, it's good enough to get by.
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Waterfall {
+        // --- Fields ---
+        #region Private Constants
+        private const float PI_OVER_180 = 0.0174532925f;
+        #endregion Private Constants
+
+        #region Private Fields
+//        private static int window;
+//        private static int windowWidth;
+//        private static int windowHeight;
+        private static float heading;
+        private static float xPosition;
+        private static float yPosition;
+        private static float zPosition;
+        private static float yRotation;
+        private static float pitch;
+        private static float waterOffset;
+        private static int[] texture = new int[6];
+        private static Sound sound = new Sound();
+        private static int[ , ] collisionArray = new int[18, 19];
+        private static int polygonCount;
+        private static int waterPolygonCount;
+        private static Polygon[] polygons;
+        private static Polygon[] waterPolygons;
+        private static float currentTime;
+        private static float oldTime;
+        private static float timeElapsed;
+        private static float secondsPerFrame;
+        private static float desiredDistance = 2.0f;
+        private static float movementValue;
+        private static int oldMouseX;
+        private static int oldMouseY;
+        #endregion Private Fields
+
+        #region Private Structs
+        private struct Polygon {
+            public float[] X;
+            public float[] Y;
+            public float[] Z;
+            public float[] U;
+            public float[] V;
+            public int TextureId;
+        }
+        #endregion Private Structs
+
+        // --- Entry Point ---
+        #region Run()
+		/// <summary>
+		/// 
+		/// </summary>
+        public static void Run() {
+            Initialize();
+            Glut.glutMainLoop();
+            Finish();
+        }
+        #endregion Run()
+
+        // --- Lesson Methods ---
+        #region Display()
+        private static void Display() {
+            float sceneRotationY;
+            double[] matrix = new double[16];
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);    // Clear The Screen And Depth Buffer
+            Gl.glLoadIdentity();                                            // Reset The View
+
+            sceneRotationY = 360.0f - yRotation;                            // Calculate The Scene Rotation
+
+            Gl.glRotatef(pitch, 1, 0, 0);                                   // Adjust Player's Pitch
+            Gl.glRotatef(sceneRotationY, 0, 1, 0);                          // Adjust Player's Rotation
+            Gl.glTranslatef(-xPosition, -yPosition, -zPosition);            // Move The Player
+
+            DrawLevel();                                                    // Draw The Level
+            DrawWater();                                                    // Draw The Water
+
+            Gl.glGetDoublev(Gl.GL_MODELVIEW_MATRIX, matrix);                // Get Current View Matrix
+
+            sound.SetListenerPosition(xPosition, yPosition, zPosition);     // Set Listener Position
+            // Set Listener Orientation, First 3 Numbers Are For The Forward Vector, Last Three Are For The Up Vector
+            sound.SetListenerOrientation(-(float) matrix[2], -(float) matrix[6], -(float) matrix[10], (float) matrix[1], (float) matrix[5], (float) matrix[9]);
+
+            Gl.glFinish();
+            Glut.glutSwapBuffers();                                         // Swap The Buffers
+        }
+        #endregion Display()
+
+        #region DrawLevel()
+        private static void DrawLevel() {
+            for(int i = 0; i < polygonCount; i++) {                         // Draw The Level Polygons
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[polygons[i].TextureId]);
+                Gl.glBegin(Gl.GL_QUADS);
+                    for(int j = 0; j < 4; j++) {
+                        Gl.glTexCoord2f(polygons[i].U[j], polygons[i].V[j]);
+                        Gl.glVertex3f(polygons[i].X[j], polygons[i].Y[j], polygons[i].Z[j]);
+                    }
+                Gl.glEnd();
+            }
+        }
+        #endregion DrawLevel()
+
+        #region DrawWater()
+        private static void DrawWater() {
+            Gl.glEnable(Gl.GL_BLEND);                                       // Enable Blending
+            for(int i = 0; i < waterPolygonCount; i++) {                    // Now Draw The Water Polygons
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[waterPolygons[i].TextureId]);
+
+                Gl.glBegin(Gl.GL_QUADS);
+                    for(int j = 0; j < 4; j++) {
+                        Gl.glTexCoord2f(waterPolygons[i].U[j], waterPolygons[i].V[j] + waterOffset);
+                        Gl.glVertex3f(waterPolygons[i].X[j], waterPolygons[i].Y[j], waterPolygons[i].Z[j]);
+                    }
+                Gl.glEnd();
+            }
+            Gl.glDisable(Gl.GL_BLEND);                                      // Disable Blending
+        }
+        #endregion DrawWater()
+
+        #region Finish()
+		/// <summary>
+		/// 
+		/// </summary>
+        public static void Finish() {
+            sound.Destroy();
+            Alut.alutExit();
+        }
+        #endregion Finish()
+
+        #region string FindFile(string fileName)
+        private static string FindFile(string fileName) {
+            string originalName = fileName;
+
+            if(File.Exists(fileName)) {
+                return fileName;
+            }
+            else if(File.Exists("Data/" + fileName)) {
+                return "Data/" + fileName;
+            }
+            else if(File.Exists("../../Data/" + fileName)) {
+                return "../../Data/" + fileName;
+            }
+            else {
+                Console.WriteLine("Could not locate file: " + originalName);
+                return null;
+            }
+        }
+        #endregion string FindFile(string fileName)
+
+        #region Idle()
+        private static void Idle() {
+            currentTime = Environment.TickCount;
+            timeElapsed = currentTime - oldTime;
+            secondsPerFrame = timeElapsed / 1000.0f;
+            waterOffset += secondsPerFrame / 2.0f;
+            if(waterOffset >= 1.0f) {
+                waterOffset -= 1.0f;
+            }
+            // Environment.TickCount's resolution and latency isn't really good enough for this, so I'm manually setting a value
+            movementValue = (float) desiredDistance * secondsPerFrame + 0.2f;
+            Glut.glutPostRedisplay();
+            oldTime = currentTime;
+        }
+        #endregion Idle()
+
+        #region Initialize()
+        private static void Initialize() {
+            Console.WriteLine("Controls:");                                 // Print Input Help
+            Console.WriteLine("W: Move Forward");
+            Console.WriteLine("A: Move Left");
+            Console.WriteLine("S: Move Backward");
+            Console.WriteLine("D: Move Right");
+            Console.WriteLine("Mouse Controls View");
+            Console.WriteLine("ESC: Exit");
+
+            Alut.alutInit();                                                // Initialize OpenAL
+
+            Glut.glutInit();                                                // Initialize GLUT
+            // Set GL Context Properties
+            Glut.glutInitDisplayMode(Glut.GLUT_DEPTH | Glut.GLUT_DOUBLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(640, 480);                              // Set Window Size
+            Glut.glutCreateWindow("OpenAL Tutorial");              // Create Window
+
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));        // Display Delegate
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));     // Keyboard Delegate
+            Glut.glutIdleFunc(new Glut.IdleCallback(Idle));                 // Idle Delegate
+            // Mouse Movement Delegate
+            Glut.glutPassiveMotionFunc(new Glut.PassiveMotionCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));        // Window Resize Delegate
+
+            LoadLevel();                                                    // Load The Level
+            LoadWater();                                                    // Load The Water
+            LoadCollision();                                                // Load The Collision Map
+            xPosition = 3.0f;                                               // Set Our Initial Player Position
+            yPosition = 1.0f;
+            zPosition = 5.0f;
+            LoadSounds();                                                   // Load The Sounds
+            LoadTextures();                                                 // Load The Textures
+            Gl.glEnable(Gl.GL_TEXTURE_2D);                                  // Enable Texture Mapping
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);                     // Set The Blending Function For Translucency
+            Gl.glClearColor(0.0f, 0.8f, 1.0f, 0.0f);                        // Clear Background Color To A Turquiose Blueish Color
+            Gl.glClearDepth(1.0);                                           // Enables Clearing Of The Depth Buffer
+            Gl.glDepthFunc(Gl.GL_LESS);                                     // The Type Of Depth Test To Do
+            Gl.glEnable(Gl.GL_DEPTH_TEST);                                  // Enables Depth Testing
+            Gl.glShadeModel(Gl.GL_SMOOTH);                                  // Enables Smooth Color Shading
+            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);     // Really Nice Perspective Calculations
+
+            oldTime = currentTime = Environment.TickCount;                  // Initialize The Timer
+        }
+        #endregion Initialize()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            float newX, newZ;
+            int xp, zp;
+
+            switch(key) {
+                case (byte) 'w':
+                case (byte) 'W':
+                    newX = xPosition - (float) (Math.Sin(heading * PI_OVER_180) * movementValue);
+                    newZ = zPosition;
+                    xp = RoundUp(newX);
+                    zp = RoundUp(newZ);
+                    if(collisionArray[zp, xp] == 1) {
+                        newX = xPosition;
+                    }
+                    else {
+                        xPosition -= (float) (Math.Sin(heading * PI_OVER_180) * movementValue);
+                    }
+
+                    newZ = zPosition - (float) (Math.Cos(heading * PI_OVER_180) * movementValue);
+                    xp = RoundUp(newX);
+                    zp = RoundUp(newZ);
+                    if(collisionArray[zp, xp] == 1) {
+                        newZ = zPosition;
+                    }
+                    else {
+                        zPosition -= (float) (Math.Cos(heading * PI_OVER_180) * movementValue);
+                    }
+                    break;
+                case (byte) 's':
+                case (byte) 'S':
+                    newX = xPosition + (float) Math.Sin(heading * PI_OVER_180) * movementValue;
+                    newZ = zPosition;
+                    xp = RoundUp(newX);
+                    zp = RoundUp(newZ);
+                    if(collisionArray[zp, xp] == 1) {
+                        newX = xPosition;
+                    }
+                    else {
+                        xPosition += (float) Math.Sin(heading * PI_OVER_180) * movementValue;
+                    }
+
+                    newZ = zPosition + (float) Math.Cos(heading * PI_OVER_180) * movementValue;
+                    xp = RoundUp(newX);
+                    zp = RoundUp(newZ);
+                    if(collisionArray[zp, xp] == 1) {
+                        newZ = zPosition;
+                    }
+                    else {
+                        zPosition += (float) Math.Cos(heading * PI_OVER_180) * movementValue;
+                    }
+                    break;
+                case (byte) 'a':
+                case (byte) 'A':
+                    newX = xPosition + (float) Math.Sin((heading - 90) * PI_OVER_180) * movementValue;
+                    newZ = zPosition;
+                    xp = RoundUp(newX);
+                    zp = RoundUp(newZ);
+                    if(collisionArray[zp, xp] == 1) {
+                        newX = xPosition;
+                    }
+                    else {
+                        xPosition += (float) Math.Sin((heading - 90) * PI_OVER_180) * movementValue;
+                    }
+
+                    newZ = zPosition + (float) Math.Cos((heading - 90) * PI_OVER_180) * movementValue;
+                    xp = RoundUp(newX);
+                    zp = RoundUp(newZ);
+                    if(collisionArray[zp, xp] == 1) {
+                        newZ = zPosition;
+                    }
+                    else {
+                        zPosition += (float) Math.Cos((heading - 90) * PI_OVER_180) * movementValue;
+                    }
+                    break;
+                case (byte) 'd':
+                case (byte) 'D':
+                    newX = xPosition + (float) Math.Sin((heading + 90) * PI_OVER_180) * movementValue;
+                    newZ = zPosition;
+                    xp = RoundUp(newX);
+                    zp = RoundUp(newZ);
+                    if(collisionArray[zp, xp] == 1) {
+                        newX = xPosition;
+                    }
+                    else {
+                        xPosition += (float) Math.Sin((heading + 90) * PI_OVER_180) * movementValue;
+                    }
+
+                    newZ = zPosition + (float) Math.Cos((heading + 90) * PI_OVER_180) * movementValue;
+                    xp = RoundUp(newX);
+                    zp = RoundUp(newZ);
+                    if(collisionArray[zp, xp] == 1) {
+                        newZ = zPosition;
+                    }
+                    else {
+                        zPosition += (float) Math.Cos((heading + 90) * PI_OVER_180) * movementValue;
+                    }
+                    break;
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Bitmap LoadBmp(string fileName)
+        private static Bitmap LoadBmp(string fileName) {                    // Loads A Bitmap Image
+            fileName = FindFile(fileName);
+            Bitmap bitmap = new Bitmap(fileName);                           // Load And Return The Bitmap
+            bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);              // Flip The Bitmap Along The Y-Axis
+            return bitmap;                                                  // Return The Bitmap
+        }
+        #endregion Bitmap LoadBmp(string fileName)
+
+        #region LoadCollision()
+        private static void LoadCollision() {
+            string fileName = FindFile("OpenAlExamples.Waterfall.Collision.txt");
+            StreamReader reader = new StreamReader(fileName, new ASCIIEncoding());
+            string line = "";
+            string[] split;
+
+            for(int i = 17; i >= 0; i--) {
+                ReadStr(reader, out line);
+                line = line.Trim();
+                split = line.Split();
+                for(int j = 18; j >= 0; j--) {
+                    collisionArray[i, j] = Int32.Parse(split[j]);
+                }
+            }
+
+            reader.Close();
+        }
+        #endregion LoadCollision()
+
+        #region LoadLevel()
+        private static void LoadLevel() {
+            string fileName = FindFile("OpenAlExamples.Waterfall.Level.txt");
+            StreamReader reader = new StreamReader(fileName, new ASCIIEncoding());
+            string line = "";
+
+            ReadStr(reader, out line);
+            polygonCount = Int32.Parse(line);
+            polygons = new Polygon[polygonCount];
+
+            for(int i = 0; i < polygonCount; i++) {
+                polygons[i].X = new float[4];
+                polygons[i].Y = new float[4];
+                polygons[i].Z = new float[4];
+                polygons[i].U = new float[4];
+                polygons[i].V = new float[4];
+                for(int j = 0; j < 4; j++) {
+                    ReadStr(reader, out line);
+                    Match match = Regex.Match(line, @"(?<X>-?\d+.\d+)\s*(?<Y>-?\d+.\d+)\s*(?<Z>-?\d+.\d+)\s*(?<U>-?\d+.\d+)\s*(?<V>-?\d+.\d+)\s*(?<TexId>\d+)", RegexOptions.ExplicitCapture);
+                    polygons[i].X[j] = Single.Parse(match.Groups["X"].ToString());
+                    polygons[i].Y[j] = Single.Parse(match.Groups["Y"].ToString());
+                    polygons[i].Z[j] = Single.Parse(match.Groups["Z"].ToString());
+                    polygons[i].U[j] = Single.Parse(match.Groups["U"].ToString());
+                    polygons[i].V[j] = Single.Parse(match.Groups["V"].ToString());
+                    polygons[i].TextureId = Int32.Parse(match.Groups["TexId"].ToString());
+                }
+            }
+
+            reader.Close();
+        }
+        #endregion void LoadLevel()
+
+        #region LoadSounds()
+        private static void LoadSounds() {
+            string fileName = FindFile("OpenAlExamples.Waterfall.Water.wav");
+            sound.Load(fileName, true);                                     // Load The Water Sound
+            sound.SetProperties(8.5f, 0.0f, 15.0f, 0.0f, 0.0f, 0.0f);       // Set The Position Of The Sound Effect
+            sound.Play();                                                   // Start Playing The Sound
+            sound.SetListenerPosition(xPosition, yPosition, zPosition);     // Set The Initial Listener Position
+        }
+        #endregion LoadSounds()
+
+        #region LoadTextures()
+        private static void LoadTextures() {
+            Bitmap[] textureImage = new Bitmap[6];                          // Storage Space For The Textures
+            Rectangle rectangle;                                            // Rectangle For Locking The Bitmap In Memory
+            BitmapData textureData = null;                                  // The Bitmap's Pixel Data
+
+            textureImage[0] = LoadBmp("OpenAlExamples.Waterfall.Grass.bmp");
+            textureImage[1] = LoadBmp("OpenAlExamples.Waterfall.Evergreen.bmp");
+            textureImage[2] = LoadBmp("OpenAlExamples.Waterfall.Rocks.bmp");
+            textureImage[3] = LoadBmp("OpenAlExamples.Waterfall.Water.bmp");
+            textureImage[4] = LoadBmp("OpenAlExamples.Waterfall.Dirt.bmp");
+            textureImage[5] = LoadBmp("OpenAlExamples.Waterfall.Wood.bmp");
+
+            Gl.glGenTextures(6, texture);                                   // Create The Textures
+            for(int i = 0; i < 6; i++) {
+                // Select The Whole Bitmap
+                rectangle = new Rectangle(0, 0, textureImage[i].Width, textureImage[i].Height);
+                // Get The Pixel Data From The Locked Bitmap
+                textureData = textureImage[i].LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
+
+                // Create Linear Filtered Texture
+                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[i]);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB8, textureData.Width, textureData.Height, 0, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, textureData.Scan0);
+
+                if(textureImage[i] != null) {                               // If Texture Exists
+                    textureImage[i].UnlockBits(textureData);                // Unlock The Pixel Data From Memory
+                    textureImage[i].Dispose();                              // Free The Texture Image
+                }
+            }
+        }
+        #endregion LoadTextures()
+
+        #region LoadWater()
+        private static void LoadWater() {
+            string fileName = FindFile("OpenAlExamples.Waterfall.Water.txt");
+            StreamReader reader = new StreamReader(fileName, new ASCIIEncoding());
+            string line = "";
+
+            ReadStr(reader, out line);
+            waterPolygonCount = Int32.Parse(line);
+            waterPolygons = new Polygon[waterPolygonCount];
+
+            for(int i = 0; i < waterPolygonCount; i++) {
+                waterPolygons[i].X = new float[4];
+                waterPolygons[i].Y = new float[4];
+                waterPolygons[i].Z = new float[4];
+                waterPolygons[i].U = new float[4];
+                waterPolygons[i].V = new float[4];
+                for(int j = 0; j < 4; j++) {
+                    ReadStr(reader, out line);
+                    Match match = Regex.Match(line, @"(?<X>-?\d+.\d+)\s*(?<Y>-?\d+.\d+)\s*(?<Z>-?\d+.\d+)\s*(?<U>-?\d+.\d+)\s*(?<V>-?\d+.\d+)\s*(?<TexId>\d+)", RegexOptions.ExplicitCapture);
+                    waterPolygons[i].X[j] = Single.Parse(match.Groups["X"].ToString());
+                    waterPolygons[i].Y[j] = Single.Parse(match.Groups["Y"].ToString());
+                    waterPolygons[i].Z[j] = Single.Parse(match.Groups["Z"].ToString());
+                    waterPolygons[i].U[j] = Single.Parse(match.Groups["U"].ToString());
+                    waterPolygons[i].V[j] = Single.Parse(match.Groups["V"].ToString());
+                    waterPolygons[i].TextureId = Int32.Parse(match.Groups["TexId"].ToString());
+                }
+            }
+
+            reader.Close();
+        }
+        #endregion LoadWater()
+
+        #region Mouse(int x, int y)
+        private static void Mouse(int x, int y) {
+            // Compute Our New Direction
+            heading -= x - oldMouseX;
+            pitch += y - oldMouseY;
+            yRotation = heading;
+            oldMouseX = x;
+            oldMouseY = y;
+        }
+        #endregion Mouse(int x, int y)
+
+        #region ReadStr(StreamReader stream, out string text)
+        private static void ReadStr(StreamReader stream, out string text) {
+            do {
+                text = stream.ReadLine();
+            } while((text.StartsWith("/")) || (text.StartsWith("\n")) || text == "");
+        }
+        #endregion ReadStr(StreamReader stream, out string text)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            if(h == 0) {                                                    // Prevent A Divide By Zero Exception
+                h = 1;                                                      // By Making Height Equal At Least One
+            }
+            //windowWidth = w;
+            //windowHeight = h;
+            Gl.glViewport(0, 0, w, h);                                      // Reset The Current Viewport
+            Gl.glMatrixMode(Gl.GL_PROJECTION);                              // Select The Projection Matrix
+            Gl.glLoadIdentity();                                            // Reset The Projection Matrix
+            Glu.gluPerspective(45.0, (float) w / (float) h, 0.1, 2000.0);   // Calculate The Aspect Ratio Of The Window
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);                               // Select The Modelview Matrix
+            Gl.glLoadIdentity();                                            // Reset The Modelview Matrix
+        }
+        #endregion Reshape(int w, int h)
+
+        #region int RoundUp(float x)
+        private static int RoundUp(float x) {
+            int n;
+
+            if(x < 0) {
+                n = (int) x;
+            }
+            else {
+                n = (int) x + 1;
+            }
+
+            return n;
+        }
+        #endregion int RoundUp(float x)
+    }
+}
diff --git a/examples/PhysFsExamples/COPYING b/examples/PhysFsExamples/COPYING
new file mode 100644
index 0000000..b67358c
--- /dev/null
+++ b/examples/PhysFsExamples/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/examples/PhysFsExamples/Makefile.am b/examples/PhysFsExamples/Makefile.am
new file mode 100644
index 0000000..6a2b36b
--- /dev/null
+++ b/examples/PhysFsExamples/Makefile.am
@@ -0,0 +1,14 @@
+
+PROGRAM = PhysFsExamples
+PACKAGES =
+BINARY_LIBS = Tao.PhysFs.dll
+SYSTEM_LIBS = System
+RESX =
+RESOURCES =
+SOURCES = \
+        Simple.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.PhysFs/Tao.PhysFs.snk
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/PhysFsExamples/Makefile.in b/examples/PhysFsExamples/Makefile.in
new file mode 100644
index 0000000..92a0a97
--- /dev/null
+++ b/examples/PhysFsExamples/Makefile.in
@@ -0,0 +1,360 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/PhysFsExamples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = PhysFsExamples
+PACKAGES = 
+BINARY_LIBS = Tao.PhysFs.dll
+SYSTEM_LIBS = System
+RESX = 
+RESOURCES = 
+SOURCES = \
+        Simple.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.PhysFs/Tao.PhysFs.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/PhysFsExamples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/PhysFsExamples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/PhysFsExamples/PhysFsExamples.csproj b/examples/PhysFsExamples/PhysFsExamples.csproj
new file mode 100644
index 0000000..1d44e11
--- /dev/null
+++ b/examples/PhysFsExamples/PhysFsExamples.csproj
@@ -0,0 +1,102 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8937F640-29DA-43B3-887E-88F5A855F01B}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>PhysFsExamples</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.PhysFs.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>PhysFsExamples</RootNamespace>
+    <StartupObject>PhysFsExamples.Simple</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.PhysFs\Tao.PhysFs.csproj">
+      <Name>Tao.PhysFs</Name>
+      <Project>{6B39535D-B2C1-414C-94A4-BBB70EF8EB0D}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Simple.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.PhysFs.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/PhysFsExamples/PhysFsExamples.sh b/examples/PhysFsExamples/PhysFsExamples.sh
new file mode 100755
index 0000000..bddef2b
--- /dev/null
+++ b/examples/PhysFsExamples/PhysFsExamples.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./PhysFsExamples.exe "$@"
diff --git a/examples/PhysFsExamples/Properties/AssemblyInfo.cs b/examples/PhysFsExamples/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..9147884
--- /dev/null
+++ b/examples/PhysFsExamples/Properties/AssemblyInfo.cs
@@ -0,0 +1,59 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework - http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright �2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("PhysFsExamples.Simple")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("A simple PhysFS example.")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+[assembly: AssemblyKeyName("")]
+#if DEBUG
+[assembly: AssemblyProduct("PhysFsExamples.Simple.exe *** Debug Build ***")]
+#else
+[assembly: AssemblyProduct("PhysFsExamples.Simple.exe")]
+#endif
+[assembly: AssemblyTitle("A simple PhysFS example.")]
+[assembly: AssemblyTrademark("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/PhysFsExamples/README b/examples/PhysFsExamples/README
new file mode 100644
index 0000000..47bdd93
--- /dev/null
+++ b/examples/PhysFsExamples/README
@@ -0,0 +1,20 @@
+PhysFsExamples
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are various PhysFs examples.
+
+Rob Loach (http://www.robloach.net)
+
+
+Todo:
+
+Myzip.zip
+    Better implementation of @"..\..\Data\myzip.zip" in Simple example
+
+
+Change Log:
+
+1.0.0.0 - January 12, 2006
+    Initial release.
diff --git a/examples/PhysFsExamples/Simple.cs b/examples/PhysFsExamples/Simple.cs
new file mode 100644
index 0000000..e67d06f
--- /dev/null
+++ b/examples/PhysFsExamples/Simple.cs
@@ -0,0 +1,145 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.IO;
+using System.Text;
+using Tao.PhysFs;
+
+namespace PhysFsExamples
+{
+	/// <summary>
+	/// PhysFS Tutorial - http://icculus.org/physfs/physfstut.txt
+	/// </summary>
+	/// <remarks>Here are some simple steps to getting PhysFS working in your program.
+	/// <p>
+	///		Originally created by some friendly people in #icculus.org in the freenode IRC network.
+	///	</p>
+	/// <p>
+	///		C# Implementation by Rob Loach (http://www.robloach.net).
+	/// </p>
+	/// </remarks>
+	public class Simple
+	{
+		/// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		public static void Main(string[] args)
+		{
+            string filePath = Path.Combine("..", "..");
+            string fileDirectory = "Data";
+            string fileName = "PhysFsExamples.Simple.MyZip.zip";
+
+            /* 
+			 * First thing you need to do is initialize the filesystem.  You simply call 
+			 * PHYSFS_init();
+			 * to do this.
+			 * 
+			 * From the docs:
+			 * argv0 the argv[0] string passed to your program's mainline. This may be NULL 
+			 * on most platforms (such as ones without a standard main() function), but you 
+			 * should always try to pass something in here. Unix-like systems such as Linux 
+			 * _need_ to pass argv[0] from main() in here.
+			 */
+			Fs.PHYSFS_init("init");
+
+			/*
+			 * After you have it initialized, then you need to set up any archives that 
+			 * will be read from.  You can do this by using the 
+			 * PHYSFS_AddToSearchPath(char*, int); function.  The 1 makes it added to the 
+			 * end of the search path so that it is the last looked at.  You could instead 
+			 * put a 0 there and have it be the first thing looked at.
+			 */
+            Fs.PHYSFS_addToSearchPath(Path.Combine(Path.Combine(filePath, fileDirectory), fileName), 1);
+            Fs.PHYSFS_addToSearchPath(Path.Combine(fileDirectory, fileName), 1);
+
+			/*
+			 * Now that we have initialized physfs and added an archive to its search path, 
+			 * we can do some file reading.  First thing you will want to do is check to 
+			 * make sure that the file exists.  You can do this by calling 
+			 * PHYSFS_exists(char*);
+			 */
+			Console.WriteLine("Exists: " + Fs.PHYSFS_exists("myfile.txt"));
+
+			/*
+			 * Then you can use PHYSFS_openRead(char*); to get a PHYSFS_file pointer to 
+			 * that file.  There is also available: PHYSFS_openWrite(char*); and 
+			 * PHYSFS_openAppend(char*);
+			 * 
+			 * NOTE: If you would like to do any writing you need to set a dir to write 
+			 * too.  You can do this by using PHYSFS_setWriteDir(const char *newDir);
+			 */
+			IntPtr myfile = Fs.PHYSFS_openRead("myfile.txt");
+
+			/*
+			 * If you are going to be reading this file into memory, you can use 
+			 * PHYSFS_fileLength(PHYSFS_file*) to find out how many bytes you need to 
+			 * allocate for the file.  You can also use this to check and make sure the 
+			 * file isn't larger than the max file size you want to open.
+			 */
+            long file_size = Fs.PHYSFS_fileLength(myfile);
+            Console.WriteLine("Filesize: " + file_size);
+
+			/*
+			 * Now it is time to read the file into memory.  In this tutorial I am simply 
+			 * going to read it all into a byte array using PHYSFS_read (PHYSFS_file *fp, 
+			 * your_buffer, size_of_object_to_read, number_of_objects_to_read); and it 
+			 * returns the number of objects read.
+			 */
+            byte[] array;
+            Fs.PHYSFS_read(myfile, out array, 1, (uint)file_size);
+			for(int i = 0; i < array.Length; i++)
+			{
+				Console.Write((char)array[i]);
+			}
+
+			/*
+			 * When you are finished with your file you need to close it.  You can do so 
+			 * with the function PHYSFS_close(PHYSFS_file*);
+			 */
+			Fs.PHYSFS_close(myfile);
+
+			/*
+			 * When you are finished with PHYSFS completely, you need to call the 
+			 * PHYSFS_deinit(void) function.
+			 * 
+			 * From the docs:
+			 * This closes any files opened via PhysicsFS, blanks the search/write paths, 
+			 * frees memory, and invalidates all of your file handles.
+			 */
+			Fs.PHYSFS_deinit();
+
+			/*
+			 * Ok that is it for the tutorial.  It should give you a rough overview of how 
+			 * things are structured and you can check the online docs for more information 
+			 * on using the rest of the API.
+			 */
+			Console.ReadLine();
+		}
+	}
+}
diff --git a/examples/Redbook/Aaindex.cs b/examples/Redbook/Aaindex.cs
new file mode 100644
index 0000000..03bdebb
--- /dev/null
+++ b/examples/Redbook/Aaindex.cs
@@ -0,0 +1,216 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws shows how to draw anti-aliased lines in color index mode.  It
+    ///     draws two diagonal lines to form an X; when 'r' is typed in the window, the
+    ///     lines are rotated in opposite directions.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/aaindex.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Aaindex {
+        // --- Fields --
+        #region Private Constants
+        private const int RAMPSIZE = 16;
+        private const int RAMP1START = 32;
+        private const int RAMP2START = 48;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static float rotAngle = 0.0f;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Main Loop.  Open window with initial window size, title bar, color index
+        ///         display mode, and handle input events.
+        ///     </para>
+        /// </summary>
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_INDEX);
+            Glut.glutInitWindowSize(200, 200);
+            Glut.glutCreateWindow("Aaindex");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize antialiasing for color index mode, including loading a green color
+        ///         ramp starting at RAMP1START, and a blue color ramp starting at RAMP2START.
+        ///         The ramps must be a multiple of 16.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float shade;
+
+            for(int i = 0; i < RAMPSIZE; i++) {
+                shade = (float) i / (float) RAMPSIZE;
+                Glut.glutSetColor(RAMP1START + i, 0.0f, shade, 0.0f);
+                Glut.glutSetColor(RAMP2START + i, 0.0f, 0.0f, shade);
+            }
+
+            Gl.glEnable(Gl.GL_LINE_SMOOTH);
+            Gl.glHint(Gl.GL_LINE_SMOOTH_HINT, Gl.GL_DONT_CARE);
+            Gl.glLineWidth(1.5f);
+
+            Gl.glClearIndex((float) RAMP1START);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Draw 2 diagonal lines to form an X.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            Gl.glIndexi(RAMP1START);
+            Gl.glPushMatrix();
+                Gl.glRotatef(-rotAngle, 0.0f, 0.0f, 0.1f);
+                Gl.glBegin(Gl.GL_LINES);
+                    Gl.glVertex2f(-0.5f, 0.5f);
+                    Gl.glVertex2f(0.5f, -0.5f);
+                Gl.glEnd();
+            Gl.glPopMatrix();
+
+            Gl.glIndexi(RAMP2START);
+            Gl.glPushMatrix();
+                Gl.glRotatef(rotAngle, 0.0f, 0.0f, 0.1f);
+                Gl.glBegin(Gl.GL_LINES);
+                    Gl.glVertex2f(0.5f, 0.5f);
+                    Gl.glVertex2f(-0.5f, -0.5f);
+                Gl.glEnd();
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 'r':
+                case (byte) 'R':
+                    rotAngle += 20.0f;
+                    if(rotAngle >= 360.0f) {
+                        rotAngle = 0.0f;
+                    }
+                    Glut.glutPostRedisplay();	
+                    break;
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Glu.gluOrtho2D(-1.0, 1.0, -1.0 * h / w, 1.0 * h / w);
+            }
+            else {
+                Glu.gluOrtho2D(-1.0 * w / h, 1.0 * w / h, -1.0, 1.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Aapoly.cs b/examples/Redbook/Aapoly.cs
new file mode 100644
index 0000000..cf0ebbd
--- /dev/null
+++ b/examples/Redbook/Aapoly.cs
@@ -0,0 +1,230 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws filled polygons with antialiased edges.  The special
+    ///     GL_SRC_ALPHA_SATURATE blending function is used.  Pressing the 't' key turns the
+    ///     antialiasing on and off.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/aapoly.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Aapoly {
+        // --- Fields --
+        #region Private Constants
+        private const int FACES = 6;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static bool polySmooth = true;
+
+        private static float[/*8*/, /*3*/] v = new float [8, 3];
+        private static float[/*8*/, /*4*/] c = {
+            {0.0f, 0.0f, 0.0f, 1.0f},
+            {1.0f, 0.0f, 0.0f, 1.0f},
+            {0.0f, 1.0f, 0.0f, 1.0f},
+            {1.0f, 1.0f, 0.0f, 1.0f},
+            {0.0f, 0.0f, 1.0f, 1.0f},
+            {1.0f, 0.0f, 1.0f, 1.0f},
+            {0.0f, 1.0f, 1.0f, 1.0f},
+            {1.0f, 1.0f, 1.0f, 1.0f}
+        };
+
+        // indices of front, top, left, bottom, right, back faces
+        private static byte[/*6*/, /*4*/] indices = {
+            {4, 5, 6, 7},
+            {2, 3, 7, 6},
+            {0, 4, 7, 3},
+            {0, 1, 5, 4},
+            {1, 5, 6, 2},
+            {0, 3, 2, 1}
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Main Loop.
+        ///     </para>
+        /// </summary>
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_ALPHA | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(200, 200);
+            Glut.glutCreateWindow("Aapoly");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glCullFace(Gl.GL_BACK);
+            Gl.glEnable(Gl.GL_CULL_FACE);
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA_SATURATE, Gl.GL_ONE);
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        #endregion Init()
+
+        #region DrawCube(float x0, float x1, float y0, float y1, float z0, float z1)
+        private static void DrawCube(float x0, float x1, float y0, float y1, float z0, float z1) {
+            v[0, 0] = v[3, 0] = v[4, 0] = v[7, 0] = x0;
+            v[1, 0] = v[2, 0] = v[5, 0] = v[6, 0] = x1;
+            v[0, 1] = v[1, 1] = v[4, 1] = v[5, 1] = y0;
+            v[2, 1] = v[3, 1] = v[6, 1] = v[7, 1] = y1;
+            v[0, 2] = v[1, 2] = v[2, 2] = v[3, 2] = z0;
+            v[4, 2] = v[5, 2] = v[6, 2] = v[7, 2] = z1;
+
+            Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);
+            Gl.glEnableClientState(Gl.GL_COLOR_ARRAY);
+            Gl.glVertexPointer(3, Gl.GL_FLOAT, 0, v);
+            Gl.glColorPointer(4, Gl.GL_FLOAT, 0, c);
+            Gl.glDrawElements(Gl.GL_QUADS, FACES * 4, Gl.GL_UNSIGNED_BYTE, indices);
+            Gl.glDisableClientState(Gl.GL_VERTEX_ARRAY);
+            Gl.glDisableClientState(Gl.GL_COLOR_ARRAY);
+        }
+        #endregion DrawCube(float x0, float x1, float y0, float y1, float z0, float z1)
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Note:  polygons must be drawn from front to back for proper blending.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            if(polySmooth) {
+                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+                Gl.glEnable(Gl.GL_BLEND);
+                Gl.glEnable(Gl.GL_POLYGON_SMOOTH);
+                Gl.glDisable(Gl.GL_DEPTH_TEST);
+            }
+            else {
+                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+                Gl.glDisable(Gl.GL_BLEND);
+                Gl.glDisable(Gl.GL_POLYGON_SMOOTH);
+                Gl.glEnable(Gl.GL_DEPTH_TEST);
+            }
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.0f, 0.0f, -8.0f);    
+                Gl.glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
+                Gl.glRotatef(60.0f, 0.0f, 1.0f, 0.0f); 
+                DrawCube(-0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f);
+            Gl.glPopMatrix ();
+
+            Gl.glFlush ();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 't':
+                case (byte) 'T':
+                    polySmooth = !polySmooth;
+                    Glut.glutPostRedisplay();	
+                    break;
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(30.0, (float) w / (float) h, 1.0, 20.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Aargb.cs b/examples/Redbook/Aargb.cs
new file mode 100644
index 0000000..0ce7b24
--- /dev/null
+++ b/examples/Redbook/Aargb.cs
@@ -0,0 +1,212 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws shows how to draw anti-aliased lines.  It draws two diagonal
+    ///     lines to form an X; when 'r' is typed in the window, the lines are rotated in
+    ///     opposite directions.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/aargb.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Aargb {
+        // --- Fields --
+        #region Private Fields
+        private static float rotAngle = 0.0f;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Main Loop.  Open window with initial window size, title bar, RGBA display
+        ///         mode, and handle input events.
+        ///     </para>
+        /// </summary>
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(200, 200);
+            Glut.glutCreateWindow("Aargb");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize antialiasing for RGBA mode, including alpha blending, hint, and
+        ///         line width.  Print out implementation specific info on line width granularity
+        ///         and width.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] values = new float[2];
+
+            Gl.glGetFloatv(Gl.GL_LINE_WIDTH_GRANULARITY, values);
+            Console.WriteLine("GL_LINE_WIDTH_GRANULARITY value is {0:F1}", values[0]);
+
+            Gl.glGetFloatv(Gl.GL_LINE_WIDTH_RANGE, values);
+            Console.WriteLine("GL_LINE_WIDTH_RANGE values are {0:F1} {1:F1}", values[0], values[1]);
+
+            Gl.glEnable(Gl.GL_LINE_SMOOTH);
+            Gl.glEnable(Gl.GL_BLEND);
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
+            Gl.glHint(Gl.GL_LINE_SMOOTH_HINT, Gl.GL_DONT_CARE);
+            Gl.glLineWidth(1.5f);
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Draw 2 diagonal lines to form an X.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            Gl.glColor3f(0.0f, 1.0f, 0.0f);
+            Gl.glPushMatrix();
+                Gl.glRotatef(-rotAngle, 0.0f, 0.0f, 0.1f);
+                Gl.glBegin(Gl.GL_LINES);
+                    Gl.glVertex2f(-0.5f, 0.5f);
+                    Gl.glVertex2f(0.5f, -0.5f);
+                Gl.glEnd();
+            Gl.glPopMatrix();
+
+            Gl.glColor3f(0.0f, 0.0f, 1.0f);
+            Gl.glPushMatrix();
+                Gl.glRotatef(rotAngle, 0.0f, 0.0f, 0.1f);
+                Gl.glBegin(Gl.GL_LINES);
+                    Gl.glVertex2f(0.5f, 0.5f);
+                    Gl.glVertex2f(-0.5f, -0.5f);
+                Gl.glEnd();
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 'r':
+                case (byte) 'R':
+                    rotAngle += 20.0f;
+                    if(rotAngle >= 360.0f) {
+                        rotAngle = 0.0f;
+                    }
+                    Glut.glutPostRedisplay();	
+                    break;
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Glu.gluOrtho2D(-1.0, 1.0, -1.0 * h / w, 1.0 * h / w);
+            }
+            else {
+                Glu.gluOrtho2D(-1.0 * w / h, 1.0 * w / h, -1.0, 1.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Accanti.cs b/examples/Redbook/Accanti.cs
new file mode 100644
index 0000000..9257b7d
--- /dev/null
+++ b/examples/Redbook/Accanti.cs
@@ -0,0 +1,238 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     Use the accumulation buffer to do full-scene antialiasing on a scene with
+    ///     orthographic parallel projection.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/accanti.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Accanti {
+        // --- Fields ---
+        #region Private Constants
+        private const int ACSIZE = 8;
+        #endregion Private Constants
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Main Loop.  Be certain to request an accumulation buffer.
+        ///     </para>
+        /// </summary>
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_ACCUM | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(250, 250);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Accanti");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize antialiasing for RGBA mode, including alpha blending, hint, and
+        ///         line width.  Print out implementation specific info on line width granularity
+        ///         and width.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] materialAmbient = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightPosition = {0.0f, 0.0f, 10.0f, 1.0f};
+            float[] lightModelAmbient = {0.2f, 0.2f, 0.2f, 1.0f};
+            
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbient);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 50.0f);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, lightModelAmbient);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_FLAT);
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glClearAccum(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        #endregion Init()
+
+        #region DisplayObjects()
+        private static void DisplayObjects() {
+            float[] torusDiffuse = {0.7f, 0.7f, 0.0f, 1.0f};
+            float[] cubeDiffuse = {0.0f, 0.7f, 0.7f, 1.0f};
+            float[] sphereDiffuse = {0.7f, 0.0f, 0.7f, 1.0f};
+            float[] octaDiffuse = {0.7f, 0.4f, 0.4f, 1.0f};
+
+            Gl.glPushMatrix();
+                Gl.glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.80f, 0.35f, 0.0f);
+                    Gl.glRotatef(100.0f, 1.0f, 0.0f, 0.0f);
+                    Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, torusDiffuse);
+                    Glut.glutSolidTorus(0.275f, 0.85f, 16, 16);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.75f, -0.50f, 0.0f);
+                    Gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
+                    Gl.glRotatef(45.0f, 1.0f, 0.0f, 0.0f);
+                    Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, cubeDiffuse);
+                    Glut.glutSolidCube(1.5f);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(0.75f, 0.60f, 0.0f);
+                    Gl.glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
+                    Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, sphereDiffuse);
+                    Glut.glutSolidSphere(1.0f, 16, 16);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(0.70f, -0.90f, 0.25f);
+                    Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, octaDiffuse);
+                    Glut.glutSolidOctahedron();
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+        }
+        #endregion DisplayObjects()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            int[] viewport = new int[4];
+
+            Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
+
+            Gl.glClear(Gl.GL_ACCUM_BUFFER_BIT);
+            for(int jitter = 0; jitter < ACSIZE; jitter++) {
+                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+                Gl.glPushMatrix();
+                // Note that 4.5 is the distance in world space between left and right and bottom
+                // and top.  This formula converts fractional pixel movement to world coordinates.
+                Gl.glTranslatef((Jitter.j8[jitter].X * 4.5f) / viewport[2], (Jitter.j8[jitter].Y * 4.5f) / viewport[3], 0.0f);
+                DisplayObjects();
+                Gl.glPopMatrix();
+                Gl.glAccum(Gl.GL_ACCUM, 1.0f / ACSIZE);
+            }
+            Gl.glAccum(Gl.GL_RETURN, 1.0f);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-2.25, 2.25, -2.25 * h / w, 2.25 * h / w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-2.25 * w / h, 2.25 * w / h, -2.25, 2.25, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Accpersp.cs b/examples/Redbook/Accpersp.cs
new file mode 100644
index 0000000..270eca6
--- /dev/null
+++ b/examples/Redbook/Accpersp.cs
@@ -0,0 +1,302 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     Use the accumulation buffer to do full-scene antialiasing on a scene with
+    ///     perspective projection, using the special routines accFrustum() and
+    ///     accPerspective().
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/accpersp.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Accpersp {
+        // --- Fields ---
+        #region Private Constants
+        private const float PI = 3.14159265358979323846f;
+        private const int ACSIZE = 8;
+        #endregion Private Constants
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Main Loop.  Be certain to request an accumulation buffer.
+        ///     </para>
+        /// </summary>
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_ACCUM | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(250, 250);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Accpersp");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize antialiasing for RGBA mode, including alpha blending, hint, and
+        ///         line width.  Print out implementation specific info on line width granularity
+        ///         and width.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] materialAmbient = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightPosition = {0.0f, 0.0f, 10.0f, 1.0f};
+            float[] lightModelAmbient = {0.2f, 0.2f, 0.2f, 1.0f};
+            
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbient);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 50.0f);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, lightModelAmbient);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_FLAT);
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glClearAccum(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        #endregion Init()
+
+        #region AccFrustum(double left, double right, double bottom, double top, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus)
+        /// <summary>
+        ///     <para>
+        ///         The first 6 arguments are identical to the glFrustum() call.
+        ///     </para>
+        ///     <para>
+        ///         pixdx and pixdy are anti-alias jitter in pixels.  Set both equal to 0.0 for
+        ///         no anti-alias jitter.  eyedx and eyedy are depth-of field jitter in pixels.
+        ///         Set both equal to 0.0 for no depth of field effects.
+        ///     </para>
+        ///     <para>
+        ///         focus is distance from eye to plane in focus.  focus must be greater than,
+        ///         but not equal to 0.0.
+        ///     </para>
+        ///     <para>
+        ///         Note that accFrustum() calls glTranslatef().  You will probably want to
+        ///         insure that your ModelView matrix has been initialized to identity before
+        ///         calling AccFrustum().
+        ///     </para>
+        /// </summary>
+        private static void AccFrustum(double left, double right, double bottom, double top, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus) {
+            double xwsize, ywsize; 
+            double dx, dy;
+            int[] viewport = new int[4];
+
+            Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
+
+            xwsize = right - left;
+            ywsize = top - bottom;
+
+            dx = -(pixdx * xwsize / (double) viewport[2] + eyedx * near / focus);
+            dy = -(pixdy * ywsize / (double) viewport[3] + eyedy * near / focus);
+
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glFrustum(left + dx, right + dx, bottom + dy, top + dy, near, far);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef((float) -eyedx, (float) -eyedy, 0.0f);
+        }
+        #endregion AccFrustum(double left, double right, double bottom, double top, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus)
+
+        #region AccPerspective(double fovy, double aspect, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus)
+        /// <summary>
+        ///     <para>
+        ///         The first 4 arguments are identical to the gluPerspective() call.
+        ///     </para>
+        ///     <para>
+        ///         pixdx and pixdy are anti-alias jitter in pixels.  Set both equal to 0.0 for
+        ///         no anti-alias jitter.  eyedx and eyedy are depth-of field jitter in pixels.
+        ///         Set both equal to 0.0 for no depth of field effects.
+        ///     </para>
+        ///     <para>
+        ///         focus is distance from eye to plane in focus.  focus must be greater than,
+        ///         but not equal to 0.0.
+        ///     </para>
+        ///     <para>
+        ///         Note that AccPerspective() calls AccFrustum().
+        ///     </para>
+        /// </summary>
+        private static void AccPerspective(double fovy, double aspect, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus) {
+            double fov2, left, right, bottom, top;
+
+            fov2 = ((fovy * PI) / 180.0) / 2.0;
+
+            top = near / (Math.Cos(fov2) / Math.Sin(fov2));
+            bottom = -top;
+
+            right = top * aspect;
+            left = -right;
+
+            AccFrustum(left, right, bottom, top, near, far, pixdx, pixdy, eyedx, eyedy, focus);
+        }
+        #endregion AccPerspective(double fovy, double aspect, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus)
+
+        #region DisplayObjects()
+        private static void DisplayObjects() {
+            float[] torusDiffuse = {0.7f, 0.7f, 0.0f, 1.0f};
+            float[] cubeDiffuse = {0.0f, 0.7f, 0.7f, 1.0f};
+            float[] sphereDiffuse = {0.7f, 0.0f, 0.7f, 1.0f};
+            float[] octaDiffuse = {0.7f, 0.4f, 0.4f, 1.0f};
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.0f, 0.0f, -5.0f);
+                Gl.glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.80f, 0.35f, 0.0f);
+                    Gl.glRotatef(100.0f, 1.0f, 0.0f, 0.0f);
+                    Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, torusDiffuse);
+                    Glut.glutSolidTorus(0.275f, 0.85f, 16, 16);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.75f, -0.50f, 0.0f);
+                    Gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
+                    Gl.glRotatef(45.0f, 1.0f, 0.0f, 0.0f);
+                    Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, cubeDiffuse);
+                    Glut.glutSolidCube(1.5f);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(0.75f, 0.60f, 0.0f);
+                    Gl.glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
+                    Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, sphereDiffuse);
+                    Glut.glutSolidSphere(1.0f, 16, 16);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(0.70f, -0.90f, 0.25f);
+                    Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, octaDiffuse);
+                    Glut.glutSolidOctahedron();
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+        }
+        #endregion DisplayObjects()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            int[] viewport = new int[4];
+
+            Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
+
+            Gl.glClear(Gl.GL_ACCUM_BUFFER_BIT);
+            for(int jitter = 0; jitter < ACSIZE; jitter++) {
+                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+                AccPerspective(50.0, (double) viewport[2] / (double) viewport[3], 1.0, 15.0, Jitter.j8[jitter].X, Jitter.j8[jitter].Y, 0.0, 0.0, 1.0);
+                DisplayObjects();
+                Gl.glAccum(Gl.GL_ACCUM, 1.0f / ACSIZE);
+            }
+            Gl.glAccum(Gl.GL_RETURN, 1.0f);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Alpha.cs b/examples/Redbook/Alpha.cs
new file mode 100644
index 0000000..293240b
--- /dev/null
+++ b/examples/Redbook/Alpha.cs
@@ -0,0 +1,211 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws several overlapping filled polygons to demonstrate the effect
+    ///     order has on alpha blending results.  Use the 't' key to toggle the order of
+    ///     drawing polygons.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/alpha.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Alpha {
+        // --- Fields ---
+        #region Private Fields
+        private static bool leftFirst = true;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Main Loop.  Open window with initial window size, title bar, RGBA display
+        ///         mode, and handle input events.
+        ///     </para>
+        /// </summary>
+        /// <param name="args"></param>
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(200, 200);
+            Glut.glutCreateWindow("Alpha");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize alpha blending function.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            Gl.glEnable(Gl.GL_BLEND);
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
+            Gl.glShadeModel(Gl.GL_FLAT);
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        #endregion Init()
+
+        #region DrawLeftTriangle()
+        /// <summary>
+        ///     <para>
+        ///         Draws yellow triangle on left hand side of screen.
+        ///     </para>
+        /// </summary>
+        private static void DrawLeftTriangle() {
+            Gl.glBegin(Gl.GL_TRIANGLES);
+                Gl.glColor4f(1.0f, 1.0f, 0.0f, 0.75f);
+                Gl.glVertex3f(0.1f, 0.9f, 0.0f);
+                Gl.glVertex3f(0.1f, 0.1f, 0.0f);
+                Gl.glVertex3f(0.7f, 0.5f, 0.0f);
+            Gl.glEnd();
+        }
+        #endregion DrawLeftTriangle()
+
+        #region DrawRightTriangle()
+        /// <summary>
+        ///     <para>
+        ///         Draws cyan triangle on right hand side of screen.
+        ///     </para>
+        /// </summary>
+        private static void DrawRightTriangle() {
+            Gl.glBegin(Gl.GL_TRIANGLES);
+                Gl.glColor4f(0.0f, 1.0f, 1.0f, 0.75f);
+                Gl.glVertex3f(0.9f, 0.9f, 0.0f);
+                Gl.glVertex3f(0.3f, 0.5f, 0.0f);
+                Gl.glVertex3f(0.9f, 0.1f, 0.0f);
+            Gl.glEnd();
+        }
+        #endregion DrawRightTriangle()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            if(leftFirst) {
+                DrawLeftTriangle();
+                DrawRightTriangle();
+            }
+            else {
+                DrawRightTriangle();
+                DrawLeftTriangle();
+            }
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 't':
+                case (byte) 'T':
+                    leftFirst = !leftFirst;
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Glu.gluOrtho2D(0.0, 1.0, 0.0, 1.0 * h / w);
+            }
+            else {
+                Glu.gluOrtho2D(0.0, 1.0 * w / h, 0.0, 1.0);
+            }
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Alpha3d.cs b/examples/Redbook/Alpha3d.cs
new file mode 100644
index 0000000..c953265
--- /dev/null
+++ b/examples/Redbook/Alpha3d.cs
@@ -0,0 +1,241 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates how to intermix opaque and alpha blended polygons in
+    ///     the same scene, by using glDepthMask.  Press the 'a' key to animate moving the
+    ///     transparent object through the opaque object.  Press the 'r' key to reset the
+    ///     scene.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/alpha3D.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Alpha3d {
+        // --- Fields ---
+        #region Private Constants
+        private const float MAXZ = 8.0f;
+        private const float MINZ = -8.0f;
+        private const float ZINC = 0.4f;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static float solidZ = MAXZ;
+        private static float transparentZ = MINZ;
+        private static int sphereList, cubeList;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("Alpha3d");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize antialiasing for RGBA mode, including alpha blending, hint, and
+        ///         line width.  Print out implementation specific info on line width granularity
+        ///         and width.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 0.15f};
+            float[] materialShininess = {100.0f};
+            float[] position = {0.5f, 0.5f, 1.0f, 0.0f};
+
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, materialShininess);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            sphereList = Gl.glGenLists(1);
+            Gl.glNewList(sphereList, Gl.GL_COMPILE);
+                Glut.glutSolidSphere(0.4f, 16, 16);
+            Gl.glEndList();
+
+            cubeList = Gl.glGenLists(1);
+            Gl.glNewList(cubeList, Gl.GL_COMPILE);
+                Glut.glutSolidCube(0.6f);
+            Gl.glEndList();
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            float[] materialSolid = {0.75f, 0.75f, 0.0f, 1.0f};
+            float[] materialZero = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] materialTransparent = {0.0f, 0.8f, 0.8f, 0.6f};
+            float[] materialEmission = {0.0f, 0.3f, 0.3f, 0.6f};
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-0.15f, -0.15f, solidZ);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialZero);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialSolid);
+                Gl.glCallList(sphereList);
+            Gl.glPopMatrix();
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.15f, 0.15f, transparentZ);
+                Gl.glRotatef(15.0f, 1.0f, 1.0f, 0.0f);
+                Gl.glRotatef(30.0f, 0.0f, 1.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialEmission);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialTransparent);
+                Gl.glEnable(Gl.GL_BLEND);
+                Gl.glDepthMask(false);
+                Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);
+                Gl.glCallList(cubeList);
+                Gl.glDepthMask(true);
+                Gl.glDisable(Gl.GL_BLEND);
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 'a':
+                case (byte) 'A':
+                    solidZ = MAXZ;
+                    transparentZ = MINZ;
+                    Glut.glutIdleFunc(new Glut.IdleCallback(Idle));
+                    break;
+                case (byte) 'r':
+                case (byte) 'R':
+                    solidZ = MAXZ;
+                    transparentZ = MINZ;
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Idle()
+        private static void Idle() {
+            if(solidZ <= MINZ || transparentZ >= MAXZ) {
+                Glut.glutIdleFunc(null);
+            }
+            else {
+                solidZ -= ZINC;
+                transparentZ += ZINC;
+                Glut.glutPostRedisplay();
+            }
+        }
+        #endregion Idle()
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-1.5, 1.5, -1.5 * h / w, 1.5 * h / w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-1.5 * w / h, 1.5 * w / h, -1.5, 1.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Anti.cs b/examples/Redbook/Anti.cs
new file mode 100644
index 0000000..06249e9
--- /dev/null
+++ b/examples/Redbook/Anti.cs
@@ -0,0 +1,180 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws antialiased lines in RGBA mode.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Anti {
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Main Loop.  Open window with initial window size, title bar, RGBA display
+        ///         mode, and handle input events.
+        ///     </para>
+        /// </summary>
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutCreateWindow("Anti");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize antialiasing for RGBA mode, including alpha blending, hint, and
+        ///         line width.  Print out implementation specific info on line width granularity
+        ///         and width.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] values = new float[2];
+            
+            Gl.glGetFloatv(Gl.GL_LINE_WIDTH_GRANULARITY, values);
+            Console.WriteLine("GL_LINE_WIDTH_GRANULARITY value is {0:F1}", values[0]);
+
+            Gl.glGetFloatv(Gl.GL_LINE_WIDTH_RANGE, values);
+            Console.WriteLine("GL_LINE_WIDTH_RANGE values are {0:F1} {1:F1}", values[0], values[1]);
+
+            Gl.glEnable(Gl.GL_LINE_SMOOTH);
+            Gl.glEnable(Gl.GL_BLEND);
+            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
+            Gl.glHint(Gl.GL_LINE_SMOOTH_HINT, Gl.GL_DONT_CARE);
+            Gl.glLineWidth(1.5f);
+
+            Gl.glShadeModel(Gl.GL_FLAT);
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glDepthFunc(Gl.GL_LESS);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Draws an icosahedron with a large alpha value, 1.0.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+            Glut.glutWireIcosahedron();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(45.0, (float) w / (float) h, 3.0, 5.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            // Move object into view
+            Gl.glTranslatef(0.0f, 0.0f, -4.0f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Bezcurve.cs b/examples/Redbook/Bezcurve.cs
new file mode 100644
index 0000000..12f1a45
--- /dev/null
+++ b/examples/Redbook/Bezcurve.cs
@@ -0,0 +1,176 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program uses evaluators to draw a Bezier curve.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/bezcurve.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Bezcurve {
+        // --- Fields ---
+        #region Private Fields
+        private static float[/* 4*3 */] controlPoints = {
+            -4.0f, -4.0f, 0.0f,
+            -2.0f,  4.0f, 0.0f,
+             2.0f, -4.0f, 0.0f,
+             4.0f,  4.0f, 0.0f
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Bezcurve");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+	        Gl.glMap1f(Gl.GL_MAP1_VERTEX_3, 0.0f, 1.0f, 3, 4, controlPoints);
+            Gl.glEnable(Gl.GL_MAP1_VERTEX_3);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            int i;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glBegin(Gl.GL_LINE_STRIP);
+                for(i = 0; i <= 30; i++) {
+                    Gl.glEvalCoord1f((float) i / 30.0f);
+                }
+            Gl.glEnd();
+            // The following code displays the control points as dots.
+            Gl.glPointSize(5.0f);
+            Gl.glColor3f(1.0f, 1.0f, 0.0f);
+            Gl.glBegin(Gl.GL_POINTS);
+                for (i = 0; i < 4; i++) {
+                    Gl.glVertex3f(controlPoints[i], controlPoints[i + 1], controlPoints[i + 2]);
+                }
+            Gl.glEnd();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-5.0, 5.0, -5.0 * h / w, 5.0 * h / w, -5.0, 5.0);
+            }
+            else {
+                Gl.glOrtho(-5.0 * w / h, 5.0 * w / h, -5.0, 5.0, -5.0, 5.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Bezmesh.cs b/examples/Redbook/Bezmesh.cs
new file mode 100644
index 0000000..5673fb0
--- /dev/null
+++ b/examples/Redbook/Bezmesh.cs
@@ -0,0 +1,203 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program uses evaluators to draw a Bezier curve.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/bezmesh.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Bezmesh {
+        // --- Fields ---
+        #region Private Fields
+        private static float[/* 4*4*3 */] controlPoints = {
+            -1.5f, -1.5f,  4.0f,
+            -0.5f, -1.5f,  2.0f,
+             0.5f, -1.5f, -1.0f,
+             1.5f, -1.5f,  2.0f,
+        
+            -1.5f, -0.5f,  1.0f,
+            -0.5f, -0.5f,  3.0f,
+             0.5f, -0.5f,  0.0f,
+             1.5f, -0.5f, -1.0f,
+        
+            -1.5f, 0.5f, 4.0f,
+            -0.5f, 0.5f, 0.0f,
+             0.5f, 0.5f, 3.0f,
+             1.5f, 0.5f, 4.0f,
+        
+            -1.5f, 1.5f, -2.0f,
+            -0.5f, 1.5f, -2.0f,
+             0.5f, 1.5f,  0.0f,
+             1.5f, 1.5f, -1.0f
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Bezmesh");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glMap2f(Gl.GL_MAP2_VERTEX_3, 0.0f, 1.0f, 3, 4, 0.0f, 1.0f, 12, 4, controlPoints);
+            Gl.glEnable(Gl.GL_MAP2_VERTEX_3);
+            Gl.glEnable(Gl.GL_AUTO_NORMAL);
+            Gl.glMapGrid2f(20, 0.0f, 1.0f, 20, 0.0f, 1.0f);
+            // For lighted version only
+            InitLights();
+        }
+        #endregion Init()
+
+        #region InitLights()
+        private static void InitLights() {
+            float[] ambient = {0.2f, 0.2f, 0.2f, 1.0f};
+            float[] position = {0.0f, 0.0f, 2.0f, 1.0f};
+            float[] materialDiffuse = {0.6f, 0.6f, 0.6f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialShininess = {50.0f};
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, ambient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position);
+
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, materialShininess);
+        }
+        #endregion InitLights()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glPushMatrix();
+                Gl.glRotatef(85.0f, 1.0f, 1.0f, 1.0f);
+                Gl.glEvalMesh2(Gl.GL_FILL, 0, 20, 0, 20);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-4.0, 4.0, -4.0 * h / w, 4.0 * h / w, -4.0, 4.0);
+            }
+            else {
+                Gl.glOrtho(-4.0 * w / h, 4.0 * w / h, -4.0, 4.0, -4.0, 4.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Bezsurf.cs b/examples/Redbook/Bezsurf.cs
new file mode 100644
index 0000000..75b3d09
--- /dev/null
+++ b/examples/Redbook/Bezsurf.cs
@@ -0,0 +1,196 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program renders a wireframe Bezier surface, using two-dimensional
+    ///     evaluators.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/bezsurf.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Bezsurf {
+        // --- Fields ---
+        #region Private Fields
+        private static float[/* 4*4*3 */] controlPoints = {
+            -1.5f, -1.5f,  4.0f,
+            -0.5f, -1.5f,  2.0f,
+             0.5f, -1.5f, -1.0f,
+             1.5f, -1.5f,  2.0f,
+        
+            -1.5f, -0.5f,  1.0f,
+            -0.5f, -0.5f,  3.0f,
+             0.5f, -0.5f,  0.0f,
+             1.5f, -0.5f, -1.0f,
+        
+            -1.5f, 0.5f, 4.0f,
+            -0.5f, 0.5f, 0.0f,
+             0.5f, 0.5f, 3.0f,
+             1.5f, 0.5f, 4.0f,
+        
+            -1.5f, 1.5f, -2.0f,
+            -0.5f, 1.5f, -2.0f,
+             0.5f, 1.5f,  0.0f,
+             1.5f, 1.5f, -1.0f
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Bezsurf");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glMap2f(Gl.GL_MAP2_VERTEX_3, 0.0f, 1.0f, 3, 4, 0.0f, 1.0f, 12, 4, controlPoints);
+            Gl.glEnable(Gl.GL_MAP2_VERTEX_3);
+            Gl.glMapGrid2f(20, 0.0f, 1.0f, 20, 0.0f, 1.0f);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            int i, j;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glPushMatrix();
+                Gl.glRotatef(85.0f, 1.0f, 1.0f, 1.0f);
+                for(j = 0; j <= 8; j++) {
+                    Gl.glBegin(Gl.GL_LINE_STRIP);
+                        for(i = 0; i <= 30; i++) {
+                            Gl.glEvalCoord2f((float) i / 30.0f, (float) j / 8.0f);
+                        }
+                    Gl.glEnd();
+                    Gl.glBegin(Gl.GL_LINE_STRIP);
+                        for(i = 0; i <= 30; i++) {
+                            Gl.glEvalCoord2f((float) j / 8.0f, (float) i / 30.0f);
+                        }
+                    Gl.glEnd();
+                }
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-4.0, 4.0, -4.0 * h / w, 4.0 * h / w, -4.0, 4.0);
+            }
+            else {
+                Gl.glOrtho(-4.0 * w / h, 4.0 * w / h, -4.0, 4.0, -4.0, 4.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/COPYING b/examples/Redbook/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/Redbook/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/Redbook/Checker.cs b/examples/Redbook/Checker.cs
new file mode 100644
index 0000000..96153fa
--- /dev/null
+++ b/examples/Redbook/Checker.cs
@@ -0,0 +1,205 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program texture maps a checkerboard image onto two rectangles.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/checker.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Checker {
+        // --- Fields ---
+        #region Private Constants
+        private const int CHECKIMAGEWIDTH = 64;
+        private const int CHECKIMAGEHEIGHT = 64;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static byte[ , , ] checkImage = new byte[CHECKIMAGEHEIGHT, CHECKIMAGEWIDTH, 4];
+        private static int[] texName = new int[1];
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutCreateWindow("Checker");
+            Glut.glutInitWindowSize(250, 250);
+            Glut.glutInitWindowPosition(100, 100);
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            MakeCheckImage();
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+
+            Gl.glGenTextures(1, texName);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texName[0]);
+
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, CHECKIMAGEWIDTH, CHECKIMAGEHEIGHT, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, checkImage);
+        }
+        #endregion Init()
+
+        #region MakeCheckImage()
+        private static void MakeCheckImage() {
+            int i, j, c;
+
+            for(i = 0; i < CHECKIMAGEHEIGHT; i++) {
+                for(j = 0; j < CHECKIMAGEWIDTH; j++) {
+                    if(((i & 0x8) == 0) ^ ((j & 0x8) == 0)) {
+                        c = 255;
+                    }
+                    else {
+                        c = 0;
+                    }
+                    checkImage[i, j, 0] = (byte) c;
+                    checkImage[i, j, 1] = (byte) c;
+                    checkImage[i, j, 2] = (byte) c;
+                    checkImage[i, j, 3] = (byte) 255;
+                }
+            }
+        }
+        #endregion MakeCheckImage()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glEnable(Gl.GL_TEXTURE_2D);
+            Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_DECAL);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texName[0]);
+
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-2.0f, -1.0f, 0.0f);
+                Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-2.0f,  1.0f, 0.0f);
+                Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f( 0.0f,  1.0f, 0.0f);
+                Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f( 0.0f, -1.0f, 0.0f);
+
+                Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f,     -1.0f,  0.0f);
+                Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f,      1.0f,  0.0f);
+                Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(2.41421f,  1.0f, -1.41421f);
+                Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(2.41421f, -1.0f, -1.41421f);
+            Gl.glEnd();
+            Gl.glFlush();
+            Gl.glDisable(Gl.GL_TEXTURE_2D);
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float) w / (float) h, 1.0, 30.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -3.6f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/CheckerOld.cs b/examples/Redbook/CheckerOld.cs
new file mode 100644
index 0000000..cdacbff
--- /dev/null
+++ b/examples/Redbook/CheckerOld.cs
@@ -0,0 +1,196 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program texture maps a checkerboard image onto two rectangles.  This program
+    ///     clamps the texture, if the texture coordinates fall outside 0.0 and 1.0.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class CheckerOld {
+        // --- Fields ---
+        #region Private Constants
+        private const int CHECKIMAGEWIDTH = 64;
+        private const int CHECKIMAGEHEIGHT = 64;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static byte[ , , ] checkImage = new byte[CHECKIMAGEHEIGHT, CHECKIMAGEWIDTH, 3];
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutCreateWindow("CheckerOld");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+		#endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glDepthFunc(Gl.GL_LESS);
+
+            MakeCheckImage();
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH, CHECKIMAGEHEIGHT, 0, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, checkImage);
+            Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP);
+            Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP);
+            Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+            Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+            Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_DECAL);
+            Gl.glEnable(Gl.GL_TEXTURE_2D);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        #region MakeCheckImage()
+        private static void MakeCheckImage() {
+            int i, j, c;
+
+            for(i = 0; i < CHECKIMAGEHEIGHT; i++) {
+                for(j = 0; j < CHECKIMAGEWIDTH; j++) {
+                    if(((i & 0x8) == 0) ^ ((j & 0x8) == 0)) {
+                        c = 255;
+                    }
+                    else {
+                        c = 0;
+                    }
+                    checkImage[i, j, 0] = (byte) c;
+                    checkImage[i, j, 1] = (byte) c;
+                    checkImage[i, j, 2] = (byte) c;
+                }
+            }
+        }
+        #endregion MakeCheckImage()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-2.0f, -1.0f, 0.0f);
+                Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-2.0f,  1.0f, 0.0f);
+                Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f( 0.0f,  1.0f, 0.0f);
+                Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f( 0.0f, -1.0f, 0.0f);
+
+                Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f,     -1.0f,  0.0f);
+                Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f,      1.0f,  0.0f);
+                Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(2.41421f,  1.0f, -1.41421f);
+                Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(2.41421f, -1.0f, -1.41421f);
+            Gl.glEnd();
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float) w / (float) h, 1.0, 30.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -3.6f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Clip.cs b/examples/Redbook/Clip.cs
new file mode 100644
index 0000000..f612d7a
--- /dev/null
+++ b/examples/Redbook/Clip.cs
@@ -0,0 +1,161 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates arbitrary clipping planes.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/clip.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Clip {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Clip");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            double[] eqn = {0.0, 1.0, 0.0, 0.0};
+            double[] eqn2 = {1.0, 0.0, 0.0, 0.0};
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.0f, 0.0f, -5.0f);
+
+                // Clip lower half -- y < 0
+                Gl.glClipPlane(Gl.GL_CLIP_PLANE0, eqn);
+                Gl.glEnable(Gl.GL_CLIP_PLANE0);
+
+                // Clip left half -- x < 0
+                Gl.glClipPlane(Gl.GL_CLIP_PLANE1, eqn2);
+                Gl.glEnable(Gl.GL_CLIP_PLANE1);
+
+                Gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+                Glut.glutWireSphere(1.0, 20, 16);
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float) w / (float) h, 1.0, 20.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Colormat.cs b/examples/Redbook/Colormat.cs
new file mode 100644
index 0000000..05400d0
--- /dev/null
+++ b/examples/Redbook/Colormat.cs
@@ -0,0 +1,212 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     After initialization, the program will be in ColorMaterial mode.  Pressing the
+    ///     mouse buttons will change the diffuse reflection values.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/colormat.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Colormat {
+        // --- Fields --
+        #region Private Fields
+        private static float[] diffuseMaterial = {0.5f, 0.5f, 0.5f, 1.0f};
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Colormat");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize material property, light source, lighting model, and depth buffer.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] specularMaterial = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightPosition = {1.0f, 1.0f, 1.0f, 0.0f};
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, diffuseMaterial);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, specularMaterial);
+            Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 25.0f);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+
+            Gl.glColorMaterial(Gl.GL_FRONT, Gl.GL_DIFFUSE);
+            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Glut.glutSolidSphere(1.0, 20, 16);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            switch(button) {
+                case Glut.GLUT_LEFT_BUTTON:
+                    if(state == Glut.GLUT_DOWN) {
+                        diffuseMaterial[0] += 0.1f;
+                        if(diffuseMaterial[0] > 1.0f) {
+                            diffuseMaterial[0] = 0.0f;
+                        }
+                        Gl.glColor4fv(diffuseMaterial);
+                        Glut.glutPostRedisplay();
+                    }
+                    break;
+                case Glut.GLUT_MIDDLE_BUTTON:
+                    if(state == Glut.GLUT_DOWN) {
+                        diffuseMaterial[1] += 0.1f;
+                        if(diffuseMaterial[1] > 1.0f) {
+                            diffuseMaterial[1] = 0.0f;
+                        }
+                        Gl.glColor4fv(diffuseMaterial);
+                        Glut.glutPostRedisplay();
+                    }
+                    break;
+                case Glut.GLUT_RIGHT_BUTTON:
+                    if(state == Glut.GLUT_DOWN) {
+                        diffuseMaterial[2] += 0.1f;
+                        if(diffuseMaterial[2] > 1.0f) {
+                            diffuseMaterial[2] = 0.0f;
+                        }
+                        Gl.glColor4fv(diffuseMaterial);
+                        Glut.glutPostRedisplay();
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-1.5, 1.5, -1.5 * h / w, 1.5 * h / w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-1.5 * w / h, 1.5 * w / h, -1.5, 1.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Cube.cs b/examples/Redbook/Cube.cs
new file mode 100644
index 0000000..d912429
--- /dev/null
+++ b/examples/Redbook/Cube.cs
@@ -0,0 +1,154 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates a single modeling transformation, glScalef() and a
+    ///     single viewing transformation, gluLookAt().  A wireframe cube is rendered.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/cube.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Cube {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Cube");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            
+            // Clear the matrix
+            Gl.glLoadIdentity();
+            
+            // Viewing transformation
+            Glu.gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+            
+            // Modeling transformation
+            Gl.glScalef(1.0f, 2.0f, 1.0f); 
+
+            Glut.glutWireCube(1.0);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/DepthCue.cs b/examples/Redbook/DepthCue.cs
new file mode 100644
index 0000000..307751b
--- /dev/null
+++ b/examples/Redbook/DepthCue.cs
@@ -0,0 +1,174 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws a wireframe model, which uses intensity (brightness) to give
+    ///     clues to distance.  Fog is used to achieve this effect.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class DepthCue {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutCreateWindow("DepthCue");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize linear fog for depth cueing.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] fogColor = {0.0f, 0.0f, 0.0f, 1.0f};
+
+            Gl.glEnable(Gl.GL_FOG);
+            Gl.glFogi(Gl.GL_FOG_MODE, Gl.GL_LINEAR);
+            Gl.glHint(Gl.GL_FOG_HINT, Gl.GL_NICEST);  // per pixel
+            Gl.glFogf(Gl.GL_FOG_START, 3.0f);
+            Gl.glFogf(Gl.GL_FOG_END, 5.0f);
+            Gl.glFogfv(Gl.GL_FOG_COLOR, fogColor);
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+            Gl.glDepthFunc(Gl.GL_LESS);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        #region DrawOneLine(float x1, float y1, float x2, float y2)
+        private static void DrawOneLine(float x1, float y1, float x2, float y2) {
+            Gl.glBegin(Gl.GL_LINES);
+                Gl.glVertex2f(x1, y1);
+                Gl.glVertex2f(x2, y2);
+            Gl.glEnd();
+        }
+        #endregion DrawOneLine(float x1, float y1, float x2, float y2)
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Draws an icosahedron.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Glut.glutWireIcosahedron();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(45.0, (float) w / (float) h, 3.0, 5.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -4.0f);  //move object into view
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Dof.cs b/examples/Redbook/Dof.cs
new file mode 100644
index 0000000..92cb2ec
--- /dev/null
+++ b/examples/Redbook/Dof.cs
@@ -0,0 +1,309 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates use of the accumulation buffer to create an
+    ///     out-of-focus depth-of-field effect.  The teapots are drawn several times into the
+    ///     accumulation buffer.  The viewing volume is jittered, except at the focal point,
+    ///     where the viewing volume is at the same position, each time.  In this case, the
+    ///     gold teapot remains in focus.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/dof.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Dof {
+        // --- Fields ---
+        #region Private Constants
+        private const double PI = 3.14159265358979323846;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static int teapotList;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Be certain to request an accumulation buffer.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_ACCUM | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(400, 400);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Dof");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region AccFrustum(double left, double right, double bottom, double top, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus)
+        /// <summary>
+        ///     <para>
+        ///          * The first 6 arguments are identical to the Gl.glFrustum() call.
+        ///     </para>
+        ///     <para>
+        ///         pixdx and pixdy are anti-alias jitter in pixels.  Set both equal to 0.0 for
+        ///         no anti-alias jitter.  eyedx and eyedy are depth-of field jitter in pixels.
+        ///         Set both equal to 0.0 for no depth of field effects.
+        ///     </para>
+        ///     <para>
+        ///         focus is distance from eye to plane in focus.  focus must be greater than,
+        ///         but not equal to 0.0.
+        ///     </para>
+        ///     <para>
+        ///         Note that AccFrustum() calls Gl.glTranslatef().  You will probably want to
+        ///         insure that your ModelView matrix has been initialized to identity before
+        ///         calling AccFrustum().
+        ///     </para>
+        /// </summary>
+        /// <param name="left"></param>
+        /// <param name="right"></param>
+        /// <param name="bottom"></param>
+        /// <param name="top"></param>
+        /// <param name="near"></param>
+        /// <param name="far"></param>
+        /// <param name="pixdx"></param>
+        /// <param name="pixdy"></param>
+        /// <param name="eyedx"></param>
+        /// <param name="eyedy"></param>
+        /// <param name="focus"></param>
+        private static void AccFrustum(double left, double right, double bottom, double top, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus) {
+            double xwsize, ywsize;
+            double dx, dy;
+            int[] viewport = new int[4];
+
+            Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
+
+            xwsize = right - left;
+            ywsize = top - bottom;
+
+            dx = -(pixdx * xwsize / (double) viewport[2] + eyedx * near / focus);
+            dy = -(pixdy * ywsize / (double) viewport[3] + eyedy * near / focus);
+
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glFrustum(left + dx, right + dx, bottom + dy, top + dy, near, far);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef((float) -eyedx, (float) -eyedy, 0.0f);
+        }
+        #endregion AccFrustum(double left, double right, double bottom, double top, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus)
+
+        #region AccPerspective(double fovy, double aspect, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus)
+        /// <summary>
+        ///     <para>
+        ///         Note that AccPerspective() calls AccFrustum().
+        ///     </para>
+        /// </summary>
+        private static void AccPerspective(double fovy, double aspect, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus) {
+            double fov2, left, right, bottom, top;
+
+            fov2 = ((fovy * PI) / 180.0) / 2.0;
+
+            top = near / (Math.Cos(fov2) / Math.Sin(fov2));
+            bottom = -top;
+
+            right = top * aspect;
+            left = -right;
+
+            AccFrustum(left, right, bottom, top, near, far, pixdx, pixdy, eyedx, eyedy, focus);
+        }
+        #endregion AccPerspective(double fovy, double aspect, double near, double far, double pixdx, double pixdy, double eyedx, double eyedy, double focus)
+
+        #region Init()
+        private static void Init() {
+            float[] ambient = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] diffuse = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] specular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] position = {0.0f, 3.0f, 3.0f, 0.0f};
+
+            float[] modelAmbient = {0.2f, 0.2f, 0.2f, 1.0f};
+            float[] localView = {0.0f};
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, ambient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, diffuse);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position);
+
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, modelAmbient);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_LOCAL_VIEWER, localView);
+
+            Gl.glFrontFace(Gl.GL_CW);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_AUTO_NORMAL);
+            Gl.glEnable(Gl.GL_NORMALIZE);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glClearAccum(0.0f, 0.0f, 0.0f, 0.0f); 
+            
+            // make teapot display list
+            teapotList = Gl.glGenLists(1);
+            Gl.glNewList(teapotList, Gl.GL_COMPILE);
+                Glut.glutSolidTeapot(0.5);
+            Gl.glEndList();
+        }
+        #endregion Init()
+
+        #region RenderTeapot(float x, float y, float z, float ambr, float ambg, float ambb, float difr, float difg, float difb, float specr, float specg, float specb, float shine)
+        private static void RenderTeapot(float x, float y, float z, float ambr, float ambg, float ambb, float difr, float difg, float difb, float specr, float specg, float specb, float shine) {
+            float[] mat = new float[4];
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(x, y, z);
+                mat[0] = ambr;
+                mat[1] = ambg;
+                mat[2] = ambb;
+                mat[3] = 1.0f;
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, mat);
+                mat[0] = difr;
+                mat[1] = difg;
+                mat[2] = difb;
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, mat);
+                mat[0] = specr;
+                mat[1] = specg;
+                mat[2] = specb;
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, mat);
+                Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, shine * 128.0f);
+                Gl.glCallList(teapotList);
+            Gl.glPopMatrix();
+        }
+        #endregion RenderTeapot(float x, float y, float z, float ambr, float ambg, float ambb, float difr, float difg, float difb, float specr, float specg, float specb, float shine)
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Display() draws 5 teapots into the accumulation buffer several times; each
+        ///         time with a jittered perspective.  The focal point is at z = 5.0, so the gold
+        ///         teapot will stay in focus.  The amout of jitter is adjusted by the magnitude
+        ///         of the AccPerspective() jitter; in this example, 0.33.  In this example, the
+        ///         teapots are drawn 8 times.  See <see cref="Jitter" />.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            int jitter;
+            int[] viewport = new int[4];
+
+            Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
+            Gl.glClear(Gl.GL_ACCUM_BUFFER_BIT);
+
+            for(jitter = 0; jitter < 8; jitter++) {
+                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+                AccPerspective(45.0, (double) viewport[2] / (double) viewport[3], 1.0, 15.0, 0.0, 0.0, 0.33 * Jitter.j8[jitter].X, 0.33 * Jitter.j8[jitter].Y, 5.0);
+
+                // ruby, gold, silver, emerald, and cyan teapots
+                RenderTeapot(-1.1f, -0.5f, -4.5f, 0.1745f, 0.01175f, 0.01175f, 0.61424f, 0.04136f, 0.04136f, 0.727811f, 0.626959f, 0.626959f, 0.6f);
+                RenderTeapot(-0.5f, -0.5f, -5.0f, 0.24725f, 0.1995f, 0.0745f, 0.75164f, 0.60648f, 0.22648f, 0.628281f, 0.555802f, 0.366065f, 0.4f);
+                RenderTeapot(0.2f, -0.5f, -5.5f, 0.19225f, 0.19225f, 0.19225f, 0.50754f, 0.50754f, 0.50754f, 0.508273f, 0.508273f, 0.508273f, 0.4f);
+                RenderTeapot(1.0f, -0.5f, -6.0f, 0.0215f, 0.1745f, 0.0215f, 0.07568f, 0.61424f, 0.07568f, 0.633f, 0.727811f, 0.633f, 0.6f);
+                RenderTeapot(1.8f, -0.5f, -6.5f, 0.0f, 0.1f, 0.06f, 0.0f, 0.50980392f, 0.50980392f, 0.50196078f, 0.50196078f, 0.50196078f, 0.25f);
+                Gl.glAccum(Gl.GL_ACCUM, 0.125f);
+            }
+            Gl.glAccum(Gl.GL_RETURN, 1.0f);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Double.cs b/examples/Redbook/Double.cs
new file mode 100644
index 0000000..35d267c
--- /dev/null
+++ b/examples/Redbook/Double.cs
@@ -0,0 +1,179 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This is a simple double buffered program.  Pressing the left mouse button rotates
+    ///     the rectangle.  Pressing the middle or right mouse button stops the rotation.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/double.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Double {
+        // --- Fields --
+        #region Private Fields
+        private static float spin = 0.0f;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Request double buffer display mode.  Register mouse input callback functions.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(250, 250);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Double");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape)); 
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glPushMatrix();
+                Gl.glRotatef(spin, 0.0f, 0.0f, 1.0f);
+                Gl.glColor3f(1.0f, 1.0f, 1.0f);
+                Gl.glRectf(-25.0f, -25.0f, 25.0f, 25.0f);
+            Gl.glPopMatrix();
+
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            switch(button) {
+                case Glut.GLUT_LEFT_BUTTON:
+                    if(state == Glut.GLUT_DOWN) {
+                        Glut.glutIdleFunc(new Glut.IdleCallback(SpinDisplay));
+                    }
+                    break;
+                case Glut.GLUT_MIDDLE_BUTTON:
+                case Glut.GLUT_RIGHT_BUTTON:
+                    if(state == Glut.GLUT_DOWN) {
+                        Glut.glutIdleFunc(null);
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+
+        #region SpinDisplay()
+        private static void SpinDisplay() {
+            spin = spin + 2.0f;
+            if(spin > 360.0f) {
+                spin = spin - 360.0f;
+            }
+            Glut.glutPostRedisplay();
+        }
+        #endregion SpinDisplay()
+    }
+}
diff --git a/examples/Redbook/Drawf.cs b/examples/Redbook/Drawf.cs
new file mode 100644
index 0000000..ecc8f62
--- /dev/null
+++ b/examples/Redbook/Drawf.cs
@@ -0,0 +1,162 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     Draws the bitmapped letter F on the screen (several times).  This demonstrates
+    ///     use of the Gl.glBitmap() call.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/drawf.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Drawf {
+        // --- Fields ---
+        #region Private Fields
+        private static byte[] rasters = {
+            0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
+            0xff, 0x00, 0xff, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
+            0xff, 0xc0, 0xff, 0xc0
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Open window with initial window size, title bar, RGBA display mode, and
+        ///         handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(100, 100);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Drawf");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glRasterPos2i(20, 20);
+            Gl.glBitmap(10, 12, 0.0f, 0.0f, 11.0f, 0.0f, rasters);
+            Gl.glBitmap(10, 12, 0.0f, 0.0f, 11.0f, 0.0f, rasters);
+            Gl.glBitmap(10, 12, 0.0f, 0.0f, 11.0f, 0.0f, rasters);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0, w, 0, h, -1.0, 1.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Feedback.cs b/examples/Redbook/Feedback.cs
new file mode 100644
index 0000000..6378c04
--- /dev/null
+++ b/examples/Redbook/Feedback.cs
@@ -0,0 +1,234 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates use of OpenGL feedback.  First,a lighting environment
+    ///     is set up and a few lines are drawn.  Then feedback mode is entered, and the
+    ///     same lines are drawn.  The results in the feedback buffer are printed.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/feedback.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Feedback {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(100, 100);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Feedback");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region DrawGeometry(int mode)
+        /// <summary>
+        ///     <para>
+        ///         Draw a few lines and two points, one of which will be clipped.  If in
+        ///         feedback mode, a passthrough token is issued between the each primitive.
+        ///     </para>
+        /// </summary>
+        private static void DrawGeometry(int mode) {
+            Gl.glBegin(Gl.GL_LINE_STRIP);
+                Gl.glNormal3f(0.0f, 0.0f, 1.0f);
+                Gl.glVertex3f(30.0f, 30.0f, 0.0f);
+                Gl.glVertex3f(50.0f, 60.0f, 0.0f);
+                Gl.glVertex3f(70.0f, 40.0f, 0.0f);
+            Gl.glEnd();
+
+            if(mode == Gl.GL_FEEDBACK) {
+                Gl.glPassThrough(1.0f);
+            }
+
+            Gl.glBegin(Gl.GL_POINTS);
+                Gl.glVertex3f(-100.0f, -100.0f, -100.0f);  //  will be clipped
+            Gl.glEnd();
+            
+            if(mode == Gl.GL_FEEDBACK) {
+                Gl.glPassThrough(2.0f);
+            }
+
+            Gl.glBegin(Gl.GL_POINTS);
+                Gl.glNormal3f(0.0f, 0.0f, 1.0f);
+                Gl.glVertex3f(50.0f, 50.0f, 0.0f);
+            Gl.glEnd();
+        }
+        #endregion DrawGeometry(int mode)
+
+        #region Init()
+        private static void Init() {
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+        }
+        #endregion Init()
+
+        #region Print3dColorVertex(int size, int count, float[] buffer)
+        /// <summary>
+        ///     <para>
+        ///         Write contents of one vertex to console.
+        ///     </para>
+        /// </summary>
+        private static void Print3dColorVertex(int size, int count, float[] buffer) {
+            Console.Write("  ");
+            for(int i = 0; i < 7; i++) {
+                Console.Write("{0:F2} ", buffer[size - count]);
+                count = count - 1;
+            }
+            Console.Write("\n");
+        }
+        #endregion Print3dColorVertex(int size, int count, float[] buffer)
+
+        #region PrintBuffer(int size, float[] buffer)
+        /// <summary>
+        ///     <para>
+        ///         Write the contents of the entire buffer.  (Parse tokens!)
+        ///     </para>
+        /// </summary>
+        private static void PrintBuffer(int size, float[] buffer) {
+            int count;
+            float token;
+
+            count = size;
+            while(count != 0) {
+                token = buffer[size - count];
+                count--;
+                if(token == Gl.GL_PASS_THROUGH_TOKEN) {
+                    Console.WriteLine("GL_PASS_THROUGH_TOKEN");
+                    Console.WriteLine("  {0:F2}", buffer[size - count]);
+                    count--;
+                }
+                else if(token == Gl.GL_POINT_TOKEN) {
+                    Console.WriteLine("GL_POINT_TOKEN");
+                    Print3dColorVertex(size, count, buffer);
+                }
+                else if(token == Gl.GL_LINE_TOKEN) {
+                    Console.WriteLine("GL_LINE_TOKEN");
+                    Print3dColorVertex(size, count, buffer);
+                    Print3dColorVertex(size, count, buffer);
+                }
+                else if(token == Gl.GL_LINE_RESET_TOKEN) {
+                    Console.WriteLine("GL_LINE_RESET_TOKEN");
+                    Print3dColorVertex(size, count, buffer);
+                    Print3dColorVertex(size, count, buffer);
+                }
+            }
+        }
+        #endregion PrintBuffer(int size, float[] buffer)
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            float[] feedBuffer = new float[1024];
+            int size;
+
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0.0, 100.0, 0.0, 100.0, 0.0, 1.0);
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            DrawGeometry(Gl.GL_RENDER);
+
+            Gl.glFeedbackBuffer(1024, Gl.GL_3D_COLOR, feedBuffer);
+            Gl.glRenderMode(Gl.GL_FEEDBACK);
+            DrawGeometry(Gl.GL_FEEDBACK);
+
+            size = Gl.glRenderMode(Gl.GL_RENDER);
+            PrintBuffer(size, feedBuffer);
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+    }
+}
diff --git a/examples/Redbook/Fog.cs b/examples/Redbook/Fog.cs
new file mode 100644
index 0000000..e84d0a7
--- /dev/null
+++ b/examples/Redbook/Fog.cs
@@ -0,0 +1,234 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws 5 red spheres, each at a different z distance from the eye,
+    ///     in different types of fog.  Pressing the f key chooses between 3 types of 
+    ///     fog:  exponential, exponential squared, and linear.  In this program, there is
+    ///     a fixed density value, as well as fixed start and end values for the linear fog.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/fog.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Fog {
+        // --- Fields ---
+        #region Private Fields
+        private static int fogMode;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Open window with initial window size, title bar, RGBA display mode, depth
+        ///         buffer, and handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("Fog");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize depth buffer, fog, light source, material property, and lighting
+        ///         model.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] position = {0.5f, 0.5f, 3.0f, 0.0f};
+
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+
+            float[] mat = {0.1745f, 0.01175f, 0.01175f};
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, mat);
+            mat[0] = 0.61424f;
+            mat[1] = 0.04136f;
+            mat[2] = 0.04136f;
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, mat);
+            mat[0] = 0.727811f;
+            mat[1] = 0.626959f;
+            mat[2] = 0.626959f;
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, mat);
+            Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 0.6f * 128.0f);
+
+            Gl.glEnable(Gl.GL_FOG);
+            float[] fogColor = {0.5f, 0.5f, 0.5f, 1.0f};
+
+            fogMode = Gl.GL_EXP;
+            Gl.glFogi(Gl.GL_FOG_MODE, fogMode);
+            Gl.glFogfv(Gl.GL_FOG_COLOR, fogColor);
+            Gl.glFogf(Gl.GL_FOG_DENSITY, 0.35f);
+            Gl.glHint(Gl.GL_FOG_HINT, Gl.GL_DONT_CARE);
+            Gl.glFogf(Gl.GL_FOG_START, 1.0f);
+            Gl.glFogf(Gl.GL_FOG_END, 5.0f);
+
+            Gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);  // fog color
+        }
+        #endregion Init()
+
+        #region RenderSphere(float x, float y, float z)
+        private static void RenderSphere(float x, float y, float z) {
+            Gl.glPushMatrix();
+                Gl.glTranslatef(x, y, z);
+                Glut.glutSolidSphere(0.4, 16, 16);
+            Gl.glPopMatrix();
+        }
+        #endregion RenderSphere(float x, float y, float z)
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Display() draws 5 spheres at different z positions.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            RenderSphere(-2.0f, -0.5f, -1.0f);
+            RenderSphere(-1.0f, -0.5f, -2.0f);
+            RenderSphere(0.0f, -0.5f, -3.0f);
+            RenderSphere(1.0f, -0.5f, -4.0f);
+            RenderSphere(2.0f, -0.5f, -5.0f);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'f':
+                case (byte) 'F':
+                    if(fogMode == Gl.GL_EXP) {
+                        fogMode = Gl.GL_EXP2;
+                        Console.WriteLine("Fog mode is GL_EXP2");
+                    }
+                    else if(fogMode == Gl.GL_EXP2) {
+                        fogMode = Gl.GL_LINEAR;
+                        Console.WriteLine("Fog mode is GL_LINEAR");
+                    }
+                    else if(fogMode == Gl.GL_LINEAR) {
+                        fogMode = Gl.GL_EXP;
+                        Console.WriteLine("Fog mode is GL_EXP");
+                    }
+                    Gl.glFogi(Gl.GL_FOG_MODE, fogMode);
+                    Glut.glutPostRedisplay();
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-2.5, 2.5, -2.5 * (float) h / (float) w, 2.5 * (float) h / (float) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-2.5 * (float) w / (float) h, 2.5 * (float) w / (float) h, -2.5, 2.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/FogIndex.cs b/examples/Redbook/FogIndex.cs
new file mode 100644
index 0000000..4e375e3
--- /dev/null
+++ b/examples/Redbook/FogIndex.cs
@@ -0,0 +1,192 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws 5 wireframe spheres, each at a different z distance from the
+    ///     eye, in linear fog.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/fogindex.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class FogIndex {
+        // --- Fields ---
+        #region Private Constants
+        // Initialize color map and fog.  Set screen clear color to end of ramp.
+        private const int NUMCOLORS = 32;
+        private const int RAMPSTART = 16;
+        #endregion Private Constants
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Open window with initial window size, title bar, color index mode, depth
+        ///         buffer, and handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_INDEX | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("FogIndex");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            for(int i = 0; i < NUMCOLORS; i++) {
+                float shade;
+                shade = (float) (NUMCOLORS - i) / (float) NUMCOLORS;
+                Glut.glutSetColor(RAMPSTART + i, shade, shade, shade);
+            }
+            Gl.glEnable(Gl.GL_FOG);
+
+            Gl.glFogi(Gl.GL_FOG_MODE, Gl.GL_LINEAR);
+            Gl.glFogi(Gl.GL_FOG_INDEX, NUMCOLORS);
+            Gl.glFogf(Gl.GL_FOG_START, 1.0f);
+            Gl.glFogf(Gl.GL_FOG_END, 6.0f);
+            Gl.glHint(Gl.GL_FOG_HINT, Gl.GL_NICEST);
+            Gl.glClearIndex((float) (NUMCOLORS + RAMPSTART - 1));
+        }
+        #endregion Init()
+
+        #region RenderSphere(float x, float y, float z)
+        private static void RenderSphere(float x, float y, float z) {
+            Gl.glPushMatrix();
+                Gl.glTranslatef(x, y, z);
+                Glut.glutSolidSphere(0.4, 16, 16);
+            Gl.glPopMatrix();
+        }
+        #endregion RenderSphere(float x, float y, float z)
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Display() draws 5 spheres at different z positions.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            RenderSphere(-2.0f, -0.5f, -1.0f);
+            RenderSphere(-1.0f, -0.5f, -2.0f);
+            RenderSphere(0.0f, -0.5f, -3.0f);
+            RenderSphere(1.0f, -0.5f, -4.0f);
+            RenderSphere(2.0f, -0.5f, -5.0f);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-2.5, 2.5, -2.5 * (float) h / (float) w, 2.5 * (float) h / (float) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-2.5 * (float) w / (float) h, 2.5 * (float) w / (float) h, -2.5, 2.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity ();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/FogIndexOld.cs b/examples/Redbook/FogIndexOld.cs
new file mode 100644
index 0000000..9962f69
--- /dev/null
+++ b/examples/Redbook/FogIndexOld.cs
@@ -0,0 +1,201 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates fog in color index mode.  Three cones are drawn at
+    ///     different z values in a linear fog.  32 contiguous colors (from 16 to 47) are
+    ///     loaded with a color ramp.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class FogIndexOld {
+        // --- Fields ---
+        #region Private Constants
+        // Initialize color map and fog.  Set screen clear color to end of ramp.
+        private const int NUMCOLORS = 32;
+        private const int RAMPSTART = 16;
+        #endregion Private Constants
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Open window with initial window size, title bar, color index mode, depth
+        ///         buffer, and handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_INDEX | Glut.GLUT_DEPTH);
+            Glut.glutCreateWindow("FogIndexOld");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            int i;
+
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glDepthFunc(Gl.GL_LESS);
+            for(i = 0; i < NUMCOLORS; i++) {
+                float shade;
+                shade = (float) (NUMCOLORS - i) / (float) NUMCOLORS;
+                Glut.glutSetColor(16 + i, shade, shade, shade);
+            }
+            Gl.glEnable(Gl.GL_FOG);
+
+            Gl.glFogi(Gl.GL_FOG_MODE, Gl.GL_LINEAR);
+            Gl.glFogi(Gl.GL_FOG_INDEX, NUMCOLORS);
+            Gl.glFogf(Gl.GL_FOG_START, 0.0f);
+            Gl.glFogf(Gl.GL_FOG_END, 4.0f);
+            Gl.glHint(Gl.GL_FOG_HINT, Gl.GL_NICEST);
+            Gl.glClearIndex((float) (NUMCOLORS + RAMPSTART - 1));
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Display() renders 3 cones at different z positions.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-1.0f, -1.0f, -1.0f);
+                Gl.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+                Gl.glIndexi(RAMPSTART);
+                Glut.glutSolidCone(1.0, 2.0, 10, 10);
+            Gl.glPopMatrix();
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.0f, -1.0f, -2.25f);
+                Gl.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+                Gl.glIndexi(RAMPSTART);
+                Glut.glutSolidCone(1.0, 2.0, 10, 10);
+            Gl.glPopMatrix();
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(1.0f, -1.0f, -3.5f);
+                Gl.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+                Gl.glIndexi(RAMPSTART);
+                Glut.glutSolidCone(1.0, 2.0, 10, 10);
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-2.0, 2.0, -2.0 * (float) h / (float) w, 2.0 * (float) h / (float) w, 0.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-2.0 * (float) w / (float) h, 2.0 * (float) w / (float) h, -2.0, 2.0, 0.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity ();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/FogOld.cs b/examples/Redbook/FogOld.cs
new file mode 100644
index 0000000..49a17d8
--- /dev/null
+++ b/examples/Redbook/FogOld.cs
@@ -0,0 +1,273 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+/**
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws 5 red teapots, each at a different z distance from the eye,
+    ///     in different types of fog.  Pressing the left mouse button chooses between 3
+    ///     types of fog:  exponential, exponential squared, and linear.  In this program,
+    ///     there is a fixed density value, as well as fixed start and end values for the
+    ///     linear fog.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class FogOld {
+        // --- Fields ---
+        #region Private Fields
+        private static int fogMode;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Open window with initial window size, title bar, RGBA display mode, depth
+        ///         buffer, and handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(450, 150);
+            Glut.glutCreateWindow("FogOld");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            Glut.glutCreateMenu(new Glut.CreateMenuCallback(Menu));
+            Glut.glutAddMenuEntry("Fog EXP", Gl.GL_EXP);
+            Glut.glutAddMenuEntry("Fog EXP2", Gl.GL_EXP2);
+            Glut.glutAddMenuEntry("Fog LINEAR", Gl.GL_LINEAR);
+            Glut.glutAddMenuEntry("Quit", 0);
+            Glut.glutAttachMenu(Glut.GLUT_RIGHT_BUTTON);
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize z-buffer, projection matrix, light source, and lighting model.  Do
+        ///         not specify a material property here.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] position = {0.0f, 3.0f, 3.0f, 0.0f};
+            float[] localView = {0.0f};
+            float[] fogColor = {0.5f, 0.5f, 0.5f, 1.0f};
+
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glDepthFunc(Gl.GL_LESS);
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_LOCAL_VIEWER, localView);
+
+            Gl.glFrontFace(Gl.GL_CW);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_AUTO_NORMAL);
+            Gl.glEnable(Gl.GL_NORMALIZE);
+            Gl.glEnable(Gl.GL_FOG);
+
+            fogMode = Gl.GL_EXP;
+            Gl.glFogi(Gl.GL_FOG_MODE, fogMode);
+            Gl.glFogfv(Gl.GL_FOG_COLOR, fogColor);
+            Gl.glFogf(Gl.GL_FOG_DENSITY, 0.35f);
+            Gl.glHint(Gl.GL_FOG_HINT, Gl.GL_DONT_CARE);
+            Gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+        }
+        #endregion Init()
+
+        #region RenderRedTeapot(float x, float y, float z)
+        private static void RenderRedTeapot(float x, float y, float z) {
+            float[] mat;
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(x, y, z);
+                mat = new float[4];
+                mat[0] = 0.1745f;
+                mat[1] = 0.01175f;
+                mat[2] = 0.01175f;
+                mat[3] = 1.0f;
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, mat);
+                mat = new float[3];
+                mat[0] = 0.61424f;
+                mat[1] = 0.04136f;
+                mat[2] = 0.04136f;
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, mat);
+                mat[0] = 0.727811f;
+                mat[1] = 0.626959f;
+                mat[2] = 0.626959f;
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, mat);
+                Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 0.6f * 128.0f);
+                Glut.glutSolidTeapot(1.0);
+            Gl.glPopMatrix();
+        }
+        #endregion RenderRedTeapot(float x, float y, float z)
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Display() draws 5 teapots at different z positions.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            RenderRedTeapot(-4.0f, -0.5f, -1.0f);
+            RenderRedTeapot(-2.0f, -0.5f, -2.0f);
+            RenderRedTeapot(0.0f, -0.5f, -3.0f);
+            RenderRedTeapot(2.0f, -0.5f, -4.0f);
+            RenderRedTeapot(4.0f, -0.5f, -5.0f);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'f':
+                case (byte) 'F':
+                    if(fogMode == Gl.GL_EXP) {
+                        fogMode = Gl.GL_EXP2;
+                        Console.WriteLine("Fog mode is GL_EXP2");
+                    }
+                    else if(fogMode == Gl.GL_EXP2) {
+                        fogMode = Gl.GL_LINEAR;
+                        Console.WriteLine("Fog mode is GL_LINEAR");
+                    }
+                    else if(fogMode == Gl.GL_LINEAR) {
+                        fogMode = Gl.GL_EXP;
+                        Console.WriteLine("Fog mode is GL_EXP");
+                    }
+                    Gl.glFogi(Gl.GL_FOG_MODE, fogMode);
+                    Glut.glutPostRedisplay();
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Menu(int mode)
+        private static void Menu(int mode) {
+            switch(mode) {
+                case Gl.GL_LINEAR:
+                    Gl.glFogf(Gl.GL_FOG_START, 1.0f);
+                    Gl.glFogf(Gl.GL_FOG_END, 5.0f);
+                    Gl.glFogi(Gl.GL_FOG_MODE, mode);
+                    Glut.glutPostRedisplay();
+                    break;
+                case Gl.GL_EXP2:
+                case Gl.GL_EXP:
+                    Gl.glFogi(Gl.GL_FOG_MODE, mode);
+                    Glut.glutPostRedisplay();
+                    break;
+                case 0:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Menu(int mode)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= (h * 3)) {
+                Gl.glOrtho(-6.0, 6.0, -2.0 * ((float) h * 3) / (float) w, 2.0 * ((float) h * 3) / (float) w, 0.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-6.0 * (float) w / ((float) h * 3), 6.0 * (float) w / ((float) h * 3), -2.0, 2.0, 0.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Font.cs b/examples/Redbook/Font.cs
new file mode 100644
index 0000000..6e20995
--- /dev/null
+++ b/examples/Redbook/Font.cs
@@ -0,0 +1,227 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     Draws some text in a bitmapped font.  Uses Gl.glBitmap() and other pixel
+    ///     routines.  Also demonstrates use of display lists.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Font {
+        // --- Fields ---
+        #region Private Fields
+        private static int fontOffset;
+
+        private static byte[] space = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+        private static byte[ , ] letters = {
+            {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18},
+            {0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
+            {0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e},
+            {0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc},
+            {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff},
+            {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff},
+            {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e},
+            {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
+            {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e},
+            {0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06},
+            {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3},
+            {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0},
+            {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3},
+            {0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3},
+            {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e},
+            {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
+            {0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c},
+            {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
+            {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e},
+            {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff},
+            {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
+            {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
+            {0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
+            {0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3},
+            {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3},
+            {0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff}
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Open window with initial window size, title bar, RGBA display mode, and
+        ///         handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(300, 100);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Font");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glShadeModel(Gl.GL_FLAT);
+            MakeRasterFont();
+        }
+        #endregion Init()
+
+        #region MakeRasterFont()
+        private static void MakeRasterFont() {
+            int i, j;
+            byte[] letter = new byte[13];
+            int count;
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+
+            fontOffset = Gl.glGenLists(128);
+            for(i = 0, j = 'A'; i < 26; i++, j++) {
+                count = 0;
+                for(int k = 0; k < 13; k++) {
+                    letter[count] = letters[i, k];
+                    count++;
+                }
+                Gl.glNewList(fontOffset + j, Gl.GL_COMPILE);
+                    Gl.glBitmap(8, 13, 0.0f, 2.0f, 10.0f, 0.0f, letter);
+                Gl.glEndList();
+            }
+
+            Gl.glNewList(fontOffset + ' ', Gl.GL_COMPILE);
+                Gl.glBitmap(8, 13, 0.0f, 2.0f, 10.0f, 0.0f, space);
+            Gl.glEndList();
+        }
+        #endregion MakeRasterFont()
+
+        #region PrintString(string text)
+        private static void PrintString(string text) {
+            Gl.glPushAttrib(Gl.GL_LIST_BIT);
+                Gl.glListBase(fontOffset);
+		// it's a STRING, not an ARRAY damnit
+		byte [] textbytes = new byte[text.Length];
+		for (int i = 0; i < text.Length; i++) textbytes[i] = (byte) text[i];
+                Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_BYTE, textbytes);
+            Gl.glPopAttrib();
+        }
+        #endregion PrintString(string text)
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            float[] white = {1.0f, 1.0f, 1.0f};
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3fv(white);
+
+            Gl.glRasterPos2i(20, 60);
+            PrintString("THE QUICK BROWN FOX JUMPS");
+            Gl.glRasterPos2i(20, 40);
+            PrintString("OVER A LAZY DOG");
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0.0, (double) w, 0.0, (double) h, -1.0, 1.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Hello.cs b/examples/Redbook/Hello.cs
new file mode 100644
index 0000000..7cc1929
--- /dev/null
+++ b/examples/Redbook/Hello.cs
@@ -0,0 +1,145 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This is a simple, introductory OpenGL program.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/hello.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Hello {
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Declares initial window size, position, and display mode (single buffer and
+        ///         RGBA).  Open window with "Hello" in its title bar.  Call initialization
+        ///         routines.  Register callback function to display graphics.  Enter main loop
+        ///         and process events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(250, 250);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Hello");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            // Select clearing color
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+            // Initialize viewing values
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            // Clear all pixels.
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            // Draw white polygon (rectangle) with corners at (0.25, 0.25, 0.0) and
+            // (0.75, 0.75, 0.0).
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glBegin(Gl.GL_POLYGON);
+                Gl.glVertex3f(0.25f, 0.25f, 0.0f);
+                Gl.glVertex3f(0.75f, 0.25f, 0.0f);
+                Gl.glVertex3f(0.75f, 0.75f, 0.0f);
+                Gl.glVertex3f(0.25f, 0.75f, 0.0f);
+            Gl.glEnd();
+
+            // Don't wait!  Start processing buffered OpenGL routines.
+            Gl.glFlush();
+        }
+        #endregion Display()
+    }
+}
diff --git a/examples/Redbook/Image.cs b/examples/Redbook/Image.cs
new file mode 100644
index 0000000..1fb56cd
--- /dev/null
+++ b/examples/Redbook/Image.cs
@@ -0,0 +1,218 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates drawing pixels and shows the effect of
+    ///     Gl.glDrawPixels(), Gl.glCopyPixels(), and Gl.glPixelZoom().  Interaction:
+    ///     moving the mouse while pressing the mouse button will copy the image in the
+    ///     lower-left corner of the window to the mouse position, using the current pixel
+    ///     zoom factors.  There is no attempt to prevent you from drawing over the original
+    ///     image.  If you press the 'r' key, the original image and zoom factors are reset.
+    ///     If you press the 'z' or 'Z' keys, you change the zoom factors.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/image.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Image {
+        // --- Fields ---
+        #region Private Constants
+        private const int CHECKWIDTH = 64;
+        private const int CHECKHEIGHT = 64;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static byte[ , , ] checkImage = new byte[CHECKWIDTH, CHECKHEIGHT, 3];
+        private static double zoomFactor = 1.0;
+        private static int height;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(250, 250);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Image");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMotionFunc(new Glut.MotionCallback(Motion));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+            MakeCheckImage();
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+        }
+        #endregion Init()
+
+        #region MakeCheckImage()
+        private static void MakeCheckImage() {
+            int i, j, c;
+
+            for(i = 0; i < CHECKWIDTH; i++) {
+                for(j = 0; j < CHECKHEIGHT; j++) {
+                    if(((i & 0x8) == 0) ^ ((j & 0x8) == 0)) {
+                        c = 255;
+                    }
+                    else {
+                        c = 0;
+                    }
+                    checkImage[i, j, 0] = (byte) c;
+                    checkImage[i, j, 1] = (byte) c;
+                    checkImage[i, j, 2] = (byte) c;
+                }
+            }
+        }
+        #endregion MakeCheckImage()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glRasterPos2i(0, 0);
+            Gl.glDrawPixels(CHECKWIDTH, CHECKHEIGHT, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, checkImage);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'r':
+                case (byte) 'R':
+                    zoomFactor = 1.0;
+                    Glut.glutPostRedisplay();
+                    Console.WriteLine("zoomFactor reset to 1.0");
+                    break;
+                case (byte) 'z':
+                    zoomFactor += 0.5;
+                    if(zoomFactor >= 3.0) {
+                        zoomFactor = 3.0;
+                    }
+                    Console.WriteLine("zoomFactor is now {0:F1}", zoomFactor);
+                    break;
+                case (byte) 'Z':
+                    zoomFactor -= 0.5;
+                    if(zoomFactor <= 0.5) {
+                        zoomFactor = 0.5;
+                    }
+                    Console.WriteLine("zoomFactor is now {0:F1}", zoomFactor);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Motion(int x, int y)
+        private static void Motion(int x, int y) {
+            Gl.glRasterPos2i(x, height - y);
+            Gl.glPixelZoom((float) zoomFactor, (float) zoomFactor);
+            Gl.glCopyPixels(0, 0, CHECKWIDTH, CHECKHEIGHT, Gl.GL_COLOR);
+            Gl.glPixelZoom(1.0f, 1.0f);
+            Gl.glFlush();
+        }
+        #endregion Motion(int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            height = h;
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluOrtho2D(0.0, (double) w, 0.0, (double) h);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity ();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Jitter.cs b/examples/Redbook/Jitter.cs
new file mode 100644
index 0000000..9ae639b
--- /dev/null
+++ b/examples/Redbook/Jitter.cs
@@ -0,0 +1,293 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     <para>
+    ///         Contains jitter point arrays for 2, 3, 4, 8, 15, 24 and 66 jitters.  The arrays
+    ///         are named j2, j3, etc. Each element in the array has the form, for example,
+    ///         j8[0].x and j8[0].y.
+    ///     </para>
+    ///     <para>
+    ///         Values are floating point in the range [-0.5 < x < 0.5],
+    ///         [-0.5 < y < 0.5], and have a gaussian distribution around the origin.
+    ///     </para>
+    ///     <para>
+    ///         Use these to do model jittering for scene anti-aliasing and view volume jittering
+    ///         for depth of field effects.  Use in conjunction with the accwindow() routine.
+    ///     </para>
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/jitter.h
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Jitter {
+        // --- Fields ---
+        #region Public Constants
+        public const int MAX_SAMPLES = 66;
+        #endregion Public Constants
+
+        #region Public Structs
+        public struct JitterPoint {
+            public float X;
+            public float Y;
+
+            public JitterPoint(float x, float y) {
+                X = x;
+                Y = y;
+            }
+        };
+        #endregion Public Structs
+
+        #region Public Fields
+        /// <summary>
+        ///     <para>
+        ///         2 jitter points.
+        ///     </para>
+        /// </summary>
+        public static JitterPoint[] j2 = {
+            new JitterPoint( 0.246490f,  0.249999f),
+            new JitterPoint(-0.246490f, -0.249999f)
+        };
+
+        /// <summary>
+        ///     <para>
+        ///         3 jitter points.
+        ///     </para>
+        /// </summary>
+        public static JitterPoint[] j3 = {
+            new JitterPoint(-0.373411f, -0.250550f),
+            new JitterPoint( 0.256263f,  0.368119f),
+            new JitterPoint( 0.117148f, -0.117570f)
+        };
+
+        /// <summary>
+        ///     <para>
+        ///         4 jitter points.
+        ///     </para>
+        /// </summary>
+        public static JitterPoint[] j4 = {
+            new JitterPoint(-0.208147f,  0.353730f),
+            new JitterPoint( 0.203849f, -0.353780f),
+            new JitterPoint(-0.292626f, -0.149945f),
+            new JitterPoint( 0.296924f,  0.149994f)
+        };
+
+        /// <summary>
+        ///     <para>
+        ///         8 jitter points.
+        ///     </para>
+        /// </summary>
+        public static JitterPoint[] j8 = {
+            new JitterPoint(-0.334818f,  0.435331f),
+            new JitterPoint( 0.286438f, -0.393495f),
+            new JitterPoint( 0.459462f,  0.141540f),
+            new JitterPoint(-0.414498f, -0.192829f),
+            new JitterPoint(-0.183790f,  0.082102f),
+            new JitterPoint(-0.079263f, -0.317383f),
+            new JitterPoint( 0.102254f,  0.299133f),
+            new JitterPoint( 0.164216f, -0.054399f)
+        };
+
+        /// <summary>
+        ///     <para>
+        ///         15 jitter points.
+        ///     </para>
+        /// </summary>
+        public static JitterPoint[] j15 = {
+            new JitterPoint( 0.285561f,  0.188437f),
+            new JitterPoint( 0.360176f, -0.065688f),
+            new JitterPoint(-0.111751f,  0.275019f),
+            new JitterPoint(-0.055918f, -0.215197f),
+            new JitterPoint(-0.080231f, -0.470965f),
+            new JitterPoint( 0.138721f,  0.409168f),
+            new JitterPoint( 0.384120f,  0.458500f),
+            new JitterPoint(-0.454968f,  0.134088f),
+            new JitterPoint( 0.179271f, -0.331196f),
+            new JitterPoint(-0.307049f, -0.364927f),
+            new JitterPoint( 0.105354f, -0.010099f),
+            new JitterPoint(-0.154180f,  0.021794f),
+            new JitterPoint(-0.370135f, -0.116425f),
+            new JitterPoint( 0.451636f, -0.300013f),
+            new JitterPoint(-0.370610f,  0.387504f)
+        };
+
+        /// <summary>
+        ///     <para>
+        ///         24 jitter points.
+        ///     </para>
+        /// </summary>
+        public static JitterPoint[] j24 = {
+            new JitterPoint( 0.030245f,  0.136384f),
+            new JitterPoint( 0.018865f, -0.348867f),
+            new JitterPoint(-0.350114f, -0.472309f),
+            new JitterPoint( 0.222181f,  0.149524f),
+            new JitterPoint(-0.393670f, -0.266873f),
+            new JitterPoint( 0.404568f,  0.230436f),
+            new JitterPoint( 0.098381f,  0.465337f),
+            new JitterPoint( 0.462671f,  0.442116f),
+            new JitterPoint( 0.400373f, -0.212720f),
+            new JitterPoint(-0.409988f,  0.263345f),
+            new JitterPoint(-0.115878f, -0.001981f),
+            new JitterPoint( 0.348425f, -0.009237f),
+            new JitterPoint(-0.464016f,  0.066467f),
+            new JitterPoint(-0.138674f, -0.468006f),
+            new JitterPoint( 0.144932f, -0.022780f),
+            new JitterPoint(-0.250195f,  0.150161f),
+            new JitterPoint(-0.181400f, -0.264219f),
+            new JitterPoint( 0.196097f, -0.234139f),
+            new JitterPoint(-0.311082f, -0.078815f),
+            new JitterPoint( 0.268379f,  0.366778f),
+            new JitterPoint(-0.040601f,  0.327109f),
+            new JitterPoint(-0.234392f,  0.354659f),
+            new JitterPoint(-0.003102f, -0.154402f),
+            new JitterPoint( 0.297997f, -0.417965f)
+        };
+
+        /// <summary>
+        ///     <para>
+        ///         66 jitter points.
+        ///     </para>
+        /// </summary>
+        public static JitterPoint[] j66 = {
+            new JitterPoint( 0.266377f, -0.218171f),
+            new JitterPoint(-0.170919f, -0.429368f),
+            new JitterPoint( 0.047356f, -0.387135f),
+            new JitterPoint(-0.430063f,  0.363413f),
+            new JitterPoint(-0.221638f, -0.313768f),
+            new JitterPoint( 0.124758f, -0.197109f),
+            new JitterPoint(-0.400021f,  0.482195f),
+            new JitterPoint( 0.247882f,  0.152010f),
+            new JitterPoint(-0.286709f, -0.470214f),
+            new JitterPoint(-0.426790f,  0.004977f),
+            new JitterPoint(-0.361249f, -0.104549f),
+            new JitterPoint(-0.040643f,  0.123453f),
+            new JitterPoint(-0.189296f,  0.438963f),
+            new JitterPoint(-0.453521f, -0.299889f),
+            new JitterPoint( 0.408216f, -0.457699f),
+            new JitterPoint( 0.328973f, -0.101914f),
+            new JitterPoint(-0.055540f, -0.477952f),
+            new JitterPoint( 0.194421f,  0.453510f),
+            new JitterPoint( 0.404051f,  0.224974f),
+            new JitterPoint( 0.310136f,  0.419700f),
+            new JitterPoint(-0.021743f,  0.403898f),
+            new JitterPoint(-0.466210f,  0.248839f),
+            new JitterPoint( 0.341369f,  0.081490f),
+            new JitterPoint( 0.124156f, -0.016859f),
+            new JitterPoint(-0.461321f, -0.176661f),
+            new JitterPoint( 0.013210f,  0.234401f),
+            new JitterPoint( 0.174258f, -0.311854f),
+            new JitterPoint( 0.294061f,  0.263364f),
+            new JitterPoint(-0.114836f,  0.328189f),
+            new JitterPoint( 0.041206f, -0.106205f),
+            new JitterPoint( 0.079227f,  0.345021f),
+            new JitterPoint(-0.109319f, -0.242380f),
+            new JitterPoint( 0.425005f, -0.332397f),
+            new JitterPoint( 0.009146f,  0.015098f),
+            new JitterPoint(-0.339084f, -0.355707f),
+            new JitterPoint(-0.224596f, -0.189548f),
+            new JitterPoint( 0.083475f,  0.117028f),
+            new JitterPoint( 0.295962f, -0.334699f),
+            new JitterPoint( 0.452998f,  0.025397f),
+            new JitterPoint( 0.206511f, -0.104668f),
+            new JitterPoint( 0.447544f, -0.096004f),
+            new JitterPoint(-0.108006f, -0.002471f),
+            new JitterPoint(-0.380810f,  0.130036f),
+            new JitterPoint(-0.242440f,  0.186934f),
+            new JitterPoint(-0.200363f,  0.070863f),
+            new JitterPoint(-0.344844f, -0.230814f),
+            new JitterPoint( 0.408660f,  0.345826f),
+            new JitterPoint(-0.233016f,  0.305203f),
+            new JitterPoint( 0.158475f, -0.430762f),
+            new JitterPoint( 0.486972f,  0.139163f),
+            new JitterPoint(-0.301610f,  0.009319f),
+            new JitterPoint( 0.282245f, -0.458671f),
+            new JitterPoint( 0.482046f,  0.443890f),
+            new JitterPoint(-0.121527f,  0.210223f),
+            new JitterPoint(-0.477606f, -0.424878f),
+            new JitterPoint(-0.083941f, -0.121440f),
+            new JitterPoint(-0.345773f,  0.253779f),
+            new JitterPoint( 0.234646f,  0.034549f),
+            new JitterPoint( 0.394102f, -0.210901f),
+            new JitterPoint(-0.312571f,  0.397656f),
+            new JitterPoint( 0.200906f,  0.333293f),
+            new JitterPoint( 0.018703f, -0.261792f),
+            new JitterPoint(-0.209349f, -0.065383f),
+            new JitterPoint( 0.076248f,  0.478538f),
+            new JitterPoint(-0.073036f, -0.355064f),
+            new JitterPoint( 0.145087f,  0.221726f)
+        };
+        #endregion Public Fields
+    }
+}
diff --git a/examples/Redbook/Light.cs b/examples/Redbook/Light.cs
new file mode 100644
index 0000000..93ad865
--- /dev/null
+++ b/examples/Redbook/Light.cs
@@ -0,0 +1,167 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates the use of the OpenGL lighting model.  A sphere is
+    ///     drawn using a grey material characteristic.  A single light source illuminates
+    ///     the object.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/light.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Light {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Light");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize material property, light source, lighting model, and depth buffer.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialShininess = {50.0f};
+            float[] lightPosition = {1.0f, 1.0f, 1.0f, 0.0f};
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, materialShininess);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Glut.glutSolidSphere(1.0, 20, 16);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-1.5, 1.5, -1.5 * (float) h / (float) w, 1.5 * (float) h / (float) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-1.5 * (float) w / (float) h, 1.5 * (float) w / (float) h, -1.5, 1.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity ();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Lines.cs b/examples/Redbook/Lines.cs
new file mode 100644
index 0000000..8b58e56
--- /dev/null
+++ b/examples/Redbook/Lines.cs
@@ -0,0 +1,195 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates geometric primitives and their attributes.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/lines.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Lines {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(400, 150);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Lines");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        #region DrawOneLine(float x1, float y1, float x2, float y2)
+        private static void DrawOneLine(float x1, float y1, float x2, float y2) {
+            Gl.glBegin(Gl.GL_LINES);
+                Gl.glVertex2f(x1, y1);
+                Gl.glVertex2f(x2, y2);
+            Gl.glEnd();
+        }
+        #endregion DrawOneLine(float x1, float y1, float x2, float y2)
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            int i;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            // select white for all lines
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+
+            // in 1st row, 3 lines, each with a different stipple
+            Gl.glEnable(Gl.GL_LINE_STIPPLE);
+
+            Gl.glLineStipple(1, 0x0101);  // dotted
+            DrawOneLine(50.0f, 125.0f, 150.0f, 125.0f);
+            Gl.glLineStipple(1, 0x00FF);  // dashed
+            DrawOneLine(150.0f, 125.0f, 250.0f, 125.0f);
+            Gl.glLineStipple(1, 0x1C47);  // dash/dot/dash
+            DrawOneLine(250.0f, 125.0f, 350.0f, 125.0f);
+
+            // in 2nd row, 3 wide lines, each with different stipple
+            Gl.glLineWidth(5.0f);
+            Gl.glLineStipple(1, 0x0101);  // dotted
+            DrawOneLine(50.0f, 100.0f, 150.0f, 100.0f);
+            Gl.glLineStipple(1, 0x00FF);  // dashed
+            DrawOneLine(150.0f, 100.0f, 250.0f, 100.0f);
+            Gl.glLineStipple(1, 0x1C47);  // dash/dot/dash
+            DrawOneLine(250.0f, 100.0f, 350.0f, 100.0f);
+            Gl.glLineWidth(1.0f);
+
+            // in 3rd row, 6 lines, with dash/dot/dash stipple
+            // as part of a single connected line strip
+            Gl.glLineStipple(1, 0x1C47);  // dash/dot/dash
+            Gl.glBegin(Gl.GL_LINE_STRIP);
+                for(i = 0; i < 7; i++) {
+                    Gl.glVertex2f(50.0f + ((float) i * 50.0f), 75.0f);
+                }
+            Gl.glEnd();
+
+            // in 4th row, 6 independent lines with same stipple
+            for(i = 0; i < 6; i++) {
+                DrawOneLine(50.0f + ((float) i * 50.0f), 50.0f, 50.0f + ((float)(i + 1) * 50.0f), 50.0f);
+            }
+
+            // in 5th row, 1 line, with dash/dot/dash stipple
+            // and a stipple repeat factor of 5
+            Gl.glLineStipple(5, 0x1C47);  // dash/dot/dash
+            DrawOneLine(50.0f, 25.0f, 350.0f, 25.0f);
+
+            Gl.glDisable(Gl.GL_LINE_STIPPLE);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluOrtho2D(0.0, (double) w, 0.0, (double) h);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/List.cs b/examples/Redbook/List.cs
new file mode 100644
index 0000000..7786af6
--- /dev/null
+++ b/examples/Redbook/List.cs
@@ -0,0 +1,183 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates how to make and execute a display list.  Note that
+    ///     attributes, such as current color and matrix, are changed.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/list.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class List {
+        // --- Fields ---
+        #region Private Fields
+        private static int listName;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Open window with initial window size, title bar, RGBA display mode, and
+        ///         handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(650, 50);
+            Glut.glutCreateWindow("List");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            listName = Gl.glGenLists(1);
+            Gl.glNewList(listName, Gl.GL_COMPILE);
+                Gl.glColor3f(1.0f, 0.0f, 0.0f);    // current color red
+                Gl.glBegin(Gl.GL_TRIANGLES);
+                    Gl.glVertex2f(0.0f, 0.0f);
+                    Gl.glVertex2f(1.0f, 0.0f);
+                    Gl.glVertex2f(0.0f, 1.0f);
+                Gl.glEnd();
+                Gl.glTranslatef(1.5f, 0.0f, 0.0f); // move position
+            Gl.glEndList();
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        #region DrawLine()
+        private static void DrawLine() {
+            Gl.glBegin(Gl.GL_LINES);
+                Gl.glVertex2f(0.0f, 0.5f);
+                Gl.glVertex2f(15.0f, 0.5f);
+            Gl.glEnd();
+        }
+        #endregion DrawLine()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(0.0f, 1.0f, 0.0f);  // current color green
+            for(int i = 0; i < 10; i++) {    // draw 10 triangles
+                Gl.glCallList(listName);
+            }
+            
+            DrawLine();                      // is this line green?  NO!
+                                             // where is the line drawn?
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Glu.gluOrtho2D(0.0, 2.0, -0.5 * (float) h / (float) w, 1.5 * (float) h / (float) w);
+            }
+            else {
+                Glu.gluOrtho2D(0.0, 2.0 * (float) w / (float) h, -0.5, 1.5);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Makefile.am b/examples/Redbook/Makefile.am
new file mode 100644
index 0000000..ad7e8f2
--- /dev/null
+++ b/examples/Redbook/Makefile.am
@@ -0,0 +1,94 @@
+
+PROGRAM = Redbook
+PACKAGES =
+BINARY_LIBS = \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+RESX = Redbook.resx
+RESOURCES = $(PROGRAM).Redbook.resources
+SOURCES = \
+        Redbook.cs \
+        Aaindex.cs \
+        Aapoly.cs \
+        Aargb.cs \
+        Accanti.cs \
+        Accpersp.cs \
+        Alpha.cs \
+        Alpha3d.cs \
+        Anti.cs \
+        Bezcurve.cs \
+        Bezmesh.cs \
+        Bezsurf.cs \
+        Checker.cs \
+        CheckerOld.cs \
+        Clip.cs \
+        Colormat.cs \
+        Cube.cs \
+        DepthCue.cs \
+        Dof.cs \
+        Double.cs \
+        Drawf.cs \
+        Feedback.cs \
+        Fog.cs \
+        FogIndex.cs \
+        FogIndexOld.cs \
+        FogOld.cs \
+        Font.cs \
+        Hello.cs \
+        Image.cs \
+        Jitter.cs \
+        Light.cs \
+        Lines.cs \
+        List.cs \
+        Material.cs \
+        Mipmap.cs \
+        Model.cs \
+        MoveLight.cs \
+        Nurbs.cs \
+        PickDepth.cs \
+        PickSquare.cs \
+        Plane.cs \
+        Planet.cs \
+        PolyOff.cs \
+        Polys.cs \
+        Program.cs \
+        Quadric.cs \
+        Redbook.Designer.cs \
+        Robot.cs \
+        Scene.cs \
+        SceneBlueAmbient.cs \
+        SceneColorLight.cs \
+        SceneFlat.cs \
+        Select.cs \
+        Smooth.cs \
+        Stencil.cs \
+        Stroke.cs \
+        Surface.cs \
+        SurfaceOld.cs \
+        TeaAmbient.cs \
+        Teapots.cs \
+        Tess.cs \
+        TessWind.cs \
+        TexBind.cs \
+        TexGen.cs \
+        TexProx.cs \
+        TexSub.cs \
+        TextureSurf.cs \
+        Torus.cs \
+        Trim.cs \
+        UnProject.cs \
+        Varray.cs \
+        Wrap.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.FreeGlut/Tao.FreeGlut.snk
+
+$(PROGRAM).Redbook.resources: Redbook.resx
+	$(RESGEN) $< $@
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/Redbook/Makefile.in b/examples/Redbook/Makefile.in
new file mode 100644
index 0000000..4170597
--- /dev/null
+++ b/examples/Redbook/Makefile.in
@@ -0,0 +1,442 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/Redbook
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = Redbook
+PACKAGES = 
+BINARY_LIBS = \
+        Tao.FreeGlut.dll \
+        Tao.OpenGl.dll
+
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+
+RESX = Redbook.resx
+RESOURCES = $(PROGRAM).Redbook.resources
+SOURCES = \
+        Redbook.cs \
+        Aaindex.cs \
+        Aapoly.cs \
+        Aargb.cs \
+        Accanti.cs \
+        Accpersp.cs \
+        Alpha.cs \
+        Alpha3d.cs \
+        Anti.cs \
+        Bezcurve.cs \
+        Bezmesh.cs \
+        Bezsurf.cs \
+        Checker.cs \
+        CheckerOld.cs \
+        Clip.cs \
+        Colormat.cs \
+        Cube.cs \
+        DepthCue.cs \
+        Dof.cs \
+        Double.cs \
+        Drawf.cs \
+        Feedback.cs \
+        Fog.cs \
+        FogIndex.cs \
+        FogIndexOld.cs \
+        FogOld.cs \
+        Font.cs \
+        Hello.cs \
+        Image.cs \
+        Jitter.cs \
+        Light.cs \
+        Lines.cs \
+        List.cs \
+        Material.cs \
+        Mipmap.cs \
+        Model.cs \
+        MoveLight.cs \
+        Nurbs.cs \
+        PickDepth.cs \
+        PickSquare.cs \
+        Plane.cs \
+        Planet.cs \
+        PolyOff.cs \
+        Polys.cs \
+        Program.cs \
+        Quadric.cs \
+        Redbook.Designer.cs \
+        Robot.cs \
+        Scene.cs \
+        SceneBlueAmbient.cs \
+        SceneColorLight.cs \
+        SceneFlat.cs \
+        Select.cs \
+        Smooth.cs \
+        Stencil.cs \
+        Stroke.cs \
+        Surface.cs \
+        SurfaceOld.cs \
+        TeaAmbient.cs \
+        Teapots.cs \
+        Tess.cs \
+        TessWind.cs \
+        TexBind.cs \
+        TexGen.cs \
+        TexProx.cs \
+        TexSub.cs \
+        TextureSurf.cs \
+        Torus.cs \
+        Trim.cs \
+        UnProject.cs \
+        Varray.cs \
+        Wrap.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.FreeGlut/Tao.FreeGlut.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/Redbook/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/Redbook/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).Redbook.resources: Redbook.resx
+	$(RESGEN) $< $@
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/Redbook/Material.cs b/examples/Redbook/Material.cs
new file mode 100644
index 0000000..c0bce25
--- /dev/null
+++ b/examples/Redbook/Material.cs
@@ -0,0 +1,340 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates the use of the GL lighting model.  Several objects are
+    ///     drawn using different material characteristics.  A single light source
+    ///     illuminates the objects.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/material.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Material {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(600, 450);
+            Glut.glutCreateWindow("Material");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize Z-buffer, projection matrix, light source, and lighting model.  Do
+        ///         not specify a material property here.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] ambient = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] diffuse = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] specular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] position = {0.0f, 3.0f, 2.0f, 0.0f};
+            float[] modelAmbient = {0.4f, 0.4f, 0.4f, 1.0f};
+            float[] localView = {0.0f};
+
+            Gl.glClearColor(0.0f, 0.1f, 0.1f, 0.0f);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, ambient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, diffuse);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, modelAmbient);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_LOCAL_VIEWER, localView);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            /*  Draw twelve spheres in 3 rows with 4 columns.  
+            *   The spheres in the first row have materials with no ambient reflection.
+            *   The second row has materials with significant ambient reflection.
+            *   The third row has materials with colored ambient reflection.
+            *
+            *   The first column has materials with blue, diffuse reflection only.
+            *   The second column has blue diffuse reflection, as well as specular
+            *   reflection with a low shininess exponent.
+            *   The third column has blue diffuse reflection, as well as specular
+            *   reflection with a high shininess exponent (a more concentrated highlight).
+            *   The fourth column has materials which also include an emissive component.
+            *
+            *   Gl.glTranslatef() is used to move spheres to their appropriate locations.
+            */
+            float[] materialNone = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] materialAmbient = {0.7f, 0.7f, 0.7f, 1.0f};
+            float[] materialAmbientColor = {0.8f, 0.8f, 0.2f, 1.0f};
+            float[] materialDiffuse = {0.1f, 0.5f, 0.8f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialEmission = {0.3f, 0.2f, 0.2f, 0.0f};
+            float[] shininessNone = {0.0f};
+            float[] shininessLow = {5.0f};
+            float[] shininessHigh = {100.0f};
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            // draw sphere in first row, first column diffuse reflection only; no ambient or
+            // specular
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-3.75f, 3.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialNone);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in first row, second column diffuse and specular reflection; low
+            // shininess; no ambient
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-1.25f, 3.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessLow);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialNone);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in first row, third column diffuse and specular reflection; high
+            // shininess; no ambient
+            Gl.glPushMatrix();
+                Gl.glTranslatef(1.25f, 3.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessHigh);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialNone);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in first row, fourth column diffuse reflection; emission; no ambient
+            // or specular reflection
+            Gl.glPushMatrix();
+                Gl.glTranslatef(3.75f, 3.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialEmission);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in second row, first column ambient and diffuse reflection; no
+            // specular
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-3.75f, 0.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbient);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialNone);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in second row, second column ambient, diffuse and specular reflection;
+            // low shininess
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-1.25f, 0.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbient);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessLow);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialNone);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in second row, third column ambient, diffuse and specular reflection;
+            // high shininess
+            Gl.glPushMatrix();
+                Gl.glTranslatef(1.25f, 0.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbient);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessHigh);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialNone);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in second row, fourth column ambient and diffuse reflection; emission;
+            // no specular
+            Gl.glPushMatrix();
+                Gl.glTranslatef(3.75f, 0.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbient);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialEmission);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in third row, first column colored ambient and diffuse reflection; no
+            // specular
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-3.75f, -3.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbientColor);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialNone);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in third row, second column colored ambient, diffuse and specular
+            // reflection; low shininess
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-1.25f, -3.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbientColor);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessLow);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialNone);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in third row, third column colored ambient, diffuse and specular
+            // reflection; high shininess
+            Gl.glPushMatrix();
+                Gl.glTranslatef(1.25f, -3.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbientColor);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessHigh);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialNone);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            // draw sphere in third row, fourth column colored ambient and diffuse reflection;
+            // emission; no specular
+            Gl.glPushMatrix();
+                Gl.glTranslatef(3.75f, -3.0f, 0.0f);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbientColor);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininessNone);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, materialEmission);
+                Glut.glutSolidSphere(1.0f, 16, 16);
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h * 2) {
+                Gl.glOrtho(-6.0, 6.0, -3.0 * ((float) h * 2) / (float) w, 3.0 * ((float) h * 2) / (float) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-6.0 * (float) w / ((float) h * 2), 6.0 * (float) w / ((float) h * 2), -3.0, 3.0, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Mipmap.cs b/examples/Redbook/Mipmap.cs
new file mode 100644
index 0000000..5dafbdd
--- /dev/null
+++ b/examples/Redbook/Mipmap.cs
@@ -0,0 +1,237 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates using mipmaps for texture maps.  To overtly show the
+    ///     effect of mipmaps, each mipmap reduction level has a solidly colored, contrasting
+    ///     texture image.  Thus, the quadrilateral which is drawn is drawn with several
+    ///     different colors.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/mipmap.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Mipmap {
+        // --- Fields ---
+        #region Private Fields
+        private static byte[ , , ] mipmapImage32 = new byte[32, 32, 4];
+        private static byte[ , , ] mipmapImage16 = new byte[16, 16, 4];
+        private static byte[ , , ] mipmapImage8 = new byte[8, 8, 4];
+        private static byte[ , , ] mipmapImage4 = new byte[4, 4, 4];
+        private static byte[ , , ] mipmapImage2 = new byte[2, 2, 4];
+        private static byte[ , , ] mipmapImage1 = new byte[1, 1, 4];
+        private static int[] texture = new int[1];
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("Mipmap");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_FLAT);
+
+            Gl.glTranslatef(0.0f, 0.0f, -3.6f);
+            MakeImages();
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+
+            Gl.glGenTextures(1, texture);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST_MIPMAP_NEAREST);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, 32, 32, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, mipmapImage32);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 1, Gl.GL_RGBA, 16, 16, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, mipmapImage16);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 2, Gl.GL_RGBA, 8, 8, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, mipmapImage8);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 3, Gl.GL_RGBA, 4, 4, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, mipmapImage4);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 4, Gl.GL_RGBA, 2, 2, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, mipmapImage2);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 5, Gl.GL_RGBA, 1, 1, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, mipmapImage1);
+
+            Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_DECAL);
+            Gl.glEnable(Gl.GL_TEXTURE_2D);
+        }
+        #endregion Init()
+
+        #region MakeImages()
+        private static void MakeImages() {
+            int i, j;
+
+            for(i = 0; i < 32; i++) {
+                for(j = 0; j < 32; j++) {
+                    mipmapImage32[i, j, 0] = 255;
+                    mipmapImage32[i, j, 1] = 255;
+                    mipmapImage32[i, j, 2] = 0;
+                    mipmapImage32[i, j, 3] = 255;
+                }
+            }
+            for(i = 0; i < 16; i++) {
+                for(j = 0; j < 16; j++) {
+                    mipmapImage16[i, j, 0] = 255;
+                    mipmapImage16[i, j, 1] = 0;
+                    mipmapImage16[i, j, 2] = 255;
+                    mipmapImage16[i, j, 3] = 255;
+                }
+            }
+            for(i = 0; i < 8; i++) {
+                for(j = 0; j < 8; j++) {
+                    mipmapImage8[i, j, 0] = 255;
+                    mipmapImage8[i, j, 1] = 0;
+                    mipmapImage8[i, j, 2] = 0;
+                    mipmapImage8[i, j, 3] = 255;
+                }
+            }
+            for(i = 0; i < 4; i++) {
+                for(j = 0; j < 4; j++) {
+                    mipmapImage4[i, j, 0] = 0;
+                    mipmapImage4[i, j, 1] = 255;
+                    mipmapImage4[i, j, 2] = 0;
+                    mipmapImage4[i, j, 3] = 255;
+                }
+            }
+            for(i = 0; i < 2; i++) {
+                for(j = 0; j < 2; j++) {
+                    mipmapImage2[i, j, 0] = 0;
+                    mipmapImage2[i, j, 1] = 0;
+                    mipmapImage2[i, j, 2] = 255;
+                    mipmapImage2[i, j, 3] = 255;
+                }
+            }
+            mipmapImage1[0, 0, 0] = 255;
+            mipmapImage1[0, 0, 1] = 255;
+            mipmapImage1[0, 0, 2] = 255;
+            mipmapImage1[0, 0, 3] = 255;
+        }
+        #endregion MakeImages()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glTexCoord2f(0.0f, 0.0f);
+                Gl.glVertex3f(-2.0f, -1.0f, 0.0f);
+                Gl.glTexCoord2f(0.0f, 8.0f);
+                Gl.glVertex3f(-2.0f, 1.0f, 0.0f);
+                Gl.glTexCoord2f(8.0f, 8.0f);
+                Gl.glVertex3f(2000.0f, 1.0f, -6000.0f);
+                Gl.glTexCoord2f(8.0f, 0.0f);
+                Gl.glVertex3f(2000.0f, -1.0f, -6000.0f);
+            Gl.glEnd();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float) w / (float) h, 1.0, 30000.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Model.cs b/examples/Redbook/Model.cs
new file mode 100644
index 0000000..2bb69ab
--- /dev/null
+++ b/examples/Redbook/Model.cs
@@ -0,0 +1,179 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates modeling transformations.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/model.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Model {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Model");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        #region DrawTriangle()
+        private static void DrawTriangle() {
+            Gl.glBegin(Gl.GL_LINE_LOOP);
+                Gl.glVertex2f(0.0f, 25.0f);
+                Gl.glVertex2f(25.0f, -25.0f);
+                Gl.glVertex2f(-25.0f, -25.0f);
+            Gl.glEnd();
+        }
+        #endregion DrawTriangle()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+
+            Gl.glLoadIdentity();
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            DrawTriangle();
+
+            Gl.glEnable(Gl.GL_LINE_STIPPLE);
+            Gl.glLineStipple(1, unchecked((short)0xF0F0));
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(-20.0f, 0.0f, 0.0f);
+            DrawTriangle();
+
+            Gl.glLineStipple(1, unchecked((short)0xF00F));
+            Gl.glLoadIdentity();
+            Gl.glScalef(1.5f, 0.5f, 1.0f);
+            DrawTriangle();
+
+            Gl.glLineStipple(1, unchecked((short)0x8888));
+            Gl.glLoadIdentity();
+            Gl.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+            DrawTriangle();
+            Gl.glDisable(Gl.GL_LINE_STIPPLE);
+
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-50.0, 50.0, -50.0 * (float) h / (float) w, 50.0 * (float) h / (float) w, -1.0, 1.0);
+            }
+            else {
+                Gl.glOrtho(-50.0 * (float) w / (float) h, 50.0 * (float) w / (float) h, -50.0, 50.0, -1.0, 1.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/MoveLight.cs b/examples/Redbook/MoveLight.cs
new file mode 100644
index 0000000..e54f8c5
--- /dev/null
+++ b/examples/Redbook/MoveLight.cs
@@ -0,0 +1,205 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     <para>
+    ///         This program demonstrates when to issue lighting and transformation commands to
+    ///         render a model with a light which is moved by a modeling transformation (rotate
+    ///         or translate).  The light position is reset after the modeling transformation is
+    ///         called.  The eye position does not change.
+    ///     </para>
+    ///     <para>
+    ///         A sphere is drawn using a grey material characteristic.  A single light source
+    ///         illuminates the object.
+    ///     </para>
+    ///     <para>
+    ///         Interaction:  pressing the left mouse button alters the modeling transformation
+    ///         (x rotation) by 30 degrees.  The scene is then redrawn with the light in a new
+    ///         position.
+    ///     </para>
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/movelight.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class MoveLight {
+        // --- Fields ---
+        #region Private Fields
+        private static int spin = 0;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("MoveLight");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Here is where the light position is reset after the modeling transformation
+        ///         (Gl.glRotated) is called.  This places the light at a new position in world
+        ///         coordinates.  The cube represents the position of the light.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            float[] position = {0.0f, 0.0f, 1.5f, 1.0f};
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glPushMatrix();
+                Glu.gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+
+                Gl.glPushMatrix();
+                    Gl.glRotated((double) spin, 1.0, 0.0, 0.0);
+                    Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position);
+
+                    Gl.glTranslated(0.0, 0.0, 1.5);
+                    Gl.glDisable(Gl.GL_LIGHTING);
+                    Gl.glColor3f(0.0f, 1.0f, 1.0f);
+                    Glut.glutWireCube(0.1);
+                    Gl.glEnable(Gl.GL_LIGHTING);
+                Gl.glPopMatrix();
+
+                Glut.glutSolidTorus(0.275, 0.85, 8, 15);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            switch(button) {
+                case (Glut.GLUT_LEFT_BUTTON):
+                    if(state == Glut.GLUT_DOWN) {
+                        spin = (spin + 30) % 360;
+                        Glut.glutPostRedisplay();
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(40.0, (float) w / (float) h, 1.0, 20.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Nurbs.cs b/examples/Redbook/Nurbs.cs
new file mode 100644
index 0000000..d5ccc99
--- /dev/null
+++ b/examples/Redbook/Nurbs.cs
@@ -0,0 +1,276 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program shows a NURBS (Non-uniform rational B-splines) surface, shaped like
+    ///     a heart.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Nurbs {
+        // --- Fields ---
+        #region Private Constants
+        private const int SPOINTS = 13;
+        private const int SORDER = 3;
+        private const int SKNOTS = (SPOINTS + SORDER);
+        private const int TPOINTS = 3;
+        private const int TORDER = 3;
+        private const int TKNOTS = (TPOINTS + TORDER);
+        private const float SQRT2 = 1.41421356237309504880f;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static float[] sknots = {
+            -1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 2.0f, 3.0f, 4.0f,
+            4.0f,  5.0f,  6.0f, 7.0f, 8.0f, 9.0f, 9.0f, 9.0f
+        };
+        private static float[] tknots = {1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f};
+        private static float[/*S_NUMPOINTS*/, /*T_NUMPOINTS*/, /*4*/] controlPoints = {
+			{
+				{4.0f, 2.0f, 2.0f, 1.0f},
+				{4.0f, 1.6f, 2.5f, 1.0f},
+				{4.0f, 2.0f, 3.0f, 1.0f}
+			},
+			{
+				{5.0f, 4.0f, 2.0f, 1.0f},
+				{5.0f, 4.0f, 2.5f, 1.0f},
+				{5.0f, 4.0f, 3.0f, 1.0f}
+			},
+			{
+				{6.0f, 5.0f, 2.0f, 1.0f},
+				{6.0f, 5.0f, 2.5f, 1.0f},
+				{6.0f, 5.0f, 3.0f, 1.0f}
+			},
+			{
+				{SQRT2 * 6.0f, SQRT2 * 6.0f, SQRT2 * 2.0f, SQRT2},
+				{SQRT2 * 6.0f, SQRT2 * 6.0f, SQRT2 * 2.5f, SQRT2},
+				{SQRT2 * 6.0f, SQRT2 * 6.0f, SQRT2 * 3.0f, SQRT2}
+			},
+			{
+				{5.2f, 6.7f, 2.0f, 1.0f},
+				{5.2f, 6.7f, 2.5f, 1.0f},
+				{5.2f, 6.7f, 3.0f, 1.0f}
+			},
+			{
+				{SQRT2 * 4.0f, SQRT2 * 6.0f, SQRT2 * 2.0f, SQRT2},
+				{SQRT2 * 4.0f, SQRT2 * 6.0f, SQRT2 * 2.5f, SQRT2},
+				{SQRT2 * 4.0f, SQRT2 * 6.0f, SQRT2 * 3.0f, SQRT2}
+			},
+			{
+				{4.0f, 5.2f, 2.0f, 1.0f},
+				{4.0f, 4.6f, 2.5f, 1.0f},
+				{4.0f, 5.2f, 3.0f, 1.0f}
+			},
+			{
+				{SQRT2 * 4.0f, SQRT2 * 6.0f, SQRT2 * 2.0f, SQRT2},
+				{SQRT2 * 4.0f, SQRT2 * 6.0f, SQRT2 * 2.5f, SQRT2},
+				{SQRT2 * 4.0f, SQRT2 * 6.0f, SQRT2 * 3.0f, SQRT2}
+			},
+			{
+				{2.8f, 6.7f, 2.0f, 1.0f},
+				{2.8f, 6.7f, 2.5f, 1.0f},
+				{2.8f, 6.7f, 3.0f, 1.0f}
+			},
+			{
+				{SQRT2 * 2.0f, SQRT2 * 6.0f, SQRT2 * 2.0f, SQRT2},
+				{SQRT2 * 2.0f, SQRT2 * 6.0f, SQRT2 * 2.5f, SQRT2},
+				{SQRT2 * 2.0f, SQRT2 * 6.0f, SQRT2 * 3.0f, SQRT2}
+			},
+			{
+				{2.0f, 5.0f, 2.0f, 1.0f},
+				{2.0f, 5.0f, 2.5f, 1.0f},
+				{2.0f, 5.0f, 3.0f, 1.0f}
+			},
+			{
+				{3.0f, 4.0f, 2.0f, 1.0f},
+				{3.0f, 4.0f, 2.5f, 1.0f},
+				{3.0f, 4.0f, 3.0f, 1.0f}
+			},
+			{
+				{4.0f, 2.0f, 2.0f, 1.0f},
+				{4.0f, 1.6f, 2.5f, 1.0f},
+				{4.0f, 2.0f, 3.0f, 1.0f}
+			}
+		};
+        private static Glu.GLUnurbs nurb;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Open window with initial window size, title bar, RGBA display mode, and
+        ///         handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutCreateWindow("Nurbs");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize depth buffer, light source, material property, and lighting model.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] materialAmbient = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialDiffuse = {1.0f, 0.2f, 1.0f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialShininess = {50.0f};
+            float[] light0Position = {1.0f, 0.1f, 1.0f, 0.0f};
+            float[] light1Position = {-1.0f, 0.1f, 1.0f, 0.0f};
+            float[] lightModelAmbient = {0.3f, 0.3f, 0.3f, 1.0f};
+
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbient);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, materialShininess);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light0Position);
+            Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, light1Position);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, lightModelAmbient);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_LIGHT1);
+            Gl.glDepthFunc(Gl.GL_LESS);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glEnable(Gl.GL_AUTO_NORMAL);
+
+            nurb = Glu.gluNewNurbsRenderer();
+
+            Glu.gluNurbsProperty(nurb, Glu.GLU_SAMPLING_TOLERANCE, 25.0f);
+            Glu.gluNurbsProperty(nurb, Glu.GLU_DISPLAY_MODE, Glu.GLU_FILL);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(4.0f, 4.5f, 2.5f);
+                Gl.glRotatef(220.0f, 1.0f, 0.0f, 0.0f);
+                Gl.glRotatef(115.0f, 0.0f, 1.0f, 0.0f);
+                Gl.glTranslatef(-4.0f, -4.5f, -2.5f);
+
+                Glu.gluBeginSurface(nurb);
+                    Glu.gluNurbsSurface(nurb, SKNOTS, sknots, TKNOTS, tknots, 4 * TPOINTS, 4, controlPoints, SORDER, TORDER, Gl.GL_MAP2_VERTEX_4);
+                Glu.gluEndSurface(nurb);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glFrustum(-1.0, 1.0, -1.5, 0.5, 0.8, 10.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(7.0, 4.5, 4.0, 4.5, 4.5, 2.0, 6.0, -3.0, 2.0);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/PickDepth.cs b/examples/Redbook/PickDepth.cs
new file mode 100644
index 0000000..07e24ec
--- /dev/null
+++ b/examples/Redbook/PickDepth.cs
@@ -0,0 +1,263 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     Picking is demonstrated in this program.  In rendering mode, three overlapping
+    ///     rectangles are drawn.  When the left mouse button is pressed, selection mode is
+    ///     entered with the picking matrix.  Rectangles which are drawn under the cursor
+    ///     position are "picked."  Pay special attention to the depth value range, which is
+    ///     returned.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/pickdepth.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class PickDepth {
+        // --- Fields ---
+        #region Private Constants
+        private const int BUFSIZE = 512;
+        #endregion Private Constants
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(200, 200);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("PickDepth");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region DrawRectangles(int mode)
+        private static void DrawRectangles(int mode) {
+            if(mode == Gl.GL_SELECT) {
+                Gl.glLoadName(1);
+            }
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glColor3f(1.0f, 1.0f, 0.0f);
+                Gl.glVertex3i(2, 0, 0);
+                Gl.glVertex3i(2, 6, 0);
+                Gl.glVertex3i(6, 6, 0);
+                Gl.glVertex3i(6, 0, 0);
+            Gl.glEnd();
+
+            if(mode == Gl.GL_SELECT) {
+                Gl.glLoadName(2);
+            }
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glColor3f(0.0f, 1.0f, 1.0f);
+                Gl.glVertex3i(3, 2, -1);
+                Gl.glVertex3i(3, 8, -1);
+                Gl.glVertex3i(8, 8, -1);
+                Gl.glVertex3i(8, 2, -1);
+            Gl.glEnd();
+
+            if(mode == Gl.GL_SELECT) {
+                Gl.glLoadName(3);
+            }
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glColor3f(1.0f, 0.0f, 1.0f);
+                Gl.glVertex3i(0, 2, -2);
+                Gl.glVertex3i(0, 7, -2);
+                Gl.glVertex3i(5, 7, -2);
+                Gl.glVertex3i(5, 2, -2);
+            Gl.glEnd();
+        }
+        #endregion DrawRectangles(int mode)
+
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_FLAT);
+            Gl.glDepthRange(0.0, 1.0);  // The default z mapping
+        }
+        #endregion Init()
+
+        #region ProcessHits(int hits, int[] buffer)
+        /// <summary>
+        ///     <para>
+        ///         Prints out the contents of the selection array.
+        ///     </para>
+        /// </summary>
+        private static void ProcessHits(int hits, int[] buffer) {
+            int i, j;
+            int names;
+            int[] ptr;
+
+            Console.WriteLine("hits = {0}", hits);
+            ptr = buffer;
+            for(i = 0; i < hits; i++) {  // for each hit
+                names = ptr[i];
+                Console.WriteLine(" number of names for hit = {0}", names);
+                i++;;
+                Console.WriteLine("  z1 is {0}", (float) ptr[i] / 0x7fffffff);
+                i++;
+                Console.WriteLine("  z2 is {0}", (float) ptr[i] / 0x7fffffff);
+                i++;
+                Console.Write("   the name is ");
+                for(j = 0; j < names; j++) {  // for each name
+                    Console.Write("{0} ", ptr[i]);
+                    i++;
+                }
+                Console.WriteLine();
+            }
+            Console.WriteLine();
+        }
+        #endregion ProcessHits(int hits, int[] buffer)
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            DrawRectangles(Gl.GL_RENDER);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        /// <summary>
+        ///     <para>
+        ///         Sets up selection mode, name stack, and projection matrix for picking.  Then
+        ///         the objects are drawn.
+        ///     </para>
+        /// </summary>
+        private static void Mouse(int button, int state, int x, int y) {
+            int[] selectBuffer = new int[BUFSIZE];
+            int hits;
+            int[] viewport = new int[4];
+
+            if(button != Glut.GLUT_LEFT_BUTTON || state != Glut.GLUT_DOWN) {
+                return;
+            }
+
+            Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
+
+            Gl.glSelectBuffer(BUFSIZE, selectBuffer);
+            Gl.glRenderMode(Gl.GL_SELECT);
+
+            Gl.glInitNames();
+            Gl.glPushName(0);
+
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glPushMatrix();
+                Gl.glLoadIdentity();
+                // create 5x5 pixel picking region near cursor location
+                Glu.gluPickMatrix((double) x, (double) (viewport[3] - y), 5.0, 5.0, viewport);
+                Gl.glOrtho(0.0, 8.0, 0.0, 8.0, -0.5, 2.5);
+                DrawRectangles(Gl.GL_SELECT);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+
+            hits = Gl.glRenderMode(Gl.GL_RENDER);
+            ProcessHits(hits, selectBuffer);
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Gl.glOrtho(0.0, 8.0, 0.0, 8.0, -0.5, 2.5);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/PickSquare.cs b/examples/Redbook/PickSquare.cs
new file mode 100644
index 0000000..dccd05e
--- /dev/null
+++ b/examples/Redbook/PickSquare.cs
@@ -0,0 +1,276 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     Use of multiple names and picking are demonstrated.  A 3x3 grid of squares is
+    ///     drawn.  When the left mouse button is pressed, all squares under the cursor
+    ///     position have their color changed.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/picksquare.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class PickSquare {
+        // --- Fields ---
+        #region Private Constants
+        private const int BUFSIZE = 512;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static int[ , ] board = new int[3, 3];
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(100, 100);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("PickSquare");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region DrawSquares(int mode)
+        /// <summary>
+        ///     <para>
+        ///         The nine squares are drawn.  In selection mode, each square is given two
+        ///         names:  one for the row and the other for the column on the grid.  The color
+        ///         of each square is determined by its position on the grid, and the value in
+        ///         the board[][] array.
+        ///     </para>
+        /// </summary>
+        private static void DrawSquares(int mode) {
+            int i, j;
+            for(i = 0; i < 3; i++) {
+                if(mode == Gl.GL_SELECT) {
+                    Gl.glLoadName(i);
+                }
+                for(j = 0; j < 3; j ++) {
+                    if(mode == Gl.GL_SELECT) {
+                        Gl.glPushName(j);
+                    }
+                    Gl.glColor3f((float) i / 3.0f, (float) j / 3.0f, (float) board[i, j] / 3.0f);
+                    Gl.glRecti(i, j, i + 1, j + 1);
+                    if(mode == Gl.GL_SELECT) {
+                        Gl.glPopName();
+                    }
+                }
+            }
+        }
+        #endregion DrawSquares(int mode)
+
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Clear color value for every square on the board.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            int i, j;
+            for(i = 0; i < 3; i++) {
+                for(j = 0; j < 3; j ++) {
+                    board[i, j] = 0;
+                }
+            }
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        #endregion Init()
+
+        #region ProcessHits(int hits, int[] buffer)
+        /// <summary>
+        ///     <para>
+        ///         Prints out the contents of the selection array.
+        ///     </para>
+        /// </summary>
+        private static void ProcessHits(int hits, int[] buffer) {
+            int i, j;
+            int ii = 0;
+            int jj = 0;
+            int names;
+            int[] ptr;
+
+            Console.WriteLine("hits = {0}", hits);
+            ptr = buffer;
+            for(i = 0; i < hits; i++) {  // for each hit
+                names = ptr[i];
+                Console.WriteLine(" number of names for this hit = {0}", names);
+                i++;;
+                Console.WriteLine("  z1 is {0}", (float) ptr[i] / 0x7fffffff);
+                i++;
+                Console.WriteLine("  z2 is {0}", (float) ptr[i] / 0x7fffffff);
+                i++;
+                Console.Write("   names are ");
+                for(j = 0; j < names; j++) {  // for each name
+                    Console.Write("{0} ", ptr[i]);
+                    if(j == 0) {  // set row and column
+                        ii = ptr[i];
+                    }
+                    else if(j == 1) {
+                        jj = ptr[i];
+                    }
+                    i++;
+                }
+                Console.WriteLine();
+                board[ii, jj] = (board[ii, jj] + 1) % 3;
+            }
+            Console.WriteLine();
+        }
+        #endregion ProcessHits(int hits, int[] buffer)
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            DrawSquares(Gl.GL_RENDER);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        /// <summary>
+        ///     <para>
+        ///         Sets up selection mode, name stack, and projection matrix for picking.  Then
+        ///         the objects are drawn.
+        ///     </para>
+        /// </summary>
+        private static void Mouse(int button, int state, int x, int y) {
+            int[] selectBuffer = new int[BUFSIZE];
+            int hits;
+            int[] viewport = new int[4];
+
+            if(button != Glut.GLUT_LEFT_BUTTON || state != Glut.GLUT_DOWN) {
+                return;
+            }
+
+            Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
+
+            Gl.glSelectBuffer(BUFSIZE, selectBuffer);
+            Gl.glRenderMode(Gl.GL_SELECT);
+
+            Gl.glInitNames();
+            Gl.glPushName(0);
+
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glPushMatrix();
+                Gl.glLoadIdentity();
+                // create 5x5 pixel picking region near cursor location
+                Glu.gluPickMatrix((double) x, (double) (viewport[3] - y), 5.0, 5.0, viewport);
+                Glu.gluOrtho2D (0.0, 3.0, 0.0, 3.0);
+                DrawSquares(Gl.GL_SELECT);
+                Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+
+            hits = Gl.glRenderMode(Gl.GL_RENDER);
+            ProcessHits(hits, selectBuffer);
+            Glut.glutPostRedisplay();
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluOrtho2D(0.0, 3.0, 0.0, 3.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Plane.cs b/examples/Redbook/Plane.cs
new file mode 100644
index 0000000..84a7bc6
--- /dev/null
+++ b/examples/Redbook/Plane.cs
@@ -0,0 +1,222 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program shows couple quads, with differing materials and lighting.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Plane {
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Open window with initial window size, title bar, RGBA display mode, and
+        ///         handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 200);
+            Glut.glutCreateWindow("Plane");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region DrawPlane()
+        private static void DrawPlane() {
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glNormal3f(0.0f, 0.0f, 1.0f);
+                Gl.glVertex3f(-1.0f, -1.0f, 0.0f);
+                Gl.glVertex3f(0.0f, -1.0f, 0.0f);
+                Gl.glVertex3f(0.0f, 0.0f, 0.0f);
+                Gl.glVertex3f(-1.0f, 0.0f, 0.0f);
+
+                Gl.glNormal3f(0.0f, 0.0f, 1.0f);
+                Gl.glVertex3f(0.0f, -1.0f, 0.0f);
+                Gl.glVertex3f(1.0f, -1.0f, 0.0f);
+                Gl.glVertex3f(1.0f, 0.0f, 0.0f);
+                Gl.glVertex3f(0.0f, 0.0f, 0.0f);
+
+                Gl.glNormal3f(0.0f, 0.0f, 1.0f);
+                Gl.glVertex3f(0.0f, 0.0f, 0.0f);
+                Gl.glVertex3f(1.0f, 0.0f, 0.0f);
+                Gl.glVertex3f(1.0f, 1.0f, 0.0f);
+                Gl.glVertex3f(0.0f, 1.0f, 0.0f);
+
+                Gl.glNormal3f(0.0f, 0.0f, 1.0f);
+                Gl.glVertex3f(0.0f, 0.0f, 0.0f);
+                Gl.glVertex3f(0.0f, 1.0f, 0.0f);
+                Gl.glVertex3f(-1.0f, 1.0f, 0.0f);
+                Gl.glVertex3f(-1.0f, 0.0f, 0.0f);
+            Gl.glEnd();
+        }
+        #endregion DrawPlane()
+
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize light source, material property, and lighting model.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            // materialSpecular and materialShininess are NOT default values
+            float[] materialAmbient = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] materialDiffuse = {0.4f, 0.4f, 0.4f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialShininess = {15.0f};
+            float[] lightAmbient = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightModelAmbient = {0.2f, 0.2f, 0.2f, 1.0f};
+
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbient);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, materialShininess);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, lightAmbient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, lightDiffuse);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, lightSpecular);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, lightModelAmbient);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glDepthFunc(Gl.GL_LESS);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            float[] infiniteLight = {1.0f, 1.0f, 1.0f, 0.0f};
+            float[] localLight = {1.0f, 1.0f, 1.0f, 1.0f};
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix ();
+                Gl.glTranslatef(-1.5f, 0.0f, 0.0f);
+                Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, infiniteLight);
+                DrawPlane();
+            Gl.glPopMatrix();
+
+            Gl.glPushMatrix ();
+                Gl.glTranslatef(1.5f, 0.0f, 0.0f);
+                Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, localLight);
+                DrawPlane();
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho (-1.5, 1.5, -1.5 * (double) h / (double) w, 1.5 * (double) h / (double) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-1.5 * (double) w / (double) h, 1.5 * (double) w / (double) h, -1.5, 1.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Planet.cs b/examples/Redbook/Planet.cs
new file mode 100644
index 0000000..3b8889f
--- /dev/null
+++ b/examples/Redbook/Planet.cs
@@ -0,0 +1,178 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program shows how to composite modeling transformations to draw translated
+    ///     and rotated models.  Interaction:  pressing the d and y keys (day and year)
+    ///     alters the rotation of the planet around the sun.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/planet.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Planet {
+        // --- Fields ---
+        #region Private Fields
+        private static int year = 0;
+        private static int day = 0;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Planet");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+
+            Gl.glPushMatrix();
+                Glut.glutWireSphere(1.0, 20, 16);   // draw sun
+                Gl.glRotatef((float) year, 0.0f, 1.0f, 0.0f);
+                Gl.glTranslatef(2.0f, 0.0f, 0.0f);
+                Gl.glRotatef((float) day, 0.0f, 1.0f, 0.0f);
+                Glut.glutWireSphere(0.2, 10, 8);    // draw smaller planet
+            Gl.glPopMatrix();
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'd':
+                    day = (day + 10) % 360;
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'D':
+                    day = (day - 10) % 360;
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'y':
+                    year = (year + 5) % 360;
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'Y':
+                    year = (year - 5) % 360;
+                    Glut.glutPostRedisplay();
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float) w / (float) h, 1.0, 20.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/PolyOff.cs b/examples/Redbook/PolyOff.cs
new file mode 100644
index 0000000..d8ff2ed
--- /dev/null
+++ b/examples/Redbook/PolyOff.cs
@@ -0,0 +1,261 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates polygon offset to draw a shaded polygon and its
+    ///     wireframe counterpart without ugly visual artifacts ("stitching").
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/polyoff.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class PolyOff {
+        // --- Fields ---
+        #region Private Fields
+        private static int list;
+        private static int spinX = 0;
+        private static int spinY = 0;
+        private static float distance = 0.0f;
+        private static float polyFactor = 1.0f;
+        private static float polyUnits = 1.0f;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutCreateWindow("PolyOff");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            float[] lightAmbient = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightPosition = {1.0f, 1.0f, 1.0f, 0.0f};
+            float[] globalAmbient = {0.2f, 0.2f, 0.2f, 1.0f};
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+            list = Gl.glGenLists(1);
+            Gl.glNewList(list, Gl.GL_COMPILE);
+                Glut.glutSolidSphere(1.0, 20, 12);
+            Gl.glEndList();
+
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, lightAmbient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, lightDiffuse);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, lightSpecular);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, globalAmbient);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            float[] materialAmbient = {0.8f, 0.8f, 0.8f, 1.0f};
+            float[] materialDiffuse = {1.0f, 0.0f, 0.5f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] gray = {0.8f, 0.8f, 0.8f, 1.0f};
+            float[] black = {0.0f, 0.0f, 0.0f, 1.0f};
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.0f, 0.0f, distance);
+                Gl.glRotatef((float) spinX, 1.0f, 0.0f, 0.0f);
+                Gl.glRotatef((float) spinY, 0.0f, 1.0f, 0.0f);
+
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE, gray);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, black);
+                Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 0.0f);
+                Gl.glEnable(Gl.GL_LIGHTING);
+                Gl.glEnable(Gl.GL_LIGHT0);
+                Gl.glEnable(Gl.GL_POLYGON_OFFSET_FILL);
+                Gl.glPolygonOffset(polyFactor, polyUnits);
+                Gl.glCallList(list);
+                Gl.glDisable(Gl.GL_POLYGON_OFFSET_FILL);
+
+                Gl.glDisable(Gl.GL_LIGHTING);
+                Gl.glDisable(Gl.GL_LIGHT0);
+                Gl.glColor3f(1.0f, 1.0f, 1.0f);
+                Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE);
+                Gl.glCallList(list);
+                Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 't':
+                    if(distance < 4.0f) {
+                        distance = (distance + 0.5f);
+                        Glut.glutPostRedisplay();
+                    }
+                    break;
+                case (byte) 'T':
+                    if(distance > -5.0f) {
+                        distance = (distance - 0.5f);
+                        Glut.glutPostRedisplay();
+                    }
+                    break;
+                case (byte) 'F':
+                    polyFactor = polyFactor + 0.1f;
+                    Console.WriteLine("polyFactor is {0}", polyFactor);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'f':
+                    polyFactor = polyFactor - 0.1f;
+                    Console.WriteLine("polyFactor is {0}", polyFactor);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'U':
+                    polyUnits = polyUnits + 1.0f;
+                    Console.WriteLine("polyUnits is {0}", polyUnits);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'u':
+                    polyUnits = polyUnits - 1.0f;
+                    Console.WriteLine("polyUnits is {0}", polyUnits);
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            switch(button) {
+                case Glut.GLUT_LEFT_BUTTON:
+                    switch(state) {
+                        case Glut.GLUT_DOWN:
+                            spinX = (spinX + 5) % 360; 
+                            Glut.glutPostRedisplay();
+                            break;
+                        default:
+                            break;
+                    }
+                    break;
+                case Glut.GLUT_RIGHT_BUTTON:
+                    switch(state) {
+                        case Glut.GLUT_DOWN:
+                            spinY = (spinY + 5) % 360; 
+                            Glut.glutPostRedisplay();
+                            break;
+                        default:
+                            break;
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(45.0, (float) w / (float) h, 1.0, 10.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Polys.cs b/examples/Redbook/Polys.cs
new file mode 100644
index 0000000..c8d291f
--- /dev/null
+++ b/examples/Redbook/Polys.cs
@@ -0,0 +1,191 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates polygon stippling.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/polys.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Polys {
+        // --- Fields ---
+        #region Private Fields
+        private static byte[] fly = {
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+            0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60,
+            0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20,
+            0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20,
+            0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22,
+            0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
+            0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
+            0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
+            0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC,
+            0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30,
+            0x07, 0xe1, 0x87, 0xe0, 0x03, 0x3f, 0xfc, 0xc0,
+            0x03, 0x31, 0x8c, 0xc0, 0x03, 0x33, 0xcc, 0xc0,
+            0x06, 0x64, 0x26, 0x60, 0x0c, 0xcc, 0x33, 0x30,
+            0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08,
+            0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08,
+            0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08
+        };
+
+        private static byte[] halftone = {
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+            0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(350, 150);
+            Glut.glutCreateWindow("Polys");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+
+            // draw one solid, unstippled rectangle, then two stippled rectangles
+            Gl.glRectf(25.0f, 25.0f, 125.0f, 125.0f);
+            Gl.glEnable(Gl.GL_POLYGON_STIPPLE);
+            Gl.glPolygonStipple(fly);
+            Gl.glRectf(125.0f, 25.0f, 225.0f, 125.0f);
+            Gl.glPolygonStipple(halftone);
+            Gl.glRectf(225.0f, 25.0f, 325.0f, 125.0f);
+            Gl.glDisable(Gl.GL_POLYGON_STIPPLE);
+
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluOrtho2D(0.0, (double) w, 0.0, (double) h);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Program.cs b/examples/Redbook/Program.cs
new file mode 100644
index 0000000..d9d3acb
--- /dev/null
+++ b/examples/Redbook/Program.cs
@@ -0,0 +1,47 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace Redbook
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new Redbook());
+        }
+    }
+}
diff --git a/examples/Redbook/Properties/AssemblyInfo.cs b/examples/Redbook/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..5415a6f
--- /dev/null
+++ b/examples/Redbook/Properties/AssemblyInfo.cs
@@ -0,0 +1,60 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework - http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright �2003-2005 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Redbook")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Redbook examples")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+
+[assembly: AssemblyKeyName("")]
+#if DEBUG
+[assembly: AssemblyProduct("Redbook Examples *** Debug Build ***")]
+#else
+[assembly: AssemblyProduct("Redbook Examples")]
+#endif
+[assembly: AssemblyTitle("Redbook examples")]
+[assembly: AssemblyTrademark("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/Redbook/Quadric.cs b/examples/Redbook/Quadric.cs
new file mode 100644
index 0000000..a798a9f
--- /dev/null
+++ b/examples/Redbook/Quadric.cs
@@ -0,0 +1,231 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates the use of some of the Glu.gluQuadric* routines.
+    ///     Quadric objects are created with some quadric properties and the callback routine
+    ///     to handle errors.  Note that the cylinder has no top or bottom and the circle
+    ///     has a hole in it.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/quadric.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Quadric {
+        // --- Fields ---
+        #region Private Fields
+        private static int startList;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("Quadric");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Glu.GLUquadric quadric;
+            float[] materialAmbient = {0.5f, 0.5f, 0.5f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialShininess = {50.0f};
+            float[] lightPosition = {1.0f, 1.0f, 1.0f, 0.0f};
+            float[] modelAmbient = {0.5f, 0.5f, 0.5f, 1.0f};
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, materialAmbient);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, materialShininess);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, modelAmbient);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            //  Create 4 display lists, each with a different quadric object.  Different drawing
+            //  styles and surface normal specifications are demonstrated.
+            startList = Gl.glGenLists(4);
+            quadric = Glu.gluNewQuadric();
+            Glu.gluQuadricCallback(quadric, Glu.GLU_ERROR, new Glu.QuadricErrorCallback(Error));
+
+            Glu.gluQuadricDrawStyle(quadric, Glu.GLU_FILL); // smooth shaded
+            Glu.gluQuadricNormals(quadric, Glu.GLU_SMOOTH);
+            Gl.glNewList(startList, Gl.GL_COMPILE);
+                Glu.gluSphere(quadric, 0.75, 15, 10);
+            Gl.glEndList();
+
+            Glu.gluQuadricDrawStyle(quadric, Glu.GLU_FILL); // flat shaded
+            Glu.gluQuadricNormals(quadric, Glu.GLU_FLAT);
+            Gl.glNewList(startList + 1, Gl.GL_COMPILE);
+                Glu.gluCylinder(quadric, 0.5, 0.3, 1.0, 15, 5);
+            Gl.glEndList();
+
+            Glu.gluQuadricDrawStyle(quadric, Glu.GLU_LINE); // all polygons wireframe
+            Glu.gluQuadricNormals(quadric, Glu.GLU_NONE);
+            Gl.glNewList(startList + 2, Gl.GL_COMPILE);
+                Glu.gluDisk(quadric, 0.25, 1.0, 20, 4);
+            Gl.glEndList();
+
+            Glu.gluQuadricDrawStyle(quadric, Glu.GLU_SILHOUETTE); // boundary only
+            Glu.gluQuadricNormals(quadric, Glu.GLU_NONE);
+            Gl.glNewList(startList + 3, Gl.GL_COMPILE);
+                Glu.gluPartialDisk(quadric, 0.0, 1.0, 20, 4, 0.0, 225.0);
+            Gl.glEndList();
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glPushMatrix();
+                Gl.glEnable(Gl.GL_LIGHTING);
+                Gl.glShadeModel(Gl.GL_SMOOTH);
+                Gl.glTranslatef(-1.0f, -1.0f, 0.0f);
+                Gl.glCallList(startList);
+
+                Gl.glShadeModel(Gl.GL_FLAT);
+                Gl.glTranslatef(0.0f, 2.0f, 0.0f);
+                Gl.glPushMatrix();
+                    Gl.glRotatef(300.0f, 1.0f, 0.0f, 0.0f);
+                    Gl.glCallList(startList + 1);
+                Gl.glPopMatrix();
+
+                Gl.glDisable(Gl.GL_LIGHTING);
+                Gl.glColor3f(0.0f, 1.0f, 1.0f);
+                Gl.glTranslatef(2.0f, -2.0f, 0.0f);
+                Gl.glCallList(startList + 2);
+
+                Gl.glColor3f(1.0f, 1.0f, 0.0f);
+                Gl.glTranslatef(0.0f, 2.0f, 0.0f);
+                Gl.glCallList(startList + 3);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region void Error(int errorCode)
+        private static void Error(int errorCode) {
+            string errorString;
+            errorString = Glu.gluErrorString(errorCode);
+            Console.WriteLine("Quadric Error: {0}", errorString);
+            Environment.Exit(1);
+        }
+        #endregion void Error(int errorCode)
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-2.5, 2.5, -2.5 * (float) h / (float) w, 2.5 * (float) h / (float) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-2.5 * (float) w / (float) h, 2.5 * (float) w / (float) h, -2.5, 2.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/README b/examples/Redbook/README
new file mode 100644
index 0000000..3428a4d
--- /dev/null
+++ b/examples/Redbook/README
@@ -0,0 +1,23 @@
+Redbook
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are C# ports of examples found at
+http://www.opengl.org/developers/code/examples/redbook/.  They make
+use of FreeGLUT, make sure to have the appropriate native libraries
+for your system installed.
+
+These examples are somewhat well documented, however, do not take
+them to be 'best practices' for .NET OpenGL development.  The
+intent of these ports is as an introduction or as a comparison
+against the original native versions.
+
+Randy Ridge
+http://www.taoframework.com
+
+
+Change Log:
+
+April 25, 2004
+    Initial release, version 1.0.0.0.
diff --git a/examples/Redbook/Redbook.Designer.cs b/examples/Redbook/Redbook.Designer.cs
new file mode 100644
index 0000000..3a94518
--- /dev/null
+++ b/examples/Redbook/Redbook.Designer.cs
@@ -0,0 +1,106 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+namespace Redbook
+{
+    partial class Redbook
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Redbook));
+            this.lstExamples = new System.Windows.Forms.ListBox();
+            this.btnRun = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // lstExamples
+            // 
+            this.lstExamples.FormattingEnabled = true;
+            this.lstExamples.Location = new System.Drawing.Point(13, 13);
+            this.lstExamples.Name = "lstExamples";
+            this.lstExamples.Size = new System.Drawing.Size(258, 173);
+            this.lstExamples.Sorted = true;
+            this.lstExamples.TabIndex = 0;
+            this.lstExamples.DoubleClick += new System.EventHandler(this.lstExamples_SelectedIndexChanged);
+            // 
+            // btnRun
+            // 
+            this.btnRun.Location = new System.Drawing.Point(94, 192);
+            this.btnRun.Name = "btnRun";
+            this.btnRun.Size = new System.Drawing.Size(95, 23);
+            this.btnRun.TabIndex = 1;
+            this.btnRun.Text = "Run";
+            this.btnRun.UseVisualStyleBackColor = true;
+            this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+            // 
+            // Redbook
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(283, 224);
+            this.Controls.Add(this.btnRun);
+            this.Controls.Add(this.lstExamples);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "Redbook";
+            this.Text = "RedbookExamples";
+            this.Load += new System.EventHandler(this.frmExamples_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ListBox lstExamples;
+        private System.Windows.Forms.Button btnRun;
+    }
+}
+
diff --git a/examples/Redbook/Redbook.cs b/examples/Redbook/Redbook.cs
new file mode 100644
index 0000000..cbf1c6c
--- /dev/null
+++ b/examples/Redbook/Redbook.cs
@@ -0,0 +1,82 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace Redbook
+{
+    public partial class Redbook : Form
+    {
+        public Redbook()
+        {
+            InitializeComponent();
+        }
+
+        private void frmExamples_Load(object sender, EventArgs e)
+        {
+            Type[] types = Assembly.GetExecutingAssembly().GetTypes();
+            foreach (Type type in types)
+            {
+                MemberInfo[] runMethods = type.GetMember("Run");
+                foreach (MemberInfo run in runMethods)
+                {
+                    lstExamples.Items.Add(type.Name);
+                }
+                if (lstExamples.Items.Count > 0)
+                {
+                    this.lstExamples.SelectedIndex = 0;
+                }
+            }
+        }
+
+        private void btnRun_Click(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+
+        private void SelectExample()
+        {
+            if (lstExamples.SelectedItem != null)
+            {
+                Type example = Assembly.GetExecutingAssembly().GetType("Redbook." + lstExamples.SelectedItem.ToString(), true, true);
+                example.InvokeMember("Run", BindingFlags.InvokeMethod, null, null, null);
+            }
+        }
+
+        private void lstExamples_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+    }
+}
diff --git a/examples/Redbook/Redbook.csproj b/examples/Redbook/Redbook.csproj
new file mode 100644
index 0000000..77925cb
--- /dev/null
+++ b/examples/Redbook/Redbook.csproj
@@ -0,0 +1,334 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7E8945BA-1C9C-4C88-A4D9-70BE863C4056}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Redbook</AssemblyName>
+    <AssemblyOriginatorKeyFile>../../src/Tao.OpenGl/Tao.OpenGl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Redbook</RootNamespace>
+    <StartupObject>Redbook.Program</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.FreeGlut\Tao.FreeGlut.csproj">
+      <Name>Tao.FreeGlut</Name>
+      <Project>{87C95364-7158-4D81-83B8-97B649E27ABA}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <ProjectReference Include="..\..\src\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Redbook.resx">
+      <DependentUpon>Redbook.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Redbook.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Aaindex.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aapoly.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aargb.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Accanti.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Accpersp.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Alpha.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Alpha3d.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Anti.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Bezcurve.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Bezmesh.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Bezsurf.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Checker.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="CheckerOld.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Clip.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Colormat.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Cube.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DepthCue.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Dof.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Double.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Drawf.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Feedback.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Fog.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="FogIndex.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="FogIndexOld.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="FogOld.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Font.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Hello.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Image.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Jitter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Light.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Lines.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="List.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Material.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Mipmap.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Model.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="MoveLight.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Nurbs.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="PickDepth.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="PickSquare.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plane.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Planet.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="PolyOff.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Polys.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Quadric.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Redbook.Designer.cs">
+      <DependentUpon>Redbook.cs</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Robot.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Scene.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SceneBlueAmbient.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SceneColorLight.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SceneFlat.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Select.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Smooth.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Stencil.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Stroke.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Surface.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SurfaceOld.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="TeaAmbient.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Teapots.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Tess.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="TessWind.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="TexBind.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="TexGen.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="TexProx.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="TexSub.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="TextureSurf.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Torus.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Trim.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="UnProject.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Varray.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Wrap.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/Redbook/Redbook.resx b/examples/Redbook/Redbook.resx
new file mode 100644
index 0000000..06ec7be
--- /dev/null
+++ b/examples/Redbook/Redbook.resx
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAChl4QAopiGAKOZhgCjmYcAo5mIAKSahwCkmogApZuJAKaciQCmnIoAppyLAKiejACpn44ArKKRAK2j
+        kgCupZUAr6eXALGomACzqZkAsamaALOqmQCyqpsAtKuaALSsnQC0rJ4Atq2eALmxogC7s6UAvbSkALu0
+        pgC+t6sAwbuvAMW8rQDIv7AAycCxAMvFuwDLxrsA08y+ANDMwwDRzcQA08/GANfQwwDa08YA29THANfT
+        ywDY1MwA3dbKAODe2QDi4NoA5OHbAOPh3ADk4dwA5OLdAOTj3gDw6t8A7OnmAO7t6gDx8e8A9fXzAPX2
+        9AD4+fgA+fn4APj6+QD8/v4A/f//AP7//wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAQ0NDQ0NDQ0NDQ0NDMBcDDAwDFzFDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0M3Bw8cAAAAAAAAACsD
+        N0NDQ0NDQ0NDQ0NDQ0NDQ0NDFCctAAAAAAAAAAAAAAAAFENDQ0NDQ0NDQ0NDQ0NDERtAJgAAAAAAAAAA
+        AAAAAAAAABtDQ0NDQ0NDQ0NDQwY+QEAAAAAAAAAAAAAAAAAAAAAAAANDQ0NDQ0NDQ0MGQkBAEAAAAAAA
+        AAAAAAAAAAAAAAAAAAVDQ0NDQ0NDGz1AQEAgAAAAAAAAAAAAAAAAAAAAAAAAABFDQ0NDQ0MdQEBAQCkA
+        AAAAAAA0NQAAAAAAAAAAAAAAAENDQ0NDFkBAQEBAAAAAAAAAGkBAGgAAAAAAAAAAAAAAFENDQzknQEBA
+        QEAlAAAAAAAABwYAAAAAAAAAAAAAAAAAN0NDBkBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQ0MA
+        QEBAQEBAOAAAAAAAAAAAAAAAAAAAAAAAAAAAACtDMTJAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ADEZQkBAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAAFwNAQEBAQEBAQEBAJAAAAAAAAAAAAAAAAAAA
+        AAAAAAAEDkBAQEBAQEBAQEBAQRohAAAAAAAAAAAAAAAAAAAAAAwNQEBAQEBAQEBAQEBAQEA8IwsAAAAA
+        AAAAAAAAAAAADAVAQEBAQEBAQEBAQEBAQEBAQEEJAAAAAAAAAAAAAAADF0JAQEBAQEBAQEBAQEBAQEBA
+        QEA7AAAAAAAAAAAAABcwMEBAQEBAQEBAQEBAQEBAQEBAQEBALgAAAAAAAAAAMUMAQEBAQEBAQEBAQEBA
+        QEBAQEBAQEAtAAAAAAAAACtDQwhAQEBAQEBAQEBAQEBAQEBAQEBAQEAiAAAAAAAAA0NDNydAQEBAQEBA
+        QEBAQEAHCkBAQEBAQAEAAAAAAAA3Q0NDFkBAQEBAQEBAQEBAHjY2HkBAQEBAEwAAAAAAEkNDQ0NDHUBA
+        QEBAQEBAQEA/KipBQEBAQEATAAAAAABDQ0NDQ0MSPUBAQEBAQEBAQEBAQEBAQEBAQAwAAAAAG0NDQ0ND
+        Q0MHQkBAQEBAQEBAQEBAQEBAQEBBAAAAAAJDQ0NDQ0NDQ0MGPkBAQEBAQEBAQEBAQEBAQBEAAAADQ0ND
+        Q0NDQ0NDQ0MRGEBAQEBAQEBAQEBAQEA6AAAAG0NDQ0NDQ0NDQ0NDQ0NDFShBQEBAQEBAQEBAHwAAFEND
+        Q0NDQ0NDQ0NDQ0NDQ0NDNwYALEJAQEBALxIrAzdDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzFwYNDQMXMUND
+        Q0NDQ0NDQ0NDQ//wD///gAH//wAA//wAAD/4AAAf8AAAD+AAAAfgAAAHwAAAA4AAAAGAAAABgAAAAQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA+AAAAfgAAAH8AAAD/gA
+        AB/8AAA//wAA//+AAf//8A//
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/examples/Redbook/Redbook.sh b/examples/Redbook/Redbook.sh
new file mode 100755
index 0000000..920def4
--- /dev/null
+++ b/examples/Redbook/Redbook.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./Redbook.exe "$@"
diff --git a/examples/Redbook/Robot.cs b/examples/Redbook/Robot.cs
new file mode 100644
index 0000000..96b5478
--- /dev/null
+++ b/examples/Redbook/Robot.cs
@@ -0,0 +1,183 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program shows how to composite modeling transformations to draw translated
+    ///     and rotated hierarchical models.  Interaction:  pressing the s and e keys
+    ///     (shoulder and elbow) alters the rotation of the robot arm.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/robot.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Robot {
+        // --- Fields ---
+        #region Private Fields
+        private static int shoulder = 0;
+        private static int elbow = 0;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("Robot");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glPushMatrix();
+                Gl.glTranslatef(-1.0f, 0.0f, 0.0f);
+                Gl.glRotatef((float) shoulder, 0.0f, 0.0f, 1.0f);
+                Gl.glTranslatef(1.0f, 0.0f, 0.0f);
+                Gl.glPushMatrix();
+                    Gl.glScalef(2.0f, 0.4f, 1.0f);
+                    Glut.glutWireCube(1.0);
+                Gl.glPopMatrix();
+
+                Gl.glTranslatef(1.0f, 0.0f, 0.0f);
+                Gl.glRotatef((float) elbow, 0.0f, 0.0f, 1.0f);
+                Gl.glTranslatef(1.0f, 0.0f, 0.0f);
+                Gl.glPushMatrix();
+                    Gl.glScalef(2.0f, 0.4f, 1.0f);
+                    Glut.glutWireCube(1.0);
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 's':
+                    shoulder = (shoulder + 5) % 360;
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'S':
+                    shoulder = (shoulder - 5) % 360;
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'e':
+                    elbow = (elbow + 5) % 360;
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'E':
+                    elbow = (elbow - 5) % 360;
+                    Glut.glutPostRedisplay();
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(65.0, (float) w / (float) h, 1.0, 20.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -5.0f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Scene.cs b/examples/Redbook/Scene.cs
new file mode 100644
index 0000000..a4a5df9
--- /dev/null
+++ b/examples/Redbook/Scene.cs
@@ -0,0 +1,181 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates the use of the GL lighting model.  Objects are drawn
+    ///     using a grey material characteristic.  A single light source illuminates the
+    ///     objects.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/scene.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Scene {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("Scene");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            float[] lightAmbient = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            // light_position is NOT default value
+            float[] lightPosition = {1.0f, 1.0f, 1.0f, 0.0f};
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, lightAmbient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, lightDiffuse);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, lightSpecular);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glRotatef(20.0f, 1.0f, 0.0f, 0.0f);
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.75f, 0.5f, 0.0f); 
+                    Gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+                    Glut.glutSolidTorus(0.275, 0.85, 15, 15);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.75f, -0.5f, 0.0f); 
+                    Gl.glRotatef(270.0f, 1.0f, 0.0f, 0.0f);
+                    Glut.glutSolidCone(1.0, 2.0, 15, 15);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(0.75f, 0.0f, -1.0f); 
+                    Glut.glutSolidSphere(1.0, 15, 15);
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-2.5, 2.5, -2.5 * (float) h / (float) w, 2.5 * (float) h / (float) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-2.5 * (float) w / (float) h, 2.5 * (float) w / (float) h, -2.5, 2.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/SceneBlueAmbient.cs b/examples/Redbook/SceneBlueAmbient.cs
new file mode 100644
index 0000000..2f39a14
--- /dev/null
+++ b/examples/Redbook/SceneBlueAmbient.cs
@@ -0,0 +1,180 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates use of a blue ambient light source.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class SceneBlueAmbient {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("SceneBlueAmbient");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            float[] lightAmbient = {0.0f, 0.0f, 1.0f, 1.0f};
+            float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            // light_position is NOT default value
+            float[] lightPosition = {1.0f, 1.0f, 1.0f, 0.0f};
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, lightAmbient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, lightDiffuse);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, lightSpecular);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glDepthFunc(Gl.GL_LESS);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glRotatef(20.0f, 1.0f, 0.0f, 0.0f);
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.75f, 0.5f, 0.0f); 
+                    Gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+                    Glut.glutSolidTorus(0.275, 0.85, 15, 15);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.75f, -0.5f, 0.0f); 
+                    Gl.glRotatef(270.0f, 1.0f, 0.0f, 0.0f);
+                    Glut.glutSolidCone(1.0, 2.0, 15, 15);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(0.75f, 0.0f, -1.0f); 
+                    Glut.glutSolidSphere(1.0, 15, 15);
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-2.5, 2.5, -2.5 * (float) h / (float) w, 2.5 * (float) h / (float) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-2.5 * (float) w / (float) h, 2.5 * (float) w / (float) h, -2.5, 2.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/SceneColorLight.cs b/examples/Redbook/SceneColorLight.cs
new file mode 100644
index 0000000..bd8c828
--- /dev/null
+++ b/examples/Redbook/SceneColorLight.cs
@@ -0,0 +1,182 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates the use of a colored (magenta, in this example) light
+    ///     source.  Objects are drawn using a grey material characteristic.  A single light
+    ///     source illuminates the objects.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class SceneColorLight {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("SceneColorLight");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            float[] lightAmbient = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] lightDiffuse = {1.0f, 0.0f, 1.0f, 1.0f};
+            float[] lightSpecular = {1.0f, 0.0f, 1.0f, 1.0f};
+            // light_position is NOT default value
+            float[] lightPosition = {1.0f, 1.0f, 1.0f, 0.0f};
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, lightAmbient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, lightDiffuse);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, lightSpecular);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glDepthFunc(Gl.GL_LESS);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glRotatef(20.0f, 1.0f, 0.0f, 0.0f);
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.75f, 0.5f, 0.0f); 
+                    Gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+                    Glut.glutSolidTorus(0.275, 0.85, 15, 15);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.75f, -0.5f, 0.0f); 
+                    Gl.glRotatef(270.0f, 1.0f, 0.0f, 0.0f);
+                    Glut.glutSolidCone(1.0, 2.0, 15, 15);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(0.75f, 0.0f, -1.0f); 
+                    Glut.glutSolidSphere(1.0, 15, 15);
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-2.5, 2.5, -2.5 * (float) h / (float) w, 2.5 * (float) h / (float) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-2.5 * (float) w / (float) h, 2.5 * (float) w / (float) h, -2.5, 2.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/SceneFlat.cs b/examples/Redbook/SceneFlat.cs
new file mode 100644
index 0000000..97293a3
--- /dev/null
+++ b/examples/Redbook/SceneFlat.cs
@@ -0,0 +1,181 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws lighted objects with flat shading.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class SceneFlat {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("SceneFlat");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            float[] lightAmbient = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            // light_position is NOT default value
+            float[] lightPosition = {1.0f, 1.0f, 1.0f, 0.0f};
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, lightAmbient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, lightDiffuse);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, lightSpecular);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glDepthFunc(Gl.GL_LESS);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glRotatef(20.0f, 1.0f, 0.0f, 0.0f);
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.75f, 0.5f, 0.0f); 
+                    Gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+                    Glut.glutSolidTorus(0.275, 0.85, 15, 15);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(-0.75f, -0.5f, 0.0f); 
+                    Gl.glRotatef(270.0f, 1.0f, 0.0f, 0.0f);
+                    Glut.glutSolidCone(1.0, 2.0, 15, 15);
+                Gl.glPopMatrix();
+
+                Gl.glPushMatrix();
+                    Gl.glTranslatef(0.75f, 0.0f, -1.0f); 
+                    Glut.glutSolidSphere(1.0, 15, 15);
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-2.5, 2.5, -2.5 * (float) h / (float) w, 2.5 * (float) h / (float) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-2.5 * (float) w / (float) h, 2.5 * (float) w / (float) h, -2.5, 2.5, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Select.cs b/examples/Redbook/Select.cs
new file mode 100644
index 0000000..2dc4d4c
--- /dev/null
+++ b/examples/Redbook/Select.cs
@@ -0,0 +1,294 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This is an illustration of the selection mode and name stack, which detects
+    ///     whether objects which collide with a viewing volume.  First, four triangles and
+    ///     a rectangular box representing a viewing volume are drawn (drawScene routine).
+    ///     The green triangle and yellow triangles appear to lie within the viewing volume,
+    ///     but the red triangle appears to lie outside it.  Then the selection mode is
+    ///     entered (SelectObjects routine).  Drawing to the screen ceases.  To see if any
+    ///     collisions occur, the four triangles are called.  In this example, the green
+    ///     triangle causes one hit with the name 1, and the yellow triangles cause one hit
+    ///     with the name 3.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/select.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Select {
+        // --- Fields ---
+        #region Private Constants
+        private const int BUFSIZE = 512;
+        #endregion Private Constants
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(200, 200);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Select");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        #region DrawScene()
+        /// <summary>
+        ///     <para>
+        ///         Draws 4 triangles and a wire frame which represents the viewing volume.
+        ///     </para>
+        /// </summary>
+        private static void DrawScene() {
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(40.0, 4.0 / 3.0, 1.0, 100.0);
+
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(7.5, 7.5, 12.5, 2.5, 2.5, -5.0, 0.0, 1.0, 0.0);
+            Gl.glColor3f(0.0f, 1.0f, 0.0f);	// green triangle
+            DrawTriangle(2.0f, 2.0f, 3.0f, 2.0f, 2.5f, 3.0f, -5.0f);
+            Gl.glColor3f(1.0f, 0.0f, 0.0f);	// red triangle
+            DrawTriangle(2.0f, 7.0f, 3.0f, 7.0f, 2.5f, 8.0f, -5.0f);
+            Gl.glColor3f(1.0f, 1.0f, 0.0f);	// yellow triangles
+            DrawTriangle(2.0f, 2.0f, 3.0f, 2.0f, 2.5f, 3.0f, 0.0f);
+            DrawTriangle(2.0f, 2.0f, 3.0f, 2.0f, 2.5f, 3.0f, -10.0f);
+            DrawViewVolume(0.0f, 5.0f, 0.0f, 5.0f, 0.0f, 10.0f);
+        }
+        #endregion DrawScene()
+
+        #region DrawTriangle(float x1, float y1, float x2, float y2, float x3, float y3, float z)
+        /// <summary>
+        ///     <para>
+        ///         Draw a triangle with vertices at (x1, y1), (x2, y2), and (x3, y3) at z units
+        ///         away from the origin
+        ///     </para>
+        /// </summary>
+        private static void DrawTriangle(float x1, float y1, float x2, float y2, float x3, float y3, float z) {
+            Gl.glBegin(Gl.GL_TRIANGLES);
+                Gl.glVertex3f(x1, y1, z);
+                Gl.glVertex3f(x2, y2, z);
+                Gl.glVertex3f(x3, y3, z);
+            Gl.glEnd();
+        }
+        #endregion DrawTriangle(float x1, float y1, float x2, float y2, float x3, float y3, float z)
+
+        #region DrawViewVolume(float x1, float x2, float y1, float y2, float z1, float z2)
+        /// <summary>
+        ///     <para>
+        ///         Draws a rectangular box with these outer x, y, and z values.
+        ///     </para>
+        /// </summary>
+        private static void DrawViewVolume(float x1, float x2, float y1, float y2, float z1, float z2) {
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glBegin(Gl.GL_LINE_LOOP);
+                Gl.glVertex3f(x1, y1, -z1);
+                Gl.glVertex3f(x2, y1, -z1);
+                Gl.glVertex3f(x2, y2, -z1);
+                Gl.glVertex3f(x1, y2, -z1);
+            Gl.glEnd();
+
+            Gl.glBegin(Gl.GL_LINE_LOOP);
+                Gl.glVertex3f(x1, y1, -z2);
+                Gl.glVertex3f(x2, y1, -z2);
+                Gl.glVertex3f(x2, y2, -z2);
+                Gl.glVertex3f(x1, y2, -z2);
+            Gl.glEnd();
+
+            Gl.glBegin(Gl.GL_LINES); // 4 lines
+                Gl.glVertex3f(x1, y1, -z1);
+                Gl.glVertex3f(x1, y1, -z2);
+                Gl.glVertex3f(x1, y2, -z1);
+                Gl.glVertex3f(x1, y2, -z2);
+                Gl.glVertex3f(x2, y1, -z1);
+                Gl.glVertex3f(x2, y1, -z2);
+                Gl.glVertex3f(x2, y2, -z1);
+                Gl.glVertex3f(x2, y2, -z2);
+            Gl.glEnd();
+        }
+        #endregion DrawViewVolume(float x1, float x2, float y1, float y2, float z1, float z2)
+
+        #region ProcessHits(int hits, int[] buffer)
+        /// <summary>
+        ///     <para>
+        ///         ProcessHits prints out the contents of the selection array.
+        ///     </para>
+        /// </summary>
+        private static void ProcessHits(int hits, int[] buffer) {
+            int i, j;
+            int names;
+            int[] ptr;
+
+            Console.WriteLine("hits = {0}", hits);
+            ptr = buffer;
+            for(i = 0; i < hits; i++) {	//  for each hit
+                names = ptr[i];
+                Console.WriteLine(" number of names for hit = {0}", names);
+                i++;
+                Console.WriteLine("  z1 is {0}", (float) ptr[i] / 0x7fffffff);
+                i++;
+                Console.WriteLine("  z2 is {0}", (float) ptr[i] / 0x7fffffff);
+                i++;
+                Console.Write("   the name is ");
+                for(j = 0; j < names; j++) {	// for each name
+                    Console.Write("{0} ", ptr[i]);
+                    i++;
+                }
+                Console.WriteLine();
+            }
+            Console.WriteLine();
+        }
+        #endregion ProcessHits(int hits, int[] buffer)
+
+        #region SelectObjects()
+        /// <summary>
+        ///     <para>
+        ///         SelectObjects "draws" the triangles in selection mode, assigning names for
+        ///         the triangles.  Note that the third and fourth triangles share one name, so
+        ///         that if either or both triangles intersects the viewing/clipping volume,
+        ///         only one hit will be registered.
+        ///     </para>
+        /// </summary>
+        private static void SelectObjects() {
+            int[] selectBuffer = new int[BUFSIZE];
+            int hits;
+
+            Gl.glSelectBuffer(BUFSIZE, selectBuffer);
+            Gl.glRenderMode(Gl.GL_SELECT);
+
+            Gl.glInitNames();
+            Gl.glPushName(0);
+
+            Gl.glPushMatrix();
+                Gl.glMatrixMode(Gl.GL_PROJECTION);
+                Gl.glLoadIdentity();
+                Gl.glOrtho(0.0, 5.0, 0.0, 5.0, 0.0, 10.0);
+                Gl.glMatrixMode(Gl.GL_MODELVIEW);
+                Gl.glLoadIdentity();
+                Gl.glLoadName(1);
+                DrawTriangle(2.0f, 2.0f, 3.0f, 2.0f, 2.5f, 3.0f, -5.0f);
+                Gl.glLoadName(2);
+                DrawTriangle(2.0f, 7.0f, 3.0f, 7.0f, 2.5f, 8.0f, -5.0f);
+                Gl.glLoadName(3);
+                DrawTriangle(2.0f, 2.0f, 3.0f, 2.0f, 2.5f, 3.0f, 0.0f);
+                DrawTriangle(2.0f, 2.0f, 3.0f, 2.0f, 2.5f, 3.0f, -10.0f);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+
+            hits = Gl.glRenderMode(Gl.GL_RENDER);
+            ProcessHits(hits, selectBuffer);
+        }
+        #endregion SelectObjects()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            DrawScene();
+            SelectObjects();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+    }
+}
diff --git a/examples/Redbook/Smooth.cs b/examples/Redbook/Smooth.cs
new file mode 100644
index 0000000..1067339
--- /dev/null
+++ b/examples/Redbook/Smooth.cs
@@ -0,0 +1,161 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates smooth shading.  A smooth shaded polygon is drawn in a
+    ///     2-D projection.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/smooth.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Smooth {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Smooth");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+        }
+        #endregion Init()
+
+        #region Triangle()
+        private static void Triangle() {
+            Gl.glBegin(Gl.GL_TRIANGLES);
+            Gl.glColor3f(1.0f, 0.0f, 0.0f);
+            Gl.glVertex2f(5.0f, 5.0f);
+            Gl.glColor3f(0.0f, 1.0f, 0.0f);
+            Gl.glVertex2f(25.0f, 5.0f);
+            Gl.glColor3f(0.0f, 0.0f, 1.0f);
+            Gl.glVertex2f(5.0f, 25.0f);
+            Gl.glEnd();
+        }
+        #endregion Triangle()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Triangle();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Glu.gluOrtho2D(0.0, 30.0, 0.0, 30.0 * (float) h / (float) w);
+            }
+            else {
+                Glu.gluOrtho2D(0.0, 30.0 * (float) w / (float) h, 0.0, 30.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Stencil.cs b/examples/Redbook/Stencil.cs
new file mode 100644
index 0000000..a2e2ea2
--- /dev/null
+++ b/examples/Redbook/Stencil.cs
@@ -0,0 +1,247 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates use of the stencil buffer for masking nonrectangular
+    ///     regions.  Whenever the window is redrawn, a value of 1 is drawn into a
+    ///     diamond-shaped region in the stencil buffer.  Elsewhere in the stencil buffer,
+    ///     the value is 0.  Then a blue sphere is drawn where the stencil value is 1,
+    ///     and yellow torii are drawn where the stencil value is not 1.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/stencil.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Stencil {
+        // --- Fields ---
+        #region Private Constants
+        private const int YELLOWMAT = 1;
+        private const int BLUEMAT = 2;
+        #endregion Private Constants
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Be certain to request stencil bits.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH | Glut.GLUT_STENCIL);
+            Glut.glutInitWindowSize(400, 400);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Stencil");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            float[] yellowDiffuse = {0.7f, 0.7f, 0.0f, 1.0f};
+            float[] yellowSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] blueDiffuse = {0.1f, 0.1f, 0.7f, 1.0f};
+            float[] blueSpecular = {0.1f, 1.0f, 1.0f, 1.0f};
+            float[] position = {1.0f, 1.0f, 1.0f, 0.0f};
+
+            Gl.glNewList(YELLOWMAT, Gl.GL_COMPILE);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, yellowDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, yellowSpecular);
+                Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 64.0f);
+            Gl.glEndList();
+
+            Gl.glNewList(BLUEMAT, Gl.GL_COMPILE);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, blueDiffuse);
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, blueSpecular);
+                Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 45.0f);
+            Gl.glEndList();
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position);
+
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_LIGHTING);
+
+            Gl.glClearStencil(0x0);
+            Gl.glEnable(Gl.GL_STENCIL_TEST);
+
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -5.0f);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Draw a sphere in a diamond-shaped section in the middle of a window with 2
+        ///         torii.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_STENCIL_BUFFER_BIT);
+
+            // create a diamond shaped stencil area
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glPushMatrix();
+                Gl.glLoadIdentity();
+                Gl.glOrtho(-3.0, 3.0, -3.0, 3.0, -1.0, 1.0);
+                Gl.glMatrixMode(Gl.GL_MODELVIEW);
+                Gl.glPushMatrix();
+                    Gl.glLoadIdentity();
+
+                    // Disable color buffer update.
+                    Gl.glColorMask(false, false, false, false);
+                    Gl.glDisable(Gl.GL_DEPTH_TEST);
+                    Gl.glStencilFunc(Gl.GL_ALWAYS, 0x1, 0x1);
+                    Gl.glStencilOp(Gl.GL_REPLACE, Gl.GL_REPLACE, Gl.GL_REPLACE);
+
+                    Gl.glBegin(Gl.GL_QUADS);
+                        Gl.glVertex3f(-1.0f, 0.0f, 0.0f);
+                        Gl.glVertex3f(0.0f, 1.0f, 0.0f);
+                        Gl.glVertex3f(1.0f, 0.0f, 0.0f);
+                        Gl.glVertex3f(0.0f, -1.0f, 0.0f);
+                    Gl.glEnd();
+                Gl.glPopMatrix();
+                Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glPopMatrix();
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+    
+            // Enable color buffer update.
+            Gl.glColorMask(true, true, true, true);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_KEEP);
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            // draw blue sphere where the stencil is 1
+            Gl.glStencilFunc(Gl.GL_EQUAL, 0x1, 0x1);
+            Gl.glCallList(BLUEMAT);
+            Glut.glutSolidSphere(0.5, 15, 15);
+
+            // draw the tori where the stencil is not 1
+            Gl.glStencilFunc(Gl.GL_NOTEQUAL, 0x1, 0x1);
+            Gl.glPushMatrix();
+                Gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
+                Gl.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
+                Gl.glCallList(YELLOWMAT);
+                Glut.glutSolidTorus(0.275, 0.85, 15, 15);
+                Gl.glPushMatrix();
+                    Gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+                    Glut.glutSolidTorus(0.275, 0.85, 15, 15);
+                Gl.glPopMatrix();
+            Gl.glPopMatrix();
+
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        /// <summary>
+        ///     <para>
+        ///         Whenever the window is reshaped, redefine the coordinate system and redraw
+        ///         the stencil area.
+        ///     </para>
+        /// </summary>
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(45.0, (float) w / (float) h, 3.0, 7.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Stroke.cs b/examples/Redbook/Stroke.cs
new file mode 100644
index 0000000..32f869c
--- /dev/null
+++ b/examples/Redbook/Stroke.cs
@@ -0,0 +1,312 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates some characters of a stroke (vector) font.  The
+    ///     characters are represented by display lists, which are given numbers which
+    ///     correspond to the ASCII values of the characters.  Use of Gl.glCallLists()
+    ///     is demonstrated.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/stroke.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Stroke {
+        // --- Fields ---
+        #region Private Constants
+        private const int PT = 1;
+        private const int STROKE = 2;
+        private const int END = 3;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static string test1 = "A SPARE SERAPE APPEARS AS";
+        private static string test2 = "APES PREPARE RARE PEPPERS";
+
+        private static CharPoint[] Adata = {
+            new CharPoint(0, 0, PT),
+            new CharPoint(0, 9, PT),
+            new CharPoint(1, 10, PT),
+            new CharPoint(4, 10, PT),
+            new CharPoint(5, 9, PT),
+            new CharPoint(5, 0, STROKE),
+            new CharPoint(0, 5, PT),
+            new CharPoint(5, 5, END)
+        };
+
+		private static CharPoint[] Edata = {
+			new CharPoint(5, 0, PT),
+			new CharPoint(0, 0, PT),
+			new CharPoint(0, 10, PT),
+			new CharPoint(5, 10, STROKE),
+			new CharPoint(0, 5, PT),
+			new CharPoint(4, 5, END)
+		};
+
+		private static CharPoint[] Pdata = {
+			new CharPoint(0, 0, PT),
+			new CharPoint(0, 10, PT),
+			new CharPoint(4, 10, PT),
+			new CharPoint(5, 9, PT),
+			new CharPoint(5, 6, PT),
+			new CharPoint(4, 5, PT),
+			new CharPoint(0, 5, END)
+		};
+
+		private static CharPoint[] Rdata = {
+			new CharPoint(0, 0, PT),
+			new CharPoint(0, 10, PT),
+			new CharPoint(4, 10, PT),
+			new CharPoint(5, 9, PT),
+			new CharPoint(5, 6, PT),
+			new CharPoint(4, 5, PT),
+			new CharPoint(0, 5, STROKE),
+			new CharPoint(3, 5, PT),
+			new CharPoint(5, 0, END)
+		};
+
+		private static CharPoint[] Sdata = {
+			new CharPoint(0, 1, PT),
+			new CharPoint(1, 0, PT),
+			new CharPoint(4, 0, PT),
+			new CharPoint(5, 1, PT),
+			new CharPoint(5, 4, PT),
+			new CharPoint(4, 5, PT),
+			new CharPoint(1, 5, PT),
+			new CharPoint(0, 6, PT),
+			new CharPoint(0, 9, PT),
+			new CharPoint(1, 10, PT),
+			new CharPoint(4, 10, PT),
+			new CharPoint(5, 9, END)
+		};
+        #endregion Private Fields
+
+        #region Private Structs
+        private struct CharPoint {
+            public float X;
+            public float Y;
+            public int Type;
+
+            public CharPoint(float x, float y, int type) {
+                X = x;
+                Y = y;
+                Type = type;
+            }
+        }
+        #endregion Private Structs
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Open window with initial window size, title bar, RGBA display mode, and
+        ///         handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(440, 120);
+            Glut.glutCreateWindow("Stroke");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region DrawLetter(CharPoint[] letter)
+        /// <summary>
+        ///     <para>
+        ///         Interprets the instructions from the array for that letter and renders
+        ///         the letter with line segments.
+        ///     </para>
+        /// </summary>
+        private static void DrawLetter(CharPoint[] letter) {
+            int i = 0;
+
+            Gl.glBegin(Gl.GL_LINE_STRIP);
+            while(i < letter.Length) {
+                switch(letter[i].Type) {
+                    case PT:
+                        Gl.glVertex2f(letter[i].X, letter[i].Y);
+                        break;
+                    case STROKE:
+                        Gl.glVertex2f(letter[i].X, letter[i].Y);
+                        Gl.glEnd();
+                        Gl.glBegin(Gl.GL_LINE_STRIP);
+                        break;
+                    case END:
+                        Gl.glVertex2f(letter[i].X, letter[i].Y);
+                        Gl.glEnd();
+                        Gl.glTranslatef(8.0f, 0.0f, 0.0f);
+                        return;
+                }
+                i++;
+            }
+        }
+        #endregion DrawLetter(CharPoint[] letter)
+
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Create a display list for each of 6 characters.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            int list;
+
+            Gl.glShadeModel(Gl.GL_FLAT);
+
+            list = Gl.glGenLists(128);
+            Gl.glListBase(list);
+            Gl.glNewList(list + 'A', Gl.GL_COMPILE);
+                DrawLetter(Adata);
+            Gl.glEndList();
+            Gl.glNewList(list + 'E', Gl.GL_COMPILE);
+                DrawLetter(Edata);
+            Gl.glEndList();
+            Gl.glNewList(list + 'P', Gl.GL_COMPILE);
+                DrawLetter(Pdata);
+            Gl.glEndList();
+            Gl.glNewList(list + 'R', Gl.GL_COMPILE);
+                DrawLetter(Rdata);
+            Gl.glEndList();
+            Gl.glNewList(list + 'S', Gl.GL_COMPILE);
+                DrawLetter(Sdata);
+            Gl.glEndList();
+            Gl.glNewList(list + ' ', Gl.GL_COMPILE);
+                Gl.glTranslatef(8.0f, 0.0f, 0.0f);
+            Gl.glEndList();
+        }
+        #endregion Init()
+
+        #region PrintStrokedString(string text)
+        private static void PrintStrokedString(string text) {
+            byte [] textbytes = new byte[text.Length];
+            for (int i = 0; i < text.Length; i++) textbytes[i] = (byte) text[i];
+            Gl.glCallLists(text.Length, Gl.GL_BYTE, textbytes);
+        }
+        #endregion PrintStrokedString(string text)
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glPushMatrix();
+                Gl.glScalef(2.0f, 2.0f, 2.0f);
+                Gl.glTranslatef(10.0f, 30.0f, 0.0f);
+                PrintStrokedString(test1);
+            Gl.glPopMatrix();
+            Gl.glPushMatrix();
+                Gl.glScalef(2.0f, 2.0f, 2.0f);
+                Gl.glTranslatef(10.0f, 13.0f, 0.0f);
+                PrintStrokedString(test2);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) ' ':
+                    Glut.glutPostRedisplay();
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluOrtho2D(0.0, (double) w, 0.0, (double) h);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Surface.cs b/examples/Redbook/Surface.cs
new file mode 100644
index 0000000..1e933a6
--- /dev/null
+++ b/examples/Redbook/Surface.cs
@@ -0,0 +1,234 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws a NURBS surface in the shape of a symmetrical hill.  The 'c'
+    ///     keyboard key allows you to toggle the visibility of the control points
+    ///     themselves.  Note that some of the control points are hidden by the surface
+    ///     itself.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/surface.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Surface {
+        // --- Fields ---
+        #region Private Fields
+        private static float[ , , ] controlPoints = new float[4, 4, 3];
+        private static bool showPoints = false;
+        private static Glu.GLUnurbs nurb;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Surface");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize material property and depth buffer.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] materialDiffuse = {0.7f, 0.7f, 0.7f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialShininess = {100.0f};
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, materialShininess);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glEnable(Gl.GL_AUTO_NORMAL);
+            Gl.glEnable(Gl.GL_NORMALIZE);
+
+            InitSurface();
+
+            nurb = Glu.gluNewNurbsRenderer();
+            Glu.gluNurbsProperty(nurb, Glu.GLU_SAMPLING_TOLERANCE, 25.0f);
+            Glu.gluNurbsProperty(nurb, Glu.GLU_DISPLAY_MODE, Glu.GLU_FILL);
+            Glu.gluNurbsCallback(nurb, Glu.GLU_ERROR, new Glu.NurbsErrorCallback(Error));
+        }
+        #endregion Init()
+
+        #region InitSurface()
+        private static void InitSurface() {
+            int u, v;
+            for(u = 0; u < 4; u++) {
+                for(v = 0; v < 4; v++) {
+                    controlPoints[u, v, 0] = 2.0f * ((float)u - 1.5f);
+                    controlPoints[u, v, 1] = 2.0f * ((float)v - 1.5f);
+
+                    if((u == 1 || u == 2) && (v == 1 || v == 2)) {
+                        controlPoints[u, v, 2] = 3.0f;
+                    }
+                    else {
+                        controlPoints[u, v, 2] = -3.0f;
+                    }
+                }
+            }
+        }
+        #endregion InitSurface()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            float[] knots = {0, 0, 0, 0, 1, 1, 1, 1};
+            int i, j;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glRotatef(330, 1, 0, 0);
+                Gl.glScalef(0.5f, 0.5f, 0.5f);
+
+                Glu.gluBeginSurface(nurb);
+                    Glu.gluNurbsSurface(nurb, 8, knots, 8, knots, 4 * 3, 3, controlPoints, 4, 4, Gl.GL_MAP2_VERTEX_3);
+                Glu.gluEndSurface(nurb);
+
+                if(showPoints) {
+                    Gl.glPointSize(5.0f);
+                    Gl.glDisable(Gl.GL_LIGHTING);
+                    Gl.glColor3f(1, 1, 0);
+                    Gl.glBegin(Gl.GL_POINTS);
+                        for(i = 0; i < 4; i++) {
+                            for(j = 0; j < 4; j++) {
+                                Gl.glVertex3f(controlPoints[i, j, 0], controlPoints[i, j, 1], controlPoints[i, j, 2]);
+                            }
+                        }
+                    Gl.glEnd();
+                    Gl.glEnable(Gl.GL_LIGHTING);
+                }
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Error(int errorCode)
+        private static void Error(int errorCode) {
+            Console.WriteLine("Nurbs Error: {0}", Glu.gluErrorString(errorCode));
+            Environment.Exit(1);
+        }
+        #endregion Error(int errorCode)
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'c':
+                case (byte) 'C':
+                    showPoints = !showPoints;
+                    Glut.glutPostRedisplay();
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(45.0, (double) w / (double) h, 3.0, 8.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -5.0f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/SurfaceOld.cs b/examples/Redbook/SurfaceOld.cs
new file mode 100644
index 0000000..7b39cab
--- /dev/null
+++ b/examples/Redbook/SurfaceOld.cs
@@ -0,0 +1,280 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* aux2glut conversion Copyright (c) Mark J. Kilgard, 1994, 1995 */
+/**
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws a NURBS surface in the shape of a symmetrical hill.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class SurfaceOld {
+        // --- Fields ---
+        #region Private Fields
+        private static float[ , , ] controlPoints = new float[4, 4, 3];
+        private static bool showPoints = false;
+        private static Glu.GLUnurbs nurb;
+        private static bool down = false;
+        private static int lastX = 0;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutCreateWindow("SurfaceOld");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMotionFunc(new Glut.MotionCallback(Motion));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+
+            Glut.glutCreateMenu(new Glut.CreateMenuCallback(Menu));
+            Glut.glutAddMenuEntry("Show control points", 1);
+            Glut.glutAddMenuEntry("Hide control points", 0);
+            Glut.glutAddMenuEntry("Solid", 2);
+            Glut.glutAddMenuEntry("Wireframe", 3);
+            Glut.glutAttachMenu(Glut.GLUT_RIGHT_BUTTON);
+
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize material property and depth buffer.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] materialDiffuse = {0.7f, 0.7f, 0.7f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialShininess = {100.0f};
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, materialShininess);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glDepthFunc(Gl.GL_LESS);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glEnable(Gl.GL_AUTO_NORMAL);
+            Gl.glEnable(Gl.GL_NORMALIZE);
+
+            InitSurface();
+
+            nurb = Glu.gluNewNurbsRenderer();
+            Glu.gluNurbsProperty(nurb, Glu.GLU_SAMPLING_TOLERANCE, 25.0f);
+            Glu.gluNurbsProperty(nurb, Glu.GLU_DISPLAY_MODE, Glu.GLU_FILL);
+
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -5.0f);
+        }
+        #endregion Init()
+
+        #region InitSurface()
+        private static void InitSurface() {
+            int u, v;
+            for(u = 0; u < 4; u++) {
+                for(v = 0; v < 4; v++) {
+                    controlPoints[u, v, 0] = 2.0f * ((float)u - 1.5f);
+                    controlPoints[u, v, 1] = 2.0f * ((float)v - 1.5f);
+
+                    if((u == 1 || u == 2) && (v == 1 || v == 2)) {
+                        controlPoints[u, v, 2] = 7.0f;
+                    }
+                    else {
+                        controlPoints[u, v, 2] = -3.0f;
+                    }
+                }
+            }
+        }
+        #endregion InitSurface()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            float[] knots = {0, 0, 0, 0, 1, 1, 1, 1};
+            int i, j;
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            Gl.glPushMatrix();
+                Gl.glRotatef(330, 1, 0, 0);
+                Gl.glScalef(0.25f, 0.25f, 0.25f);
+
+                Glu.gluBeginSurface(nurb);
+                    Glu.gluNurbsSurface(nurb, 8, knots, 8, knots, 4 * 3, 3, controlPoints, 4, 4, Gl.GL_MAP2_VERTEX_3);
+                Glu.gluEndSurface(nurb);
+
+                if(showPoints) {
+                    Gl.glPointSize(5.0f);
+                    Gl.glDisable(Gl.GL_LIGHTING);
+                    Gl.glColor3f(1, 1, 0);
+                    Gl.glBegin(Gl.GL_POINTS);
+                        for(i = 0; i < 4; i++) {
+                            for(j = 0; j < 4; j++) {
+                                Gl.glVertex3f(controlPoints[i, j, 0], controlPoints[i, j, 1], controlPoints[i, j, 2]);
+                            }
+                        }
+                    Gl.glEnd();
+                    Gl.glEnable(Gl.GL_LIGHTING);
+                }
+            Gl.glPopMatrix();
+            Glut.glutSwapBuffers();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'c':
+                case (byte) 'C':
+                    showPoints = !showPoints;
+                    Glut.glutPostRedisplay();
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Menu(int val)
+        private static void Menu(int val) {
+            switch(val) {
+                case 0:
+                    showPoints = false;
+                    break;
+                case 1:
+                    showPoints = true;
+                    break;
+                case 2:
+                    Glu.gluNurbsProperty(nurb, Glu.GLU_DISPLAY_MODE, Glu.GLU_FILL);
+                    break;
+                case 3:
+                    Glu.gluNurbsProperty(nurb, Glu.GLU_DISPLAY_MODE, Glu.GLU_OUTLINE_POLYGON);
+                    break;
+            }
+            Glut.glutPostRedisplay();
+        }
+        #endregion Menu(int val)
+
+        #region Motion(int x, int y)
+        private static void Motion(int x, int y) {
+            if(down) {
+                Gl.glRotatef(lastX - x, 0, 1, 0);
+                lastX = x;
+                Glut.glutPostRedisplay();
+            }
+        }
+        #endregion Motion(int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            if(button == Glut.GLUT_LEFT_BUTTON) {
+                if(state == Glut.GLUT_DOWN) {
+                    lastX = x;
+                    down = true;
+                }
+                else {
+                    down = false;
+                }
+            }
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(45.0, (double) w / (double) h, 3.0, 8.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/TeaAmbient.cs b/examples/Redbook/TeaAmbient.cs
new file mode 100644
index 0000000..9661802
--- /dev/null
+++ b/examples/Redbook/TeaAmbient.cs
@@ -0,0 +1,195 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/* Copyright (c) Mark J. Kilgard, 1994. */
+/**
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program renders three lighted, shaded teapots, with different ambient values.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Mark J. Kilgard
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class TeaAmbient {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("TeaAmbient");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize light source and lighting model.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] lightAmbient = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            // lightPosition is NOT default value
+            float[] lightPosition = {1.0f, 0.0f, 0.0f, 0.0f};
+            float[] globalAmbient = {0.75f, 0.75f, 0.75f, 1.0f};
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, lightAmbient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, lightDiffuse);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, lightSpecular);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, lightPosition);
+
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, globalAmbient);
+
+            Gl.glFrontFace(Gl.GL_CW);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_AUTO_NORMAL);
+            Gl.glEnable(Gl.GL_NORMALIZE);
+            Gl.glDepthFunc(Gl.GL_LESS);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            float[] lowAmbient = {0.1f, 0.1f, 0.1f, 1.0f};
+            float[] moreAmbient = {0.4f, 0.4f, 0.4f, 1.0f};
+            float[] mostAmbient = {1.0f, 1.0f, 1.0f, 1.0f};
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+
+            // material has small ambient reflection
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, lowAmbient);
+            Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 40.0f);
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.0f, 2.0f, 0.0f);
+                Glut.glutSolidTeapot(1.0);
+            Gl.glPopMatrix();
+
+            // material has moderate ambient reflection
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, moreAmbient);
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.0f, 0.0f, 0.0f);
+                Glut.glutSolidTeapot(1.0);
+            Gl.glPopMatrix();
+
+            // material has large ambient reflection
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, mostAmbient);
+            Gl.glPushMatrix();
+                Gl.glTranslatef(0.0f, -2.0f, 0.0f);
+                Glut.glutSolidTeapot(1.0);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-4.0, 4.0, -4.0 * (float) h / (float) w, 4.0 * (float) h / (float) w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(-4.0 * (float) w / (float) h, 4.0 * (float) w / (float) h, -4.0, 4.0, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Teapots.cs b/examples/Redbook/Teapots.cs
new file mode 100644
index 0000000..99b90cd
--- /dev/null
+++ b/examples/Redbook/Teapots.cs
@@ -0,0 +1,255 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates lots of material properties.  A single light source
+    ///     illuminates the objects.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/teapots.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Teapots {
+        // --- Fields ---
+        #region Private Fields
+        private static int teapotList;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        /// <summary>
+        ///     <para>
+        ///         Main Loop.  Open window with initial window size, title bar, RGBA display
+        ///         mode, and handle input events.
+        ///     </para>
+        /// </summary>
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 600);
+            Glut.glutInitWindowPosition(50, 50);
+            Glut.glutCreateWindow("Teapots");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        /// Initialize depth buffer, projection matrix, light source, and lighting model.
+        /// Do not specify a material property here.
+        /// </summary>
+        private static void Init() {
+            float[] ambient = {0.0f, 0.0f, 0.0f, 1.0f};
+            float[] diffuse = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] specular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] position = {0.0f, 3.0f, 3.0f, 0.0f};
+
+            float[] lmodel_ambient = {0.2f, 0.2f, 0.2f, 1.0f};
+            float[] local_view = {0.0f};
+
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, ambient);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, diffuse);
+            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
+
+            Gl.glFrontFace(Gl.GL_CW);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_AUTO_NORMAL);
+            Gl.glEnable(Gl.GL_NORMALIZE);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            // Be effecient, make teapot display list
+            teapotList = Gl.glGenLists(1);
+            Gl.glNewList(teapotList, Gl.GL_COMPILE);
+                Glut.glutSolidTeapot(1.0);
+            Gl.glEndList();
+        }
+        #endregion Init()
+
+        #region RenderTeapot(float x, float y, float ambr, float ambg, float ambb, float difr, float difg, float difb, float specr, float specg, float specb, float shine)
+        /// <summary>
+        ///     <para>
+        ///         Move object into position.  Use 3rd through 12th parameters to specify the
+        ///         material property.  Draw a teapot.
+        ///     </para>
+        /// </summary>
+        private static void RenderTeapot(float x, float y, float ambr, float ambg, float ambb, float difr, float difg, float difb, float specr, float specg, float specb, float shine) {
+            float[] mat = new float[4];
+
+            Gl.glPushMatrix();
+                Gl.glTranslatef(x, y, 0.0f);
+                mat[0] = ambr;
+                mat[1] = ambg;
+                mat[2] = ambb;
+                mat[3] = 1.0f;
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, mat);
+                mat[0] = difr;
+                mat[1] = difg;
+                mat[2] = difb;
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, mat);
+                mat[0] = specr;
+                mat[1] = specg;
+                mat[2] = specb;
+                Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, mat);
+                Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, shine * 128.0f);
+                Gl.glCallList(teapotList);
+            Gl.glPopMatrix();
+        }
+        #endregion RenderTeapot(float x, float y, float ambr, float ambg, float ambb, float difr, float difg, float difb, float specr, float specg, float specb, float shine)
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         First column:  emerald, jade, obsidian, pearl, ruby, turquoise.
+        ///     </para>
+        ///     <para>
+        ///         2nd column:  brass, bronze, chrome, copper, gold, silver.
+        ///     </para>
+        ///     <para>
+        ///         3rd column:  black, cyan, green, red, white, yellow plastic.
+        ///     </para>
+        ///     <para>
+        ///         4th column:  black, cyan, green, red, white, yellow rubber.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            RenderTeapot(2.0f, 17.0f, 0.0215f, 0.1745f, 0.0215f, 0.07568f, 0.61424f, 0.07568f, 0.633f, 0.727811f, 0.633f, 0.6f);
+            RenderTeapot(2.0f, 14.0f, 0.135f, 0.2225f, 0.1575f, 0.54f, 0.89f, 0.63f, 0.316228f, 0.316228f, 0.316228f, 0.1f);
+            RenderTeapot(2.0f, 11.0f, 0.05375f, 0.05f, 0.06625f, 0.18275f, 0.17f, 0.22525f, 0.332741f, 0.328634f, 0.346435f, 0.3f);
+            RenderTeapot(2.0f, 8.0f, 0.25f, 0.20725f, 0.20725f, 1f, 0.829f, 0.829f, 0.296648f, 0.296648f, 0.296648f, 0.088f);
+            RenderTeapot(2.0f, 5.0f, 0.1745f, 0.01175f, 0.01175f, 0.61424f, 0.04136f, 0.04136f, 0.727811f, 0.626959f, 0.626959f, 0.6f);
+            RenderTeapot(2.0f, 2.0f, 0.1f, 0.18725f, 0.1745f, 0.396f, 0.74151f, 0.69102f, 0.297254f, 0.30829f, 0.306678f, 0.1f);
+            RenderTeapot(6.0f, 17.0f, 0.329412f, 0.223529f, 0.027451f, 0.780392f, 0.568627f, 0.113725f, 0.992157f, 0.941176f, 0.807843f, 0.21794872f);
+            RenderTeapot(6.0f, 14.0f, 0.2125f, 0.1275f, 0.054f, 0.714f, 0.4284f, 0.18144f, 0.393548f, 0.271906f, 0.166721f, 0.2f);
+            RenderTeapot(6.0f, 11.0f, 0.25f, 0.25f, 0.25f, 0.4f, 0.4f, 0.4f, 0.774597f, 0.774597f, 0.774597f, 0.6f);
+            RenderTeapot(6.0f, 8.0f, 0.19125f, 0.0735f, 0.0225f, 0.7038f, 0.27048f, 0.0828f, 0.256777f, 0.137622f, 0.086014f, 0.1f);
+            RenderTeapot(6.0f, 5.0f, 0.24725f, 0.1995f, 0.0745f, 0.75164f, 0.60648f, 0.22648f, 0.628281f, 0.555802f, 0.366065f, 0.4f);
+            RenderTeapot(6.0f, 2.0f, 0.19225f, 0.19225f, 0.19225f, 0.50754f, 0.50754f, 0.50754f, 0.508273f, 0.508273f, 0.508273f, 0.4f);
+            RenderTeapot(10.0f, 17.0f, 0.0f, 0.0f, 0.0f, 0.01f, 0.01f, 0.01f, 0.50f, 0.50f, 0.50f, 0.25f);
+            RenderTeapot(10.0f, 14.0f, 0.0f, 0.1f, 0.06f, 0.0f, 0.50980392f, 0.50980392f, 0.50196078f, 0.50196078f, 0.50196078f, 0.25f);
+            RenderTeapot(10.0f, 11.0f, 0.0f, 0.0f, 0.0f, 0.1f, 0.35f, 0.1f, 0.45f, 0.55f, 0.45f, 0.25f);
+            RenderTeapot(10.0f, 8.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.7f, 0.6f, 0.6f, 0.25f);
+            RenderTeapot(10.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.55f, 0.55f, 0.55f, 0.70f, 0.70f, 0.70f, 0.25f);
+            RenderTeapot(10.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.5f, 0.0f, 0.60f, 0.60f, 0.50f, 0.25f);
+            RenderTeapot(14.0f, 17.0f, 0.02f, 0.02f, 0.02f, 0.01f, 0.01f, 0.01f, 0.4f, 0.4f, 0.4f, 0.078125f);
+            RenderTeapot(14.0f, 14.0f, 0.0f, 0.05f, 0.05f, 0.4f, 0.5f, 0.5f, 0.04f, 0.7f, 0.7f, 0.078125f);
+            RenderTeapot(14.0f, 11.0f, 0.0f, 0.05f, 0.0f, 0.4f, 0.5f, 0.4f, 0.04f, 0.7f, 0.04f, 0.078125f);
+            RenderTeapot(14.0f, 8.0f, 0.05f, 0.0f, 0.0f, 0.5f, 0.4f, 0.4f, 0.7f, 0.04f, 0.04f, 0.078125f);
+            RenderTeapot(14.0f, 5.0f, 0.05f, 0.05f, 0.05f, 0.5f, 0.5f, 0.5f, 0.7f, 0.7f, 0.7f, 0.078125f);
+            RenderTeapot(14.0f, 2.0f, 0.05f, 0.05f, 0.0f, 0.5f, 0.5f, 0.4f, 0.7f, 0.7f, 0.04f, 0.078125f);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case (byte) 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(0.0, 16.0, 0.0, 16.0 * h / w, -10.0, 10.0);
+            }
+            else {
+                Gl.glOrtho(0.0, 16.0 * w / h, 0.0, 16.0, -10.0, 10.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Tess.cs b/examples/Redbook/Tess.cs
new file mode 100644
index 0000000..c9c3aab
--- /dev/null
+++ b/examples/Redbook/Tess.cs
@@ -0,0 +1,279 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     <para>
+    ///         This program demonstrates polygon tessellation.  Two tesselated objects are
+    ///         drawn.  The first is a rectangle with a triangular hole.  The second is a
+    ///         smooth shaded, self-intersecting star.
+    ///     </para>
+    ///     <para>
+    ///         Note the exterior rectangle is drawn with its vertices in counter-clockwise
+    ///         order, but its interior clockwise.  Note the Combine callback is needed for
+    ///         the self-intersecting star.  Also note that removing the TessProperty for
+    ///         the star will make the interior unshaded (WINDING_ODD).
+    ///     </para>
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/tess.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Tess {
+        // --- Fields ---
+        #region Private Fields
+        private static int startList;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("Tess");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Glu.GLUtesselator tess;
+            double[][] rect = new double[4][] {
+                new double[] {50.0, 50.0, 0.0},
+                new double[] {200.0, 50.0, 0.0},
+                new double[] {200.0, 200.0, 0.0},
+                new double[] {50.0, 200.0, 0.0}
+            };
+            double[][] tri = new double[3][] {
+                new double[] {75.0, 75.0, 0.0},
+                new double[] {125.0, 175.0, 0.0},
+                new double[] {175.0, 75.0, 0.0}
+            };
+            double[][] star = new double[5][] {
+                new double[] {250.0, 50.0, 0.0, 1.0, 0.0, 1.0},
+                new double[] {325.0, 200.0, 0.0, 1.0, 1.0, 0.0},
+                new double[] {400.0, 50.0, 0.0, 0.0, 1.0, 1.0},
+                new double[] {250.0, 150.0, 0.0, 1.0, 0.0, 0.0},
+                new double[] {400.0, 150.0, 0.0, 0.0, 1.0, 0.0}
+            };
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+            startList = Gl.glGenLists(2);
+
+            tess = Glu.gluNewTess();
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback1(Gl.glVertex3dv));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Begin));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(End));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_ERROR, new Glu.TessErrorCallback(Error));
+
+            // rectangle with triangular hole inside
+            Gl.glNewList(startList, Gl.GL_COMPILE);
+                Gl.glShadeModel(Gl.GL_FLAT);    
+                Glu.gluTessBeginPolygon(tess, IntPtr.Zero);
+                    Glu.gluTessBeginContour(tess);
+                        Glu.gluTessVertex(tess, rect[0], rect[0]);
+                        Glu.gluTessVertex(tess, rect[1], rect[1]);
+                        Glu.gluTessVertex(tess, rect[2], rect[2]);
+                        Glu.gluTessVertex(tess, rect[3], rect[3]);
+                    Glu.gluTessEndContour(tess);
+                    Glu.gluTessBeginContour(tess);
+                        Glu.gluTessVertex(tess, tri[0], tri[0]);
+                        Glu.gluTessVertex(tess, tri[1], tri[1]);
+                        Glu.gluTessVertex(tess, tri[2], tri[2]);
+                    Glu.gluTessEndContour(tess);
+                Glu.gluTessEndPolygon(tess);
+            Gl.glEndList();
+
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback1(Vertex));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Begin));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(End));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_ERROR, new Glu.TessErrorCallback(Error));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_COMBINE, new Glu.TessCombineCallback1(Combine));
+
+            // smooth shaded, self-intersecting star
+            Gl.glNewList(startList + 1, Gl.GL_COMPILE);
+                Gl.glShadeModel(Gl.GL_SMOOTH);    
+                Glu.gluTessProperty(tess, Glu.GLU_TESS_WINDING_RULE, Glu.GLU_TESS_WINDING_POSITIVE);
+                Glu.gluTessBeginPolygon(tess, IntPtr.Zero);
+                    Glu.gluTessBeginContour(tess);
+                        Glu.gluTessVertex(tess, star[0], star[0]);
+                        Glu.gluTessVertex(tess, star[1], star[1]);
+                        Glu.gluTessVertex(tess, star[2], star[2]);
+                        Glu.gluTessVertex(tess, star[3], star[3]);
+                        Glu.gluTessVertex(tess, star[4], star[4]);
+                    Glu.gluTessEndContour(tess);
+                Glu.gluTessEndPolygon(tess);
+            Gl.glEndList();
+            Glu.gluDeleteTess(tess);
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Begin(int which)
+        private static void Begin(int which) {
+            Gl.glBegin(which);
+        }
+        #endregion Begin(int which)
+
+        #region Combine(double[] coordinates, double[][] vertexData, float[] weight, double[] dataOut)
+        /// <summary>
+        ///     <para>
+        ///         The Combine callback is used to create a new vertex when edges intersect.
+        ///         coordinate location is trivial to calculate, but weight[4] may be used to
+        ///         average color, normal, or texture coordinate data.  In this program, color
+        ///         is weighted.
+        ///     </para>
+        /// </summary>
+        private static void Combine(double[] coordinates, double[] vertexData, float[] weight, double[] dataOut) {
+            double[] vertex = new double[6];
+            int i;
+
+            vertex[0] = coordinates[0];
+            vertex[1] = coordinates[1];
+            vertex[2] = coordinates[2];
+
+            for(i = 3; i < 6; i++) {
+                vertex[i] = weight[0] * vertexData[i] + weight[1] * vertexData[i] + weight[2] * vertexData[i] + weight[3] * vertexData[i];
+            }
+
+            dataOut = vertex;
+        }
+        #endregion Combine(double[] coordinates, double[][] vertexData, float[] weight, double[] dataOut)
+
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glCallList(startList);
+            Gl.glCallList(startList + 1);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region End()
+        private static void End() {
+            Gl.glEnd();
+        }
+        #endregion End()
+
+        #region Error(int errorCode)
+        private static void Error(int errorCode) {
+            Console.WriteLine("Tessellation Error: {0}", Glu.gluErrorString(errorCode));
+            Environment.Exit(1);
+        }
+        #endregion Error(int errorCode)
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluOrtho2D(0.0, (double) w, 0.0, (double) h);
+        }
+        #endregion Reshape(int w, int h)
+
+        #region Vertex(double[] vertex)
+        private static void Vertex(double[] vertex) {
+            double[] pointer;
+
+            pointer = vertex;
+            //Gl.glColor3dv(pointer);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glVertex3dv(vertex);
+        }
+        #endregion Vertex(double[] vertex)
+    }
+}
diff --git a/examples/Redbook/TessWind.cs b/examples/Redbook/TessWind.cs
new file mode 100644
index 0000000..8afd2c6
--- /dev/null
+++ b/examples/Redbook/TessWind.cs
@@ -0,0 +1,375 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates the winding rule polygon tessellation property.  Four
+    ///     tessellated objects are drawn, each with very different contours.  When the w key
+    ///     is pressed, the objects are drawn with a different winding rule.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/tesswind.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class TessWind {
+        // --- Fields ---
+        #region Private Fields
+        private static double currentWinding = Glu.GLU_TESS_WINDING_ODD;
+        private static Glu.GLUtesselator tess;
+        private static int list;
+
+        private static double[][] rects = new double[12][] {
+            new double[] {50.0, 50.0, 0.0},
+            new double[] {300.0, 50.0, 0.0},
+            new double[] {300.0, 300.0, 0.0},
+            new double[] {50.0, 300.0, 0.0},
+            new double[] {100.0, 100.0, 0.0},
+            new double[] {250.0, 100.0, 0.0},
+            new double[] {250.0, 250.0, 0.0},
+            new double[] {100.0, 250.0, 0.0},
+            new double[] {150.0, 150.0, 0.0},
+            new double[] {200.0, 150.0, 0.0},
+            new double[] {200.0, 200.0, 0.0},
+            new double[] {150.0, 200.0, 0.0}
+        };
+        private static double[][] spiral = new double[16][] {
+            new double[] {400.0, 250.0, 0.0},
+            new double[] {400.0, 50.0, 0.0},
+            new double[] {50.0, 50.0, 0.0},
+            new double[] {50.0, 400.0, 0.0},
+            new double[] {350.0, 400.0, 0.0},
+            new double[] {350.0, 100.0, 0.0},
+            new double[] {100.0, 100.0, 0.0},
+            new double[] {100.0, 350.0, 0.0},
+            new double[] {300.0, 350.0, 0.0},
+            new double[] {300.0, 150.0, 0.0},
+            new double[] {150.0, 150.0, 0.0},
+            new double[] {150.0, 300.0, 0.0},
+            new double[] {250.0, 300.0, 0.0},
+            new double[] {250.0, 200.0, 0.0},
+            new double[] {200.0, 200.0, 0.0},
+            new double[] {200.0, 250.0, 0.0}
+        };
+        private static double[][] quad1 = new double[4][] {
+            new double[] {50.0, 150.0, 0.0},
+            new double[] {350.0, 150.0, 0.0},
+            new double[] {350.0, 200.0, 0.0},
+            new double[] {50.0, 200.0, 0.0}
+        };
+        private static double[][] quad2 = new double[4][] {
+            new double[] {100.0, 100.0, 0.0},
+            new double[] {300.0, 100.0, 0.0},
+            new double[] {300.0, 350.0, 0.0},
+            new double[] {100.0, 350.0, 0.0}
+        };
+        private static double[][] tri = new double[3][] {
+            new double[] {200.0, 50.0, 0.0},
+            new double[] {250.0, 300.0, 0.0},
+            new double[] {150.0, 300.0, 0.0}
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutCreateWindow("TessWind");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+            tess = Glu.gluNewTess();
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback1(Gl.glVertex3dv));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Begin));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(End));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_ERROR, new Glu.TessErrorCallback(Error));
+            Glu.gluTessCallback(tess, Glu.GLU_TESS_COMBINE, new Glu.TessCombineCallback1(Combine));
+
+            list = Gl.glGenLists(4);
+            MakeNewLists();
+        }
+        #endregion Init()
+
+        #region MakeNewLists()
+        /// <summary>
+        ///     <para>
+        ///         Make four display lists, each with a different tessellated object.
+        ///     </para>
+        /// </summary>
+        private static void MakeNewLists() {
+            int i;
+
+            Glu.gluTessProperty(tess, Glu.GLU_TESS_WINDING_RULE, currentWinding);
+
+            Gl.glNewList(list, Gl.GL_COMPILE);
+                Glu.gluTessBeginPolygon(tess, IntPtr.Zero);
+                    Glu.gluTessBeginContour(tess);
+                        for(i = 0; i < 4; i++) {
+                            Glu.gluTessVertex(tess, rects[i], rects[i]);
+                        }
+                    Glu.gluTessEndContour(tess);
+                    Glu.gluTessBeginContour(tess);
+                        for(i = 4; i < 8; i++) {
+                            Glu.gluTessVertex(tess, rects[i], rects[i]);
+                        }
+                    Glu.gluTessEndContour(tess);
+                    Glu.gluTessBeginContour(tess);
+                        for(i = 8; i < 12; i++) {
+                            Glu.gluTessVertex(tess, rects[i], rects[i]);
+                        }
+                    Glu.gluTessEndContour(tess);
+                Glu.gluTessEndPolygon(tess);
+            Gl.glEndList();
+
+            Gl.glNewList(list + 1, Gl.GL_COMPILE);
+                Glu.gluTessBeginPolygon(tess, IntPtr.Zero);
+                    Glu.gluTessBeginContour(tess);
+                        for(i = 0; i < 4; i++) {
+                            Glu.gluTessVertex(tess, rects[i], rects[i]);
+                        }
+                    Glu.gluTessEndContour(tess);
+                    Glu.gluTessBeginContour(tess);
+                        for(i = 7; i >= 4; i--) {
+                            Glu.gluTessVertex(tess, rects[i], rects[i]);
+                        }
+                    Glu.gluTessEndContour(tess);
+                    Glu.gluTessBeginContour(tess);
+                        for(i = 11; i >= 8; i--) {
+                            Glu.gluTessVertex(tess, rects[i], rects[i]);
+                        }
+                    Glu.gluTessEndContour(tess);
+                Glu.gluTessEndPolygon(tess);
+            Gl.glEndList();
+
+            Gl.glNewList(list + 2, Gl.GL_COMPILE);
+                Glu.gluTessBeginPolygon(tess, IntPtr.Zero);
+                    Glu.gluTessBeginContour(tess);
+                        for(i = 0; i < 16; i++) {
+                            Glu.gluTessVertex(tess, spiral[i], spiral[i]);
+                        }
+                    Glu.gluTessEndContour(tess);
+                Glu.gluTessEndPolygon(tess);
+            Gl.glEndList();
+
+            Gl.glNewList(list + 3, Gl.GL_COMPILE);
+                Glu.gluTessBeginPolygon(tess, IntPtr.Zero);
+                    Glu.gluTessBeginContour(tess);
+                        for(i = 0; i < 4; i++) {
+                            Glu.gluTessVertex(tess, quad1[i], quad1[i]);
+                        }
+                    Glu.gluTessEndContour(tess);
+                    Glu.gluTessBeginContour(tess);
+                        for(i = 0; i < 4; i++) {
+                            Glu.gluTessVertex(tess, quad2[i], quad2[i]);
+                        }
+                    Glu.gluTessEndContour(tess);
+                    Glu.gluTessBeginContour(tess);
+                        for(i = 0; i < 3; i++) {
+                            Glu.gluTessVertex(tess, tri[i], tri[i]);
+                        }
+                    Glu.gluTessEndContour(tess);
+                Glu.gluTessEndPolygon(tess);
+            Gl.glEndList();
+        }
+        #endregion MakeNewLists()
+
+        // --- Callbacks ---
+        #region Begin(int which)
+        private static void Begin(int which) {
+            Gl.glBegin(which);
+        }
+        #endregion Begin(int which)
+
+        #region Combine(double[] coordinates, double[][] vertexData, float[] weight, double[] dataOut)
+        /// <summary>
+        ///     <para>
+        ///         The Combine callback is used to create a new vertex when edges intersect.
+        ///         coordinate location is trivial to calculate, but weight[4] may be used to
+        ///         average color, normal, or texture coordinate data.
+        ///     </para>
+        /// </summary>
+        private static void Combine(double[] coordinates, double[] vertexData, float[] weight, double[] dataOut) {
+            double[] vertex = new double[3];
+
+            vertex[0] = coordinates[0];
+            vertex[1] = coordinates[1];
+            vertex[2] = coordinates[2];
+            dataOut = vertex;
+        }
+        #endregion Combine(double[] coordinates, double[][] vertexData, float[] weight, double[] dataOut)
+
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glPushMatrix(); 
+                Gl.glCallList(list);
+                Gl.glTranslatef(0.0f, 500.0f, 0.0f);
+                Gl.glCallList(list + 1);
+                Gl.glTranslatef(500.0f, -500.0f, 0.0f);
+                Gl.glCallList(list + 2);
+                Gl.glTranslatef(0.0f, 500.0f, 0.0f);
+                Gl.glCallList(list + 3);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region End()
+        private static void End() {
+            Gl.glEnd();
+        }
+        #endregion End()
+
+        #region Error(int errorCode)
+        private static void Error(int errorCode) {
+            Console.WriteLine("Tessellation Error: {0}", Glu.gluErrorString(errorCode));
+            Environment.Exit(1);
+        }
+        #endregion Error(int errorCode)
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'w':
+                case (byte) 'W':
+                    if(currentWinding == Glu.GLU_TESS_WINDING_ODD) {
+                        currentWinding = Glu.GLU_TESS_WINDING_NONZERO;
+                    }
+                    else if(currentWinding == Glu.GLU_TESS_WINDING_NONZERO) {
+                        currentWinding = Glu.GLU_TESS_WINDING_POSITIVE;
+                    }
+                    else if(currentWinding == Glu.GLU_TESS_WINDING_POSITIVE) {
+                        currentWinding = Glu.GLU_TESS_WINDING_NEGATIVE;
+                    }
+                    else if(currentWinding == Glu.GLU_TESS_WINDING_NEGATIVE) {
+                        currentWinding = Glu.GLU_TESS_WINDING_ABS_GEQ_TWO;
+                    }
+                    else if(currentWinding == Glu.GLU_TESS_WINDING_ABS_GEQ_TWO) {
+                        currentWinding = Glu.GLU_TESS_WINDING_ODD;
+                    }
+                    MakeNewLists();
+                    Glut.glutPostRedisplay();
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Glu.gluOrtho2D(0.0, 1000.0, 0.0, 1000.0 * (double) h / (double) w);
+            }
+            else {
+                Glu.gluOrtho2D(0.0, 1000.0 * (double) w / (double) h, 0.0, 1000.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+
+        #region Vertex(double[] vertex)
+        private static void Vertex(double[] vertex) {
+            double[] pointer;
+
+            pointer = vertex;
+            //Gl.glColor3dv(pointer);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glVertex3dv(vertex);
+        }
+        #endregion Vertex(double[] vertex)
+    }
+}
diff --git a/examples/Redbook/TexBind.cs b/examples/Redbook/TexBind.cs
new file mode 100644
index 0000000..04c21d4
--- /dev/null
+++ b/examples/Redbook/TexBind.cs
@@ -0,0 +1,231 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates using Gl.glBindTexture() by creating and managing two
+    ///     textures.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/texbind.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class TexBind {
+        // --- Fields ---
+        #region Private Constants
+        private const int CHECKWIDTH = 64;
+        private const int CHECKHEIGHT = 64;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static byte[ , , ] checkImage = new byte[CHECKHEIGHT, CHECKWIDTH, 4];
+        private static byte[ , , ] otherImage = new byte[CHECKHEIGHT, CHECKWIDTH, 4];
+        private static int[] textures = new int[2];
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(250, 250);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("TexBind");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            MakeCheckImages();
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+
+            Gl.glGenTextures(2, textures);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, textures[0]);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, CHECKWIDTH, CHECKHEIGHT, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, checkImage);
+
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, textures[1]);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+            Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_DECAL);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, CHECKWIDTH, CHECKHEIGHT, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, otherImage);
+            Gl.glEnable(Gl.GL_TEXTURE_2D);
+        }
+        #endregion Init()
+
+        #region MakeCheckImages()
+        private static void MakeCheckImages() {
+            int i, j, c;
+                
+            for(i = 0; i < CHECKHEIGHT; i++) {
+                for(j = 0; j < CHECKWIDTH; j++) {
+                    if(((i & 0x8) == 0) ^ ((j & 0x8) == 0)) {
+                        c = 255;
+                    }
+                    else {
+                        c = 0;
+                    }
+                    checkImage[i, j, 0] = (byte) c;
+                    checkImage[i, j, 1] = (byte) c;
+                    checkImage[i, j, 2] = (byte) c;
+                    checkImage[i, j, 3] = (byte) 255;
+
+                    if(((i & 0x10) == 0) ^ ((j & 0x10) == 0)) {
+                        c = 255;
+                    }
+                    else {
+                        c = 0;
+                    }
+                    otherImage[i, j, 0] = (byte) c;
+                    otherImage[i, j, 1] = (byte) 0;
+                    otherImage[i, j, 2] = (byte) 0;
+                    otherImage[i, j, 3] = (byte) 255;
+                }
+            }
+        }
+        #endregion MakeCheckImages()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, textures[0]);
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glTexCoord2f(0, 0);
+                Gl.glVertex3f(-2, -1, 0);
+                Gl.glTexCoord2f(0, 1);
+                Gl.glVertex3f(-2, 1, 0);
+                Gl.glTexCoord2f(1, 1);
+                Gl.glVertex3f(0, 1, 0);
+                Gl.glTexCoord2f(1, 0);
+                Gl.glVertex3f(0, -1, 0);
+            Gl.glEnd();
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, textures[1]);
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glTexCoord2f(0, 0);
+                Gl.glVertex3f(1, -1, 0);
+                Gl.glTexCoord2f(0, 1);
+                Gl.glVertex3f(1, 1, 0);
+                Gl.glTexCoord2f(1, 1);
+                Gl.glVertex3f(2.41421f, 1, -1.41421f);
+                Gl.glTexCoord2f(1, 0);
+                Gl.glVertex3f(2.41421f, -1, -1.41421f);
+            Gl.glEnd();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float) w / (float) h, 1.0, 30.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -3.6f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/TexGen.cs b/examples/Redbook/TexGen.cs
new file mode 100644
index 0000000..b82a378
--- /dev/null
+++ b/examples/Redbook/TexGen.cs
@@ -0,0 +1,244 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws a texture mapped teapot with automatically generated texture
+    ///     coordinates.  The texture is rendered as stripes on the teapot.  Initially, the
+    ///     object is drawn with texture coordinates based upon the object coordinates of the
+    ///     vertex and distance from the plane x = 0.  Pressing the 'e' key changes the
+    ///     coordinate generation to eye coordinates of the vertex.  Pressing the 'o' key
+    ///     switches it back to the object coordinates.  Pressing the 's' key changes the
+    ///     plane to a slanted one (x + y + z = 0).  Pressing the 'x' key switches it back to
+    ///     x = 0.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/texgen.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class TexGen {
+        // --- Fields ---
+        #region Private Constants
+        private const int STRIPEWIDTH = 32;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static byte[] stripeImage = new byte[STRIPEWIDTH * 4];
+        private static int[] texture = new int[1];
+
+        // planes for texture coordinate generation
+        private static float[] xequalzero = {1.0f, 0.0f, 0.0f, 0.0f};
+        private static float[] slanted = {1.0f, 1.0f, 1.0f, 0.0f};
+        private static float[] currentCoeff;
+        private static int currentPlane;
+        private static int currentGenMode;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(256, 256);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("TexGen");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+
+            MakeStripeImage();
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+
+            Gl.glGenTextures(1, texture);
+            Gl.glBindTexture(Gl.GL_TEXTURE_1D, texture[0]);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_1D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_1D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_1D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
+            Gl.glTexImage1D(Gl.GL_TEXTURE_1D, 0, Gl.GL_RGBA, STRIPEWIDTH, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, stripeImage);
+
+            Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_MODULATE);
+            currentCoeff = xequalzero;
+            currentGenMode = Gl.GL_OBJECT_LINEAR;
+            currentPlane = Gl.GL_OBJECT_PLANE;
+            Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, currentGenMode);
+            Gl.glTexGenfv(Gl.GL_S, currentPlane, currentCoeff);
+
+            Gl.glEnable(Gl.GL_TEXTURE_GEN_S);
+            Gl.glEnable(Gl.GL_TEXTURE_1D);
+            Gl.glEnable(Gl.GL_CULL_FACE);
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_AUTO_NORMAL);
+            Gl.glEnable(Gl.GL_NORMALIZE);
+            Gl.glFrontFace(Gl.GL_CW);
+            Gl.glCullFace(Gl.GL_BACK);
+            Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 64.0f);
+        }
+        #endregion Init()
+
+        #region MakeStripeImage()
+        private static void MakeStripeImage() {
+            for(int j = 0; j < STRIPEWIDTH; j++) {
+                stripeImage[4 * j] = (byte) ((j <= 4) ? 255 : 0);
+                stripeImage[4 * j + 1] = (byte) ((j > 4) ? 255 : 0);
+                stripeImage[4 * j + 2] = (byte) 0;
+                stripeImage[4 * j + 3] = (byte) 255;
+            }
+        }
+        #endregion MakeStripeImage()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glPushMatrix();
+                Gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
+                Gl.glBindTexture(Gl.GL_TEXTURE_1D, texture[0]);
+                Glut.glutSolidTeapot(2.0);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'e':
+                case (byte) 'E':
+                    currentGenMode = Gl.GL_EYE_LINEAR;
+                    currentPlane = Gl.GL_EYE_PLANE;
+                    Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, currentGenMode);
+                    Gl.glTexGenfv(Gl.GL_S, currentPlane, currentCoeff);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'o':
+                case (byte) 'O':
+                    currentGenMode = Gl.GL_OBJECT_LINEAR;
+                    currentPlane = Gl.GL_OBJECT_PLANE;
+                    Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, currentGenMode);
+                    Gl.glTexGenfv(Gl.GL_S, currentPlane, currentCoeff);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 's':
+                case (byte) 'S':
+                    currentCoeff = slanted;
+                    Gl.glTexGenfv(Gl.GL_S, currentPlane, currentCoeff);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'x':
+                case (byte) 'X':
+                    currentCoeff = xequalzero;
+                    Gl.glTexGenfv(Gl.GL_S, currentPlane, currentCoeff);
+                    Glut.glutPostRedisplay();
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-3.5, 3.5, -3.5 * (float) h / (float) w, 3.5 * (float) h / (float) w, -3.5, 3.5);
+            }
+            else {
+                Gl.glOrtho(-3.5 * (float) w / (float) h, 3.5 * (float) w / (float) h, -3.5, 3.5, -3.5, 3.5);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/TexProx.cs b/examples/Redbook/TexProx.cs
new file mode 100644
index 0000000..82fcb8c
--- /dev/null
+++ b/examples/Redbook/TexProx.cs
@@ -0,0 +1,154 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     The brief program illustrates use of texture proxies.  This program only prints
+    ///     out some messages about whether certain size textures are supported and then exits.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class TexProx {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("TexProx");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            int[] proxyComponents = new int[1];
+            byte[] nullImage = null;
+
+            Console.WriteLine();
+
+            Gl.glTexImage2D(Gl.GL_PROXY_TEXTURE_2D, 0, Gl.GL_RGBA8, 64, 64, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, nullImage);
+            Gl.glGetTexLevelParameteriv(Gl.GL_PROXY_TEXTURE_2D, 0, Gl.GL_TEXTURE_INTERNAL_FORMAT, proxyComponents);
+            Console.WriteLine("Proxying 64x64 level 0 RGBA8 texture (level 0)");
+            if(proxyComponents[0] == Gl.GL_RGBA8) {
+                Console.WriteLine("proxy allocation succeeded");
+            }
+            else {
+                Console.WriteLine("proxy allocation failed");
+            }
+            Console.WriteLine();
+
+            Gl.glTexImage2D(Gl.GL_PROXY_TEXTURE_2D, 0, Gl.GL_RGBA16, 2048, 2048, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_SHORT, nullImage);
+            Gl.glGetTexLevelParameteriv(Gl.GL_PROXY_TEXTURE_2D, 0, Gl.GL_TEXTURE_INTERNAL_FORMAT, proxyComponents);
+            Console.WriteLine("Proxying 2048x2048 level 0 RGBA16 texture (big so unlikely to be supported)");
+            if(proxyComponents[0] == Gl.GL_RGBA16) {
+                Console.WriteLine("proxy allocation succeeded");
+            }
+            else {
+                Console.WriteLine("proxy allocation failed");
+            }
+            Console.WriteLine();
+
+            Console.WriteLine("Press Enter to exit...");
+            Console.ReadLine();
+        }
+        #endregion Init()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Environment.Exit(0);
+        }
+        #endregion Display()
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/TexSub.cs b/examples/Redbook/TexSub.cs
new file mode 100644
index 0000000..7d1772f
--- /dev/null
+++ b/examples/Redbook/TexSub.cs
@@ -0,0 +1,244 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program texture maps a checkerboard image onto two rectangles.  This
+    ///     program clamps the texture, if the texture coordinates fall outside 0.0 and 1.0.
+    ///     If the s key is pressed, a texture subimage is used to alter the original
+    ///     texture.  If the r key is pressed, the original texture is restored.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/texsub.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class TexSub {
+        // --- Fields ---
+        #region Private Constants
+        private const int CHECKWIDTH = 64;
+        private const int CHECKHEIGHT = 64;
+        private const int SUBWIDTH = 16;
+        private const int SUBHEIGHT = 16;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static byte[ , , ] checkImage = new byte[CHECKHEIGHT, CHECKWIDTH, 4];
+        private static byte[ , , ] subImage = new byte[SUBHEIGHT, SUBWIDTH, 4];
+        private static int[] texture = new int[1];
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(250, 250);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("TexSub");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            MakeCheckImages();
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+
+            Gl.glGenTextures(1, texture);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, CHECKWIDTH, CHECKHEIGHT, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, checkImage);
+        }
+        #endregion Init()
+
+        #region MakeCheckImages()
+        private static void MakeCheckImages() {
+            int i, j, c;
+    
+            for(i = 0; i < CHECKHEIGHT; i++) {
+                for(j = 0; j < CHECKWIDTH; j++) {
+                    if(((i & 0x8) == 0) ^ ((j & 0x8) == 0)) {
+                        c = 255;
+                    }
+                    else {
+                        c = 0;
+                    }
+                    checkImage[i, j, 0] = (byte) c;
+                    checkImage[i, j, 1] = (byte) c;
+                    checkImage[i, j, 2] = (byte) c;
+                    checkImage[i, j, 3] = (byte) 255;
+                }
+            }
+
+            for(i = 0; i < SUBHEIGHT; i++) {
+                for(j = 0; j < SUBWIDTH; j++) {
+                    if(((i & 0x4) == 0) ^ ((j & 0x4) == 0)) {
+                        c = 255;
+                    }
+                    else {
+                        c = 0;
+                    }
+                    subImage[i, j, 0] = (byte) c;
+                    subImage[i, j, 1] = (byte) 0;
+                    subImage[i, j, 2] = (byte) 0;
+                    subImage[i, j, 3] = (byte) 255;
+                }
+            }
+        }
+        #endregion MakeCheckImages()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glEnable(Gl.GL_TEXTURE_2D);
+            Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_DECAL);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glTexCoord2f(0.0f, 0.0f);
+                Gl.glVertex3f(-2.0f, -1.0f, 0.0f);
+                Gl.glTexCoord2f(0.0f, 1.0f);
+                Gl.glVertex3f(-2.0f, 1.0f, 0.0f);
+                Gl.glTexCoord2f(1.0f, 1.0f);
+                Gl.glVertex3f(0.0f, 1.0f, 0.0f);
+                Gl.glTexCoord2f(1.0f, 0.0f);
+                Gl.glVertex3f(0.0f, -1.0f, 0.0f);
+
+                Gl.glTexCoord2f(0.0f, 0.0f);
+                Gl.glVertex3f(1.0f, -1.0f, 0.0f);
+                Gl.glTexCoord2f(0.0f, 1.0f);
+                Gl.glVertex3f(1.0f, 1.0f, 0.0f);
+                Gl.glTexCoord2f(1.0f, 1.0f);
+                Gl.glVertex3f(2.41421f, 1.0f, -1.41421f);
+                Gl.glTexCoord2f(1.0f, 0.0f);
+                Gl.glVertex3f(2.41421f, -1.0f, -1.41421f);
+            Gl.glEnd();
+            Gl.glFlush();
+            Gl.glDisable(Gl.GL_TEXTURE_2D);
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 's':
+                case (byte) 'S':
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                    Gl.glTexSubImage2D(Gl.GL_TEXTURE_2D, 0, 12, 44, SUBWIDTH, SUBHEIGHT, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, subImage);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'r':
+                case (byte) 'R':
+                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+                    Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, CHECKWIDTH, CHECKHEIGHT, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, checkImage);
+                    Glut.glutPostRedisplay();
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float) w / (float) h, 1.0, 30.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -3.6f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/TextureSurf.cs b/examples/Redbook/TextureSurf.cs
new file mode 100644
index 0000000..c7a832b
--- /dev/null
+++ b/examples/Redbook/TextureSurf.cs
@@ -0,0 +1,221 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program uses evaluators to generate a curved surface and automatically
+    ///     generated texture coordinates.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/texturesurf.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class TextureSurf {
+        // --- Fields ---
+        #region Private Constants
+        private const int IMAGEWIDTH = 64;
+        private const int IMAGEHEIGHT = 64;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static byte[] image = new byte[IMAGEWIDTH * IMAGEHEIGHT * 3];
+
+        private static float[/* 4*4*3 */] controlPoints = {
+            -1.5f, -1.5f, 4.0f,
+            -0.5f, -1.5f, 2.0f,
+            0.5f, -1.5f, -1.0f,
+            1.5f, -1.5f, 2.0f,
+        
+            -1.5f, -0.5f, 1.0f,
+            -0.5f, -0.5f, 3.0f,
+            0.5f, -0.5f, 0.0f,
+            1.5f, -0.5f, -1.0f,
+        
+            -1.5f, 0.5f, 4.0f,
+            -0.5f, 0.5f, 0.0f,
+            0.5f, 0.5f, 3.0f,
+            1.5f, 0.5f, 4.0f,
+        
+            -1.5f, 1.5f, -2.0f,
+            -0.5f, 1.5f, -2.0f,
+            0.5f, 1.5f, 0.0f,
+            1.5f, 1.5f, -1.0f
+        };
+
+        private static float[/* 2*2*2 */] texturePoints = {
+                0.0f, 0.0f,
+                0.0f, 1.0f,
+            
+                1.0f, 0.0f,
+                1.0f, 1.0f
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("TextureSurf");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glMap2f(Gl.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, controlPoints);
+            Gl.glMap2f(Gl.GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, texturePoints);
+            Gl.glEnable(Gl.GL_MAP2_TEXTURE_COORD_2);
+            Gl.glEnable(Gl.GL_MAP2_VERTEX_3);
+            Gl.glMapGrid2f(20, 0, 1, 20, 0, 1);
+            MakeImage();
+            Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_DECAL);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB, IMAGEWIDTH, IMAGEHEIGHT, 0, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, image);
+            Gl.glEnable(Gl.GL_TEXTURE_2D);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glShadeModel(Gl.GL_FLAT);
+        }
+        #endregion Init()
+
+        #region MakeImage()
+        private static void MakeImage() {
+            int i, j;
+            float ti, tj;
+   
+            for(i = 0; i < IMAGEWIDTH; i++) {
+                ti = 2.0f * 3.14159265f * i / IMAGEWIDTH;
+                for(j = 0; j < IMAGEHEIGHT; j++) {
+                    tj = 2.0f * 3.14159265f * j / IMAGEHEIGHT;
+                    image[3 * (IMAGEHEIGHT * i + j)] = (byte) (127 * (1.0 + Math.Sin(ti)));
+                    image[3 * (IMAGEHEIGHT * i + j) + 1] = (byte) (127 * (1.0 + Math.Cos(2 * tj)));
+                    image[3 * (IMAGEHEIGHT * i + j) + 2] = (byte) (127 * (1.0 + Math.Cos(ti + tj)));
+                }
+            }
+        }
+        #endregion MakeImage()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glEvalMesh2(Gl.GL_FILL, 0, 20, 0, 20);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            if(w <= h) {
+                Gl.glOrtho(-4.0, 4.0, -4.0 * (float) h / (float) w, 4.0 * (float) h / (float) w, -4.0, 4.0);
+            }
+            else {
+                Gl.glOrtho(-4.0 * (float) w / (float) h, 4.0 * (float) w / (float) h, -4.0, 4.0, -4.0, 4.0);
+            }
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glRotatef(85.0f, 1.0f, 1.0f, 1.0f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Torus.cs b/examples/Redbook/Torus.cs
new file mode 100644
index 0000000..a4b1bc0
--- /dev/null
+++ b/examples/Redbook/Torus.cs
@@ -0,0 +1,224 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates the creation of a display list.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/torus.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Torus {
+        // --- Fields ---
+        #region Private Constants
+        private const double PI = 3.14159265358979323846;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static int torus;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(200, 200);
+            Glut.glutCreateWindow("Torus");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Create display list with torus and initialize state.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            torus = Gl.glGenLists(1);
+            Gl.glNewList(torus, Gl.GL_COMPILE);
+                DrawTorus(8, 25);
+            Gl.glEndList();
+
+            Gl.glShadeModel(Gl.GL_FLAT);
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        #endregion Init()
+
+        #region DrawTorus(int c, int t)
+        /// <summary>
+        ///     <para>
+        ///         Draw a torus.
+        ///     </para>
+        /// </summary>
+        private static void DrawTorus(int numc, int numt) {
+            int i, j, k;
+            double s, t, x, y, z, twoPi;
+
+            twoPi = 2 * PI;
+            for(i = 0; i < numc; i++) {
+                Gl.glBegin(Gl.GL_QUAD_STRIP);
+                    for(j = 0; j <= numt; j++) {
+                        for(k = 1; k >= 0; k--) {
+                            s = (i + k) % numc + 0.5;
+                            t = j % numt;
+
+                            x = (1 + 0.1 * Math.Cos(s * twoPi / numc)) * Math.Cos(t * twoPi / numt);
+                            y = (1 + 0.1 * Math.Cos(s * twoPi / numc)) * Math.Sin(t * twoPi / numt);
+                            z = 0.1 * Math.Sin(s * twoPi / numc);
+                            Gl.glVertex3f((float) x, (float) y, (float) z);
+                        }
+                    }
+                Gl.glEnd();
+            }
+        }
+        #endregion DrawTorus(int c, int t)
+
+        // --- Callbacks ---
+        #region Display()
+        /// <summary>
+        ///     <para>
+        ///         Clear window and draw torus.
+        ///     </para>
+        /// </summary>
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glColor3f(1.0f, 1.0f, 1.0f);
+            Gl.glCallList(torus);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        /// <summary>
+        ///     <para>
+        ///         Rotate about x-axis when "x" typed; rotate about y-axis when "y" typed;
+        ///         "i" returns torus to original view
+        ///     </para>
+        /// </summary>
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 'x':
+                case (byte) 'X':
+                    Gl.glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'y':
+                case (byte) 'Y':
+                    Gl.glRotatef(30.0f, 0.0f, 1.0f, 0.0f);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'i':
+                case (byte) 'I':
+                    Gl.glLoadIdentity();
+                    Glu.gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
+                    Glut.glutPostRedisplay();
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        /// <summary>
+        ///     <para>
+        ///         Handle window resize.
+        ///     </para>
+        /// </summary>
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(30, (float) w / (float) h, 1.0, 100.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Glu.gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Trim.cs b/examples/Redbook/Trim.cs
new file mode 100644
index 0000000..00f5c8e
--- /dev/null
+++ b/examples/Redbook/Trim.cs
@@ -0,0 +1,245 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program draws a NURBS surface in the shape of a symmetrical hill, using both
+    ///     a NURBS curve and pwl (piecewise linear) curve to trim part of the surface.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/trim.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Trim {
+        // --- Fields ---
+        #region Private Fields
+        private static float[ , , ] controlPoints = new float[4, 4, 3];
+        private static Glu.GLUnurbs nurb;
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Trim");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        /// <summary>
+        ///     <para>
+        ///         Initialize material property and depth buffer.
+        ///     </para>
+        /// </summary>
+        private static void Init() {
+            float[] materialDiffuse = {0.7f, 0.7f, 0.7f, 1.0f};
+            float[] materialSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
+            float[] materialShininess = {100.0f};
+
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, materialDiffuse);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, materialSpecular);
+            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, materialShininess);
+
+            Gl.glEnable(Gl.GL_LIGHTING);
+            Gl.glEnable(Gl.GL_LIGHT0);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+            Gl.glEnable(Gl.GL_AUTO_NORMAL);
+            Gl.glEnable(Gl.GL_NORMALIZE);
+
+            InitSurface();
+
+            nurb = Glu.gluNewNurbsRenderer();
+            Glu.gluNurbsProperty(nurb, Glu.GLU_SAMPLING_TOLERANCE, 25.0f);
+            Glu.gluNurbsProperty(nurb, Glu.GLU_DISPLAY_MODE, Glu.GLU_FILL);
+            Glu.gluNurbsCallback(nurb, Glu.GLU_ERROR, new Glu.NurbsErrorCallback(NurbsError));
+        }
+        #endregion Init()
+
+        #region InitSurface()
+        /// <summary>
+        ///     <para>
+        ///         Initializes the control points of the surface to a small hill.  The control
+        ///         points range from -3 to +3 in x, y, and z.
+        ///     </para>
+        /// </summary>
+        private static void InitSurface() {
+            int u, v;
+            for(u = 0; u < 4; u++) {
+                for(v = 0; v < 4; v++) {
+                    controlPoints[u, v, 0] = (float) (2.0f * (u - 1.5));
+                    controlPoints[u, v, 1] = (float) (2.0f * (v - 1.5));
+
+                    if((u == 1 || u == 2) && (v == 1 || v == 2)) {
+                        controlPoints[u, v, 2] = 3.0f;
+                    }
+                    else {
+                        controlPoints[u, v, 2] = -3.0f;
+                    }
+                }
+            }
+        }
+        #endregion InitSurface()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            float[] knots = {0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f};
+            // counter clockwise
+            float[ , ] edgePoints = {
+                {0.0f, 0.0f},
+                {1.0f, 0.0f},
+                {1.0f, 1.0f},
+                {0.0f, 1.0f},
+                {0.0f, 0.0f}
+            };
+            // clockwise
+            float[ , ] curvePoints = {
+                {0.25f, 0.5f},
+                {0.25f, 0.75f},
+                {0.75f, 0.75f},
+                {0.75f, 0.5f}
+            };
+            float[] curveKnots = {0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f};
+            // clockwise
+            float[ , ] pwlPoints = {
+                {0.75f, 0.5f},
+                {0.5f, 0.25f},
+                {0.25f, 0.5f}
+            };
+
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glPushMatrix();
+                Gl.glRotatef(330.0f, 1.0f, 0.0f, 0.0f);
+                Gl.glScalef(0.5f, 0.5f, 0.5f);
+
+                Glu.gluBeginSurface(nurb);
+                    Glu.gluNurbsSurface(nurb, 8, knots, 8, knots, 4 * 3, 3, controlPoints, 4, 4, Gl.GL_MAP2_VERTEX_3);
+                    Glu.gluBeginTrim(nurb);
+                        Glu.gluPwlCurve(nurb, 5, edgePoints, 2, Glu.GLU_MAP1_TRIM_2);
+                    Glu.gluEndTrim(nurb);
+                    Glu.gluBeginTrim(nurb);
+                        Glu.gluNurbsCurve(nurb, 8, curveKnots, 2, curvePoints, 4, Glu.GLU_MAP1_TRIM_2);
+                        Glu.gluPwlCurve(nurb, 3, pwlPoints, 2, Glu.GLU_MAP1_TRIM_2);
+                    Glu.gluEndTrim(nurb);
+                Glu.gluEndSurface(nurb);
+            Gl.glPopMatrix();
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region NurbsError(int errorCode)
+        private static void NurbsError(int errorCode) {
+            Console.WriteLine("Nurbs Error: {0}", Glu.gluErrorString(errorCode));
+            Environment.Exit(1);
+        }
+        #endregion NurbsError(int errorCode)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(45, (float) w / (float) h, 3.0, 8.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -5.0f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/UnProject.cs b/examples/Redbook/UnProject.cs
new file mode 100644
index 0000000..a997701
--- /dev/null
+++ b/examples/Redbook/UnProject.cs
@@ -0,0 +1,162 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     When the left mouse button is pressed, this program reads the mouse position and
+    ///     determines two 3D points from which it was transformed.  Very little is
+    ///     displayed.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class UnProject {
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(500, 500);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("UnProject");
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            int[] viewport = new int[4];
+            double[] modelviewMatrix = new double[16];
+            double[] projectionMatrix = new double[16];
+            int realY;  // OpenGL y coordinate position
+            double worldX, worldY, worldZ;  // returned world x, y, z coords
+
+            switch(button) {
+                case Glut.GLUT_LEFT_BUTTON:
+                    if(state == Glut.GLUT_DOWN) {
+                        Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
+                        Gl.glGetDoublev(Gl.GL_MODELVIEW_MATRIX, modelviewMatrix);
+                        Gl.glGetDoublev(Gl.GL_PROJECTION_MATRIX, projectionMatrix);
+                        // note viewport[3] is height of window in pixels
+                        realY = viewport[3] - (int) y - 1;
+                        Console.WriteLine("Coordinates at cursor are ({0:F6}, {1:F6})", x, realY);
+                        Glu.gluUnProject((double) x, (double) realY, 0.0, modelviewMatrix, projectionMatrix, viewport, out worldX, out worldY, out worldZ); 
+                        Console.WriteLine("World coords at z = 0.0 are ({0:F6}, {1:F6}, {2:F6})", worldX, worldY, worldZ);
+                        Glu.gluUnProject((double) x, (double) realY, 1.0, modelviewMatrix, projectionMatrix, viewport, out worldX, out worldY, out worldZ); 
+                        Console.WriteLine("World coords at z = 1.0 are ({0:F6}, {1:F6}, {2:F6})", worldX, worldY, worldZ);
+                    }
+                    break;
+            }
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(45.0, (float) w / (float) h, 1.0, 100.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Varray.cs b/examples/Redbook/Varray.cs
new file mode 100644
index 0000000..1eb9f85
--- /dev/null
+++ b/examples/Redbook/Varray.cs
@@ -0,0 +1,252 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program demonstrates vertex arrays.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/varray.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Varray {
+        // --- Fields ---
+        #region Private Constants
+        private const int POINTER = 1;
+        private const int INTERLEAVED = 2;
+        private const int DRAWARRAY = 1;
+        private const int ARRAYELEMENT = 2;
+        private const int DRAWELEMENTS = 3;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static int setupMethod = POINTER;
+        private static int derefMethod = DRAWARRAY;
+
+        private static float[] intertwined = {
+            1.0f, 0.2f, 1.0f, 100.0f, 100.0f, 0.0f,
+            1.0f, 0.2f, 0.2f, 0.0f, 200.0f, 0.0f,
+            1.0f, 1.0f, 0.2f, 100.0f, 300.0f, 0.0f,
+            0.2f, 1.0f, 0.2f, 200.0f, 300.0f, 0.0f,
+            0.2f, 1.0f, 1.0f, 300.0f, 200.0f, 0.0f,
+            0.2f, 0.2f, 1.0f, 200.0f, 100.0f, 0.0f
+        };
+
+        private static int[] vertices = {
+            25, 25,
+            100, 325,
+            175, 25,
+            175, 325,
+            250, 25,
+            325, 325
+        };
+
+        private static float[] colors = {
+            1.0f, 0.2f, 0.2f,
+            0.2f, 0.2f, 1.0f,
+            0.8f, 1.0f, 0.2f,
+            0.75f, 0.75f, 0.75f,
+            0.35f, 0.35f, 0.35f,
+            0.5f, 0.5f, 0.5f
+        };
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
+            Glut.glutInitWindowSize(350, 350);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Varray");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_SMOOTH);
+            SetupPointers();
+        }
+        #endregion Init()
+
+        #region SetupInterleave()
+        private static void SetupInterleave() {
+            Gl.glInterleavedArrays(Gl.GL_C3F_V3F, 0, intertwined);
+        }
+        #endregion SetupInterleave()
+
+        #region SetupPointers()
+        private static void SetupPointers() {
+            Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);
+            Gl.glEnableClientState(Gl.GL_COLOR_ARRAY);
+
+            Gl.glVertexPointer(2, Gl.GL_INT, 0, vertices);
+            Gl.glColorPointer(3, Gl.GL_FLOAT, 0, colors);
+        }
+        #endregion SetupPointers()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+
+            if(derefMethod == DRAWARRAY) {
+                Gl.glDrawArrays(Gl.GL_TRIANGLES, 0, 6);
+            }
+            else if(derefMethod == ARRAYELEMENT) {
+                Gl.glBegin(Gl.GL_TRIANGLES);
+                    Gl.glArrayElement(2);
+                    Gl.glArrayElement(3);
+                    Gl.glArrayElement(5);
+                Gl.glEnd();
+            }
+            else if(derefMethod == DRAWELEMENTS) {
+                int[] indices = {0, 1, 3, 4};
+
+                Gl.glDrawElements(Gl.GL_POLYGON, 4, Gl.GL_UNSIGNED_INT, indices);
+            }
+            Gl.glFlush();
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Mouse(int button, int state, int x, int y)
+        private static void Mouse(int button, int state, int x, int y) {
+            switch(button) {
+                case Glut.GLUT_LEFT_BUTTON:
+                    if(state == Glut.GLUT_DOWN) {
+                        if(setupMethod == POINTER) {
+                            setupMethod = INTERLEAVED;
+                            SetupInterleave();
+                        }
+                        else if(setupMethod == INTERLEAVED) {
+                            setupMethod = POINTER;
+                            SetupPointers();
+                        }
+                        Glut.glutPostRedisplay();
+                    }
+                    break;
+                case Glut.GLUT_MIDDLE_BUTTON:
+                case Glut.GLUT_RIGHT_BUTTON:
+                    if(state == Glut.GLUT_DOWN) {
+                        if(derefMethod == DRAWARRAY) {
+                            derefMethod = ARRAYELEMENT;
+                        }
+                        else if(derefMethod == ARRAYELEMENT) {
+                            derefMethod = DRAWELEMENTS;
+                        }
+                        else if (derefMethod == DRAWELEMENTS) {
+                            derefMethod = DRAWARRAY;
+                        }
+                        Glut.glutPostRedisplay();
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion Mouse(int button, int state, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluOrtho2D(0.0, (double) w, 0.0, (double) h);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/Redbook/Wrap.cs b/examples/Redbook/Wrap.cs
new file mode 100644
index 0000000..20e43e0
--- /dev/null
+++ b/examples/Redbook/Wrap.cs
@@ -0,0 +1,233 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+/*
+ * Copyright (c) 1993-1997, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED 
+ * Permission to use, copy, modify, and distribute this software for 
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that 
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. 
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * US Government Users Restricted Rights 
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+#endregion Original Credits / License
+
+using System;
+using Tao.FreeGlut;
+using Tao.OpenGl;
+
+namespace Redbook {
+    #region Class Documentation
+    /// <summary>
+    ///     This program texture maps a checkerboard image onto two rectangles.  This program
+    ///     demonstrates the wrapping modes, if the texture coordinates fall outside 0.0 and
+    ///     1.0.  Interaction: Pressing the 's' and 'S' keys switch the wrapping between
+    ///     clamping and repeating for the s parameter.  The 't' and 'T' keys control the
+    ///     wrapping for the t parameter.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Original Author:    Silicon Graphics, Inc.
+    ///         http://www.opengl.org/developers/code/examples/redbook/wrap.c
+    ///     </para>
+    ///     <para>
+    ///         C# Implementation:  Randy Ridge
+    ///         http://www.taoframework.com
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public sealed class Wrap {
+        // --- Fields ---
+        #region Private Constants
+        private const int CHECKWIDTH = 64;
+        private const int CHECKHEIGHT = 64;
+        #endregion Private Constants
+
+        #region Private Fields
+        private static byte[ , , ] checkImage = new byte[CHECKHEIGHT, CHECKWIDTH, 4];
+        private static int[] texture = new int[1];
+        #endregion Private Fields
+
+        // --- Entry Point ---
+        #region Run()
+        [STAThread]
+        public static void Run() {
+            Glut.glutInit();
+            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB | Glut.GLUT_DEPTH);
+            Glut.glutInitWindowSize(250, 250);
+            Glut.glutInitWindowPosition(100, 100);
+            Glut.glutCreateWindow("Wrap");
+            Init();
+            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
+            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
+            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
+            Glut.glutMainLoop();
+        }
+        #endregion Run()
+
+        // --- Application Methods ---
+        #region Init()
+        private static void Init() {
+            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            Gl.glShadeModel(Gl.GL_FLAT);
+            Gl.glEnable(Gl.GL_DEPTH_TEST);
+
+            MakeCheckImage();
+            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
+
+            Gl.glGenTextures(1, texture);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
+            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
+
+            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, CHECKWIDTH, CHECKHEIGHT, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, checkImage);
+        }
+        #endregion Init()
+
+        #region MakeCheckImage()
+        private static void MakeCheckImage() {
+            int i, j, c;
+    
+            for(i = 0; i < CHECKHEIGHT; i++) {
+                for(j = 0; j < CHECKWIDTH; j++) {
+                    if(((i & 0x8) == 0) ^ ((j & 0x8) == 0)) {
+                        c = 255;
+                    }
+                    else {
+                        c = 0;
+                    }
+                    checkImage[i, j, 0] = (byte) c;
+                    checkImage[i, j, 1] = (byte) c;
+                    checkImage[i, j, 2] = (byte) c;
+                    checkImage[i, j, 3] = (byte) 255;
+                }
+            }
+        }
+        #endregion MakeCheckImage()
+
+        // --- Callbacks ---
+        #region Display()
+        private static void Display() {
+            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
+            Gl.glEnable(Gl.GL_TEXTURE_2D);
+            Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_DECAL);
+            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
+
+            Gl.glBegin(Gl.GL_QUADS);
+                Gl.glTexCoord2f(0.0f, 0.0f);
+                Gl.glVertex3f(-2.0f, -1.0f, 0.0f);
+                Gl.glTexCoord2f(0.0f, 3.0f);
+                Gl.glVertex3f(-2.0f, 1.0f, 0.0f);
+                Gl.glTexCoord2f(3.0f, 3.0f);
+                Gl.glVertex3f(0.0f, 1.0f, 0.0f);
+                Gl.glTexCoord2f(3.0f, 0.0f);
+                Gl.glVertex3f(0.0f, -1.0f, 0.0f);
+
+                Gl.glTexCoord2f(0.0f, 0.0f);
+                Gl.glVertex3f(1.0f, -1.0f, 0.0f);
+                Gl.glTexCoord2f(0.0f, 3.0f);
+                Gl.glVertex3f(1.0f, 1.0f, 0.0f);
+                Gl.glTexCoord2f(3.0f, 3.0f);
+                Gl.glVertex3f(2.41421f, 1.0f, -1.41421f);
+                Gl.glTexCoord2f(3.0f, 0.0f);
+                Gl.glVertex3f(2.41421f, -1.0f, -1.41421f);
+            Gl.glEnd();
+            Gl.glFlush();
+            Gl.glDisable(Gl.GL_TEXTURE_2D);
+        }
+        #endregion Display()
+
+        #region Keyboard(byte key, int x, int y)
+        private static void Keyboard(byte key, int x, int y) {
+            switch(key) {
+                case 27:
+                    Environment.Exit(0);
+                    break;
+                case (byte) 's':
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'S':
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 't':
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP);
+                    Glut.glutPostRedisplay();
+                    break;
+                case (byte) 'T':
+                    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
+                    Glut.glutPostRedisplay();
+                    break;
+            }
+        }
+        #endregion Keyboard(byte key, int x, int y)
+
+        #region Reshape(int w, int h)
+        private static void Reshape(int w, int h) {
+            Gl.glViewport(0, 0, w, h);
+            Gl.glMatrixMode(Gl.GL_PROJECTION);
+            Gl.glLoadIdentity();
+            Glu.gluPerspective(60.0, (float) w / (float) h, 1.0, 30.0);
+            Gl.glMatrixMode(Gl.GL_MODELVIEW);
+            Gl.glLoadIdentity();
+            Gl.glTranslatef(0.0f, 0.0f, -3.6f);
+        }
+        #endregion Reshape(int w, int h)
+    }
+}
diff --git a/examples/SdlExamples/COPYING b/examples/SdlExamples/COPYING
new file mode 100644
index 0000000..b945203
--- /dev/null
+++ b/examples/SdlExamples/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/SdlExamples/GfxPrimitives.cs b/examples/SdlExamples/GfxPrimitives.cs
new file mode 100644
index 0000000..2451668
--- /dev/null
+++ b/examples/SdlExamples/GfxPrimitives.cs
@@ -0,0 +1,119 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Threading;
+using Tao.Sdl;
+
+namespace SdlExamples
+{
+    #region Class Documentation
+    /// <summary>
+    /// Simple Tao.Sdl Example
+    /// </summary>
+    /// <remarks>
+    /// Just draws a bunch of rectangles to the screen. 
+    /// To quit, you can close the window, 
+    /// press the Escape key or press the 'q' key
+    /// <p>Written by David Hudson (jendave at yahoo.com)</p>
+    /// <p>This is a reimplementation of an example 
+    /// written by Will Weisser (ogl at 9mm.com)</p>
+    /// </remarks>
+    #endregion Class Documentation
+    public class GfxPrimitives
+    {
+        #region Run()
+        /// <summary>
+        ///  
+        /// </summary>
+        [STAThread]
+        public static void Run()
+        {
+            int flags = (Sdl.SDL_HWSURFACE | Sdl.SDL_DOUBLEBUF | Sdl.SDL_ANYFORMAT);
+            int bpp = 16;
+            int width = 640;
+            int height = 480;
+            bool quitFlag = false;
+
+            Random rand = new Random();
+
+            //string musicFile = "Data/SdlExamples.Reactangles.sound.ogg";
+
+            Sdl.SDL_Event evt;
+
+            try
+            {
+                Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+                Sdl.SDL_WM_SetCaption("Tao.Sdl Example - GfxPrimitives", "");
+                IntPtr surfacePtr = Sdl.SDL_SetVideoMode(
+                    width,
+                    height,
+                    bpp,
+                    flags);
+
+                Sdl.SDL_Rect rect2 =
+                    new Sdl.SDL_Rect(0, 0, (short)width, (short)height);
+                Sdl.SDL_SetClipRect(surfacePtr, ref rect2);
+                while (quitFlag == false)
+                {
+                    Sdl.SDL_PollEvent(out evt);
+
+                    if (evt.type == Sdl.SDL_QUIT)
+                    {
+                        quitFlag = true;
+                    }
+                    else if (evt.type == Sdl.SDL_KEYDOWN)
+                    {
+                        if ((evt.key.keysym.sym == (int)Sdl.SDLK_ESCAPE) ||
+                            (evt.key.keysym.sym == (int)Sdl.SDLK_q))
+                        {
+                            quitFlag = true;
+                        }
+                    }
+
+                    try
+                    {
+                        SdlGfx.filledCircleRGBA(surfacePtr, (short)rand.Next(10, width - 100), (short)rand.Next(10, height - 100), (short)rand.Next(10, 100), (byte)rand.Next(255), (byte)rand.Next(255), (byte)rand.Next(255), (byte)rand.Next(255));
+                        Sdl.SDL_Flip(surfacePtr);
+                        Thread.Sleep(100);
+                    }
+                    catch (Exception) { }
+                }
+            }
+            catch
+            {
+                Sdl.SDL_Quit();
+                throw;
+            }
+            finally
+            {
+                Sdl.SDL_Quit();
+            }
+        }
+        #endregion Run()
+    }
+}
diff --git a/examples/SdlExamples/Makefile.am b/examples/SdlExamples/Makefile.am
new file mode 100644
index 0000000..cd75d64
--- /dev/null
+++ b/examples/SdlExamples/Makefile.am
@@ -0,0 +1,27 @@
+
+PROGRAM = SdlExamples
+PACKAGES =
+BINARY_LIBS = \
+        Tao.Sdl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+RESX = SdlExamples.resx
+RESOURCES = $(PROGRAM).SdlExamples.resources
+SOURCES = \
+        SdlExamples.cs \
+        GfxPrimitives.cs \
+        Program.cs \
+        Rectangles.cs \
+        SdlExamples.Designer.cs \
+        SmpegPlayer.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.Sdl/Tao.Sdl.snk
+
+$(PROGRAM).SdlExamples.resources: SdlExamples.resx
+	$(RESGEN) $< $@
+
+include $(top_srcdir)/Program.am
+
diff --git a/examples/SdlExamples/Makefile.in b/examples/SdlExamples/Makefile.in
new file mode 100644
index 0000000..09b926c
--- /dev/null
+++ b/examples/SdlExamples/Makefile.in
@@ -0,0 +1,375 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic program building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Program.am COPYING
+subdir = examples/SdlExamples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+PROGRAM = SdlExamples
+PACKAGES = 
+BINARY_LIBS = \
+        Tao.Sdl.dll
+
+SYSTEM_LIBS = \
+        System \
+        System.Windows.Forms \
+        System.Data \
+        System.Drawing
+
+RESX = SdlExamples.resx
+RESOURCES = $(PROGRAM).SdlExamples.resources
+SOURCES = \
+        SdlExamples.cs \
+        GfxPrimitives.cs \
+        Program.cs \
+        Rectangles.cs \
+        SdlExamples.Designer.cs \
+        SmpegPlayer.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.Sdl/Tao.Sdl.snk
+noinst_DATA = $(PROGRAM).exe
+EXTRA_DIST = $(SOURCES) $(RESX) $(PROGRAM).csproj $(PROGRAM).sh
+CLEANFILES = $(PROGRAM).exe $(RESOURCES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Program.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  examples/SdlExamples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  examples/SdlExamples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	distclean distclean-generic distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+	uninstall-am
+
+
+$(PROGRAM).SdlExamples.resources: SdlExamples.resx
+	$(RESGEN) $< $@
+
+$(PROGRAM).exe: $(RESOURCES) $(SOURCES)
+	for lib in $(BINARY_LIBS); do \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}; \
+	  ln -sf ../../src/$${lib%.dll}/$${lib}.config; \
+	done
+	$(CSC) -out:$@ -target:winexe \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix -resource:, $(RESOURCES)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+clean-local:
+	rm -f $(BINARY_LIBS)
+	rm -f $(addsuffix .config, $(BINARY_LIBS))
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/SdlExamples/Program.cs b/examples/SdlExamples/Program.cs
new file mode 100644
index 0000000..2947269
--- /dev/null
+++ b/examples/SdlExamples/Program.cs
@@ -0,0 +1,47 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace SdlExamples
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main(string[] args)
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new SdlExamples());
+        }
+    }
+}
diff --git a/examples/SdlExamples/Properties/AssemblyInfo.cs b/examples/SdlExamples/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..c5d0a1a
--- /dev/null
+++ b/examples/SdlExamples/Properties/AssemblyInfo.cs
@@ -0,0 +1,51 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("SdlExamples")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Sdl examples")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Sdl.Examples")]
+[assembly: AssemblyTitle("Sdl Example")]
+[assembly: AssemblyTrademark("Tao Framework - http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/examples/SdlExamples/README b/examples/SdlExamples/README
new file mode 100644
index 0000000..e32f610
--- /dev/null
+++ b/examples/SdlExamples/README
@@ -0,0 +1,11 @@
+SdlExamples
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+These are various SDL examples.
+
+Dave Hudson (jendave at yahoo.com)
+
+October 22, 2004
+    Initial release, version 1.0.0.0
diff --git a/examples/SdlExamples/Rectangles.cs b/examples/SdlExamples/Rectangles.cs
new file mode 100644
index 0000000..9a0c0d7
--- /dev/null
+++ b/examples/SdlExamples/Rectangles.cs
@@ -0,0 +1,258 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Original Credits / License
+//-----------------------------------------------------------------------------
+//Copyright (C) 2003 Will Weisser (ogl at 9mm.com)
+// *
+// * This library is free software; you can redistribute it and/or
+// * modify it under the terms of the GNU Lesser General Public
+// * License as published by the Free Software Foundation; either
+// * version 2.1 of the License, or (at your option) any later version.
+// * 
+// * This library is distributed in the hope that it will be useful,
+// * but WITHOUT ANY WARRANTY; without even the implied warranty of
+// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// * Lesser General Public License for more details.
+// * 
+// * You should have received a copy of the GNU Lesser General Public
+// * License along with this library; if not, write to the Free Software
+// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//-----------------------------------------------------------------------------
+#endregion Original Credits / License
+
+using System;
+using Tao.Sdl;
+using System.IO;
+using System.Runtime.InteropServices;
+
+namespace SdlExamples 
+{
+	#region Class Documentation
+	/// <summary>
+	/// Simple Tao.Sdl Example
+	/// </summary>
+	/// <remarks>
+	/// Just draws a bunch of rectangles to the screen. 
+	/// To quit, you can close the window, 
+	/// press the Escape key or press the 'q' key
+	/// <p>Written by David Hudson (jendave at yahoo.com)</p>
+	/// <p>This is a reimplementation of an example 
+	/// written by Will Weisser (ogl at 9mm.com)</p>
+	/// </remarks>
+	#endregion Class Documentation
+	public class Rectangles 
+	{		
+		#region Run()
+		/// <summary>
+		/// 
+		/// </summary>
+        [STAThread]
+		public static void Run() 
+		{
+			int flags = (Sdl.SDL_HWSURFACE|Sdl.SDL_DOUBLEBUF|Sdl.SDL_ANYFORMAT);
+			int bpp = 16;
+			int width = 640;
+			int height = 480;
+			bool quitFlag = false;
+
+			Random rand = new Random();
+
+            string filePath = Path.Combine("..", "..");
+            string fileDirectory = "Data";
+            string fileName = "SdlExamples.Rectangles.sound.ogg";
+            if (File.Exists(fileName))
+            {
+                filePath = "";
+                fileDirectory = "";
+            }
+            else if (File.Exists(Path.Combine(fileDirectory, fileName)))
+            {
+                filePath = "";
+            }
+
+            string file = Path.Combine(Path.Combine(filePath, fileDirectory), fileName);
+
+			Sdl.SDL_Event evt;
+
+            try
+            {
+                Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+                Sdl.SDL_WM_SetCaption("Tao.Sdl Example - Rectangles", "");
+                IntPtr surfacePtr = Sdl.SDL_SetVideoMode(
+                    width,
+                    height,
+                    bpp,
+                    flags);
+
+                int result = SdlMixer.Mix_OpenAudio(
+                    SdlMixer.MIX_DEFAULT_FREQUENCY,
+                    (short)SdlMixer.MIX_DEFAULT_FORMAT,
+                    2,
+                    1024);
+                IntPtr chunkPtr = SdlMixer.Mix_LoadMUS(file);
+
+                SdlMixer.MusicFinishedDelegate musicStopped =
+                    new SdlMixer.MusicFinishedDelegate(musicHasStopped);
+                SdlMixer.Mix_HookMusicFinished(musicStopped);
+
+                result = SdlMixer.Mix_PlayMusic(chunkPtr, 1);
+                if (result == -1)
+                {
+                    Console.WriteLine("Music Error: " + Sdl.SDL_GetError());
+                }
+
+                int rmask = 0x00000000;
+                int gmask = 0x00ff0000;
+                int bmask = 0x0000ff00;
+                int amask = 0x000000ff;
+
+                IntPtr rgbSurfacePtr = Sdl.SDL_CreateRGBSurface(
+                    flags,
+                    width,
+                    height,
+                    bpp,
+                    rmask,
+                    gmask,
+                    bmask,
+                    amask);
+
+                Sdl.SDL_Rect rect = new Sdl.SDL_Rect(
+                    0,
+                    0,
+                    (short)width,
+                    (short)height);
+                result = Sdl.SDL_FillRect(rgbSurfacePtr, ref rect, 0);
+
+                Sdl.SDL_Rect rect2;
+
+                IntPtr videoInfoPointer = Sdl.SDL_GetVideoInfo();
+                if (videoInfoPointer == IntPtr.Zero)
+                {
+                    throw new ApplicationException(string.Format("Video query failed: {0}", Sdl.SDL_GetError()));
+                }
+
+                Sdl.SDL_VideoInfo videoInfo = (Sdl.SDL_VideoInfo)
+                    Marshal.PtrToStructure(videoInfoPointer,
+                    typeof(Sdl.SDL_VideoInfo));
+                Console.WriteLine("Hi There");
+
+                Sdl.SDL_PixelFormat pixelFormat = (Sdl.SDL_PixelFormat)
+                    Marshal.PtrToStructure(videoInfo.vfmt,
+                    typeof(Sdl.SDL_PixelFormat));
+
+                Console.WriteLine(videoInfo.hw_available);
+                Console.WriteLine(videoInfo.wm_available);
+                Console.WriteLine(videoInfo.blit_hw);
+                Console.WriteLine(videoInfo.blit_hw_CC);
+                Console.WriteLine(videoInfo.blit_hw_A);
+                Console.WriteLine(videoInfo.blit_sw);
+                Console.WriteLine(videoInfo.blit_hw_CC);
+                Console.WriteLine(videoInfo.blit_hw_A);
+                Console.WriteLine(videoInfo.blit_fill);
+                Console.WriteLine(videoInfo.video_mem);
+                Console.WriteLine(pixelFormat.BitsPerPixel);
+                Console.WriteLine(pixelFormat.BytesPerPixel);
+                Console.WriteLine(pixelFormat.Rmask);
+                Console.WriteLine(pixelFormat.Gmask);
+                Console.WriteLine(pixelFormat.Bmask);
+                Console.WriteLine(pixelFormat.Amask);
+
+                int numevents = 10;
+                Sdl.SDL_Event[] events = new Sdl.SDL_Event[numevents];
+                events[0].type = Sdl.SDL_KEYDOWN;
+                events[0].key.keysym.sym = (int)Sdl.SDLK_p;
+                events[1].type = Sdl.SDL_KEYDOWN;
+                events[1].key.keysym.sym = (int)Sdl.SDLK_z;
+                int result2 = Sdl.SDL_PeepEvents(events, numevents, Sdl.SDL_ADDEVENT, Sdl.SDL_KEYDOWNMASK);
+                Console.WriteLine("Addevent result: " + result2);
+
+                while (quitFlag == false)
+                {
+                    result = Sdl.SDL_PollEvent(out evt);
+
+                    if (evt.type == Sdl.SDL_QUIT)
+                    {
+                        quitFlag = true;
+                    }
+                    else if (evt.type == Sdl.SDL_KEYDOWN)
+                    {
+                        if ((evt.key.keysym.sym == (int)Sdl.SDLK_ESCAPE) ||
+                            (evt.key.keysym.sym == (int)Sdl.SDLK_q))
+                        {
+                            quitFlag = true;
+                        }
+                        if (evt.key.keysym.sym == (int)Sdl.SDLK_p)
+                        {
+                            Console.WriteLine("Key p event was added");
+                        }
+                        if (evt.key.keysym.sym == (int)Sdl.SDLK_z)
+                        {
+                            Console.WriteLine("Key z event was added");
+                        }
+                    }
+
+                    rect2 = new Sdl.SDL_Rect(
+                        (short)rand.Next(-300, width),
+                        (short)rand.Next(-300, height),
+                        (short)rand.Next(20, 300),
+                        (short)rand.Next(20, 300));
+
+                    try
+                    {
+                        result = Sdl.SDL_FillRect(
+                            surfacePtr,
+                            ref rect2,
+                            rand.Next(100000));
+                        result = Sdl.SDL_BlitSurface(
+                            rgbSurfacePtr,
+                            ref rect2,
+                            surfacePtr,
+                            ref rect);
+                        result = Sdl.SDL_Flip(surfacePtr);
+                    }
+                    catch (Exception) { }
+                }
+            }
+            catch
+            {
+                Sdl.SDL_Quit();
+                throw;
+            }
+            finally
+            {
+                Sdl.SDL_Quit();
+            }
+		}
+		#endregion Run()
+
+		private static void musicHasStopped()
+		{
+			Console.WriteLine("The Music has stopped!");
+		}
+	}
+}
diff --git a/examples/SdlExamples/SdlExamples.Designer.cs b/examples/SdlExamples/SdlExamples.Designer.cs
new file mode 100644
index 0000000..acb741e
--- /dev/null
+++ b/examples/SdlExamples/SdlExamples.Designer.cs
@@ -0,0 +1,106 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+namespace SdlExamples
+{
+    partial class SdlExamples
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SdlExamples));
+            this.lstExamples = new System.Windows.Forms.ListBox();
+            this.btnRun = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // lstExamples
+            // 
+            this.lstExamples.FormattingEnabled = true;
+            this.lstExamples.Location = new System.Drawing.Point(13, 13);
+            this.lstExamples.Name = "lstExamples";
+            this.lstExamples.Size = new System.Drawing.Size(258, 173);
+            this.lstExamples.Sorted = true;
+            this.lstExamples.TabIndex = 0;
+            this.lstExamples.DoubleClick += new System.EventHandler(this.lstExamples_SelectedIndexChanged);
+            // 
+            // btnRun
+            // 
+            this.btnRun.Location = new System.Drawing.Point(94, 192);
+            this.btnRun.Name = "btnRun";
+            this.btnRun.Size = new System.Drawing.Size(95, 23);
+            this.btnRun.TabIndex = 1;
+            this.btnRun.Text = "Run";
+            this.btnRun.UseVisualStyleBackColor = true;
+            this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+            // 
+            // SdlExamples
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(287, 228);
+            this.Controls.Add(this.btnRun);
+            this.Controls.Add(this.lstExamples);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "SdlExamples";
+            this.Text = "SdlExamplesExamples";
+            this.Load += new System.EventHandler(this.frmExamples_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ListBox lstExamples;
+        private System.Windows.Forms.Button btnRun;
+    }
+}
+
diff --git a/examples/SdlExamples/SdlExamples.cs b/examples/SdlExamples/SdlExamples.cs
new file mode 100644
index 0000000..353046d
--- /dev/null
+++ b/examples/SdlExamples/SdlExamples.cs
@@ -0,0 +1,82 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace SdlExamples
+{
+    public partial class SdlExamples : Form
+    {
+        public SdlExamples()
+        {
+            InitializeComponent();
+        }
+
+        private void frmExamples_Load(object sender, EventArgs e)
+        {
+            Type[] types = Assembly.GetExecutingAssembly().GetTypes();
+            foreach (Type type in types)
+            {
+                MemberInfo[] runMethods = type.GetMember("Run");
+                foreach (MemberInfo run in runMethods)
+                {
+                    lstExamples.Items.Add(type.Name);
+                }
+                if (lstExamples.Items.Count > 0)
+                {
+                    this.lstExamples.SelectedIndex = 0;
+                }
+            }
+        }
+
+        private void btnRun_Click(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+
+        private void SelectExample()
+        {
+            if (lstExamples.SelectedItem != null)
+            {
+                Type example = Assembly.GetExecutingAssembly().GetType("SdlExamples." + lstExamples.SelectedItem.ToString(), true, true);
+                example.InvokeMember("Run", BindingFlags.InvokeMethod, null, null, null);
+            }
+        }
+
+        private void lstExamples_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            SelectExample();
+        }
+    }
+}
diff --git a/examples/SdlExamples/SdlExamples.csproj b/examples/SdlExamples/SdlExamples.csproj
new file mode 100644
index 0000000..a93df3a
--- /dev/null
+++ b/examples/SdlExamples/SdlExamples.csproj
@@ -0,0 +1,131 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{BD901EFF-3281-40FB-9B1B-6A3D3663842E}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>SdlExamples</AssemblyName>
+    <AssemblyOriginatorKeyFile>../../src/Tao.Sdl/Tao.Sdl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>SdlExamples</RootNamespace>
+    <StartupObject>SdlExamples.Program</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.Sdl\Tao.Sdl.csproj">
+      <Name>Tao.Sdl</Name>
+      <Project>{DD8BE6C6-C237-4C82-B521-754900077769}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="SdlExamples.resx">
+      <DependentUpon>SdlExamples.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="SdlExamples.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="GfxPrimitives.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Rectangles.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlExamples.Designer.cs">
+      <DependentUpon>SdlExamples.cs</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SmpegPlayer.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/examples/SdlExamples/SdlExamples.resx b/examples/SdlExamples/SdlExamples.resx
new file mode 100644
index 0000000..06ec7be
--- /dev/null
+++ b/examples/SdlExamples/SdlExamples.resx
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAChl4QAopiGAKOZhgCjmYcAo5mIAKSahwCkmogApZuJAKaciQCmnIoAppyLAKiejACpn44ArKKRAK2j
+        kgCupZUAr6eXALGomACzqZkAsamaALOqmQCyqpsAtKuaALSsnQC0rJ4Atq2eALmxogC7s6UAvbSkALu0
+        pgC+t6sAwbuvAMW8rQDIv7AAycCxAMvFuwDLxrsA08y+ANDMwwDRzcQA08/GANfQwwDa08YA29THANfT
+        ywDY1MwA3dbKAODe2QDi4NoA5OHbAOPh3ADk4dwA5OLdAOTj3gDw6t8A7OnmAO7t6gDx8e8A9fXzAPX2
+        9AD4+fgA+fn4APj6+QD8/v4A/f//AP7//wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAQ0NDQ0NDQ0NDQ0NDMBcDDAwDFzFDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0M3Bw8cAAAAAAAAACsD
+        N0NDQ0NDQ0NDQ0NDQ0NDQ0NDFCctAAAAAAAAAAAAAAAAFENDQ0NDQ0NDQ0NDQ0NDERtAJgAAAAAAAAAA
+        AAAAAAAAABtDQ0NDQ0NDQ0NDQwY+QEAAAAAAAAAAAAAAAAAAAAAAAANDQ0NDQ0NDQ0MGQkBAEAAAAAAA
+        AAAAAAAAAAAAAAAAAAVDQ0NDQ0NDGz1AQEAgAAAAAAAAAAAAAAAAAAAAAAAAABFDQ0NDQ0MdQEBAQCkA
+        AAAAAAA0NQAAAAAAAAAAAAAAAENDQ0NDFkBAQEBAAAAAAAAAGkBAGgAAAAAAAAAAAAAAFENDQzknQEBA
+        QEAlAAAAAAAABwYAAAAAAAAAAAAAAAAAN0NDBkBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQ0MA
+        QEBAQEBAOAAAAAAAAAAAAAAAAAAAAAAAAAAAACtDMTJAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ADEZQkBAQEBAQEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAAFwNAQEBAQEBAQEBAJAAAAAAAAAAAAAAAAAAA
+        AAAAAAAEDkBAQEBAQEBAQEBAQRohAAAAAAAAAAAAAAAAAAAAAAwNQEBAQEBAQEBAQEBAQEA8IwsAAAAA
+        AAAAAAAAAAAADAVAQEBAQEBAQEBAQEBAQEBAQEEJAAAAAAAAAAAAAAADF0JAQEBAQEBAQEBAQEBAQEBA
+        QEA7AAAAAAAAAAAAABcwMEBAQEBAQEBAQEBAQEBAQEBAQEBALgAAAAAAAAAAMUMAQEBAQEBAQEBAQEBA
+        QEBAQEBAQEAtAAAAAAAAACtDQwhAQEBAQEBAQEBAQEBAQEBAQEBAQEAiAAAAAAAAA0NDNydAQEBAQEBA
+        QEBAQEAHCkBAQEBAQAEAAAAAAAA3Q0NDFkBAQEBAQEBAQEBAHjY2HkBAQEBAEwAAAAAAEkNDQ0NDHUBA
+        QEBAQEBAQEA/KipBQEBAQEATAAAAAABDQ0NDQ0MSPUBAQEBAQEBAQEBAQEBAQEBAQAwAAAAAG0NDQ0ND
+        Q0MHQkBAQEBAQEBAQEBAQEBAQEBBAAAAAAJDQ0NDQ0NDQ0MGPkBAQEBAQEBAQEBAQEBAQBEAAAADQ0ND
+        Q0NDQ0NDQ0MRGEBAQEBAQEBAQEBAQEA6AAAAG0NDQ0NDQ0NDQ0NDQ0NDFShBQEBAQEBAQEBAHwAAFEND
+        Q0NDQ0NDQ0NDQ0NDQ0NDNwYALEJAQEBALxIrAzdDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzFwYNDQMXMUND
+        Q0NDQ0NDQ0NDQ//wD///gAH//wAA//wAAD/4AAAf8AAAD+AAAAfgAAAHwAAAA4AAAAGAAAABgAAAAQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA+AAAAfgAAAH8AAAD/gA
+        AB/8AAA//wAA//+AAf//8A//
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/examples/SdlExamples/SdlExamples.sh b/examples/SdlExamples/SdlExamples.sh
new file mode 100755
index 0000000..d4d4d7c
--- /dev/null
+++ b/examples/SdlExamples/SdlExamples.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec mono ./SdlExamples.exe "$@"
diff --git a/examples/SdlExamples/SmpegPlayer.cs b/examples/SdlExamples/SmpegPlayer.cs
new file mode 100644
index 0000000..5e68d00
--- /dev/null
+++ b/examples/SdlExamples/SmpegPlayer.cs
@@ -0,0 +1,173 @@
+#region License
+/*
+MIT License
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Threading;
+using Tao.Sdl;
+using System.Runtime.InteropServices;
+using System.IO;
+
+namespace SdlExamples 
+{
+	#region Class Documentation
+	/// <summary>
+	/// Simple Tao.Sdl Example
+	/// </summary>
+	/// <remarks>
+	/// Just draws a bunch of rectangles to the screen. 
+	/// To quit, you can close the window, 
+	/// press the Escape key or press the 'q' key
+	/// <p>Written by David Hudson (jendave at yahoo.com)</p>
+	/// <p>This is a reimplementation of an example 
+	/// written by Will Weisser (ogl at 9mm.com)</p>
+	/// </remarks>
+	#endregion Class Documentation
+	public class SmpegPlayer 
+	{		
+		//int position = 0;
+		//byte[] two = new byte[4096];
+		//Smpeg.SMPEG_DisplayCallback callbackDelegate;
+		static IntPtr surfacePtr;
+
+		#region Run()
+		/// <summary>
+		/// 
+		/// </summary>
+        [STAThread]
+		public static void Run() 
+		{
+			Sdl.SDL_Event evt;
+			bool quitFlag = false;
+			int flags = (Sdl.SDL_HWSURFACE|Sdl.SDL_DOUBLEBUF|Sdl.SDL_ANYFORMAT);
+			int bpp = 16;
+			int width = 352;
+			int height = 240;
+			
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			Sdl.SDL_WM_SetCaption("Tao.Sdl Example - SmpegPlayer", "");
+			surfacePtr = Sdl.SDL_SetVideoMode(
+				width, 
+				height, 
+				bpp, 
+				flags);
+			SdlMixer.Mix_OpenAudio(SdlMixer.MIX_DEFAULT_FREQUENCY, unchecked(Sdl.AUDIO_S16LSB), 2, 1024);
+			Smpeg.SMPEG_Info info = new Smpeg.SMPEG_Info();
+
+            string filePath = Path.Combine("..", "..");
+            string fileDirectory = "Data";
+            string fileName = "SdlExamples.SmpegPlayer.mpg";
+            if (File.Exists(fileName))
+            {
+                filePath = "";
+                fileDirectory = "";
+            }
+            else if (File.Exists(Path.Combine(fileDirectory, fileName)))
+            {
+                filePath = "";
+            }
+
+            string file = Path.Combine(Path.Combine(filePath, fileDirectory), fileName);
+
+			//SdlMixer.MixFunctionDelegate audioMixer = new SdlMixer.MixFunctionDelegate(this.player);
+			//int freq;
+			//short format;
+			//int channels;
+			SdlMixer.Mix_CloseAudio();
+			IntPtr intPtr = Smpeg.SMPEG_new(file, out info, 1); 
+			//Smpeg.SMPEG_enableaudio(intPtr, 0);
+			//SdlMixer.Mix_QuerySpec(out freq, out unchecked(format), out channels);
+			//Sdl.SDL_AudioSpec audiofmt = new Tao.Sdl.Sdl.SDL_AudioSpec();
+			//audiofmt.freq = freq;
+			//audiofmt.format = unchecked(format);
+			//audiofmt.channels = (byte) channels;
+			//Console.WriteLine("Freq: " + audiofmt.freq);
+			//Console.WriteLine("Format: " + audiofmt.format);
+			//Console.WriteLine("Channels: " + audiofmt.channels);
+
+			Smpeg.SMPEG_getinfo(intPtr, out info);
+			Console.WriteLine("Time: " + info.total_time.ToString());
+			Console.WriteLine("Width: " + info.width.ToString());
+			Console.WriteLine("Height: " + info.height.ToString());
+			Console.WriteLine("Size: " + info.total_size.ToString());
+			Console.WriteLine("Smpeg_error: " + Smpeg.SMPEG_error(intPtr));
+			
+			//Smpeg.SMPEG_actualSpec(intPtr, ref audiofmt); 
+			//SdlMixer.Mix_HookMusic(audioMixer, intPtr);
+			Smpeg.SMPEG_setdisplay(intPtr, surfacePtr, IntPtr.Zero, null);
+			
+			Smpeg.SMPEG_play(intPtr);
+			//Smpeg.SMPEG_loop(intPtr, 1);
+			//Smpeg.SMPEG_enableaudio(intPtr, 1);
+
+            try
+            {
+                while ((Smpeg.SMPEG_status(intPtr) == Smpeg.SMPEG_PLAYING) &&
+                    (quitFlag == false))
+                {
+                    Sdl.SDL_PollEvent(out evt);
+
+                    if (evt.type == Sdl.SDL_QUIT)
+                    {
+                        quitFlag = true;
+                    }
+                    else if (evt.type == Sdl.SDL_KEYDOWN)
+                    {
+                        if ((evt.key.keysym.sym == (int)Sdl.SDLK_ESCAPE) ||
+                            (evt.key.keysym.sym == (int)Sdl.SDLK_q))
+                        {
+                            quitFlag = true;
+                        }
+                    }
+                }
+            }
+            catch
+            {
+                Smpeg.SMPEG_stop(intPtr);
+                Smpeg.SMPEG_delete(intPtr);
+                Sdl.SDL_Quit();
+                throw; 
+            }
+            finally
+            {
+                Smpeg.SMPEG_stop(intPtr);
+                Smpeg.SMPEG_delete(intPtr);
+                Sdl.SDL_Quit();
+            }
+		} 
+
+//		private void player(IntPtr one, byte[] temp, int len)
+//		{
+//			//position +=len;
+//			IntPtr tempPtr = new IntPtr(one.ToInt32() + position);
+//			
+//			Marshal.Copy(tempPtr, two, 0, len);
+//			Smpeg.SMPEG_playAudio(one, two, len);
+//			position +=len;
+//		}
+		#endregion Run()
+	}
+}
diff --git a/m4/Makefile.am b/m4/Makefile.am
new file mode 100644
index 0000000..5d1a4a4
--- /dev/null
+++ b/m4/Makefile.am
@@ -0,0 +1,8 @@
+
+EXTRA_DIST = \
+    acx_pthread.m4 \
+    acx_version.m4 \
+    ax_check_gl.m4 \
+    ax_check_glu.m4 \
+    ax_check_glut.m4
+
diff --git a/m4/Makefile.in b/m4/Makefile.in
new file mode 100644
index 0000000..dcde326
--- /dev/null
+++ b/m4/Makefile.in
@@ -0,0 +1,331 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = m4
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = \
+    acx_pthread.m4 \
+    acx_version.m4 \
+    ax_check_gl.m4 \
+    ax_check_glu.m4 \
+    ax_check_glut.m4
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  m4/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  m4/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/m4/acx_pthread.m4 b/m4/acx_pthread.m4
new file mode 100644
index 0000000..f7b92c7
--- /dev/null
+++ b/m4/acx_pthread.m4
@@ -0,0 +1,233 @@
+dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+dnl
+dnl This macro figures out how to build C programs using POSIX
+dnl threads.  It sets the PTHREAD_LIBS output variable to the threads
+dnl library and linker flags, and the PTHREAD_CFLAGS output variable
+dnl to any special C compiler flags that are needed.  (The user can also
+dnl force certain compiler flags/libs to be tested by setting these
+dnl environment variables.)
+dnl
+dnl Also sets PTHREAD_CC to any special C compiler that is needed for
+dnl multi-threaded programs (defaults to the value of CC otherwise).
+dnl (This is necessary on AIX to use the special cc_r compiler alias.)
+dnl
+dnl NOTE: You are assumed to not only compile your program with these
+dnl flags, but also link it with them as well.  e.g. you should link
+dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+dnl
+dnl If you are only building threads programs, you may wish to
+dnl use these variables in your default LIBS, CFLAGS, and CC:
+dnl
+dnl        LIBS="$PTHREAD_LIBS $LIBS"
+dnl        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+dnl        CC="$PTHREAD_CC"
+dnl
+dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
+dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE
+dnl to that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+dnl
+dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
+dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands
+dnl to run it if it is not found.  If ACTION-IF-FOUND is not specified,
+dnl the default action will define HAVE_PTHREAD.
+dnl
+dnl Please let the authors know if this macro fails on any platform,
+dnl or if you have any other suggestions or comments.  This macro was
+dnl based on work by SGJ on autoconf scripts for FFTW (www.fftw.org)
+dnl (with help from M. Frigo), as well as ac_pthread and hb_pthread
+dnl macros posted by Alejandro Forero Cuervo to the autoconf macro
+dnl repository.  We are also grateful for the helpful feedback of
+dnl numerous users.
+dnl
+dnl @version $Id: acx_pthread.m4,v 1.7 2005/01/16 14:28:19 guidod Exp $
+dnl @author Steven G. Johnson <stevenj at alum.mit.edu>
+
+AC_DEFUN([ACX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_SAVE
+AC_LANG_C
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
+        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test x"$acx_pthread_ok" = xno; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads too;
+#      also defines -D_REENTRANT)
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+        *solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed.  (We need to link with -pthread or
+        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
+        # a function called by this macro, so we could check for that, but
+        # who knows whether they'll stub that too in a future libc.)  So,
+        # we'll just look for -pthreads and -lpthread first:
+
+        acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags"
+        ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+        case $flag in
+                none)
+                AC_MSG_CHECKING([whether pthreads work without any flags])
+                ;;
+
+                -*)
+                AC_MSG_CHECKING([whether pthreads work with $flag])
+                PTHREAD_CFLAGS="$flag"
+                ;;
+
+		pthread-config)
+		AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
+		if test x"$acx_pthread_config" = xno; then continue; fi
+		PTHREAD_CFLAGS="`pthread-config --cflags`"
+		PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+		;;
+
+                *)
+                AC_MSG_CHECKING([for the pthreads library -l$flag])
+                PTHREAD_LIBS="-l$flag"
+                ;;
+        esac
+
+        save_LIBS="$LIBS"
+        save_CFLAGS="$CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+        AC_TRY_LINK([#include <pthread.h>],
+                    [pthread_t th; pthread_join(th, 0);
+                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
+                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+                    [acx_pthread_ok=yes])
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test "x$acx_pthread_ok" = xyes; then
+                break;
+        fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+	AC_MSG_CHECKING([for joinable pthread attribute])
+	attr_name=unknown
+	for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+	    AC_TRY_LINK([#include <pthread.h>], [int attr; attr=$attr;],
+                        [attr_name=$attr; break])
+	done
+        AC_MSG_RESULT($attr_name)
+        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
+                               [Define to necessary symbol if this constant
+                                uses a non-standard name on your system.])
+        fi
+
+        AC_MSG_CHECKING([if more special flags are required for pthreads])
+        flag=no
+        case "${host_cpu}-${host_os}" in
+            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
+            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+        esac
+        AC_MSG_RESULT(${flag})
+        if test "x$flag" != xno; then
+            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+        fi
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        # More AIX lossage: must compile with cc_r
+        AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC})
+else
+        PTHREAD_CC="$CC"
+fi
+
+AC_SUBST(PTHREAD_LIBS)
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_CC)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
+        :
+else
+        acx_pthread_ok=no
+        $2
+fi
+AC_LANG_RESTORE
+])dnl ACX_PTHREAD
diff --git a/m4/acx_version.m4 b/m4/acx_version.m4
new file mode 100644
index 0000000..7d56ead
--- /dev/null
+++ b/m4/acx_version.m4
@@ -0,0 +1,8 @@
+AC_DEFUN([ACX_ASSEMBLY_VERSION], [
+  AC_MSG_CHECKING([for $1 assembly version])
+  $3="`sed -ne 's/.*AssemblyVersion("\(.*\)").*/\1/p' src/$1/Properties/AssemblyInfo.cs`"
+  AC_SUBST($3)
+  $2="`echo "$$3" | sed 's/@<:@.@:>@@<:@0-9@:>@*@<:@.@:>@@<:@0-9@:>@*$//'`"
+  AC_SUBST($2)
+  AC_MSG_RESULT([$$2 ($$3)])
+])
diff --git a/m4/ax_check_gl.m4 b/m4/ax_check_gl.m4
new file mode 100644
index 0000000..adc2c3d
--- /dev/null
+++ b/m4/ax_check_gl.m4
@@ -0,0 +1,91 @@
+dnl @synopsis AX_CHECK_GL
+dnl
+dnl Check for an OpenGL implementation.  If GL is found, the required compiler
+dnl and linker flags are included in the output variables "GL_CFLAGS" and
+dnl "GL_LIBS", respectively.  This macro adds the configure option
+dnl "--with-apple-opengl-framework", which users can use to indicate that
+dnl Apple's OpenGL framework should be used on Mac OS X.  If Apple's OpenGL
+dnl framework is used, the symbol "HAVE_APPLE_OPENGL_FRAMEWORK" is defined.  If
+dnl no GL implementation is found, "no_gl" is set to "yes".
+dnl
+dnl @copyright (C) 2003 Braden McDaniel
+dnl @license GNU GPL
+dnl @version 1.5
+dnl @author Braden McDaniel <address at hidden>
+dnl
+AC_DEFUN([AX_CHECK_GL],
+[AC_REQUIRE([AC_PATH_X])dnl
+AC_REQUIRE([ACX_PTHREAD])dnl
+
+#
+# There isn't a reliable way to know we should use the Apple OpenGL framework
+# without a configure option.  A Mac OS X user may have installed an
+# alternative GL implementation (e.g., Mesa), which may or may not depend on X.
+#
+AC_ARG_WITH([apple-opengl-framework],
+            [AC_HELP_STRING([--with-apple-opengl-framework],
+                            [use Apple OpenGL framework (Mac OS X only)])])
+if test "X$with_apple_opengl_framework" = "Xyes"; then
+  AC_DEFINE([HAVE_APPLE_OPENGL_FRAMEWORK], [1],
+            [Use the Apple OpenGL framework.])
+  GL_CFLAGS="-framework OpenGL"
+else
+  GL_CFLAGS="${PTHREAD_CFLAGS}"
+  GL_LIBS="${PTHREAD_LIBS} -lm"
+
+  #
+  # Use x_includes and x_libraries if they have been set (presumably by
+  # AC_PATH_X).
+  #
+  if test "X$no_x" != "Xyes"; then
+    if test -n "$x_includes"; then
+      GL_CFLAGS="-I${x_includes} ${GL_CFLAGS}"
+    fi
+    if test -n "$x_libraries"; then
+      GL_LIBS="-L${x_libraries} -lX11 ${GL_LIBS}"
+    fi
+  fi
+
+  AC_LANG_PUSH(C)
+
+  AC_CHECK_HEADERS([windows.h])
+
+  AC_CACHE_CHECK([for OpenGL library], [ax_cv_check_gl_libgl],
+  [ax_cv_check_gl_libgl="no"
+  ax_save_CPPFLAGS="${CPPFLAGS}"
+  CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}"
+  ax_save_LIBS="${LIBS}"
+  LIBS=""
+  ax_check_libs="-lopengl32 -lGL"
+    for ax_lib in ${ax_check_libs}; do
+    if test "X$CC" = "Xcl"; then
+      ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'`
+    else
+      ax_try_lib="${ax_lib}"
+    fi
+    LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}"
+    AC_TRY_LINK([
+# if HAVE_WINDOWS_H && defined(_WIN32)
+#   include <windows.h>
+# endif
+# include <GL/gl.h>
+],
+    [glBegin(0)],
+    [ax_cv_check_gl_libgl="${ax_try_lib}"; break])
+  done
+  LIBS=${ax_save_LIBS}
+  CPPFLAGS=${ax_save_CPPFLAGS}])
+
+  if test "X${ax_cv_check_gl_libgl}" = "Xno"; then
+    no_gl="yes"
+    GL_CFLAGS=""
+    GL_LIBS=""
+  else
+    GL_LIBS="${ax_cv_check_gl_libgl} ${GL_LIBS}"
+  fi
+  AC_LANG_POP(C)
+fi
+
+AC_SUBST([GL_CFLAGS])
+AC_SUBST([GL_LIBS])
+])dnl
diff --git a/m4/ax_check_glu.m4 b/m4/ax_check_glu.m4
new file mode 100644
index 0000000..40236a3
--- /dev/null
+++ b/m4/ax_check_glu.m4
@@ -0,0 +1,67 @@
+dnl @synopsis AX_CHECK_GLU
+dnl
+dnl Check for GLU.  If GLU is found, the required preprocessor and linker flags
+dnl are included in the output variables "GLU_CFLAGS" and "GLU_LIBS",
+dnl respectively.  This macro adds the configure option
+dnl "--with-apple-opengl-framework", which users can use to indicate that
+dnl Apple's OpenGL framework should be used on Mac OS X.  If Apple's OpenGL
+dnl framework is used, the symbol "HAVE_APPLE_OPENGL_FRAMEWORK" is defined.  If
+dnl no GLU implementation is found, "no_glu" is set to "yes".
+dnl
+dnl @copyright (C) 2003 Braden McDaniel
+dnl @license GNU GPL
+dnl @version 1.0
+dnl @author Braden McDaniel <address at hidden>
+dnl
+AC_DEFUN([AX_CHECK_GLU],
+[AC_REQUIRE([AX_CHECK_GL])dnl
+GLU_CFLAGS="${GL_CFLAGS}"
+if test "X${with_apple_opengl_framework}" != "Xyes"; then
+  AC_CACHE_CHECK([for OpenGL Utility library], [ax_cv_check_glu_libglu],
+  [ax_cv_check_glu_libglu="no"
+  ax_save_CPPFLAGS="${CPPFLAGS}"
+  CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}"
+  ax_save_LIBS="${LIBS}"
+  LIBS=""
+  ax_check_libs="-lglu32 -lGLU"
+  for ax_lib in ${ax_check_libs}; do
+    if test "X$CC" = "Xcl"; then
+      ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'`
+    else
+      ax_try_lib="${ax_lib}"
+    fi
+    LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}"
+    #
+    # libGLU typically links with libstdc++ on POSIX platforms. However,
+    # setting the language to C++ means that test program source is named
+    # "conftest.cc"; and Microsoft cl doesn't know what to do with such a
+    # file.
+    #
+    if test "X$CXX" != "Xcl"; then
+      AC_LANG_PUSH([C++])
+    fi
+    AC_TRY_LINK([
+# if HAVE_WINDOWS_H && defined(_WIN32)
+#   include <windows.h>
+# endif
+# include <GL/glu.h>
+],
+    [gluBeginCurve(0)],
+    [ax_cv_check_glu_libglu="${ax_try_lib}"; break])
+    if test "X$CXX" != "Xcl"; then
+      AC_LANG_POP([C++])
+    fi
+  done
+  LIBS=${ax_save_LIBS}
+  CPPFLAGS=${ax_save_CPPFLAGS}])
+  if test "X${ax_cv_check_glu_libglu}" = "Xno"; then
+    no_gl="yes"
+    GLU_CFLAGS=""
+    GLU_LIBS=""
+  else
+    GLU_LIBS="${ax_cv_check_glu_libglu} ${GL_LIBS}"
+  fi
+fi
+AC_SUBST([GLU_CFLAGS])
+AC_SUBST([GLU_LIBS])
+])
diff --git a/m4/ax_check_glut.m4 b/m4/ax_check_glut.m4
new file mode 100644
index 0000000..d242a11
--- /dev/null
+++ b/m4/ax_check_glut.m4
@@ -0,0 +1,75 @@
+dnl @synopsis AX_CHECK_GLUT
+dnl
+dnl Check for GLUT.  If GLUT is found, the required compiler and linker flags
+dnl are included in the output variables "GLUT_CFLAGS" and "GLUT_LIBS",
+dnl respectively.  This macro adds the configure option
+dnl "--with-apple-opengl-framework", which users can use to indicate that
+dnl Apple's OpenGL framework should be used on Mac OS X.  If Apple's OpenGL
+dnl framework is used, the symbol "HAVE_APPLE_OPENGL_FRAMEWORK" is defined.  If
+dnl GLUT is not found, "no_glut" is set to "yes".
+dnl
+dnl @copyright (C) 2003 Braden McDaniel
+dnl @license GNU GPL
+dnl @version 1.5
+dnl @author Braden McDaniel <address at hidden>
+dnl
+AC_DEFUN([AX_CHECK_GLUT],
+[AC_REQUIRE([AX_CHECK_GLU])dnl
+AC_REQUIRE([AC_PATH_XTRA])dnl
+
+if test "X$with_apple_opengl_framework" = "Xyes"; then
+  GLUT_CFLAGS="${GLU_CFLAGS} -framework GLUT"
+else
+  GLUT_CFLAGS=${GLU_CFLAGS}
+
+  #
+  # If X is present, assume GLUT depends on it.
+  #
+  if test "X${no_x}" != "Xyes"; then
+    GLUT_LIBS="${X_PRE_LIBS} -lXmu -lXi ${X_EXTRA_LIBS} ${GLU_LIBS}"
+  fi
+
+  AC_LANG_PUSH(C)
+
+  ax_save_CPPFLAGS="${CPPFLAGS}"
+  CPPFLAGS="${GLUT_CFLAGS} ${CPPFLAGS}"
+
+  AC_CACHE_CHECK([for GLUT library], [ax_cv_check_glut_libglut],
+  [ax_cv_check_glut_libglut="no"
+  ax_save_LIBS="${LIBS}"
+  LIBS=""
+  ax_check_libs="-lglut32 -lglut"
+  for ax_lib in ${ax_check_libs}; do
+    if test "X$CC" = "Xcl"; then
+      ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'`
+    else
+      ax_try_lib="${ax_lib}"
+    fi
+    LIBS="${ax_try_lib} ${GLUT_LIBS} ${ax_save_LIBS}"
+    AC_TRY_LINK([
+# if HAVE_WINDOWS_H && defined(_WIN32)
+#   include <windows.h>
+# endif
+# include <GL/glut.h>
+  ],
+    [glutMainLoop()],
+    [ax_cv_check_glut_libglut="${ax_try_lib}"; break])
+
+  done
+  LIBS=${ax_save_LIBS}
+  ])
+  CPPFLAGS="${ax_save_CPPFLAGS}"
+  AC_LANG_POP(C)
+
+  if test "X${ax_cv_check_glut_libglut}" = "Xno"; then
+    no_glut="yes"
+    GLUT_CFLAGS=""
+    GLUT_LIBS=""
+  else
+    GLUT_LIBS="${ax_cv_check_glut_libglut} ${GLUT_LIBS}"
+  fi
+fi
+
+AC_SUBST([GLUT_CFLAGS])
+AC_SUBST([GLUT_LIBS])
+])dnl
diff --git a/other/Tao_Logos/TaoButton.jpg b/other/Tao_Logos/TaoButton.jpg
new file mode 100644
index 0000000..2179d8a
Binary files /dev/null and b/other/Tao_Logos/TaoButton.jpg differ
diff --git a/other/Tao_Logos/TaoPill.gif b/other/Tao_Logos/TaoPill.gif
new file mode 100644
index 0000000..5ea3e5b
Binary files /dev/null and b/other/Tao_Logos/TaoPill.gif differ
diff --git a/other/Tao_Logos/tao.ico b/other/Tao_Logos/tao.ico
new file mode 100644
index 0000000..dd0e012
Binary files /dev/null and b/other/Tao_Logos/tao.ico differ
diff --git a/other/Tao_Logos/yinyangblue.gif b/other/Tao_Logos/yinyangblue.gif
new file mode 100644
index 0000000..cdbe127
Binary files /dev/null and b/other/Tao_Logos/yinyangblue.gif differ
diff --git a/other/win32installer/TaoFramework.nsi b/other/win32installer/TaoFramework.nsi
new file mode 100644
index 0000000..92f3941
--- /dev/null
+++ b/other/win32installer/TaoFramework.nsi
@@ -0,0 +1,430 @@
+!verbose 3
+
+!define PRODUCT_NAME "TaoFramework"
+!define PRODUCT_PACKAGE "taoframework"
+!define PRODUCT_VERSION "2.1.0"
+!define PRODUCT_BUILD "1"
+!define PRODUCT_PUBLISHER "TaoFramework"
+!define PRODUCT_WEB_SITE "http://www.taoframework.com"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\TaoFramework"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\TaoFramework"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+!define PRODUCT_DIR "..\..\dist"
+!define PRODUCT_PATH "${PRODUCT_DIR}\${PRODUCT_PACKAGE}-${PRODUCT_VERSION}"
+!define PRODUCT_SOURCE "${PRODUCT_PATH}\source"
+!define PRODUCT_BIN "${PRODUCT_PATH}\bin"
+!define PRODUCT_DOC "${PRODUCT_PATH}\doc"
+!define PRODUCT_EXAMPLES "${PRODUCT_PATH}\examples"
+!define PRODUCT_DEPS "${PRODUCT_PATH}\lib"
+
+;!define MUI_WELCOMEFINISHPAGE_BITMAP "TaoLogo.bmp"
+;!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+;!define MUI_UNWELCOMEFINISHPAGE_BITMAP "TaoLogo.bmp"
+;!define MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+
+BrandingText "� 2003-2008 Tao Framework Team, http://www.taoframework.com"
+SetCompressor lzma
+CRCCheck on
+
+; File Association defines
+;!include "fileassoc.nsh"
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "${NSISDIR}/Contrib/Graphics/Icons/modern-install.ico"
+!define MUI_UNICON "${NSISDIR}/Contrib/Graphics/Icons/modern-uninstall.ico"
+
+;--------------------------------
+;Variables
+
+Var STARTMENU_FOLDER
+Var INI_VALUE
+Var file_handle
+Var filename
+
+;--------------------------------
+;Installer Pages
+
+; Welcome page
+!insertmacro MUI_PAGE_WELCOME
+; License page
+!insertmacro MUI_PAGE_LICENSE "${PRODUCT_SOURCE}\COPYING"
+; Components Page
+!insertmacro MUI_PAGE_COMPONENTS
+; Directory page
+!insertmacro MUI_PAGE_DIRECTORY
+
+;Start Menu Folder Page Configuration
+!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" 
+!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\TaoFramework" 
+!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
+  
+!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
+
+Page custom CustomPageC 
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+
+; Finish page
+!insertmacro MUI_PAGE_FINISH
+
+;------------------------------------
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_UNPAGE_FINISH
+;------------------------------------
+
+; Language files
+!insertmacro MUI_LANGUAGE "English"
+
+; Reserve files
+!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+
+; MUI end ------
+
+ReserveFile "runtime.ini"
+!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "${PRODUCT_DIR}\${PRODUCT_PACKAGE}-${PRODUCT_VERSION}-setup.exe"
+InstallDir "$PROGRAMFILES\TaoFramework"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails show
+ShowUnInstDetails show
+
+; .NET Framework check
+; http://msdn.microsoft.com/netframework/default.aspx?pull=/library/en-us/dnnetdep/html/redistdeploy1_1.asp
+; Section "Detecting that the .NET Framework 2.0 is installed"
+Function .onInit
+!insertmacro MUI_INSTALLOPTIONS_EXTRACT "runtime.ini"
+	ReadRegDWORD $R0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" Install
+	StrCmp $R0 "" 0 CheckPreviousVersion
+	MessageBox MB_OK "Microsoft .NET Framework 2.0 was not found on this system.$\r$\n$\r$\nUnable to continue this installation."
+	Abort
+
+  CheckPreviousVersion:
+	ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName"
+	StrCmp $R0 "" CheckOSVersion 0
+	MessageBox MB_OK "An old version of TaoFramework is installed on this computer, please uninstall first.$\r$\n$\r$\nUnable to continue this installation."
+	Abort
+	
+  CheckOSVersion:
+        Call IsSupportedWindowsVersion
+        Pop $R0
+        StrCmp $R0 "False" NoAbort 0
+	MessageBox MB_OK "The operating system you are using is not supported by TaoFramework (95/98/ME/NT3.x/NT4.x)."
+        Abort
+
+  NoAbort:
+FunctionEnd
+
+Section "Source" SecSrc
+  SetOverwrite ifnewer
+  
+  SetOutPath "$INSTDIR\source\m4"
+  File /r /x .svn ${PRODUCT_SOURCE}\m4\*
+
+  SetOutPath "$INSTDIR\source\tests"
+  File /r /x obj /x .svn ${PRODUCT_SOURCE}\tests\*
+
+  SetOutPath "$INSTDIR\source\src"
+  File /r /x obj /x bin /x doc /x .svn ${PRODUCT_SOURCE}\src\*
+
+  SetOutPath "$INSTDIR\source\other"
+  File /r /x .svn /x *.swp ${PRODUCT_SOURCE}\other\*
+
+  SetOutPath "$INSTDIR\source\lib"
+  File /r /x .svn /x *.swp ${PRODUCT_SOURCE}\lib\*
+
+  SetOutPath "$INSTDIR\source\examples"
+  File /r /x .svn /x *.swp ${PRODUCT_SOURCE}\examples\*
+
+  SetOutPath "$INSTDIR\source"
+  File /x .svn /x .auto /x autom4te.cache ${PRODUCT_SOURCE}\*
+
+  ;Store installation folder
+  WriteRegStr HKCU "Software\TaoFramework" "" $INSTDIR
+  
+SectionEnd
+
+Section "Runtime" SecRuntime
+  SetOverwrite ifnewer
+  SetOutPath "$INSTDIR\bin"
+  File /r /x .svn /x *.config ${PRODUCT_BIN}\*
+  
+  SetOutPath "$INSTDIR\lib"
+  File /r /x .svn ${PRODUCT_DEPS}\*
+
+  SetOutPath "$INSTDIR\other\Prebuild"
+  File "${PRODUCT_SOURCE}\other\Prebuild\*"
+
+  ;Store installation folder
+  WriteRegStr HKCU "Software\TaoFramework" "" $INSTDIR
+  
+  ;Read a value from an InstallOptions INI file
+  !insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "runtime.ini" "Field 3" "State"
+  StrCmp $INI_VALUE "1" "" +3
+  SetOutPath "$SYSDIR"
+  File /r /x .svn ${PRODUCT_SOURCE}\lib\*
+  
+  !insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "runtime.ini" "Field 2" "State"
+  StrCmp $INI_VALUE "1" "" +4
+  Push "TaoFramework"
+  Push $INSTDIR\bin
+  Call AddManagedDLL
+SectionEnd
+
+Section "Examples" SecExamples
+  SetOverwrite ifnewer
+
+  SetOutPath "$INSTDIR\examples"
+  File /r /x obj ${PRODUCT_EXAMPLES}\*
+
+  CreateDirectory "$SMPROGRAMS\TaoFramework"
+  CreateDirectory "$SMPROGRAMS\TaoFramework\Examples"
+  call CreateExampleShortcuts
+
+  ;Store installation folder
+  WriteRegStr HKCU "Software\TaoFramework" "" $INSTDIR
+  
+SectionEnd
+
+Section "Documentation" SecDocs
+  SetOverwrite ifnewer
+  SetOutPath "$INSTDIR\doc"
+  File /r ${PRODUCT_DOC}\*.chm
+  
+  CreateDirectory "$SMPROGRAMS\TaoFramework\Documentation"
+  call CreateDocShortcuts
+
+  ;Store installation folder
+  WriteRegStr HKCU "Software\TaoFramework" "" $INSTDIR
+SectionEnd
+
+Function CustomPageC
+
+  !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)"
+  !insertmacro MUI_INSTALLOPTIONS_DISPLAY "runtime.ini"
+
+FunctionEnd
+
+; Usage:
+;   Push $SYSDIR\myDll.dll
+;   Push "MyAssemblyName"
+;   Call AddManagedDLL
+;
+Function AddManagedDLL
+  Exch $R0
+  Exch
+  Exch $R1
+ 
+  call GACInstall
+  WriteRegStr HKLM "SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\$R1" "" "$R0"
+  WriteRegStr HKCU "SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\$R1" "" "$R0"
+  WriteRegStr HKLM "SOFTWARE\Microsoft\VisualStudio\8.0\AssemblyFolders\$R1" "" "$R0"
+ 
+  Pop $R1
+  Pop $R0
+FunctionEnd
+
+Function un.DeleteManagedDLLKey
+  Exch $R0
+  Exch
+  Exch $R1
+  
+  DeleteRegKey HKLM "SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\$R1" 
+  DeleteRegKey HKCU "SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\$R1" 
+  DeleteRegKey HKLM "SOFTWARE\Microsoft\VisualStudio\8.0\AssemblyFolders\$R1"
+ 
+  Pop $R1
+  Pop $R0
+FunctionEnd
+
+;Language strings
+LangString TEXT_IO_TITLE ${LANG_ENGLISH} "Installation Options"
+LangString TEXT_IO_SUBTITLE ${LANG_ENGLISH} "TaoFramework Installation Options."
+LangString DESC_SecExamples ${LANG_ENGLISH} "Installs examples using various features of TaoFramework."
+LangString DESC_SecSrc ${LANG_ENGLISH} "Installs the source code."
+LangString DESC_SecDocs ${LANG_ENGLISH} "Installs documentation"
+LangString DESC_SecRuntime ${LANG_ENGLISH} "Copies the runtime libaries to the TaoFramework directory. It does not install them into the GAC."
+
+;Assign language strings to sections
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+!insertmacro MUI_DESCRIPTION_TEXT ${SecExamples} $(DESC_SecExamples)
+!insertmacro MUI_DESCRIPTION_TEXT ${SecSrc} $(DESC_SecSrc)
+!insertmacro MUI_DESCRIPTION_TEXT ${SecDocs} $(DESC_SecDocs)
+!insertmacro MUI_DESCRIPTION_TEXT ${SecRuntime} $(DESC_SecRuntime)
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+
+Section -AdditionalIcons
+  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
+  CreateShortCut "$SMPROGRAMS\TaoFramework\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
+  CreateShortCut "$SMPROGRAMS\TaoFramework\Uninstall.lnk" "$INSTDIR\uninst.exe"
+SectionEnd
+
+Section -Post
+  WriteUninstaller "$INSTDIR\uninst.exe"
+  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+SectionEnd
+
+Section Uninstall
+  Call un.GACUnInstall
+  Delete "$SMPROGRAMS\TaoFramework\*.*"
+
+  ; set OutPath to somewhere else because the current working directory cannot be deleted!
+  SetOutPath "$DESKTOP"
+  
+  RMDir /r "$SMPROGRAMS\TaoFramework"
+  
+  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+
+  Push "TaoFramework"
+  Push $INSTDIR\bin
+  Call un.DeleteManagedDLLKey
+  
+  RMDir /r "$INSTDIR"
+SectionEnd
+
+; GetWindowsVersion, taken from NSIS help, modified for our purposes
+Function IsSupportedWindowsVersion
+
+   Push $R0
+   Push $R1
+
+   ReadRegStr $R0 HKLM \
+   "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
+
+   IfErrors 0 lbl_winnt
+
+   ; we are not NT
+   ReadRegStr $R0 HKLM \
+   "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber
+
+   StrCpy $R1 $R0 1
+   StrCmp $R1 '4' 0 lbl_error
+
+   StrCpy $R1 $R0 3
+
+   StrCmp $R1 '4.0' lbl_win32_95
+   StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98
+
+   lbl_win32_95:
+     StrCpy $R0 'False'
+   Goto lbl_done
+
+   lbl_win32_98:
+     StrCpy $R0 'False'
+   Goto lbl_done
+
+   lbl_win32_ME:
+     StrCpy $R0 'False'
+   Goto lbl_done
+
+   lbl_winnt:
+
+   StrCpy $R1 $R0 1
+
+   StrCmp $R1 '3' lbl_winnt_x
+   StrCmp $R1 '4' lbl_winnt_x
+
+   StrCpy $R1 $R0 3
+
+   StrCmp $R1 '5.0' lbl_winnt_2000
+   StrCmp $R1 '5.1' lbl_winnt_XP
+   StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error
+
+   lbl_winnt_x:
+     StrCpy $R0 'False'
+   Goto lbl_done
+
+   lbl_winnt_2000:
+     Strcpy $R0 'True'
+   Goto lbl_done
+
+   lbl_winnt_XP:
+     Strcpy $R0 'True'
+   Goto lbl_done
+
+   lbl_winnt_2003:
+     Strcpy $R0 'True'
+   Goto lbl_done
+
+   lbl_error:
+     Strcpy $R0 'False'
+   lbl_done:
+
+   Pop $R1
+   Exch $R0
+
+FunctionEnd
+
+Function AddExampleToStartMenu
+    Pop $0 ; link
+    IfFileExists $INSTDIR\examples\$0 0 +2
+      CreateShortCut $SMPROGRAMS\TaoFramework\Examples\$0.lnk $INSTDIR\examples\$0
+FunctionEnd
+
+Function CreateExampleShortcuts
+  FindFirst $file_handle $filename $INSTDIR\examples\*.exe
+  loop:
+	StrCmp $filename "" done
+  	Push $filename
+  	call AddExampleToStartMenu
+	FindNext $file_handle $filename
+  	Goto loop
+  done:
+
+FunctionEnd
+
+Function CreateDocShortcuts
+  FindFirst $file_handle $filename $INSTDIR\doc\*.chm
+  loop:
+	StrCmp $filename "" done
+  	Push $filename
+	Push $filename
+  	call AddDocToStartMenu
+	FindNext $file_handle $filename
+  	Goto loop
+  done:
+
+FunctionEnd
+
+Function AddDocToStartMenu
+    Pop $0 ; link
+    Pop $1 ; file
+    IfFileExists $INSTDIR\doc\$1 0 +2
+      CreateShortCut $SMPROGRAMS\TaoFramework\Documentation\$0.lnk $INSTDIR\doc\$1
+FunctionEnd
+
+Function GACInstall
+  FindFirst $file_handle $filename $INSTDIR\bin\*.dll
+  loop:
+	StrCmp $filename "" done
+	nsExec::Exec '"$INSTDIR/other/Prebuild/prebuild.exe" /install "$INSTDIR/bin/$filename"'
+	FindNext $file_handle $filename
+  	Goto loop
+  done:
+
+FunctionEnd
+
+Function un.GACUnInstall
+  FindFirst $file_handle $filename $INSTDIR\bin\*.dll
+  loop:
+	StrCmp $filename "" done
+	nsExec::Exec '"$INSTDIR/other/Prebuild/prebuild.exe" /remove "$INSTDIR/bin/$filename"'
+	FindNext $file_handle $filename
+  	Goto loop
+  done:
+FunctionEnd
+
diff --git a/other/win32installer/runtime.ini b/other/win32installer/runtime.ini
new file mode 100644
index 0000000..bc2c1c7
--- /dev/null
+++ b/other/win32installer/runtime.ini
@@ -0,0 +1,28 @@
+[Settings]
+NumFields=3
+
+[Field 1]
+Type=label
+Text=Runtime Installations
+Left=0
+Right=-1
+Top=0
+Bottom=10
+
+[Field 2]
+Type=checkbox
+Text=Register assemblies in Global Assembly Cache (GAC).
+Left=0
+Right=-1
+Top=30
+Bottom=40
+State=1
+
+[Field 3]
+Type=checkbox
+Text=Install Windows dll dependencies.
+Left=0
+Right=-1
+Top=50
+Bottom=60
+State=1
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..07a9374
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,38 @@
+
+SUBDIRS = Tao.DevIl \
+          Tao.FFmpeg \
+          Tao.FreeType \
+          Tao.GlBindGen \
+          Tao.Lua \
+          Tao.FtGl \
+          Tao.Ode \
+          Tao.OpenAl \
+          Tao.OpenGl \
+          Tao.Platform.Windows \
+          Tao.Platform.X11 \
+          Tao.Cg \
+          Tao.FreeGlut \
+          Tao.Glfw \
+          Tao.PhysFs \
+          Tao.Sdl
+
+monodocdir = $(prefix)/lib/monodoc/sources/
+monodoc_DATA = Tao.source Tao.zip Tao.tree
+
+EXTRA_DIST = Tao.source
+CLEANFILES = Tao.zip Tao.tree
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also Assembly.am)
+$(monodoc_DATA):
+	export MONO_PATH=$(shell echo $(SUBDIRS) | tr ' ' :):$$MONO_PATH; \
+	for x in $(filter-out Tao.OpenGl Tao.GlBindGen, $(SUBDIRS)); do \
+	  $(mkdir_p) doc/$$x && \
+	  echo monodocer $$x/$$x.dll --out doc/$$x && \
+	  monodocer $$x/$$x.dll --out doc/$$x || exit 1; \
+        done
+	mdassembler --out Tao \
+	  $(addprefix --ecma doc/, $(filter-out Tao.OpenGl Tao.GlBindGen, $(SUBDIRS)))
+
+clean-local:
+	rm -Rf doc
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..faab0bc
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,550 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = src
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodocdir)"
+monodocDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(monodoc_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = Tao.DevIl \
+          Tao.FFmpeg \
+          Tao.FreeType \
+          Tao.GlBindGen \
+          Tao.Lua \
+          Tao.FtGl \
+          Tao.Ode \
+          Tao.OpenAl \
+          Tao.OpenGl \
+          Tao.Platform.Windows \
+          Tao.Platform.X11 \
+          Tao.Cg \
+          Tao.FreeGlut \
+          Tao.Glfw \
+          Tao.PhysFs \
+          Tao.Sdl
+
+monodocdir = $(prefix)/lib/monodoc/sources/
+monodoc_DATA = Tao.source Tao.zip Tao.tree
+EXTRA_DIST = Tao.source
+CLEANFILES = Tao.zip Tao.tree
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-monodocDATA: $(monodoc_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodocdir)" || $(MKDIR_P) "$(DESTDIR)$(monodocdir)"
+	@list='$(monodoc_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monodocDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodocdir)/$$f'"; \
+	  $(monodocDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodocdir)/$$f"; \
+	done
+
+uninstall-monodocDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(monodoc_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodocdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodocdir)/$$f"; \
+	done
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(monodocdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-monodocDATA
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-monodocDATA
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic clean-local \
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-monodocDATA install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+	uninstall-monodocDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also Assembly.am)
+$(monodoc_DATA):
+	export MONO_PATH=$(shell echo $(SUBDIRS) | tr ' ' :):$$MONO_PATH; \
+	for x in $(filter-out Tao.OpenGl Tao.GlBindGen, $(SUBDIRS)); do \
+	  $(mkdir_p) doc/$$x && \
+	  echo monodocer $$x/$$x.dll --out doc/$$x && \
+	  monodocer $$x/$$x.dll --out doc/$$x || exit 1; \
+        done
+	mdassembler --out Tao \
+	  $(addprefix --ecma doc/, $(filter-out Tao.OpenGl Tao.GlBindGen, $(SUBDIRS)))
+
+clean-local:
+	rm -Rf doc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.Cg/AUTHORS b/src/Tao.Cg/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Cg/COPYING b/src/Tao.Cg/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.Cg/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.Cg/Cg.cs b/src/Tao.Cg/Cg.cs
new file mode 100644
index 0000000..f288ffd
--- /dev/null
+++ b/src/Tao.Cg/Cg.cs
@@ -0,0 +1,6460 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.Cg 
+{
+	#region Class Documentation
+	/// <summary>
+	///     Cg core runtime binding for .NET, implementing Cg 1.4.1.
+	/// </summary>
+	/// <remarks>
+	///     Binds functions and definitions in cg.dll or libcg.so.
+	/// </remarks>
+	#endregion Class Documentation
+    public static class Cg 
+	{
+		#region Private Constants
+		#region string CG_NATIVE_LIBRARY
+		/// <summary>
+		///     Specifies CG's native library archive.
+		/// </summary>
+		/// <remarks>
+		///     Specifies cg.dll everywhere; will be mapped via .config for mono.
+		/// </remarks>
+		private const string CG_NATIVE_LIBRARY = "cg.dll";
+		#endregion string CG_NATIVE_LIBRARY
+
+		#region CallingConvention CALLING_CONVENTION
+		/// <summary>
+		///     Specifies the calling convention.
+		/// </summary>
+		/// <remarks>
+		///     Specifies <see cref="CallingConvention.Cdecl" /> for Windows and Linux.
+		/// </remarks>
+		private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+		#endregion CallingConvention CALLING_CONVENTION
+		#endregion Private Constants
+
+		#region Public Constants
+		#region BindLocations
+		#region CG_TEXUNIT0
+		/// <summary>
+		///     Texture unit.
+		/// </summary>
+		// CG_TEXUNIT0 = 2048
+		public const int CG_TEXUNIT0 = 2048;
+		#endregion CG_TEXUNIT0
+
+		#region CG_TEXUNIT1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT1 = 2049
+		public const int CG_TEXUNIT1 = 2049;
+		#endregion CG_TEXUNIT1
+
+		#region CG_TEXUNIT2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT2 = 2050
+		public const int CG_TEXUNIT2 = 2050;
+		#endregion CG_TEXUNIT2
+
+		#region CG_TEXUNIT3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT3 = 2051
+		public const int CG_TEXUNIT3 = 2051;
+		#endregion CG_TEXUNIT3
+
+		#region CG_TEXUNIT4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT4 = 2052
+		public const int CG_TEXUNIT4 = 2052;
+		#endregion CG_TEXUNIT4
+
+		#region CG_TEXUNIT5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT5 = 2053
+		public const int CG_TEXUNIT5 = 2053;
+		#endregion CG_TEXUNIT5
+
+		#region CG_TEXUNIT6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT6 = 2054
+		public const int CG_TEXUNIT6 = 2054;
+		#endregion CG_TEXUNIT6
+
+		#region CG_TEXUNIT7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT7 = 2055
+		public const int CG_TEXUNIT7 = 2055;
+		#endregion CG_TEXUNIT7
+
+		#region CG_TEXUNIT8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT8 = 2056
+		public const int CG_TEXUNIT8 = 2056;
+		#endregion CG_TEXUNIT8
+
+		#region CG_TEXUNIT9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT9 = 2057
+		public const int CG_TEXUNIT9 = 2057;
+		#endregion CG_TEXUNIT9
+
+		#region CG_TEXUNIT10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT10 = 2058
+		public const int CG_TEXUNIT10 = 2058;
+		#endregion CG_TEXUNIT10
+
+		#region CG_TEXUNIT11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT11 = 2059
+		public const int CG_TEXUNIT11 = 2059;
+		#endregion CG_TEXUNIT11
+
+		#region CG_TEXUNIT12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT12 = 2060
+		public const int CG_TEXUNIT12 = 2060;
+		#endregion CG_TEXUNIT12
+
+		#region CG_TEXUNIT13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT13 = 2061
+		public const int CG_TEXUNIT13 = 2061;
+		#endregion CG_TEXUNIT13
+
+		#region CG_TEXUNIT14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT14 = 2062
+		public const int CG_TEXUNIT14 = 2062;
+		#endregion CG_TEXUNIT14
+
+		#region CG_TEXUNIT15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXUNIT15 = 2063
+		public const int CG_TEXUNIT15 = 2063;
+		#endregion CG_TEXUNIT15
+
+		#region CG_ATTR0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR0 = 2113
+		public const int CG_ATTR0 = 2113;
+		#endregion CG_ATTR0
+
+		#region CG_ATTR1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR1 = 2114
+		public const int CG_ATTR1 = 2114;
+		#endregion CG_ATTR1
+
+		#region CG_ATTR2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR2 = 2115
+		public const int CG_ATTR2 = 2115;
+		#endregion CG_ATTR2
+
+		#region CG_ATTR3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR3 = 2116
+		public const int CG_ATTR3 = 2116;
+		#endregion CG_ATTR3
+
+		#region CG_ATTR4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR4 = 2117
+		public const int CG_ATTR4 = 2117;
+		#endregion CG_ATTR4
+
+		#region CG_ATTR5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR5 = 2118
+		public const int CG_ATTR5 = 2118;
+		#endregion CG_ATTR5
+
+		#region CG_ATTR6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR6 = 2119
+		public const int CG_ATTR6 = 2119;
+		#endregion CG_ATTR6
+
+		#region CG_ATTR7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR7 = 2120
+		public const int CG_ATTR7 = 2120;
+		#endregion CG_ATTR7
+
+		#region CG_ATTR8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR8 = 2121
+		public const int CG_ATTR8 = 2121;
+		#endregion CG_ATTR8
+
+		#region CG_ATTR9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR9 = 2122
+		public const int CG_ATTR9 = 2122;
+		#endregion CG_ATTR9
+
+		#region CG_ATTR10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR10 = 2123
+		public const int CG_ATTR10 = 2123;
+		#endregion CG_ATTR10
+
+		#region CG_ATTR11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR11 = 2124
+		public const int CG_ATTR11 = 2124;
+		#endregion CG_ATTR11
+
+		#region CG_ATTR12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR12 = 2125
+		public const int CG_ATTR12 = 2125;
+		#endregion CG_ATTR12
+
+		#region CG_ATTR13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR13 = 2126
+		public const int CG_ATTR13 = 2126;
+		#endregion CG_ATTR13
+
+		#region CG_ATTR14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR14 = 2127
+		public const int CG_ATTR14 = 2127;
+		#endregion CG_ATTR14
+
+		#region CG_ATTR15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ATTR15 = 2128
+		public const int CG_ATTR15 = 2128;
+		#endregion CG_ATTR15
+
+		#region CG_C
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_C = 2178
+		public const int CG_C = 2178;
+		#endregion CG_C
+
+		#region CG_TEX0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEX0 = 2179
+		public const int CG_TEX0 = 2179;
+		#endregion CG_TEX0
+
+		#region CG_TEX1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEX1 = 2180
+		public const int CG_TEX1 = 2180;
+		#endregion CG_TEX1
+
+		#region CG_TEX2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEX2 = 2181
+		public const int CG_TEX2 = 2181;
+		#endregion CG_TEX2
+
+		#region CG_TEX3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEX3 = 2192
+		public const int CG_TEX3 = 2192;
+		#endregion CG_TEX3
+
+		#region CG_TEX4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEX4 = 2193
+		public const int CG_TEX4 = 2193;
+		#endregion CG_TEX4
+
+		#region CG_TEX5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEX5 = 2194
+		public const int CG_TEX5 = 2194;
+		#endregion CG_TEX5
+
+		#region CG_TEX6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEX6 = 2195
+		public const int CG_TEX6 = 2195;
+		#endregion CG_TEX6
+
+		#region CG_TEX7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEX7 = 2196
+		public const int CG_TEX7 = 2196;
+		#endregion CG_TEX7
+
+		#region CG_HPOS
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_HPOS = 2243
+		public const int CG_HPOS = 2243;
+		#endregion CG_HPOS
+
+		#region CG_COL0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COL0 = 2245
+		public const int CG_COL0 = 2245;
+		#endregion CG_COL0
+
+		#region CG_COL1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COL1 = 2246
+		public const int CG_COL1 = 2246;
+		#endregion CG_COL1
+
+		#region CG_COL2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COL2 = 2247
+		public const int CG_COL2 = 2247;
+		#endregion CG_COL2
+
+		#region CG_COL3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COL3 = 2248
+		public const int CG_COL3 = 2248;
+		#endregion CG_COL3
+
+		#region CG_PSIZ
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZ = 2309
+		public const int CG_PSIZ = 2309;
+		#endregion CG_PSIZ
+
+		#region CG_WPOS
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_WPOS = 2373
+		public const int CG_WPOS = 2373;
+		#endregion CG_WPOS
+
+		#region CG_POSITION0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION0 = 2437
+		public const int CG_POSITION0 = 2437;
+		#endregion CG_POSITION0
+
+		#region CG_POSITION1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION1 = 2438
+		public const int CG_POSITION1 = 2438;
+		#endregion CG_POSITION1
+
+		#region CG_POSITION2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION2 = 2439
+		public const int CG_POSITION2 = 2439;
+		#endregion CG_POSITION2
+
+		#region CG_POSITION3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION3 = 2440
+		public const int CG_POSITION3 = 2440;
+		#endregion CG_POSITION3
+
+		#region CG_POSITION4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION4 = 2441
+		public const int CG_POSITION4 = 2441;
+		#endregion CG_POSITION4
+
+		#region CG_POSITION5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION5 = 2442
+		public const int CG_POSITION5 = 2442;
+		#endregion CG_POSITION5
+
+		#region CG_POSITION6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION6 = 2443
+		public const int CG_POSITION6 = 2443;
+		#endregion CG_POSITION6
+
+		#region CG_POSITION7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION7 = 2444
+		public const int CG_POSITION7 = 2444;
+		#endregion CG_POSITION7
+
+		#region CG_POSITION8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION8 = 2445
+		public const int CG_POSITION8 = 2445;
+		#endregion CG_POSITION8
+
+		#region CG_POSITION9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION9 = 2446
+		public const int CG_POSITION9 = 2446;
+		#endregion CG_POSITION9
+
+		#region CG_POSITION10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION10 = 2447
+		public const int CG_POSITION10 = 2447;
+		#endregion CG_POSITION10
+
+		#region CG_POSITION11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION11 = 2448
+		public const int CG_POSITION11 = 2448;
+		#endregion CG_POSITION11
+
+		#region CG_POSITION12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION12 = 2449
+		public const int CG_POSITION12 = 2449;
+		#endregion CG_POSITION12
+
+		#region CG_POSITION13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION13 = 2450
+		public const int CG_POSITION13 = 2450;
+		#endregion CG_POSITION13
+
+		#region CG_POSITION14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION14 = 2451
+		public const int CG_POSITION14 = 2451;
+		#endregion CG_POSITION14
+
+		#region CG_POSITION15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_POSITION15 = 2452
+		public const int CG_POSITION15 = 2452;
+		#endregion CG_POSITION15
+
+		#region CG_DIFFUSE0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DIFFUSE0 = 2501
+		public const int CG_DIFFUSE0 = 2501;
+		#endregion CG_DIFFUSE0
+
+		#region CG_TANGENT0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT0 = 2565
+		public const int CG_TANGENT0 = 2565;
+		#endregion CG_TANGENT0
+
+		#region CG_TANGENT1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT1 = 2566
+		public const int CG_TANGENT1 = 2566;
+		#endregion CG_TANGENT1
+
+		#region CG_TANGENT2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT2 = 2567
+		public const int CG_TANGENT2 = 2567;
+		#endregion CG_TANGENT2
+
+		#region CG_TANGENT3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT3 = 2568
+		public const int CG_TANGENT3 = 2568;
+		#endregion CG_TANGENT3
+
+		#region CG_TANGENT4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT4 = 2569
+		public const int CG_TANGENT4 = 2569;
+		#endregion CG_TANGENT4
+
+		#region CG_TANGENT5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT5 = 2570
+		public const int CG_TANGENT5 = 2570;
+		#endregion CG_TANGENT5
+
+		#region CG_TANGENT6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT6 = 2571
+		public const int CG_TANGENT6 = 2571;
+		#endregion CG_TANGENT6
+
+		#region CG_TANGENT7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT7 = 2572
+		public const int CG_TANGENT7 = 2572;
+		#endregion CG_TANGENT7
+
+		#region CG_TANGENT8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT8 = 2573
+		public const int CG_TANGENT8 = 2573;
+		#endregion CG_TANGENT8
+
+		#region CG_TANGENT9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT9 = 2574
+		public const int CG_TANGENT9 = 2574;
+		#endregion CG_TANGENT9
+
+		#region CG_TANGENT10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT10 = 2575
+		public const int CG_TANGENT10 = 2575;
+		#endregion CG_TANGENT10
+
+		#region CG_TANGENT11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT11 = 2576
+		public const int CG_TANGENT11 = 2576;
+		#endregion CG_TANGENT11
+
+		#region CG_TANGENT12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT12 = 2577
+		public const int CG_TANGENT12 = 2577;
+		#endregion CG_TANGENT12
+
+		#region CG_TANGENT13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT13 = 2578
+		public const int CG_TANGENT13 = 2578;
+		#endregion CG_TANGENT13
+
+		#region CG_TANGENT14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT14 = 2579
+		public const int CG_TANGENT14 = 2579;
+		#endregion CG_TANGENT14
+
+		#region CG_TANGENT15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TANGENT15 = 2580
+		public const int CG_TANGENT15 = 2580;
+		#endregion CG_TANGENT15
+
+		#region CG_SPECULAR0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SPECULAR0 = 2629
+		public const int CG_SPECULAR0 = 2629;
+		#endregion CG_SPECULAR0
+
+		#region CG_BLENDINDICES0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES0 = 2693
+		public const int CG_BLENDINDICES0 = 2693;
+		#endregion CG_BLENDINDICES0
+
+		#region CG_BLENDINDICES1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES1 = 2694
+		public const int CG_BLENDINDICES1 = 2694;
+		#endregion CG_BLENDINDICES1
+
+		#region CG_BLENDINDICES2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES2 = 2695
+		public const int CG_BLENDINDICES2 = 2695;
+		#endregion CG_BLENDINDICES2
+
+		#region CG_BLENDINDICES3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES3 = 2696
+		public const int CG_BLENDINDICES3 = 2696;
+		#endregion CG_BLENDINDICES3
+
+		#region CG_BLENDINDICES4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES4 = 2697
+		public const int CG_BLENDINDICES4 = 2697;
+		#endregion CG_BLENDINDICES4
+
+		#region CG_BLENDINDICES5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES5 = 2698
+		public const int CG_BLENDINDICES5 = 2698;
+		#endregion CG_BLENDINDICES5
+
+		#region CG_BLENDINDICES6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES6 = 2699
+		public const int CG_BLENDINDICES6 = 2699;
+		#endregion CG_BLENDINDICES6
+
+		#region CG_BLENDINDICES7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES7 = 2700
+		public const int CG_BLENDINDICES7 = 2700;
+		#endregion CG_BLENDINDICES7
+
+		#region CG_BLENDINDICES8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES8 = 2701
+		public const int CG_BLENDINDICES8 = 2701;
+		#endregion CG_BLENDINDICES8
+
+		#region CG_BLENDINDICES9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES9 = 2702
+		public const int CG_BLENDINDICES9 = 2702;
+		#endregion CG_BLENDINDICES9
+
+		#region CG_BLENDINDICES10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES10 = 2703
+		public const int CG_BLENDINDICES10 = 2703;
+		#endregion CG_BLENDINDICES10
+
+		#region CG_BLENDINDICES11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES11 = 2704
+		public const int CG_BLENDINDICES11 = 2704;
+		#endregion CG_BLENDINDICES11
+
+		#region CG_BLENDINDICES12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES12 = 2705
+		public const int CG_BLENDINDICES12 = 2705;
+		#endregion CG_BLENDINDICES12
+
+		#region CG_BLENDINDICES13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES13 = 2706
+		public const int CG_BLENDINDICES13 = 2706;
+		#endregion CG_BLENDINDICES13
+
+		#region CG_BLENDINDICES14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES14 = 2707
+		public const int CG_BLENDINDICES14 = 2707;
+		#endregion CG_BLENDINDICES14
+
+		#region CG_BLENDINDICES15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDINDICES15 = 2708
+		public const int CG_BLENDINDICES15 = 2708;
+		#endregion CG_BLENDINDICES15
+
+		#region CG_COLOR0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR0 = 2757
+		public const int CG_COLOR0 = 2757;
+		#endregion CG_COLOR0
+
+		#region CG_COLOR1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR1 = 2758
+		public const int CG_COLOR1 = 2758;
+		#endregion CG_COLOR1
+
+		#region CG_COLOR2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR2 = 2759
+		public const int CG_COLOR2 = 2759;
+		#endregion CG_COLOR2
+
+		#region CG_COLOR3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR3 = 2760
+		public const int CG_COLOR3 = 2760;
+		#endregion CG_COLOR3
+
+		#region CG_COLOR4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR4 = 2761
+		public const int CG_COLOR4 = 2761;
+		#endregion CG_COLOR4
+
+		#region CG_COLOR5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR5 = 2762
+		public const int CG_COLOR5 = 2762;
+		#endregion CG_COLOR5
+
+		#region CG_COLOR6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR6 = 2763
+		public const int CG_COLOR6 = 2763;
+		#endregion CG_COLOR6
+
+		#region CG_COLOR7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR7 = 2764
+		public const int CG_COLOR7 = 2764;
+		#endregion CG_COLOR7
+
+		#region CG_COLOR8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR8 = 2765
+		public const int CG_COLOR8 = 2765;
+		#endregion CG_COLOR8
+
+		#region CG_COLOR9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR9 = 2766
+		public const int CG_COLOR9 = 2766;
+		#endregion CG_COLOR9
+
+		#region CG_COLOR10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR10 = 2767
+		public const int CG_COLOR10 = 2767;
+		#endregion CG_COLOR10
+
+		#region CG_COLOR11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR11 = 2768
+		public const int CG_COLOR11 = 2768;
+		#endregion CG_COLOR11
+
+		#region CG_COLOR12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR12 = 2769
+		public const int CG_COLOR12 = 2769;
+		#endregion CG_COLOR12
+
+		#region CG_COLOR13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR13 = 2770
+		public const int CG_COLOR13 = 2770;
+		#endregion CG_COLOR13
+
+		#region CG_COLOR14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR14 = 2771
+		public const int CG_COLOR14 = 2771;
+		#endregion CG_COLOR14
+
+		#region CG_COLOR15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLOR15 = 2772
+		public const int CG_COLOR15 = 2772;
+		#endregion CG_COLOR15
+
+		#region CG_PSIZE0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE0 = 2821
+		public const int CG_PSIZE0 = 2821;
+		#endregion CG_PSIZE0
+
+		#region CG_PSIZE1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE1 = 2822
+		public const int CG_PSIZE1 = 2822;
+		#endregion CG_PSIZE1
+
+		#region CG_PSIZE2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE2 = 2823
+		public const int CG_PSIZE2 = 2823;
+		#endregion CG_PSIZE2
+
+		#region CG_PSIZE3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE3 = 2824
+		public const int CG_PSIZE3 = 2824;
+		#endregion CG_PSIZE3
+
+		#region CG_PSIZE4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE4 = 2825
+		public const int CG_PSIZE4 = 2825;
+		#endregion CG_PSIZE4
+
+		#region CG_PSIZE5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE5 = 2826
+		public const int CG_PSIZE5 = 2826;
+		#endregion CG_PSIZE5
+
+		#region CG_PSIZE6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE6 = 2827
+		public const int CG_PSIZE6 = 2827;
+		#endregion CG_PSIZE6
+
+		#region CG_PSIZE7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE7 = 2828
+		public const int CG_PSIZE7 = 2828;
+		#endregion CG_PSIZE7
+
+		#region CG_PSIZE8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE8 = 2829
+		public const int CG_PSIZE8 = 2829;
+		#endregion CG_PSIZE8
+
+		#region CG_PSIZE9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE9 = 2830
+		public const int CG_PSIZE9 = 2830;
+		#endregion CG_PSIZE9
+
+		#region CG_PSIZE10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE10 = 2831
+		public const int CG_PSIZE10 = 2831;
+		#endregion CG_PSIZE10
+
+		#region CG_PSIZE11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE11 = 2832
+		public const int CG_PSIZE11 = 2832;
+		#endregion CG_PSIZE11
+
+		#region CG_PSIZE12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE12 = 2833
+		public const int CG_PSIZE12 = 2833;
+		#endregion CG_PSIZE12
+
+		#region CG_PSIZE13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE13 = 2834
+		public const int CG_PSIZE13 = 2834;
+		#endregion CG_PSIZE13
+
+		#region CG_PSIZE14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE14 = 2835
+		public const int CG_PSIZE14 = 2835;
+		#endregion CG_PSIZE14
+
+		#region CG_PSIZE15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PSIZE15 = 2836
+		public const int CG_PSIZE15 = 2836;
+		#endregion CG_PSIZE15
+
+		#region CG_BINORMAL0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL0 = 2885
+		public const int CG_BINORMAL0 = 2885;
+		#endregion CG_BINORMAL0
+
+		#region CG_BINORMAL1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL1 = 2886
+		public const int CG_BINORMAL1 = 2886;
+		#endregion CG_BINORMAL1
+
+		#region CG_BINORMAL2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL2 = 2887
+		public const int CG_BINORMAL2 = 2887;
+		#endregion CG_BINORMAL2
+
+		#region CG_BINORMAL3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL3 = 2888
+		public const int CG_BINORMAL3 = 2888;
+		#endregion CG_BINORMAL3
+
+		#region CG_BINORMAL4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL4 = 2889
+		public const int CG_BINORMAL4 = 2889;
+		#endregion CG_BINORMAL4
+
+		#region CG_BINORMAL5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL5 = 2890
+		public const int CG_BINORMAL5 = 2890;
+		#endregion CG_BINORMAL5
+
+		#region CG_BINORMAL6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL6 = 2891
+		public const int CG_BINORMAL6 = 2891;
+		#endregion CG_BINORMAL6
+
+		#region CG_BINORMAL7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL7 = 2892
+		public const int CG_BINORMAL7 = 2892;
+		#endregion CG_BINORMAL7
+
+		#region CG_BINORMAL8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL8 = 2893
+		public const int CG_BINORMAL8 = 2893;
+		#endregion CG_BINORMAL8
+
+		#region CG_BINORMAL9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL9 = 2894
+		public const int CG_BINORMAL9 = 2894;
+		#endregion CG_BINORMAL9
+
+		#region CG_BINORMAL10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL10 = 2895
+		public const int CG_BINORMAL10 = 2895;
+		#endregion CG_BINORMAL10
+
+		#region CG_BINORMAL11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL11 = 2896
+		public const int CG_BINORMAL11 = 2896;
+		#endregion CG_BINORMAL11
+
+		#region CG_BINORMAL12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL12 = 2897
+		public const int CG_BINORMAL12 = 2897;
+		#endregion CG_BINORMAL12
+
+		#region CG_BINORMAL13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL13 = 2898
+		public const int CG_BINORMAL13 = 2898;
+		#endregion CG_BINORMAL13
+
+		#region CG_BINORMAL14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL14 = 2899
+		public const int CG_BINORMAL14 = 2899;
+		#endregion CG_BINORMAL14
+
+		#region CG_BINORMAL15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BINORMAL15 = 2900
+		public const int CG_BINORMAL15 = 2900;
+		#endregion CG_BINORMAL15
+
+		#region CG_FOG0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG0 = 2917
+		public const int CG_FOG0 = 2917;
+		#endregion CG_FOG0
+
+		#region CG_FOG1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG1 = 2918
+		public const int CG_FOG1 = 2918;
+		#endregion CG_FOG1
+
+		#region CG_FOG2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG2 = 2919
+		public const int CG_FOG2 = 2919;
+		#endregion CG_FOG2
+
+		#region CG_FOG3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG3 = 2920
+		public const int CG_FOG3 = 2920;
+		#endregion CG_FOG3
+
+		#region CG_FOG4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG4 = 2921
+		public const int CG_FOG4 = 2921;
+		#endregion CG_FOG4
+
+		#region CG_FOG5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG5 = 2922
+		public const int CG_FOG5 = 2922;
+		#endregion CG_FOG5
+
+		#region CG_FOG6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG6 = 2923
+		public const int CG_FOG6 = 2923;
+		#endregion CG_FOG6
+
+		#region CG_FOG7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG7 = 2924
+		public const int CG_FOG7 = 2924;
+		#endregion CG_FOG7
+
+		#region CG_FOG8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG8 = 2925
+		public const int CG_FOG8 = 2925;
+		#endregion CG_FOG8
+
+		#region CG_FOG9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG9 = 2926
+		public const int CG_FOG9 = 2926;
+		#endregion CG_FOG9
+
+		#region CG_FOG10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG10 = 2927
+		public const int CG_FOG10 = 2927;
+		#endregion CG_FOG10
+
+		#region CG_FOG11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG11 = 2928
+		public const int CG_FOG11 = 2928;
+		#endregion CG_FOG1
+
+		#region CG_FOG12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG12 = 2929
+		public const int CG_FOG12 = 2929;
+		#endregion CG_FOG1
+
+		#region CG_FOG13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG13 = 2930
+		public const int CG_FOG13 = 2930;
+		#endregion CG_FOG13
+
+		#region CG_FOG14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG14 = 2931
+		public const int CG_FOG14 = 2931;
+		#endregion CG_FOG14
+
+		#region CG_FOG15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOG1 = 2932
+		public const int CG_FOG15 = 2932;
+		#endregion CG_FOG15
+
+		#region CG_DEPTH0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH0 = 2933
+		public const int CG_DEPTH0 = 2933;
+		#endregion CG_DEPTH0
+
+		#region CG_DEPTH1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH1 = 2934
+		public const int CG_DEPTH1 = 2934;
+		#endregion CG_DEPTH1
+
+		#region CG_DEPTH2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH2 = 2935
+		public const int CG_DEPTH2 = 2935;
+		#endregion CG_DEPTH2
+
+		#region CG_DEPTH3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH3 = 2936
+		public const int CG_DEPTH3 = 2936;
+		#endregion CG_DEPTH3
+
+		#region CG_DEPTH4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH4 = 2937
+		public const int CG_DEPTH4 = 2937;
+		#endregion CG_DEPTH4
+
+		#region CG_DEPTH5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH5 = 2938
+		public const int CG_DEPTH5 = 2938;
+		#endregion CG_DEPTH5
+
+		#region CG_DEPTH6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH6 = 2939
+		public const int CG_DEPTH6 = 2939;
+		#endregion CG_DEPTH6
+
+		#region CG_DEPTH7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH7 = 2940
+		public const int CG_DEPTH7 = 2940;
+		#endregion CG_DEPTH7
+
+		#region CG_DEPTH8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH8 = 2941
+		public const int CG_DEPTH8 = 2941;
+		#endregion CG_DEPTH8
+
+		#region CG_DEPTH9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH9 = 29542;
+		// TODO: Watch this value, it looks like an error, but that's how Nvidia defined it.
+		public const int CG_DEPTH9 = 29542;
+		#endregion CG_DEPTH9
+
+		#region CG_DEPTH10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH10 = 2943
+		public const int CG_DEPTH10 = 2943;
+		#endregion CG_DEPTH10
+
+		#region CG_DEPTH11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH11 = 2944
+		public const int CG_DEPTH11 = 2944;
+		#endregion CG_DEPTH11
+
+		#region CG_DEPTH12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH12 = 2945
+		public const int CG_DEPTH12 = 2945;
+		#endregion CG_DEPTH12
+
+		#region CG_DEPTH13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH13 = 2946
+		public const int CG_DEPTH13 = 2946;
+		#endregion CG_DEPTH13
+
+		#region CG_DEPTH14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH14 = 2947
+		public const int CG_DEPTH14 = 2947;
+		#endregion CG_DEPTH14
+
+		#region CG_DEPTH15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_DEPTH15 = 2948
+		public const int CG_DEPTH15 = 2948;
+		#endregion CG_DEPTH15
+
+		#region CG_SAMPLE0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE0 = 2949
+		public const int CG_SAMPLE0 = 2949;
+		#endregion CG_SAMPLE0
+
+		#region CG_SAMPLE1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE1 = 2950
+		public const int CG_SAMPLE1 = 2950;
+		#endregion CG_SAMPLE1
+
+		#region CG_SAMPLE2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE2 = 2951
+		public const int CG_SAMPLE2 = 2951;
+		#endregion CG_SAMPLE2
+
+		#region CG_SAMPLE3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE3 = 2952
+		public const int CG_SAMPLE3 = 2952;
+		#endregion CG_SAMPLE3
+
+		#region CG_SAMPLE4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE4 = 2953
+		public const int CG_SAMPLE4 = 2953;
+		#endregion CG_SAMPLE4
+
+		#region CG_SAMPLE5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE5 = 2954
+		public const int CG_SAMPLE5 = 2954;
+		#endregion CG_SAMPLE5
+
+		#region CG_SAMPLE6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE6 = 2955
+		public const int CG_SAMPLE6 = 2955;
+		#endregion CG_SAMPLE6
+
+		#region CG_SAMPLE7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE7 = 2956
+		public const int CG_SAMPLE7 = 2956;
+		#endregion CG_SAMPLE7
+
+		#region CG_SAMPLE8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE8 = 2957
+		public const int CG_SAMPLE8 = 2957;
+		#endregion CG_SAMPLE8
+
+		#region CG_SAMPLE9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE9 = 2958
+		public const int CG_SAMPLE9 = 2958;
+		#endregion CG_SAMPLE9
+
+		#region CG_SAMPLE10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE10 = 2959
+		public const int CG_SAMPLE10 = 2959;
+		#endregion CG_SAMPLE10
+
+		#region CG_SAMPLE11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE11 = 2960
+		public const int CG_SAMPLE11 = 2960;
+		#endregion CG_SAMPLE11
+
+		#region CG_SAMPLE12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE12 = 2961
+		public const int CG_SAMPLE12 = 2961;
+		#endregion CG_SAMPLE12
+
+		#region CG_SAMPLE13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE13 = 2962
+		public const int CG_SAMPLE13 = 2962;
+		#endregion CG_SAMPLE13
+
+		#region CG_SAMPLE14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE14 = 2963
+		public const int CG_SAMPLE14 = 2963;
+		#endregion CG_SAMPLE14
+
+		#region CG_SAMPLE15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_SAMPLE15 = 2964
+		public const int CG_SAMPLE15 = 2964;
+		#endregion CG_SAMPLE15
+
+		#region CG_BLENDWEIGHT0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT0 = 3028
+		public const int CG_BLENDWEIGHT0 = 3028;
+		#endregion CG_BLENDWEIGHT0
+
+		#region CG_BLENDWEIGHT1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT1 = 3029
+		public const int CG_BLENDWEIGHT1 = 3029;
+		#endregion CG_BLENDWEIGHT1
+
+		#region CG_BLENDWEIGHT2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT2 = 3030
+		public const int CG_BLENDWEIGHT2 = 3030;
+		#endregion CG_BLENDWEIGHT2
+
+		#region CG_BLENDWEIGHT3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT3 = 3031
+		public const int CG_BLENDWEIGHT3 = 3031;
+		#endregion CG_BLENDWEIGHT3
+
+		#region CG_BLENDWEIGHT4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT4 = 3032
+		public const int CG_BLENDWEIGHT4 = 3032;
+		#endregion CG_BLENDWEIGHT4
+
+		#region CG_BLENDWEIGHT5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT5 = 3033
+		public const int CG_BLENDWEIGHT5 = 3033;
+		#endregion CG_BLENDWEIGHT5
+
+		#region CG_BLENDWEIGHT6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT6 = 3034
+		public const int CG_BLENDWEIGHT6 = 3034;
+		#endregion CG_BLENDWEIGHT6
+
+		#region CG_BLENDWEIGHT7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT7 = 3035
+		public const int CG_BLENDWEIGHT7 = 3035;
+		#endregion CG_BLENDWEIGHT7
+
+		#region CG_BLENDWEIGHT8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT8 = 3036
+		public const int CG_BLENDWEIGHT8 = 3036;
+		#endregion CG_BLENDWEIGHT8
+
+		#region CG_BLENDWEIGHT9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT9 = 3037
+		public const int CG_BLENDWEIGHT9 = 3037;
+		#endregion CG_BLENDWEIGHT9
+
+		#region CG_BLENDWEIGHT10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT10 = 3038
+		public const int CG_BLENDWEIGHT10 = 3038;
+		#endregion CG_BLENDWEIGHT10
+
+		#region CG_BLENDWEIGHT11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT11 = 3039
+		public const int CG_BLENDWEIGHT11 = 3039;
+		#endregion CG_BLENDWEIGHT11
+
+		#region CG_BLENDWEIGHT12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT12 = 3040
+		public const int CG_BLENDWEIGHT12 = 3040;
+		#endregion CG_BLENDWEIGHT12
+
+		#region CG_BLENDWEIGHT13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT13 = 3041
+		public const int CG_BLENDWEIGHT13 = 3041;
+		#endregion CG_BLENDWEIGHT13
+
+		#region CG_BLENDWEIGHT14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT14 = 3042
+		public const int CG_BLENDWEIGHT14 = 3042;
+		#endregion CG_BLENDWEIGHT14
+
+		#region CG_BLENDWEIGHT15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_BLENDWEIGHT15 = 3043
+		public const int CG_BLENDWEIGHT15 = 3043;
+		#endregion CG_BLENDWEIGHT15
+
+		#region CG_NORMAL0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL0 = 3092
+		public const int CG_NORMAL0 = 3092;
+		#endregion CG_NORMAL0
+
+		#region CG_NORMAL1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL1 = 3093
+		public const int CG_NORMAL1 = 3093;
+		#endregion CG_NORMAL1
+
+		#region CG_NORMAL2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL2 = 3094
+		public const int CG_NORMAL2 = 3094;
+		#endregion CG_NORMAL2
+
+		#region CG_NORMAL3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL3 = 3095
+		public const int CG_NORMAL3 = 3095;
+		#endregion CG_NORMAL3
+
+		#region CG_NORMAL4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL4 = 3096
+		public const int CG_NORMAL4 = 3096;
+		#endregion CG_NORMAL4
+
+		#region CG_NORMAL5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL5 = 3097
+		public const int CG_NORMAL5 = 3097;
+		#endregion CG_NORMAL5
+
+		#region CG_NORMAL6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL6 = 3098
+		public const int CG_NORMAL6 = 3098;
+		#endregion CG_NORMAL6
+
+		#region CG_NORMAL7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL7 = 3099
+		public const int CG_NORMAL7 = 3099;
+		#endregion CG_NORMAL7
+
+		#region CG_NORMAL8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL8 = 3100
+		public const int CG_NORMAL8 = 3100;
+		#endregion CG_NORMAL8
+
+		#region CG_NORMAL9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL9 = 3101
+		public const int CG_NORMAL9 = 3101;
+		#endregion CG_NORMAL9
+
+		#region CG_NORMAL10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL10 = 3102
+		public const int CG_NORMAL10 = 3102;
+		#endregion CG_NORMAL10
+
+		#region CG_NORMAL11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL11 = 3103
+		public const int CG_NORMAL11 = 3103;
+		#endregion CG_NORMAL11
+
+		#region CG_NORMAL12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL12 = 3104
+		public const int CG_NORMAL12 = 3104;
+		#endregion CG_NORMAL12
+
+		#region CG_NORMAL13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL13 = 3105
+		public const int CG_NORMAL13 = 3105;
+		#endregion CG_NORMAL13
+
+		#region CG_NORMAL14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL14 = 3106
+		public const int CG_NORMAL14 = 3106;
+		#endregion CG_NORMAL14
+
+		#region CG_NORMAL15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_NORMAL15 = 3107
+		public const int CG_NORMAL15 = 3107;
+		#endregion CG_NORMAL15
+
+		#region CG_FOGCOORD
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_FOGCOORD = 3156
+		public const int CG_FOGCOORD = 3156;
+		#endregion CG_FOGCOORD
+
+		#region CG_TEXCOORD0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD0 = 3220
+		public const int CG_TEXCOORD0 = 3220;
+		#endregion CG_TEXCOORD0
+
+		#region CG_TEXCOORD1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD1 = 3221
+		public const int CG_TEXCOORD1 = 3221;
+		#endregion CG_TEXCOORD1
+
+		#region CG_TEXCOORD2
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD2 = 3222
+		public const int CG_TEXCOORD2 = 3222;
+		#endregion CG_TEXCOORD2
+
+		#region CG_TEXCOORD3
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD3 = 3223
+		public const int CG_TEXCOORD3 = 3223;
+		#endregion CG_TEXCOORD3
+
+		#region CG_TEXCOORD4
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD4 = 3224
+		public const int CG_TEXCOORD4 = 3224;
+		#endregion CG_TEXCOORD4
+
+		#region CG_TEXCOORD5
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD5 = 3225
+		public const int CG_TEXCOORD5 = 3225;
+		#endregion CG_TEXCOORD5
+
+		#region CG_TEXCOORD6
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD6 = 3226
+		public const int CG_TEXCOORD6 = 3226;
+		#endregion CG_TEXCOORD6
+
+		#region CG_TEXCOORD7
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD7 = 3227
+		public const int CG_TEXCOORD7 = 3227;
+		#endregion CG_TEXCOORD7
+
+		#region CG_TEXCOORD8
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD8 = 3228
+		public const int CG_TEXCOORD8 = 3228;
+		#endregion CG_TEXCOORD8
+
+		#region CG_TEXCOORD9
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD9 = 3229
+		public const int CG_TEXCOORD9 = 3229;
+		#endregion CG_TEXCOORD9
+
+		#region CG_TEXCOORD10
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD10 = 3230
+		public const int CG_TEXCOORD10 = 3230;
+		#endregion CG_TEXCOORD10
+
+		#region CG_TEXCOORD11
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD11 = 3231
+		public const int CG_TEXCOORD11 = 3231;
+		#endregion CG_TEXCOORD11
+
+		#region CG_TEXCOORD12
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD12 = 3232
+		public const int CG_TEXCOORD12 = 3232;
+		#endregion CG_TEXCOORD12
+
+		#region CG_TEXCOORD13
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD13 = 3233
+		public const int CG_TEXCOORD13 = 3233;
+		#endregion CG_TEXCOORD13
+
+		#region CG_TEXCOORD14
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD14 = 3234
+		public const int CG_TEXCOORD14 = 3234;
+		#endregion CG_TEXCOORD14
+
+		#region CG_TEXCOORD15
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXCOORD15 = 3235
+		public const int CG_TEXCOORD15 = 3235;
+		#endregion CG_TEXCOORD15
+
+		#region CG_TESSFACTOR
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TESSFACTOR = 3255
+		public const int CG_TESSFACTOR = 3255;
+		#endregion CG_TESSFACTOR
+
+		#region CG_COMBINER_CONST0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COMBINER_CONST0 = 3284
+		public const int CG_COMBINER_CONST0 = 3284;
+		#endregion CG_COMBINER_CONST0
+
+		#region CG_COMBINER_CONST1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COMBINER_CONST1 = 3285
+		public const int CG_COMBINER_CONST1 = 3285;
+		#endregion CG_COMBINER_CONST1
+
+		#region CG_COMBINER_STAGE_CONST0
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COMBINER_STAGE_CONST0 = 3286
+		public const int CG_COMBINER_STAGE_CONST0 = 3286;
+		#endregion CG_COMBINER_STAGE_CONST0
+
+		#region CG_COMBINER_STAGE_CONST1
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COMBINER_STAGE_CONST1 = 3287
+		public const int CG_COMBINER_STAGE_CONST1 = 3287;
+		#endregion CG_COMBINER_STAGE_CONST1
+
+		#region CG_OFFSET_TEXTURE_MATRIX
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_OFFSET_TEXTURE_MATRIX = 3288
+		public const int CG_OFFSET_TEXTURE_MATRIX = 3288;
+		#endregion CG_OFFSET_TEXTURE_MATRIX
+
+		#region CG_OFFSET_TEXTURE_SCALE
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_OFFSET_TEXTURE_SCALE = 3289
+		public const int CG_OFFSET_TEXTURE_SCALE = 3289;
+		#endregion CG_OFFSET_TEXTURE_SCALE
+
+		#region CG_OFFSET_TEXTURE_BIAS
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_OFFSET_TEXTURE_BIAS = 3290
+		public const int CG_OFFSET_TEXTURE_BIAS = 3290;
+		#endregion CG_OFFSET_TEXTURE_BIAS
+
+		#region CG_CONST_EYE
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_CONST_EYE = 3291
+		public const int CG_CONST_EYE = 3291;
+		#endregion CG_CONST_EYE
+		#endregion BindLocations
+	
+		#region cg.h
+		#region CG_VERSION_NUM
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_VERSION_NUM = 1400
+		public const int CG_VERSION_NUM = 1400;
+		#endregion CG_VERSION_NUM
+        
+		#region CG_FALSE
+		/// <summary>
+		///     False.
+		/// </summary>
+		// #define CG_FALSE ((CGbool)0)
+		public const int CG_FALSE = 0;
+		#endregion CG_FALSE
+
+		#region CG_TRUE
+		/// <summary>
+		///     True.
+		/// </summary>
+		// #define CG_TRUE ((CGbool)1)
+		public const int CG_TRUE = 1;
+		#endregion CG_TRUE
+
+		#region CG_UNKNOWN_TYPE
+		/// <summary>
+		///     An unknown data type.
+		/// </summary>
+		// CG_UNKNOWN_TYPE = 0
+		public const int CG_UNKNOWN_TYPE = 0;
+		#endregion CG_UNKNOWN_TYPE
+
+		#region CG_STRUCT
+		/// <summary>
+		///     A collection of one or more members of possibly different types.
+		/// </summary>
+		// CG_STRUCT = 1
+		public const int CG_STRUCT = 1;
+		#endregion CG_STRUCT
+
+		#region CG_ARRAY
+		/// <summary>
+		///     A collection of one or more elements of the same type.
+		/// </summary>
+		// CG_ARRAY = 2
+		public const int CG_ARRAY = 2;
+		#endregion CG_ARRAY
+
+		#region CG_TYPE_START_ENUM
+		/// <summary>
+		///     Start of the Cg data type definitions.
+		/// </summary>
+		// CG_TYPE_START_ENUM = 1024
+		public const int CG_TYPE_START_ENUM = 1024;
+		#endregion CG_TYPE_START_ENUM
+
+		#region CG_UNDEFINED
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_UNDEFINED = 0
+		public const int CG_UNDEFINED = 0;
+		#endregion CG_UNDEFINED
+
+		#region CG_PROFILE_START
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PROFILE_START = 6144
+		public const int CG_PROFILE_START = 6144;
+		#endregion CG_PROFILE_START
+
+		#region CG_PROFILE_UNKNOWN
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PROFILE_UNKNOWN = 6145
+		public const int CG_PROFILE_UNKNOWN = 6145;
+		#endregion CG_PROFILE_UNKNOWN
+
+		#region CG_PROFILE_MAX
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PROFILE_MAX = 7100
+		public const int CG_PROFILE_MAX = 7100;
+		#endregion CG_PROFILE_MAX
+
+		#region CG_PARAMETERCLASS_UNKNOWN
+		/// <summary>
+		///     
+		/// </summary>
+		public const int CG_PARAMETERCLASS_UNKNOWN = 0;
+		#endregion CG_PARAMETERCLASS_UNKNOWN
+
+		#region CG_PARAMETERCLASS_SCALAR
+		/// <summary>
+		///     
+		/// </summary>
+		public const int CG_PARAMETERCLASS_SCALAR = 1;
+		#endregion CG_PARAMETERCLASS_SCALAR
+
+		#region CG_PARAMETERCLASS_VECTOR
+		/// <summary>
+		///     
+		/// </summary>
+		public const int CG_PARAMETERCLASS_VECTOR = 2;
+		#endregion CG_PARAMETERCLASS_VECTOR
+
+		#region CG_PARAMETERCLASS_MATRIX
+		/// <summary>
+		///     
+		/// </summary>
+		public const int CG_PARAMETERCLASS_MATRIX = 3;
+		#endregion CG_PARAMETERCLASS_MATRIX
+
+		#region CG_PARAMETERCLASS_STRUCT
+		/// <summary>
+		///     
+		/// </summary>
+		public const int CG_PARAMETERCLASS_STRUCT = 4;
+		#endregion CG_PARAMETERCLASS_STRUCT
+
+		#region CG_PARAMETERCLASS_ARRAY
+		/// <summary>
+		///     
+		/// </summary>
+		public const int CG_PARAMETERCLASS_ARRAY = 5;
+		#endregion CG_PARAMETERCLASS_ARRAY
+
+		#region CG_PARAMETERCLASS_SAMPLER
+		/// <summary>
+		///     
+		/// </summary>
+		public const int CG_PARAMETERCLASS_SAMPLER = 6;
+		#endregion CG_PARAMETERCLASS_SAMPLER
+
+		#region CG_PARAMETERCLASS_OBJECT
+		/// <summary>
+		///     
+		/// </summary>
+		public const int CG_PARAMETERCLASS_OBJECT = 7;
+		#endregion CG_PARAMETERCLASS_OBJECT
+		#endregion cg.h
+
+		#region Data Types
+		#region CG_HALF
+		/// <summary>
+		///     The half type is lower-precision IEEE-like floating point.  Profiles must
+		///     support the half type, but may choose to implement it with the same precision
+		///     as the float type.
+		/// </summary>
+		// CG_HALF = 1025
+		public const int CG_HALF = 1025;
+		#endregion CG_HALF
+
+		#region CG_HALF2
+		/// <summary>
+		///     Two-element, packed, half array (vector type).
+		/// </summary>
+		// CG_HALF2 = 1026
+		public const int CG_HALF2 = 1026;
+		#endregion CG_HALF2
+
+		#region CG_HALF3
+		/// <summary>
+		///     Three-element, packed, half array (vector type).
+		/// </summary>
+		// CG_HALF3 = 1027
+		public const int CG_HALF3 = 1027;
+		#endregion CG_HALF3
+
+		#region CG_HALF4
+		/// <summary>
+		///     Four-element, packed, half array (vector type).
+		/// </summary>
+		// CG_HALF4 = 1028
+		public const int CG_HALF4 = 1028;
+		#endregion CG_HALF4
+
+		#region CG_HALF1x1
+		/// <summary>
+		///     1x1, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF1x1 = 1029
+		public const int CG_HALF1x1 = 1029;
+		#endregion CG_HALF1x1
+
+		#region CG_HALF1x2
+		/// <summary>
+		///     1x2, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF1x2 = 1030
+		public const int CG_HALF1x2 = 1030;
+		#endregion CG_HALF1x2
+
+		#region CG_HALF1x3
+		/// <summary>
+		///     1x3, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF1x3 = 1031
+		public const int CG_HALF1x3 = 1031;
+		#endregion CG_HALF1x3
+
+		#region CG_HALF1x4
+		/// <summary>
+		///     1x4, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF1x4 = 1032
+		public const int CG_HALF1x4 = 1032;
+		#endregion CG_HALF1x4
+
+		#region CG_HALF2x1
+		/// <summary>
+		///     2x1, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF2x1 = 1033
+		public const int CG_HALF2x1 = 1033;
+		#endregion CG_HALF2x1
+
+		#region CG_HALF2x2
+		/// <summary>
+		///     2x2, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF2x2 = 1034
+		public const int CG_HALF2x2 = 1034;
+		#endregion CG_HALF2x2
+
+		#region CG_HALF2x3
+		/// <summary>
+		///     2x3, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF2x3 = 1035
+		public const int CG_HALF2x3 = 1035;
+		#endregion CG_HALF2x3
+
+		#region CG_HALF2x4
+		/// <summary>
+		///     2x4, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF2x4 = 1036
+		public const int CG_HALF2x4 = 1036;
+		#endregion CG_HALF2x4
+
+		#region CG_HALF3x1
+		/// <summary>
+		///     3x1, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF3x1 = 1037
+		public const int CG_HALF3x1 = 1037;
+		#endregion CG_HALF3x1
+
+		#region CG_HALF3x2
+		/// <summary>
+		///     3x2, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF3x2 = 1038
+		public const int CG_HALF3x2 = 1038;
+		#endregion CG_HALF3x2
+
+		#region CG_HALF3x3
+		/// <summary>
+		///     3x3, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF3x3 = 1039
+		public const int CG_HALF3x3 = 1039;
+		#endregion CG_HALF3x3
+
+		#region CG_HALF3x4
+		/// <summary>
+		///     3x4, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF3x4 = 1040
+		public const int CG_HALF3x4 = 1040;
+		#endregion CG_HALF3x4
+
+		#region CG_HALF4x1
+		/// <summary>
+		///     4x1, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF4x1 = 1041
+		public const int CG_HALF4x1 = 1041;
+		#endregion CG_HALF4x1
+
+		#region CG_HALF4x2
+		/// <summary>
+		///     4x2, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF4x2 = 1042
+		public const int CG_HALF4x2 = 1042;
+		#endregion CG_HALF4x2
+
+		#region CG_HALF4x3
+		/// <summary>
+		///     4x3, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF4x3 = 1043
+		public const int CG_HALF4x3 = 1043;
+		#endregion CG_HALF4x3
+
+		#region CG_HALF4x4
+		/// <summary>
+		///     4x4, packed, half array (matrix type).
+		/// </summary>
+		// CG_HALF4x4 = 1044
+		public const int CG_HALF4x4 = 1044;
+		#endregion CG_HALF4x4
+
+		#region CG_FLOAT
+		/// <summary>
+		///     The float type is as close as possible to the IEEE single precision (32-bit)
+		///     floating point.  Profiles must support the float data type.
+		/// </summary>
+		// CG_FLOAT = 1045
+		public const int CG_FLOAT = 1045;
+		#endregion CG_FLOAT
+
+		#region CG_FLOAT2
+		/// <summary>
+		///     Two-element, packed, float array (vector type).
+		/// </summary>
+		// CG_FLOAT2 = 1046
+		public const int CG_FLOAT2 = 1046;
+		#endregion CG_FLOAT2
+
+		#region CG_FLOAT3
+		/// <summary>
+		///     Three-element, packed, float array (vector type).
+		/// </summary>
+		// CG_FLOAT3 = 1047
+		public const int CG_FLOAT3 = 1047;
+		#endregion CG_FLOAT3
+
+		#region CG_FLOAT4
+		/// <summary>
+		///     Four-element, packed, float array (vector type).
+		/// </summary>
+		// CG_FLOAT4 = 1048
+		public const int CG_FLOAT4 = 1048;
+		#endregion CG_FLOAT4
+
+		#region CG_FLOAT1x1
+		/// <summary>
+		///     1x1, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT1x1 = 1049
+		public const int CG_FLOAT1x1 = 1049;
+		#endregion CG_FLOAT1x1
+
+		#region CG_FLOAT1x2
+		/// <summary>
+		///     1x2, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT1x2 = 1050
+		public const int CG_FLOAT1x2 = 1050;
+		#endregion CG_FLOAT1x2
+
+		#region CG_FLOAT1x3
+		/// <summary>
+		///     1x3, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT1x3 = 1051
+		public const int CG_FLOAT1x3 = 1051;
+		#endregion CG_FLOAT1x3
+
+		#region CG_FLOAT1x4
+		/// <summary>
+		///     1x4, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT1x4 = 1052
+		public const int CG_FLOAT1x4 = 1052;
+		#endregion CG_FLOAT1x4
+
+		#region CG_FLOAT2x1
+		/// <summary>
+		///     2x1, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT2x1 = 1053
+		public const int CG_FLOAT2x1 = 1053;
+		#endregion CG_FLOAT2x1
+
+		#region CG_FLOAT2x2
+		/// <summary>
+		///     2x2, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT2x2 = 1054
+		public const int CG_FLOAT2x2 = 1054;
+		#endregion CG_FLOAT2x2
+
+		#region CG_FLOAT2x3
+		/// <summary>
+		///     2x3, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT2x3 = 1055
+		public const int CG_FLOAT2x3 = 1055;
+		#endregion CG_FLOAT2x3
+
+		#region CG_FLOAT2x4
+		/// <summary>
+		///     2x4, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT2x4 = 1056
+		public const int CG_FLOAT2x4 = 1056;
+		#endregion CG_FLOAT2x4
+
+		#region CG_FLOAT3x1
+		/// <summary>
+		///     3x1, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT3x1 = 1057
+		public const int CG_FLOAT3x1 = 1057;
+		#endregion CG_FLOAT3x1
+
+		#region CG_FLOAT3x2
+		/// <summary>
+		///     3x2, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT3x2 = 1058
+		public const int CG_FLOAT3x2 = 1058;
+		#endregion CG_FLOAT3x2
+
+		#region CG_FLOAT3x3
+		/// <summary>
+		///     3x3, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT3x3 = 1059
+		public const int CG_FLOAT3x3 = 1059;
+		#endregion CG_FLOAT3x3
+
+		#region CG_FLOAT3x4
+		/// <summary>
+		///     3x4, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT3x4 = 1060
+		public const int CG_FLOAT3x4 = 1060;
+		#endregion CG_FLOAT3x4
+
+		#region CG_FLOAT4x1
+		/// <summary>
+		///     4x1, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT4x1 = 1061
+		public const int CG_FLOAT4x1 = 1061;
+		#endregion CG_FLOAT4x1
+
+		#region CG_FLOAT4x2
+		/// <summary>
+		///     4x2, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT4x2 = 1062
+		public const int CG_FLOAT4x2 = 1062;
+		#endregion CG_FLOAT4x2
+
+		#region CG_FLOAT4x3
+		/// <summary>
+		///     4x3, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT4x3 = 1063
+		public const int CG_FLOAT4x3 = 1063;
+		#endregion CG_FLOAT4x3
+
+		#region CG_FLOAT4x4
+		/// <summary>
+		///     4x4, packed, float array (matrix type).
+		/// </summary>
+		// CG_FLOAT4x4 = 1064
+		public const int CG_FLOAT4x4 = 1064;
+		#endregion CG_FLOAT4x4
+
+		#region CG_SAMPLER1D
+		/// <summary>
+		///     A handle to a 1-dimensional texture object.
+		/// </summary>
+		// CG_SAMPLER1D = 1065
+		public const int CG_SAMPLER1D = 1065;
+		#endregion CG_SAMPLER1D
+
+		#region CG_SAMPLER2D
+		/// <summary>
+		///     A handle to a 2-dimensional texture object.
+		/// </summary>
+		// CG_SAMPLER2D = 1066
+		public const int CG_SAMPLER2D = 1066;
+		#endregion CG_SAMPLER2D
+
+		#region CG_SAMPLER3D
+		/// <summary>
+		///     A handle to a 3-dimensional texture object.
+		/// </summary>
+		// CG_SAMPLER3D = 1067
+		public const int CG_SAMPLER3D = 1067;
+		#endregion CG_SAMPLER3D
+
+		#region CG_SAMPLERRECT
+		/// <summary>
+		///     A handle to a texture object rectangle.
+		/// </summary>
+		// CG_SAMPLERRECT = 1068
+		public const int CG_SAMPLERRECT = 1068;
+		#endregion CG_SAMPLERRECT
+
+		#region CG_SAMPLERCUBE
+		/// <summary>
+		///     A handle to a texture object cube map.
+		/// </summary>
+		// CG_SAMPLERCUBE = 1069
+		public const int CG_SAMPLERCUBE = 1069;
+		#endregion CG_SAMPLERCUBE
+
+		#region CG_FIXED
+		/// <summary>
+		///     The fixed type is a signed type with a range of at least [-2,2) and with at
+		///     least 10 bits of fractional precision.  Overflow operations on the data type
+		///     clamp rather than wrap.  Fragment profiles must support the fixed type, but
+		///     may implement it with the same precision as the half or float types.
+		///     Vertex profiles are required to provide partial support for the fixed type.
+		///     Vertex profiles have the option to provide full support for the fixed type or
+		///     to implement the fixed type with the same precision as the half or float types.
+		/// </summary>
+		// CG_FIXED = 1070
+		public const int CG_FIXED = 1070;
+		#endregion CG_FIXED
+
+		#region CG_FIXED2
+		/// <summary>
+		///     Two-element, packed, fixed array (vector type).
+		/// </summary>
+		// CG_FIXED2 = 1071
+		public const int CG_FIXED2 = 1071;
+		#endregion CG_FIXED2
+
+		#region CG_FIXED3
+		/// <summary>
+		///     Three-element, packed, fixed array (vector type).
+		/// </summary>
+		// CG_FIXED3 = 1072
+		public const int CG_FIXED3 = 1072;
+		#endregion CG_FIXED3
+
+		#region CG_FIXED4
+		/// <summary>
+		///     Four-element, packed, fixed array (vector type).
+		/// </summary>
+		// CG_FIXED4 = 1073
+		public const int CG_FIXED4 = 1073;
+		#endregion CG_FIXED4
+
+		#region CG_FIXED1x1
+		/// <summary>
+		///     1x1, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED1x1 = 1074
+		public const int CG_FIXED1x1 = 1074;
+		#endregion CG_FIXED1x1
+
+		#region CG_FIXED1x2
+		/// <summary>
+		///     1x2, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED1x2 = 1075
+		public const int CG_FIXED1x2 = 1075;
+		#endregion CG_FIXED1x2
+
+		#region CG_FIXED1x3
+		/// <summary>
+		///     1x3, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED1x3 = 1076
+		public const int CG_FIXED1x3 = 1076;
+		#endregion CG_FIXED1x3
+
+		#region CG_FIXED1x4
+		/// <summary>
+		///     1x4, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED1x4 = 1077
+		public const int CG_FIXED1x4 = 1077;
+		#endregion CG_FIXED1x4
+
+		#region CG_FIXED2x1
+		/// <summary>
+		///     2x1, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED2x1 = 1078
+		public const int CG_FIXED2x1 = 1078;
+		#endregion CG_FIXED2x1
+
+		#region CG_FIXED2x2
+		/// <summary>
+		///     2x2, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED2x2 = 1079
+		public const int CG_FIXED2x2 = 1079;
+		#endregion CG_FIXED2x2
+
+		#region CG_FIXED2x3
+		/// <summary>
+		///     2x3, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED2x3 = 1080
+		public const int CG_FIXED2x3 = 1080;
+		#endregion CG_FIXED2x3
+
+		#region CG_FIXED2x4
+		/// <summary>
+		///     2x4, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED2x4 = 1081
+		public const int CG_FIXED2x4 = 1081;
+		#endregion CG_FIXED2x4
+
+		#region CG_FIXED3x1
+		/// <summary>
+		///     3x1, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED3x1 = 1082
+		public const int CG_FIXED3x1 = 1082;
+		#endregion CG_FIXED3x1
+
+		#region CG_FIXED3x2
+		/// <summary>
+		///     3x2, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED3x2 = 1083
+		public const int CG_FIXED3x2 = 1083;
+		#endregion CG_FIXED3x2
+
+		#region CG_FIXED3x3
+		/// <summary>
+		///     3x3, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED3x3 = 1084
+		public const int CG_FIXED3x3 = 1084;
+		#endregion CG_FIXED3x3
+
+		#region CG_FIXED3x4
+		/// <summary>
+		///     3x4, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED3x4 = 1085
+		public const int CG_FIXED3x4 = 1085;
+		#endregion CG_FIXED3x4
+
+		#region CG_FIXED4x1
+		/// <summary>
+		///     4x1, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED4x1 = 1086
+		public const int CG_FIXED4x1 = 1086;
+		#endregion CG_FIXED4x1
+
+		#region CG_FIXED4x2
+		/// <summary>
+		///     4x2, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED4x2 = 1087
+		public const int CG_FIXED4x2 = 1087;
+		#endregion CG_FIXED4x2
+
+		#region CG_FIXED4x3
+		/// <summary>
+		///     4x3, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED4x3 = 1088
+		public const int CG_FIXED4x3 = 1088;
+		#endregion CG_FIXED4x3
+
+		#region CG_FIXED4x4
+		/// <summary>
+		///     4x4, packed, fixed array (matrix type).
+		/// </summary>
+		// CG_FIXED4x4 = 1089
+		public const int CG_FIXED4x4 = 1089;
+		#endregion CG_FIXED4x4
+
+		#region CG_HALF1
+		/// <summary>
+		///     Single-element, packed, half array (vector type).
+		/// </summary>
+		// CG_HALF1 = 1090
+		public const int CG_HALF1 = 1090;
+		#endregion CG_HALF1
+
+		#region CG_FLOAT1
+		/// <summary>
+		///     Single-element, packed, float array (vector type).
+		/// </summary>
+		// CG_FLOAT1 = 1091
+		public const int CG_FLOAT1 = 1091;
+		#endregion CG_FLOAT1
+
+		#region CG_FIXED1
+		/// <summary>
+		///     Single-element, packed, fixed array (vector type).
+		/// </summary>
+		// CG_FIXED1 = 1092
+		public const int CG_FIXED1 = 1092;
+		#endregion CG_FIXED1
+
+		#region CG_INT
+		/// <summary>
+		///     The int type is preferably 32-bit two�s complement.  Profiles may
+		///     optionally treat int as float.
+		/// </summary>
+		// CG_INT = 1093
+		public const int CG_INT = 1093;
+		#endregion CG_INT
+
+		#region CG_INT1
+		/// <summary>
+		///     Single-element, packed, int array (vector type).
+		/// </summary>
+		// CG_INT2 = 1094
+		public const int CG_INT1 = 1094;
+		#endregion CG_INT1
+
+		#region CG_INT2
+		/// <summary>
+		///     Two-element, packed, int array (vector type).
+		/// </summary>
+		// CG_INT2 = 1095
+		public const int CG_INT2 = 1095;
+		#endregion CG_INT2
+
+		#region CG_INT3
+		/// <summary>
+		///     Three-element, packed, int array (vector type).
+		/// </summary>
+		// CG_INT3 = 1096
+		public const int CG_INT3 = 1096;
+		#endregion CG_INT3
+
+		#region CG_INT4
+		/// <summary>
+		///     Four-element, packed, int array (vector type).
+		/// </summary>
+		// CG_INT4 = 1097
+		public const int CG_INT4 = 1097;
+		#endregion CG_INT4
+
+		#region CG_INT1x1
+		/// <summary>
+		///     1x1, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT1x1 = 1098
+		public const int CG_INT1x1 = 1098;
+		#endregion CG_INT1x1
+
+		#region CG_INT1x2
+		/// <summary>
+		///     1x2, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT1x2 = 1099
+		public const int CG_INT1x2 = 1099;
+		#endregion CG_INT1x2
+
+		#region CG_INT1x3
+		/// <summary>
+		///     1x3, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT1x3 = 1100
+		public const int CG_INT1x3 = 1100;
+		#endregion CG_INT1x3
+
+		#region CG_INT1x4
+		/// <summary>
+		///     1x4, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT1x4 = 1101
+		public const int CG_INT1x4 = 1101;
+		#endregion CG_INT1x4
+
+		#region CG_INT2x1
+		/// <summary>
+		///     2x1, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT2x1 = 1102
+		public const int CG_INT2x1 = 1102;
+		#endregion CG_INT2x1
+
+		#region CG_INT2x2
+		/// <summary>
+		///     2x2, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT2x2 = 1103
+		public const int CG_INT2x2 = 1103;
+		#endregion CG_INT2x2
+
+		#region CG_INT2x3
+		/// <summary>
+		///     2x3, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT2x3 = 1104
+		public const int CG_INT2x3 = 1104;
+		#endregion CG_INT2x3
+
+		#region CG_INT2x4
+		/// <summary>
+		///     2x4, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT2x4 = 1105
+		public const int CG_INT2x4 = 1105;
+		#endregion CG_INT2x4
+
+		#region CG_INT3x1
+		/// <summary>
+		///     3x1, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT3x1 = 1106
+		public const int CG_INT3x1 = 1106;
+		#endregion CG_INT3x1
+
+		#region CG_INT3x2
+		/// <summary>
+		///     3x2, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT3x2 = 1107
+		public const int CG_INT3x2 = 1107;
+		#endregion CG_INT3x2
+
+		#region CG_INT3x3
+		/// <summary>
+		///     3x3, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT3x3 = 1108
+		public const int CG_INT3x3 = 1108;
+		#endregion CG_INT3x3
+
+		#region CG_INT3x4
+		/// <summary>
+		///     3x4, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT3x4 = 1109
+		public const int CG_INT3x4 = 1109;
+		#endregion CG_INT3x4
+
+		#region CG_INT4x1
+		/// <summary>
+		///     4x1, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT4x1 = 1110
+		public const int CG_INT4x1 = 1110;
+		#endregion CG_INT4x1
+
+		#region CG_INT4x2
+		/// <summary>
+		///     4x2, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT4x2 = 1111
+		public const int CG_INT4x2 = 1111;
+		#endregion CG_INT4x2
+
+		#region CG_INT4x3
+		/// <summary>
+		///     4x3, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT4x3 = 1112
+		public const int CG_INT4x3 = 1112;
+		#endregion CG_INT4x3
+
+		#region CG_INT4x4
+		/// <summary>
+		///     4x4, packed, int array (matrix type).
+		/// </summary>
+		// CG_INT4x4 = 1113
+		public const int CG_INT4x4 = 1113;
+		#endregion CG_INT4x4
+
+		#region CG_BOOL
+		/// <summary>
+		///     The bool type represents Boolean values.  Objects of bool type are either
+		///     true or false.
+		/// </summary>
+		// CG_BOOL = 1114
+		public const int CG_BOOL = 1114;
+		#endregion CG_BOOL
+
+		#region CG_BOOL1
+		/// <summary>
+		///     Single-element, packed, bool array (vector type).
+		/// </summary>
+		// CG_BOOL2 = 1115
+		public const int CG_BOOL1 = 1115;
+		#endregion CG_BOOL1
+
+		#region CG_BOOL2
+		/// <summary>
+		///     Two-element, packed, bool array (vector type).
+		/// </summary>
+		// CG_BOOL2 = 1116
+		public const int CG_BOOL2 = 1116;
+		#endregion CG_BOOL2
+
+		#region CG_BOOL3
+		/// <summary>
+		///     Three-element, packed, bool array (vector type).
+		/// </summary>
+		// CG_BOOL3 = 1117
+		public const int CG_BOOL3 = 1117;
+		#endregion CG_BOOL3
+
+		#region CG_BOOL4
+		/// <summary>
+		///     Four-element, packed, bool array (vector type).
+		/// </summary>
+		// CG_BOOL4 = 1118
+		public const int CG_BOOL4 = 1118;
+		#endregion CG_BOOL4
+
+		#region CG_BOOL1x1
+		/// <summary>
+		///     1x1, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL1x1 = 1119
+		public const int CG_BOOL1x1 = 1119;
+		#endregion CG_BOOL1x1
+
+		#region CG_BOOL1x2
+		/// <summary>
+		///     1x2, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL1x2 = 1120
+		public const int CG_BOOL1x2 = 1120;
+		#endregion CG_BOOL1x2
+
+		#region CG_BOOL1x3
+		/// <summary>
+		///     1x3, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL1x3 = 1121
+		public const int CG_BOOL1x3 = 1121;
+		#endregion CG_BOOL1x3
+
+		#region CG_BOOL1x4
+		/// <summary>
+		///     1x4, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL1x4 = 1122
+		public const int CG_BOOL1x4 = 1122;
+		#endregion CG_BOOL1x4
+
+		#region CG_BOOL2x1
+		/// <summary>
+		///     2x1, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL2x1 = 1123
+		public const int CG_BOOL2x1 = 1123;
+		#endregion CG_BOOL2x1
+
+		#region CG_BOOL2x2
+		/// <summary>
+		///     2x2, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL2x2 = 1124
+		public const int CG_BOOL2x2 = 1124;
+		#endregion CG_BOOL2x2
+
+		#region CG_BOOL2x3
+		/// <summary>
+		///     2x3, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL2x3 = 1125
+		public const int CG_BOOL2x3 = 1125;
+		#endregion CG_BOOL2x3
+
+		#region CG_BOOL2x4
+		/// <summary>
+		///     2x4, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL2x4 = 1126
+		public const int CG_BOOL2x4 = 1126;
+		#endregion CG_BOOL2x4
+
+		#region CG_BOOL3x1
+		/// <summary>
+		///     3x1, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL3x1 = 1127
+		public const int CG_BOOL3x1 = 1127;
+		#endregion CG_BOOL3x1
+
+		#region CG_BOOL3x2
+		/// <summary>
+		///     3x2, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL3x2 = 1128
+		public const int CG_BOOL3x2 = 1128;
+		#endregion CG_BOOL3x2
+
+		#region CG_BOOL3x3
+		/// <summary>
+		///     3x3, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL3x3 = 1129
+		public const int CG_BOOL3x3 = 1129;
+		#endregion CG_BOOL3x3
+
+		#region CG_BOOL3x4
+		/// <summary>
+		///     3x4, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL3x4 = 1130
+		public const int CG_BOOL3x4 = 1130;
+		#endregion CG_BOOL3x4
+
+		#region CG_BOOL4x1
+		/// <summary>
+		///     4x1, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL4x1 = 1131
+		public const int CG_BOOL4x1 = 1131;
+		#endregion CG_BOOL4x1
+
+		#region CG_BOOL4x2
+		/// <summary>
+		///     4x2, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL4x2 = 1132
+		public const int CG_BOOL4x2 = 1132;
+		#endregion CG_BOOL4x2
+
+		#region CG_BOOL4x3
+		/// <summary>
+		///     4x3, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL4x3 = 1133
+		public const int CG_BOOL4x3 = 1133;
+		#endregion CG_BOOL4x3
+
+		#region CG_BOOL4x4
+		/// <summary>
+		///     4x4, packed, bool array (matrix type).
+		/// </summary>
+		// CG_BOOL4x4 = 1134
+		public const int CG_BOOL4x4 = 1134;
+		#endregion CG_BOOL4x4
+
+		#region CG_STRING
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_STRING = 1135
+		public const int CG_STRING = 1135;
+		#endregion CG_STRING
+
+		#region CG_PROGRAM_TYPE
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_PROGRAM_TYPE = 1136
+		public const int CG_PROGRAM_TYPE = 1136;
+		#endregion CG_PROGRAM_TYPE
+
+		#region CG_TEXTURE
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_TEXTURE = 1137
+		public const int CG_TEXTURE = 1137;
+		#endregion CG_BOOL4x4
+		#endregion Data Types
+
+		#region Enums
+		#region CG_UNKNOWN
+		/// <summary>
+		///     Unknown resource.
+		/// </summary>
+		// CG_UNKNOWN = 4096
+		public const int CG_UNKNOWN = 4096;
+		#endregion CG_UNKNOWN
+
+		#region CG_IN
+		/// <summary>
+		///     Specifies an input parameter.
+		/// </summary>
+		// CG_IN = 4097
+		public const int CG_IN = 4097;
+		#endregion CG_IN
+
+		#region CG_OUT
+		/// <summary>
+		///     Specifies an output parameter.
+		/// </summary>
+		// CG_OUT = 4098
+		public const int CG_OUT = 4098;
+		#endregion CG_OUT
+
+		#region CG_INOUT
+		/// <summary>
+		///     Specifies a parameter that is both input and output.
+		/// </summary>
+		// CG_INOUT = 4099
+		public const int CG_INOUT = 4099;
+		#endregion CG_INOUT
+
+		#region CG_MIXED
+		/// <summary>
+		///     A structure parameter that contains parameters that differ in variability.
+		/// </summary>
+		// CG_MIXED = 4100
+		public const int CG_MIXED = 4100;
+		#endregion CG_MIXED
+
+		#region CG_VARYING
+		/// <summary>
+		///     A varying parameter is one whose value changes with each invocation of the
+		///     program.
+		/// </summary>
+		// CG_VARYING = 4101
+		public const int CG_VARYING = 4101;
+		#endregion CG_VARYING
+
+		#region CG_UNIFORM
+		/// <summary>
+		///     A uniform parameter is one whose value does not chance with each invocation of a
+		///     program, but whose value can change between groups of program invocations.
+		/// </summary>
+		// CG_UNIFORM = 4102
+		public const int CG_UNIFORM = 4102;
+		#endregion CG_UNIFORM
+
+		#region CG_CONSTANT
+		/// <summary>
+		///     A constant parameter never changes for the life of a compiled program.
+		///     Modifying a constant parameter requires program recompilation.
+		/// </summary>
+		// CG_CONSTANT = 4103
+		public const int CG_CONSTANT = 4103;
+		#endregion CG_CONSTANT
+
+		#region CG_PROGRAM_SOURCE
+		/// <summary>
+		///     The original Cg source program.
+		/// </summary>
+		// CG_PROGRAM_SOURCE = 4104
+		public const int CG_PROGRAM_SOURCE = 4104;
+		#endregion CG_PROGRAM_SOURCE
+
+		#region CG_PROGRAM_ENTRY
+		/// <summary>
+		///     The main entry point for the program.
+		/// </summary>
+		// CG_PROGRAM_ENTRY = 4105
+		public const int CG_PROGRAM_ENTRY = 4105;
+		#endregion CG_PROGRAM_ENTRY
+
+		#region CG_COMPILED_PROGRAM
+		/// <summary>
+		///     The string for the compiled program.
+		/// </summary>
+		// CG_COMPILED_PROGRAM = 4106
+		public const int CG_COMPILED_PROGRAM = 4106;
+		#endregion CG_COMPILED_PROGRAM
+
+		#region CG_PROGRAM_PROFILE
+		/// <summary>
+		///     The profile for the program.
+		/// </summary>
+		// CG_PROGRAM_PROFILE = 4107
+		public const int CG_PROGRAM_PROFILE = 4107;
+		#endregion CG_PROGRAM_PROFILE
+
+		#region CG_GLOBAL
+		/// <summary>
+		///     A global.
+		/// </summary>
+		// CG_GLOBAL = 4108
+		public const int CG_GLOBAL = 4108;
+		#endregion CG_GLOBAL
+
+		#region CG_PROGRAM
+		/// <summary>
+		///     The program.
+		/// </summary>
+		// CG_PROGRAM = 4109
+		public const int CG_PROGRAM = 4109;
+		#endregion CG_PROGRAM
+
+		#region CG_DEFAULT
+		/// <summary>
+		///     The default values for a uniform parameter.
+		/// </summary>
+		// CG_DEFAULT = 4110
+		public const int CG_DEFAULT = 4110;
+		#endregion CG_DEFAULT
+
+		#region CG_ERROR
+		/// <summary>
+		///     An error.
+		/// </summary>
+		// CG_ERROR = 4111
+		public const int CG_ERROR = 4111;
+		#endregion CG_ERROR
+
+		#region CG_SOURCE
+		/// <summary>
+		///     A string that contains Cg source code.
+		/// </summary>
+		// CG_SOURCE = 4112
+		public const int CG_SOURCE = 4112;
+		#endregion CG_SOURCE
+
+		#region CG_OBJECT
+		/// <summary>
+		///     A string that contains object code that resulted from the precompilation of some
+		///     Cg source code.
+		/// </summary>
+		// CG_OBJECT = 4113
+		public const int CG_OBJECT = 4113;
+		#endregion CG_OBJECT
+
+		#region CG_COMPILE_MANUAL
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COMPILE_MANUAL = 4114
+		public const int CG_COMPILE_MANUAL = 4114;
+		#endregion CG_COMPILE_MANUAL
+
+		#region CG_COMPILE_IMMEDIATE
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COMPILE_IMMEDIATE = 4115
+		public const int CG_COMPILE_IMMEDIATE = 4115;
+		#endregion CG_COMPILE_IMMEDIATE
+
+		#region CG_COMPILE_LAZY
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COMPILE_LAZY = 4116
+		public const int CG_COMPILE_LAZY = 4116;
+		#endregion CG_COMPILE_LAZY
+
+		#region CG_CURRENT
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_CURRENT = 4117
+		public const int CG_CURRENT = 4117;
+		#endregion CG_CURRENT
+
+		#region CG_LITERAL
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_LITERAL = 4118
+		public const int CG_LITERAL = 4118;
+		#endregion CG_LITERAL
+
+		#region CG_VERSION
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_VERSION = 4119
+		public const int CG_VERSION = 4119;
+		#endregion CG_VERSION
+
+		#region CG_ROW_MAJOR
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_ROW_MAJOR = 4120
+		public const int CG_ROW_MAJOR = 4120;
+		#endregion CG_ROW_MAJOR
+
+		#region CG_COLUMN_MAJOR
+		/// <summary>
+		///     
+		/// </summary>
+		// CG_COLUMN_MAJOR = 4121
+		public const int CG_COLUMN_MAJOR = 4121;
+		#endregion CG_COLUMN_MAJOR
+		#endregion Enums
+
+		#region Errors
+		#region CG_NO_ERROR
+		/// <summary>
+		///     No error has occurred.
+		/// </summary>
+		// CG_NO_ERROR = 0
+		public const int CG_NO_ERROR = 0;
+		#endregion CG_NO_ERROR
+
+		#region CG_COMPILER_ERROR
+		/// <summary>
+		///     The compile returned an error.
+		/// </summary>
+		// CG_COMPILER_ERROR = 1
+		public const int CG_COMPILER_ERROR = 1;
+		#endregion CG_COMPILER_ERROR
+
+		#region CG_INVALID_PARAMETER_ERROR
+		/// <summary>
+		///     The parameter used is invalid.
+		/// </summary>
+		// CG_INVALID_PARAMETER_ERROR = 2
+		public const int CG_INVALID_PARAMETER_ERROR = 2;
+		#endregion CG_INVALID_PARAMETER_ERROR
+
+		#region CG_INVALID_PROFILE_ERROR
+		/// <summary>
+		///     The profile is not supported.
+		/// </summary>
+		// CG_INVALID_PROFILE_ERROR = 3
+		public const int CG_INVALID_PROFILE_ERROR = 3;
+		#endregion CG_INVALID_PROFILE_ERROR
+
+		#region CG_PROGRAM_LOAD_ERROR
+		/// <summary>
+		///     The program could not load.
+		/// </summary>
+		// CG_PROGRAM_LOAD_ERROR = 4
+		public const int CG_PROGRAM_LOAD_ERROR = 4;
+		#endregion CG_PROGRAM_LOAD_ERROR
+
+		#region CG_PROGRAM_BIND_ERROR
+		/// <summary>
+		///     The program could not bind.
+		/// </summary>
+		// CG_PROGRAM_BIND_ERROR = 5
+		public const int CG_PROGRAM_BIND_ERROR = 5;
+		#endregion CG_PROGRAM_BIND_ERROR
+
+		#region CG_PROGRAM_NOT_LOADED_ERROR
+		/// <summary>
+		///     The program must be loaded before this operation may be used.
+		/// </summary>
+		// CG_PROGRAM_NOT_LOADED_ERROR = 6
+		public const int CG_PROGRAM_NOT_LOADED_ERROR = 6;
+		#endregion CG_PROGRAM_NOT_LOADED_ERROR
+
+		#region CG_UNSUPPORTED_GL_EXTENSION_ERROR
+		/// <summary>
+		///     An unsupported GL extension was required to perform this operation.
+		/// </summary>
+		// CG_UNSUPPORTED_GL_EXTENSION_ERROR = 7
+		public const int CG_UNSUPPORTED_GL_EXTENSION_ERROR = 7;
+		#endregion CG_UNSUPPORTED_GL_EXTENSION_ERROR
+
+		#region CG_INVALID_VALUE_TYPE_ERROR
+		/// <summary>
+		///     An unknown value type was assigned to a parameter.
+		/// </summary>
+		// CG_INVALID_VALUE_TYPE_ERROR = 8
+		public const int CG_INVALID_VALUE_TYPE_ERROR = 8;
+		#endregion CG_INVALID_VALUE_TYPE_ERROR
+
+		#region CG_NOT_MATRIX_PARAM_ERROR
+		/// <summary>
+		///     The parameter is not of matrix type.
+		/// </summary>
+		// CG_NOT_MATRIX_PARAM_ERROR = 9
+		public const int CG_NOT_MATRIX_PARAM_ERROR = 9;
+		#endregion CG_NOT_MATRIX_PARAM_ERROR
+
+		#region CG_INVALID_ENUMERANT_ERROR
+		/// <summary>
+		///     The enumerant parameter has an invalid value.
+		/// </summary>
+		// CG_INVALID_ENUMERANT_ERROR = 10
+		public const int CG_INVALID_ENUMERANT_ERROR = 10;
+		#endregion CG_INVALID_ENUMERANT_ERROR
+
+		#region CG_NOT_4x4_MATRIX_ERROR
+		/// <summary>
+		///     The parameter must be a 4x4 matrix type.
+		/// </summary>
+		// CG_NOT_4x4_MATRIX_ERROR = 11
+		public const int CG_NOT_4x4_MATRIX_ERROR = 11;
+		#endregion CG_NOT_4x4_MATRIX_ERROR
+
+		#region CG_FILE_READ_ERROR
+		/// <summary>
+		///     The file could not be read.
+		/// </summary>
+		// CG_FILE_READ_ERROR = 12
+		public const int CG_FILE_READ_ERROR = 12;
+		#endregion CG_FILE_READ_ERROR
+
+		#region CG_FILE_WRITE_ERROR
+		/// <summary>
+		///     The file could not be written.
+		/// </summary>
+		// CG_FILE_WRITE_ERROR = 13
+		public const int CG_FILE_WRITE_ERROR = 13;
+		#endregion CG_FILE_WRITE_ERROR
+
+		#region CG_NVPARSE_ERROR
+		/// <summary>
+		///     nvparse could not successfully parse the output from the Cg compiler backend.
+		/// </summary>
+		// CG_NVPARSE_ERROR = 14
+		public const int CG_NVPARSE_ERROR = 14;
+		#endregion CG_NVPARSE_ERROR
+
+		#region CG_MEMORY_ALLOC_ERROR
+		/// <summary>
+		///     Memory allocation failed.
+		/// </summary>
+		// CG_MEMORY_ALLOC_ERROR = 15
+		public const int CG_MEMORY_ALLOC_ERROR = 15;
+		#endregion CG_MEMORY_ALLOC_ERROR
+
+		#region CG_INVALID_CONTEXT_HANDLE_ERROR
+		/// <summary>
+		///     Invalid context handle.
+		/// </summary>
+		// CG_INVALID_CONTEXT_HANDLE_ERROR = 16
+		public const int CG_INVALID_CONTEXT_HANDLE_ERROR = 16;
+		#endregion CG_INVALID_CONTEXT_HANDLE_ERROR
+
+		#region CG_INVALID_PROGRAM_HANDLE_ERROR
+		/// <summary>
+		///     Invalid program handle.
+		/// </summary>
+		// #region CG_INVALID_PROGRAM_HANDLE_ERROR = 17
+		public const int CG_INVALID_PROGRAM_HANDLE_ERROR = 17;
+		#endregion CG_INVALID_PROGRAM_HANDLE_ERROR
+
+		#region CG_INVALID_PARAM_HANDLE_ERROR
+		/// <summary>
+		///     Invalid parameter handle.
+		/// </summary>
+		// CG_INVALID_PARAM_HANDLE_ERROR = 18
+		public const int CG_INVALID_PARAM_HANDLE_ERROR = 18;
+		#endregion CG_INVALID_PARAM_HANDLE_ERROR
+
+		#region CG_UNKNOWN_PROFILE_ERROR
+		/// <summary>
+		///     The specified profile is unknown.
+		/// </summary>
+		// CG_UNKNOWN_PROFILE_ERROR = 19
+		public const int CG_UNKNOWN_PROFILE_ERROR = 19;
+		#endregion CG_UNKNOWN_PROFILE_ERROR
+
+		#region CG_VAR_ARG_ERROR
+		/// <summary>
+		///     The variable arguments were specified incorrectly.
+		/// </summary>
+		// CG_VAR_ARG_ERROR = 20
+		public const int CG_VAR_ARG_ERROR = 20;
+		#endregion CG_VAR_ARG_ERROR
+
+		#region CG_INVALID_DIMENSION_ERROR
+		/// <summary>
+		///     The dimension value is invalid.
+		/// </summary>
+		// CG_INVALID_DIMENSION_ERROR = 21
+		public const int CG_INVALID_DIMENSION_ERROR = 21;
+		#endregion CG_INVALID_DIMENSION_ERROR
+
+		#region CG_ARRAY_PARAM_ERROR
+		/// <summary>
+		///     The parameter must be an array.
+		/// </summary>
+		// CG_ARRAY_PARAM_ERROR = 22
+		public const int CG_ARRAY_PARAM_ERROR = 22;
+		#endregion CG_ARRAY_PARAM_ERROR
+
+		#region CG_OUT_OF_ARRAY_BOUNDS_ERROR
+		/// <summary>
+		///     Index into the array is out of bounds.
+		/// </summary>
+		// CG_OUT_OF_ARRAY_BOUNDS_ERROR = 23
+		public const int CG_OUT_OF_ARRAY_BOUNDS_ERROR = 23;
+		#endregion CG_OUT_OF_ARRAY_BOUNDS_ERROR
+
+		#region CG_CONFLICTING_TYPES_ERROR
+		/// <summary>
+		///     A type being added to the context conflicts with an existing type.
+		/// </summary>
+		// CG_CONFLICTING_TYPES_ERROR = 23
+		public const int CG_CONFLICTING_TYPES_ERROR = 24;
+		#endregion CG_CONFLICTING_TYPES_ERROR
+
+		#region CG_CONFLICTING_PARAMETER_TYPES_ERROR
+		/// <summary>
+		///     A type being added to the context conflicts with an existing type.
+		/// </summary>
+		// CG_CONFLICTING_PARAMETER_TYPES_ERROR = 25
+		public const int CG_CONFLICTING_PARAMETER_TYPES_ERROR = 25;
+		#endregion CG_CONFLICTING_PARAMETER_TYPES_ERROR
+
+		#region CG_PARAMETER_IS_NOT_SHARED_ERROR
+		/// <summary>
+		///     The parameter must be global.
+		/// </summary>
+		// CG_PARAMETER_IS_NOT_SHARED_ERROR = 26
+		public const int CG_PARAMETER_IS_NOT_SHARED_ERROR = 26;
+		#endregion CG_PARAMETER_IS_NOT_SHARED_ERROR
+
+		#region CG_INVALID_PARAMETER_VARIABILITY_ERROR
+		/// <summary>
+		///     The parameter could not be changed to the given variability.
+		/// </summary>
+		// CG_INVALID_PARAMETER_VARIABILITY_ERROR = 27
+		public const int CG_INVALID_PARAMETER_VARIABILITY_ERROR = 27;
+		#endregion CG_INVALID_PARAMETER_VARIABILITY_ERROR
+
+		#region CG_CANNOT_DESTROY_PARAMETER_ERROR
+		/// <summary>
+		///    Cannot destroy the parameter.  
+		///    It is bound to other parameters or is not a root parameter.
+		/// </summary>
+		// CG_CANNOT_DESTROY_PARAMETER_ERROR = 28
+		public const int CG_CANNOT_DESTROY_PARAMETER_ERROR = 28;
+		#endregion CG_CANNOT_DESTROY_PARAMETER_ERROR
+
+		#region CG_NOT_ROOT_PARAMETER_ERROR
+		/// <summary>
+		///     The parameter is not a root parameter.
+		/// </summary>
+		// CG_NOT_ROOT_PARAMETER_ERROR = 29
+		public const int CG_NOT_ROOT_PARAMETER_ERROR = 29;
+		#endregion CG_NOT_ROOT_PARAMETER_ERROR
+
+		#region CG_PARAMETERS_DO_NOT_MATCH_ERROR
+		/// <summary>
+		///     The two parameters being bound do not match.
+		/// </summary>
+		// CG_PARAMETERS_DO_NOT_MATCH_ERROR = 30
+		public const int CG_PARAMETERS_DO_NOT_MATCH_ERROR = 30;
+		#endregion CG_PARAMETERS_DO_NOT_MATCH_ERROR
+
+		#region CG_IS_NOT_PROGRAM_PARAMETER_ERROR
+		/// <summary>
+		///     The parameter is not a program parameter.
+		/// </summary>
+		// CG_IS_NOT_PROGRAM_PARAMETER_ERROR = 31
+		public const int CG_IS_NOT_PROGRAM_PARAMETER_ERROR = 31;
+		#endregion CG_IS_NOT_PROGRAM_PARAMETER_ERROR
+
+		#region CG_INVALID_PARAMETER_TYPE_ERROR
+		/// <summary>
+		///     The type of the parameter is invalid.
+		/// </summary>
+		// CG_IS_NOT_PROGRAM_PARAMETER_ERROR = 32
+		public const int CG_INVALID_PARAMETER_TYPE_ERROR = 32;
+		#endregion CG_INVALID_PARAMETER_TYPE_ERROR
+
+		#region CG_PARAMETER_IS_NOT_RESIZABLE_ARRAY_ERROR
+		/// <summary>
+		///     The parameter must be a resizable array.
+		/// </summary>
+		// CG_PARAMETER_IS_NOT_RESIZABLE_ARRAY_ERROR = 33
+		public const int CG_PARAMETER_IS_NOT_RESIZABLE_ARRAY_ERROR = 33;
+		#endregion CG_PARAMETER_IS_NOT_RESIZABLE_ARRAY_ERROR
+
+		#region CG_INVALID_SIZE_ERROR
+		/// <summary>
+		///     The size value is invalid.
+		/// </summary>
+		// CG_INVALID_SIZE_ERROR = 34
+		public const int CG_INVALID_SIZE_ERROR = 34;
+		#endregion CG_INVALID_SIZE_ERROR
+
+		#region CG_BIND_CREATES_CYCLE_ERROR
+		/// <summary>
+		///     Cannot bind the given parameters.  Binding will form a cycle.
+		/// </summary>
+		// CG_BIND_CREATES_CYCLE_ERROR = 35
+		public const int CG_BIND_CREATES_CYCLE_ERROR = 35;
+		#endregion CG_BIND_CREATES_CYCLE_ERROR
+
+		#region CG_ARRAY_TYPES_DO_NOT_MATCH_ERROR
+		/// <summary>
+		///     Cannot bind the given parameters.  Array types do not match.
+		/// </summary>
+		// CG_ARRAY_TYPES_DO_NOT_MATCH_ERROR = 36
+		public const int CG_ARRAY_TYPES_DO_NOT_MATCH_ERROR = 36;
+		#endregion CG_ARRAY_TYPES_DO_NOT_MATCH_ERROR
+
+		#region CG_ARRAY_DIMENSIONS_DO_NOT_MATCH_ERROR
+		/// <summary>
+		///     Cannot bind the given parameters. Array dimensions do not match.
+		/// </summary>
+		// CG_ARRAY_DIMENSIONS_DO_NOT_MATCH_ERROR = 37
+		public const int CG_ARRAY_DIMENSIONS_DO_NOT_MATCH_ERROR = 37;
+		#endregion CG_ARRAY_DIMENSIONS_DO_NOT_MATCH_ERROR
+
+		#region CG_ARRAY_HAS_WRONG_DIMENSION_ERROR
+		/// <summary>
+		///     The array is has the wrong dimension.
+		/// </summary>
+		// CG_ARRAY_HAS_WRONG_DIMENSION_ERROR = 38
+		public const int CG_ARRAY_HAS_WRONG_DIMENSION_ERROR = 38;
+		#endregion CG_ARRAY_HAS_WRONG_DIMENSION_ERROR
+
+		#region CG_TYPE_IS_NOT_DEFINED_IN_PROGRAM_ERROR
+		/// <summary>
+		///     Connecting the parameters failed because The type of the 
+		///     source parameter is not defined within the given program 
+		///     or does not match the type with the same name in the program.
+		/// </summary>
+		// CG_TYPE_IS_NOT_DEFINED_IN_PROGRAM_ERROR = 39
+		public const int CG_TYPE_IS_NOT_DEFINED_IN_PROGRAM_ERROR = 39;
+		#endregion CG_TYPE_IS_NOT_DEFINED_IN_PROGRAM_ERROR
+
+		#region CG_INVALID_EFFECT_HANDLE_ERROR
+		/// <summary>
+		///     Invalid effect handle.
+		/// </summary>
+		// CG_INVALID_EFFECT_HANDLE_ERROR = 40
+		public const int CG_INVALID_EFFECT_HANDLE_ERROR = 40;
+		#endregion CG_INVALID_EFFECT_HANDLE_ERROR
+
+		#region CG_INVALID_STATE_HANDLE_ERROR
+		/// <summary>
+		///     Invalid state handle.
+		/// </summary>
+		// CG_INVALID_STATE_HANDLE_ERROR = 41
+		public const int CG_INVALID_STATE_HANDLE_ERROR = 41;
+		#endregion CG_INVALID_STATE_HANDLE_ERROR
+
+		#region CG_INVALID_STATE_ASSIGNMENT_HANDLE_ERROR
+		/// <summary>
+		///     Invalid state assignment handle.
+		/// </summary>
+		// CG_INVALID_STATE_ASSIGNMENT_HANDLE_ERROR = 42
+		public const int CG_INVALID_STATE_ASSIGNMENT_HANDLE_ERROR = 42;
+		#endregion CG_INVALID_STATE_ASSIGNMENT_HANDLE_ERROR
+
+		#region CG_INVALID_PASS_HANDLE_ERROR
+		/// <summary>
+		///     Invalid pass handle.
+		/// </summary>
+		// CG_INVALID_PASS_HANDLE_ERROR = 43
+		public const int CG_INVALID_PASS_HANDLE_ERROR = 43;
+		#endregion CG_INVALID_PASS_HANDLE_ERROR
+
+		#region CG_INVALID_ANNOTATION_HANDLE_ERROR
+		/// <summary>
+		///     Invalid annotation handle.
+		/// </summary>
+		// CG_INVALID_ANNOTATION_HANDLE_ERROR = 44
+		public const int CG_INVALID_ANNOTATION_HANDLE_ERROR = 44;
+		#endregion CG_INVALID_ANNOTATION_HANDLE_ERROR
+
+		#region CG_INVALID_TECHNIQUE_HANDLE_ERROR
+		/// <summary>
+		///     Invalid technique handle.
+		/// </summary>
+		// CG_INVALID_TECHNIQUE_HANDLE_ERROR = 45
+		public const int CG_INVALID_TECHNIQUE_HANDLE_ERROR = 45;
+		#endregion CG_INVALID_TECHNIQUE_HANDLE_ERROR
+
+		#region CG_INVALID_PARAMETER_HANDLE_ERROR
+		/// <summary>
+		///     Invalid parameter handle.
+		/// </summary>
+		// CG_INVALID_PARAMETER_HANDLE_ERROR = 46
+		public const int CG_INVALID_PARAMETER_HANDLE_ERROR = 46;
+		#endregion CG_INVALID_PARAMETER_HANDLE_ERROR
+
+		#region CG_STATE_ASSIGNMENT_TYPE_MISMATCH_ERROR
+		/// <summary>
+		///     Invalid parameter handle.
+		/// </summary>
+		// CG_STATE_ASSIGNMENT_TYPE_MISMATCH_ERROR = 47
+		public const int CG_STATE_ASSIGNMENT_TYPE_MISMATCH_ERROR = 47;
+		#endregion CG_STATE_ASSIGNMENT_TYPE_MISMATCH_ERROR
+
+		#region CG_INVALID_FUNCTION_HANDLE_ERROR
+		/// <summary>
+		///     Invalid function handle.
+		/// </summary>
+		// CG_INVALID_FUNCTION_HANDLE_ERROR = 48
+		public const int CG_INVALID_FUNCTION_HANDLE_ERROR = 48;
+		#endregion CG_INVALID_FUNCTION_HANDLE_ERROR
+
+		#region CG_INVALID_TECHNIQUE_ERROR
+		/// <summary>
+		///     Technique did not pass validation.
+		/// </summary>
+		// CG_INVALID_TECHNIQUE_ERROR = 49
+		public const int CG_INVALID_TECHNIQUE_ERROR = 49;
+		#endregion CG_INVALID_TECHNIQUE_ERROR
+
+		#region CG_INVALID_POINTER_ERROR
+		/// <summary>
+		///    The supplied pointer is NULL.
+		/// </summary>
+		// CG_INVALID_POINTER_ERROR = 50
+		public const int CG_INVALID_POINTER_ERROR = 50;
+		#endregion CG_INVALID_POINTER_ERROR
+
+		#region CG_NOT_ENOUGH_DATA_ERROR
+		/// <summary>
+		///    Not enough data was provided.
+		/// </summary>
+		// CG_NOT_ENOUGH_DATA_ERROR = 51
+		public const int CG_NOT_ENOUGH_DATA_ERROR = 51;
+		#endregion CG_NOT_ENOUGH_DATA_ERROR
+
+		#region CG_NON_NUMERIC_PARAMETER_ERROR
+		/// <summary>
+		///    The parameter is not of a numeric type.
+		/// </summary>
+		// CG_NON_NUMERIC_PARAMETER_ERROR = 52
+		public const int CG_NON_NUMERIC_PARAMETER_ERROR = 52;
+		#endregion CG_NON_NUMERIC_PARAMETER_ERROR
+
+		#region CG_ARRAY_SIZE_MISMATCH_ERROR
+		/// <summary>
+		///    The specified array sizes are not compatible with the given array.
+		/// </summary>
+		// CG_ARRAY_SIZE_MISMATCH_ERROR = 53
+		public const int CG_ARRAY_SIZE_MISMATCH_ERROR = 53;
+		#endregion CG_ARRAY_SIZE_MISMATCH_ERROR
+		#endregion Errors
+
+		#region Profiles
+
+		#region CG_PROFILE_GENERIC
+		/// <summary>
+		///     DirectX 9 vertex shaders.
+		/// </summary>
+		public const int CG_PROFILE_GENERIC = 7002;
+		#endregion CG_PROFILE_GENERIC
+
+		#region OpenGL
+		#region CG_PROFILE_VP20
+		/// <summary>
+		///     OpenGL NV2x vertex programs.
+		/// </summary>
+		public const int CG_PROFILE_VP20 = 6146;
+		#endregion CG_PROFILE_VP20
+
+		#region CG_PROFILE_FP20
+		/// <summary>
+		///     OpenGL NV2x fragment programs.
+		/// </summary>
+		public const int CG_PROFILE_FP20 = 6147;
+		#endregion CG_PROFILE_FP20
+
+		#region CG_PROFILE_VP30
+		/// <summary>
+		///     OpenGL NV30 vertex programs.
+		/// </summary>
+		public const int CG_PROFILE_VP30 = 6148;
+		#endregion CG_PROFILE_VP30
+
+		#region CG_PROFILE_FP30
+		/// <summary>
+		///     OpenGL NV30 fragment programs.
+		/// </summary>
+		public const int CG_PROFILE_FP30 = 6149;
+		#endregion CG_PROFILE_FP30
+
+		#region CG_PROFILE_ARBVP1
+		/// <summary>
+		///     OpenGL ARB vertex programs 1.0.
+		/// </summary>
+		public const int CG_PROFILE_ARBVP1 = 6150;
+		#endregion CG_PROFILE_ARBVP1
+
+		#region CG_PROFILE_ARBFP1
+		/// <summary>
+		///     OpenGL ARB fragment programs 1.0.
+		/// </summary>
+		public const int CG_PROFILE_ARBFP1 = 7000;
+		#endregion CG_PROFILE_ARBFP1
+
+		#region CG_PROFILE_VP40
+		/// <summary>
+		///     OpenGL NV40 vertex programs.
+		/// </summary>
+		public const int CG_PROFILE_VP40 = 7001;
+		#endregion CG_PROFILE_VP40
+		#endregion OpenGL
+
+		#region DirectX8
+		#region CG_PROFILE_VS_1_1
+		/// <summary>
+		///     DirectX 8 vertex shaders.
+		/// </summary>
+		public const int CG_PROFILE_VS_1_1 = 6153;
+		#endregion CG_PROFILE_VS_1_1           
+
+		#region CG_PROFILE_PS_1_1
+		/// <summary>
+		///     DirectX 8 pixel shaders.
+		/// </summary>
+		public const int CG_PROFILE_PS_1_1 = 6159;
+		#endregion CG_PROFILE_PS_1_1    
+
+		#region CG_PROFILE_PS_1_2
+		/// <summary>
+		///     DirectX 8 pixel shaders.
+		/// </summary>
+		public const int CG_PROFILE_PS_1_2 = 6160;
+		#endregion CG_PROFILE_PS_1_2    
+
+		#region CG_PROFILE_PS_1_3
+		/// <summary>
+		///     DirectX 8 pixel shaders.
+		/// </summary>
+		public const int CG_PROFILE_PS_1_3 = 6161;
+		#endregion CG_PROFILE_PS_1_3    
+		#endregion DirectX8
+
+		#region DirectX9
+		#region CG_PROFILE_VS_2_0
+		/// <summary>
+		///     DirectX 9 vertex shaders.
+		/// </summary>
+		public const int CG_PROFILE_VS_2_0 = 6154;
+		#endregion CG_PROFILE_VS_2_0
+
+		#region CG_PROFILE_VS_2_X
+		/// <summary>
+		///     DirectX 9 vertex shaders.
+		/// </summary>
+		public const int CG_PROFILE_VS_2_X = 6155;
+		#endregion CG_PROFILE_VS_2_X
+
+		#region CG_PROFILE_PS_2_0
+		/// <summary>
+		///     DirectX 9 pixel shaders.
+		/// </summary>
+		public const int CG_PROFILE_PS_2_0 = 6162;
+		#endregion CG_PROFILE_PS_2_0
+
+		#region CG_PROFILE_PS_2_X
+		/// <summary>
+		///     DirectX 9 pixel shaders.
+		/// </summary>
+		public const int CG_PROFILE_PS_2_X = 6163;
+		#endregion CG_PROFILE_PS_2_X
+		#endregion DirectX9
+		#endregion Profiles
+		#endregion Public Constants
+
+		// --- Public Externs ---
+		#region Type Functions
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="type"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetTypeString(CGtype type);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetTypeString(int type);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="type_string"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtype cgGetType(const char *type_string);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetType(string type_string);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="handle"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtype cgGetNamedUserType(CGhandle handle, const char *name);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetNamedUserType(IntPtr handle, string name);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="handle"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetNumUserTypes(CGhandle handle);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetNumUserTypes(IntPtr handle);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="handle"></param>
+		/// <param name="index"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtype cgGetUserType(CGhandle handle, int index);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetUserType(IntPtr handle, int index);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="type"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetNumParentTypes(CGtype type);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetNumParentTypes(int type);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="type"></param>
+		/// <param name="index"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtype cgGetParentType(CGtype type, int index);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParentType(int type, int index);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="parent"></param>
+		/// <param name="child"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsParentType(CGtype parent, CGtype child);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsParentType(int parent, int child);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="type"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsInterfaceType(CGtype type);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsInterfaceType(int type);
+		#endregion Type Functions
+
+		#region Context Functions
+		#region IntPtr cgCreateContext()
+		/// <summary>
+		///     Creates a new Cg context to use.
+		/// </summary>
+		/// <returns>
+		///     A handle to the newly created Cg context.
+		/// </returns>
+		// CGDLL_API CGcontext cgCreateContext(void);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateContext();
+		#endregion IntPtr cgCreateContext()
+
+		#region cgDestroyContext(IntPtr context)
+		/// <summary>
+		///     Destroys the specified Cg context.
+		/// </summary>
+		/// <param name="context">
+		///     Handle to the Cg context to destroy.
+		/// </param>
+		// CGDLL_API void cgDestroyContext(CGcontext ctx);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgDestroyContext(IntPtr context);
+		#endregion cgDestroyContext(IntPtr context)
+
+		#region int cgIsContext(IntPtr context)
+		/// <summary>
+		///     Given the specified context handle, returns true if it is a valid Cg context.
+		/// </summary>
+		/// <param name="context">
+		///     Handle of the context to check.
+		/// </param>
+		/// <returns>
+		///     CG_TRUE if valid, CG_FALSE otherwise.
+		/// </returns>
+		// CGDLL_API CGbool cgIsContext(CGcontext ctx);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsContext(IntPtr context);
+		#endregion int cgIsContext(IntPtr context)
+
+		#region string cgGetLastListing(IntPtr context)
+		/// <summary>
+		///     Gets the compiler output from the results of the most recent program compilation for the given Cg context.
+		/// </summary>
+		/// <param name="context">
+		///     Handle to the context to query.
+		/// </param>
+		/// <returns>
+		///     String representing compiler output from last program compiled.
+		/// </returns>
+		public static string cgGetLastListing(IntPtr context) 
+		{
+			return Marshal.PtrToStringAnsi(cgGetLastListingA(context));
+		}
+
+		/// <summary>
+		///     Gets the compiler output from the results of the most recent program compilation for the given Cg context.
+		/// </summary>
+		/// <param name="context">
+		///     Handle to the context to query.
+		/// </param>
+		/// <returns>
+		///     IntPtr that must be converted to a string with Marshal.PtrToStringAnsi.
+		/// </returns>
+		// CGDLL_API const char *cgGetLastListing(CGcontext ctx);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="cgGetLastListing"), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr cgGetLastListingA(IntPtr context);
+		#endregion string cgGetLastListing(IntPtr context)
+
+		#region void cgSetLastListing(IntPtr handle, string listing)
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="handle"></param>
+		/// <param name="listing"></param>
+		// CGDLL_API void cgSetLastListing(CGhandle handle, const char *listing);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetLastListing(IntPtr handle, string listing);
+		#endregion void cgSetLastListing(IntPtr handle, string listing)
+
+		#region void cgSetAutoCompile(IntPtr ctx, int flag)
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="flag"></param>
+		// CGDLL_API void cgSetAutoCompile(CGcontext ctx, CGenum flag);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetAutoCompile(IntPtr ctx, int flag);
+		#endregion void cgSetAutoCompile(IntPtr ctx, int flag)
+
+		#region int cgGetAutoCompile(IntPtr ctx)
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <returns></returns>
+		// CGDLL_API void cgGetAutoCompile(CGcontext ctx);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetAutoCompile(IntPtr ctx);
+		#endregion int cgGetAutoCompile(IntPtr ctx)
+		#endregion Context Functions
+
+		#region Program Functions
+		#region IntPtr cgCopyProgram(IntPtr program)
+		/// <summary>
+		///     Makes a copy of the specified Cg program within the same context.
+		/// </summary>
+		/// <param name="program">
+		///     Handle to the program to copy.
+		/// </param>
+		/// <returns>
+		///     Handle to a new program within the same context.
+		/// </returns>
+		// CGDLL_API CGprogram cgCopyProgram(CGprogram program);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCopyProgram(IntPtr program);
+		#endregion IntPtr cgCopyProgram(IntPtr program)
+
+		#region IntPtr cgCreateProgram(IntPtr context, int type, string source, int profile, string entry, string[] args)
+		/// <summary>
+		///     Compiles and creates a Cg program.
+		/// </summary>
+		/// <param name="context">
+		///     Current Cg context.
+		/// </param>
+		/// <param name="type">
+		///     Type of source to use.
+		/// </param>
+		/// <param name="source">
+		///     Source Cg code.
+		/// </param>
+		/// <param name="profile">
+		///     Profile to use for compiling the program.
+		/// </param>
+		/// <param name="entry">
+		///     Entry point of the specified Cg source.  If null, then 'main' is assumed.
+		/// </param>
+		/// <param name="args">
+		///     Optional args to pass to the compiler.
+		/// </param>
+		/// <returns>
+		///     Handle to the newly created Cg program.
+		/// </returns>
+		// CGDLL_API CGprogram cgCreateProgram(CGcontext ctx, CGenum program_type, const char *program, CGprofile profile, const char *entry, const char **args);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateProgram(IntPtr context, int type, string source, int profile, string entry, string[] args);
+		#endregion IntPtr cgCreateProgram(IntPtr context, int type, string source, int profile, string entry, string[] args)
+
+		#region IntPtr cgCreateProgramFromFile(IntPtr context, int type, string file, int profile, string entry, string[] args)
+		/// <summary>
+		///     Creates a Cg program from the specified file.
+		/// </summary>
+		/// <param name="context">
+		///     Current Cg context.
+		/// </param>
+		/// <param name="type">
+		///     Type of source to use.
+		/// </param>
+		/// <param name="file">
+		///     Name of the file to load and compile.
+		/// </param>
+		/// <param name="profile">
+		///     Profile to use for compiling the program.
+		/// </param>
+		/// <param name="entry">
+		///     Entry point of the specified Cg source.  If null, then 'main' is assumed.
+		/// </param>
+		/// <param name="args">
+		///     Optional args to pass to the compiler.
+		/// </param>
+		/// <returns>
+		///     Handle to the newly created Cg program.
+		/// </returns>
+		// CGDLL_API CGprogram cgCreateProgramFromFile(CGcontext ctx, CGenum program_type, const char *program_file, CGprofile profile, const char *entry, const char **args);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateProgramFromFile(IntPtr context, int type, string file, int profile, string entry, string[] args);
+		#endregion IntPtr cgCreateProgramFromFile(IntPtr context, int type, string file, int profile, string entry, string[] args)
+
+		#region void cgDestroyProgram(IntPtr program)
+		/// <summary>
+		///     Destroys the specified Cg program.
+		/// </summary>
+		/// <param name="program">
+		///     Handle to the program to destroy.
+		/// </param>
+		// CGDLL_API void cgDestroyProgram(CGprogram program);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgDestroyProgram(IntPtr program);
+		#endregion void cgDestroyProgram(IntPtr program)
+
+		#region string cgGetProgramString(IntPtr program, int sourceType)
+		/// <summary>
+		///     Gets the specified source from the program.
+		/// </summary>
+		/// <param name="program">
+		///     Handle to the Cg program.
+		/// </param>
+		/// <param name="sourceType">
+		///     Type of source to pull, whether original or compiled, etc.
+		/// </param>
+		/// <returns>
+		///     String containing the source of the specified type from the program.
+		/// </returns>
+		public static string cgGetProgramString(IntPtr program, int sourceType) 
+		{
+			return Marshal.PtrToStringAnsi(cgGetProgramStringA(program, sourceType));
+		}
+
+		/// <summary>
+		///     Gets the specified source from the program.
+		/// </summary>
+		/// <param name="program">
+		///     Handle to the Cg program.
+		/// </param>
+		/// <param name="sourceType">
+		///     Type of source to pull, whether original or compiled, etc.
+		/// </param>
+		/// <returns>
+		///     IntPtr to the string data.  Must be converted using Marshal.PtrToStringAnsi.
+		/// </returns>
+		// CGDLL_API const char *cgGetProgramString(CGprogram prog, CGenum pname);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="cgGetProgramString", CharSet=CharSet.Auto), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr cgGetProgramStringA(IntPtr program, int sourceType);
+		#endregion string cgGetProgramString(IntPtr program, int sourceType)
+
+		#region IntPtr cgGetFirstProgram(IntPtr context)
+		/// <summary>
+		///     Gets the first program in a context.
+		/// </summary>
+		/// <param name="context">
+		///     The context to retreive first program from.
+		/// </param>
+		/// <returns>
+		///     The program or null if no programs available.
+		/// </returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstProgram(IntPtr context);
+		#endregion IntPtr cgGetFirstProgram(IntPtr context)
+
+		#region IntPtr cgGetNextProgram(IntPtr current)
+		/// <summary>
+		///     Iterate trough programs in a context.
+		/// </summary>
+		/// <param name="current">
+		///     Current program.
+		/// </param>
+		/// <returns>
+		///     Next program in context's internal sequence of programs.
+		/// </returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNextProgram(IntPtr current);
+		#endregion IntPtr cgGetNextProgram(IntPtr current)
+
+		#region IntPtr cgGetProgramContext(IntPtr prog)
+		/// <summary>
+		///     Gets a programs parent context.
+		/// </summary>
+		/// <param name="prog">
+		///     Program to retreive context from.
+		/// </param>
+		/// <returns>
+		///     The context a given program belongs to.
+		/// </returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetProgramContext(IntPtr prog);
+		#endregion IntPtr cgGetProgramContext(IntPtr prog)
+
+		#region bool cgIsProgram(IntPtr prog)
+		/// <summary>
+		///     Determine if a program handle references a Cg program object.
+		/// </summary>
+		/// <param name="prog">
+		///     The program handle.
+		/// </param>
+		/// <returns>
+		///     CG_TRUE if prog references a valid program object.
+		/// </returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern bool cgIsProgram(IntPtr prog);
+		#endregion bool cgIsProgram(IntPtr prog)
+
+		#region void cgCompileProgram(IntPtr prog)
+		/// <summary>
+		///     Compile a program object.
+		/// </summary>
+		/// <param name="prog">
+		///     The program to be compiled or inspected.
+		/// </param>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgCompileProgram(IntPtr prog);
+		#endregion void cgCompileProgram(IntPtr prog)
+
+		#region int cgGetParameterType(IntPtr param)
+		/// <summary>
+		///    Gets the data type of the specified parameter.
+		/// </summary>
+		/// <param name="param">Id of the parameter to query.</param>
+		/// <returns>Enum value representing the parameter's data type.</returns>
+		// CGDLL_API CGtype cgGetParameterType(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterType(IntPtr param);
+		#endregion cgGetParameterType(IntPtr param)
+        
+		#region bool cgIsProgramCompiled(IntPtr prog)
+		/// <summary>
+		///     Determines if a program has been compiled.
+		/// </summary>
+		/// <param name="prog">
+		///     Specifies the program.
+		/// </param>
+		/// <returns>
+		///     CG_TRUE if specified program has been compiled.
+		/// </returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern bool cgIsProgramCompiled(IntPtr prog);
+		#endregion bool cgIsProgramCompiled(IntPtr prog)
+
+		#region int cgGetProgramProfile(IntPtr prog)
+		/// <summary>
+		///     Gets the profile enumeration of the program.
+		/// </summary>
+		/// <param name="prog">
+		///     Specifies the program.
+		/// </param>
+		/// <returns>
+		///     The profile enumeration or CG_PROFILE_UNKNOWN if compilation failed.
+		/// </returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetProgramProfile(IntPtr prog);
+		#endregion int cgGetProgramProfile(IntPtr prog)
+
+        #region IntPtr cgCombinePrograms(int n, IntPtr[] progs)
+        /// <summary>
+        ///     Gets the profile enumeration of the program.
+        /// </summary>
+        /// <param name="progs">
+        ///     Specifies the program.
+        /// </param>
+        /// <param name="n"></param>
+        /// <returns>
+        ///     The profile enumeration or CG_PROFILE_UNKNOWN if compilation failed.
+        /// </returns>
+        [DllImport(CG_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr cgCombinePrograms(int n, IntPtr[] progs);
+        #endregion IntPtr cgCombinePrograms(int n, IntPtr[] progs)
+        #endregion Program Functions
+
+        #region Parameter functions
+        /// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="type"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgCreateParameter(CGcontext ctx, CGtype type);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateParameter(IntPtr ctx, int type);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="type"></param>
+		/// <param name="length"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgCreateParameterArray(CGcontext ctx, CGtype type, int length);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateParameterArray(IntPtr ctx, int type, int length);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="type"></param>
+		/// <param name="dim"></param>
+		/// <param name="lengths"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgCreateParameterMultiDimArray(CGcontext ctx, CGtype type, int dim, const int *lengths);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateParameterMultiDimArray(IntPtr ctx, int type, int dim, out int lengths);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		// CGDLL_API void cgDestroyParameter(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgDestroyParameter(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="from"></param>
+		/// <param name="to"></param>
+		// CGDLL_API void cgConnectParameter(CGparameter from, CGparameter to);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgConnectParameter(IntPtr from, IntPtr to);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		// CGDLL_API void cgDisconnectParameter(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgDisconnectParameter(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetConnectedParameter(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetConnectedParameter(IntPtr param);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetNumConnectedToParameters(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetNumConnectedToParameters(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="index"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetConnectedToParameter(CGparameter param, int index);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetConnectedToParameter(IntPtr param, int index);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="prog"></param>
+		/// <param name="name_space"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetNamedProgramParameter(CGprogram prog,  CGenum name_space,  const char *name);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedProgramParameter(IntPtr prog, int name_space, string name);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetNamedStructParameter(CGparameter param, const char *name);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedStructParameter(IntPtr param, string name);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetFirstDependentParameter(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstDependentParameter(IntPtr param);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtype cgGetArrayType(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetArrayType(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetArrayTotalSize(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetArrayTotalSize(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="size"></param>
+		// CGDLL_API void cgSetArraySize(CGparameter param, int size);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetArraySize(IntPtr param, int size);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="sizes"></param>
+		// CGDLL_API void cgSetMultiDimArraySize(CGparameter param, const int *sizes);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetMultiDimArraySize(IntPtr param, out int sizes);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API CGcontext cgGetParameterContext(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetParameterContext(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtype cgGetParameterBaseType(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterBaseType(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameterclass cgGetParameterClass(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterClass(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetParameterRows(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterRows(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetParameterColumns(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterColumns(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtype cgGetParameterNamedType(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterNamedType(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="handle"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsParameterUsed(CGparameter param, CGhandle handle);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsParameterUsed(IntPtr param, IntPtr handle);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		// CGDLL_API void cgSetParameterValuedr(CGparameter param, int n, const double *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameterValuedr(IntPtr param, int n, double[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		// CGDLL_API void cgSetParameterValuedc(CGparameter param, int n, out double vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameterValuedc(IntPtr param, int n, double[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		// CGDLL_API void cgSetParameterValuefr(CGparameter param, int n, const float *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameterValuefr(IntPtr param, int n, float[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		// CGDLL_API void cgSetParameterValuefc(CGparameter param, int n, const float *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameterValuefc(IntPtr param, int n, float[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		// CGDLL_API void cgSetParameterValueir(CGparameter param, int n, const int *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameterValueir(IntPtr param, int n, int[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		// CGDLL_API void cgSetParameterValueic(CGparameter param, int n, const int *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameterValueic(IntPtr param, int n, int[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetParameterValuedr(CGparameter param, int n, double *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterValuedr(IntPtr param, int n, double[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetParameterValuedc(CGparameter param, int n, double *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterValuedc(IntPtr param, int n, double[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetParameterValuefr(CGparameter param, int n, float *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterValuefr(IntPtr param, int n, float[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetParameterValuefc(CGparameter param, int n, float *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterValuefc(IntPtr param, int n, float[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetParameterValueir(CGparameter param, int n, int *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterValueir(IntPtr param, int n, int[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="n"></param>
+		/// <param name="vals"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetParameterValueic(CGparameter param, int n, int *vals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterValueic(IntPtr param, int n, int[] vals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetStringParameterValue(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetStringParameterValue(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="str"></param>
+		// CGDLL_API void cgSetStringParameterValue(CGparameter param, const char *str);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetStringParameterValue(IntPtr param, string str);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsParameterGlobal(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsParameterGlobal(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetParameterIndex(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterIndex(IntPtr param);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="vary"></param>
+		// CGDLL_API void cgSetParameterVariability(CGparameter param, CGenum vary);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameterVariability(IntPtr param, int vary);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="semantic"></param>
+		// CGDLL_API void cgSetParameterSemantic(CGparameter param, const char *semantic);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameterSemantic(IntPtr param, string semantic);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		// CGDLL_API void cgSetParameter1f(CGparameter param, float x);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter1f(IntPtr param, float x);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		// CGDLL_API void cgSetParameter2f(CGparameter param, float x, float y);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter2f(IntPtr param, float x, float y);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <param name="z"></param>
+		// CGDLL_API void cgSetParameter3f(CGparameter param, float x, float y, float z);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter3f(IntPtr param, float x, float y, float z);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <param name="z"></param>
+		/// <param name="w"></param>
+		// CGDLL_API void cgSetParameter4f(CGparameter param, float x, float y, float z, float w);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter4f(IntPtr param, float x, float y, float z, float w);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		// CGDLL_API void cgSetParameter1d(CGparameter param, double x);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter1d(IntPtr param, double x);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		// CGDLL_API void cgSetParameter2d(CGparameter param, double x, double y);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter2d(IntPtr param, double x, double y);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <param name="z"></param>
+		// CGDLL_API void cgSetParameter3d(CGparameter param, double x, double y, double z);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter3d(IntPtr param, double x, double y, double z);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <param name="z"></param>
+		/// <param name="w"></param>
+		// CGDLL_API void cgSetParameter4d(CGparameter param, double x, double y, double z, double w);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter4d(IntPtr param, double x, double y, double z, double w);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		// CGDLL_API void cgSetParameter1i(CGparameter param, int x);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter1i(IntPtr param, int x);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		// CGDLL_API void cgSetParameter2i(CGparameter param, int x, int y);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter2i(IntPtr param, int x, int y);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <param name="z"></param>
+		// CGDLL_API void cgSetParameter3i(CGparameter param, int x, int y, int z);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter3i(IntPtr param, int x, int y, int z);
+		
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <param name="z"></param>
+		/// <param name="w"></param>
+		// CGDLL_API void cgSetParameter4i(CGparameter param, int x, int y, int z, int w);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter4i(IntPtr param, int x, int y, int z, int w);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter1iv(CGparameter param, const int *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter1iv(IntPtr param, out int v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter2iv(CGparameter param, const int *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter2iv(IntPtr param, out int v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter3iv(CGparameter param, const int *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter3iv(IntPtr param, out int v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter4iv(CGparameter param, const int *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter4iv(IntPtr param, out int v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter1fv(CGparameter param, const float *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter1fv(IntPtr param, out float v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter2fv(CGparameter param, const float *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter2fv(IntPtr param, out float v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter3fv(CGparameter param, const float *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter3fv(IntPtr param, out float v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter4fv(CGparameter param, const float *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter4fv(IntPtr param, out float v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter1dv(CGparameter param, const double *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter1dv(IntPtr param, out double v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter2dv(CGparameter param, const double *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter2dv(IntPtr param, out double v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter3dv(CGparameter param, const double *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter3dv(IntPtr param, out double v);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="v"></param>
+		// CGDLL_API void cgSetParameter4dv(CGparameter param, const double *v);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetParameter4dv(IntPtr param, out double v);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgSetMatrixParameterir(CGparameter param, const int *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetMatrixParameterir(IntPtr param, out int matrix);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgSetMatrixParameterdr(CGparameter param, const double *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetMatrixParameterdr(IntPtr param, out double matrix);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgSetMatrixParameterfr(CGparameter param, const float *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetMatrixParameterfr(IntPtr param, out float matrix);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgSetMatrixParameteric(CGparameter param, const int *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetMatrixParameteric(IntPtr param, out int matrix);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgSetMatrixParameterdc(CGparameter param, const double *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetMatrixParameterdc(IntPtr param, out double matrix);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgSetMatrixParameterfc(CGparameter param, const float *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetMatrixParameterfc(IntPtr param, out float matrix);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgGetMatrixParameterir(CGparameter param, int *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGetMatrixParameterir(IntPtr param, out int matrix);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgGetMatrixParameterdr(CGparameter param, double *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGetMatrixParameterdr(IntPtr param, out double matrix);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgGetMatrixParameterfr(CGparameter param, float *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGetMatrixParameterfr(IntPtr param, out float matrix);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgGetMatrixParameteric(CGparameter param, int *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGetMatrixParameteric(IntPtr param, out int matrix);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgGetMatrixParameterdc(CGparameter param, double *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGetMatrixParameterdc(IntPtr param, out double matrix);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="matrix"></param>
+		// CGDLL_API void cgGetMatrixParameterfc(CGparameter param, float *matrix);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGetMatrixParameterfc(IntPtr param, out float matrix);
+	
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="prog"></param>
+		/// <returns></returns>
+		// CGDLL_API char const * const *cgGetProgramOptions(CGprogram prog);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string[] cgGetProgramOptions(IntPtr prog);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="prog"></param>
+		/// <param name="profile"></param>
+		// CGDLL_API void cgSetProgramProfile(CGprogram prog, CGprofile profile);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetProgramProfile(IntPtr prog, int profile);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="prog"></param>
+		// CGDLL_API void cgSetPassProgramParameters(CGprogram);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetPassProgramParameters(IntPtr prog);
+		#endregion Parameter Functions
+	 	
+		#region CgFX Functions 
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="code"></param>
+		/// <param name="args"></param>
+		/// <returns></returns>
+		// CGDLL_API CGeffect cgCreateEffect(CGcontext, const char *code, const char **args);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateEffect(IntPtr ctx, string code, string[] args);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="filename"></param>
+		/// <param name="args"></param>
+		/// <returns></returns>
+		// CGDLL_API CGeffect cgCreateEffectFromFile(CGcontext, const char *filename, const char **args);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateEffectFromFile(IntPtr ctx, string filename, string[] args);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		// CGDLL_API void cgDestroyEffect(CGeffect);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgDestroyEffect(IntPtr effect);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		/// <returns></returns>
+		// CGDLL_API CGcontext cgGetEffectContext(CGeffect);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetEffectContext(IntPtr effect);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsEffect(CGeffect effect);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsEffect(IntPtr effect);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <returns></returns>
+		// CGDLL_API CGeffect cgGetFirstEffect(CGcontext);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstEffect(IntPtr ctx);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		/// <returns></returns>
+		// CGDLL_API CGeffect cgGetNextEffect(CGeffect);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNextEffect(IntPtr effect);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		/// <param name="profile"></param>
+		/// <param name="entry"></param>
+		/// <param name="args"></param>
+		/// <returns></returns>
+		// CGDLL_API CGprogram cgCreateProgramFromEffect(CGeffect effect, CGprofile profile, const char *entry, const char **args);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateProgramFromEffect(IntPtr effect, int profile, string entry, string[] args);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtechnique cgGetFirstTechnique(CGeffect);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstTechnique(IntPtr effect);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="technique"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtechnique cgGetNextTechnique(CGtechnique);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNextTechnique(IntPtr technique);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtechnique cgGetNamedTechnique(CGeffect, const char *name);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedTechnique(IntPtr effect, string name);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="technique"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetTechniqueName(CGtechnique);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetTechniqueName(IntPtr technique);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="technique"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsTechnique(CGtechnique);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsTechnique(IntPtr technique);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="technique"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgValidateTechnique(CGtechnique);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgValidateTechnique(IntPtr technique);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="technique"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsTechniqueValidated(CGtechnique);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsTechniqueValidated(IntPtr technique);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="technique"></param>
+		/// <returns></returns>
+		// CGDLL_API CGeffect cgGetTechniqueEffect(CGtechnique);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetTechniqueEffect(IntPtr technique);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="technique"></param>
+		/// <returns></returns>
+		// CGDLL_API CGpass cgGetFirstPass(CGtechnique);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstPass(IntPtr technique);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="technique"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGpass cgGetNamedPass(CGtechnique, const char *name);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedPass(IntPtr technique, string name);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="pass"></param>
+		/// <returns></returns>
+		// CGDLL_API CGpass cgGetNextPass(CGpass);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNextPass(IntPtr pass);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="pass"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsPass(CGpass);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsPass(IntPtr pass);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="pass"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetPassName(CGpass); 
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetPassName(IntPtr pass); 
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="pass"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtechnique cgGetPassTechnique(CGpass);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetPassTechnique(IntPtr pass);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="pass"></param>
+		// CGDLL_API void cgSetPassState(CGpass);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetPassState(IntPtr pass);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="pass"></param>
+		// CGDLL_API void cgResetPassState(CGpass);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgResetPassState(IntPtr pass);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="pass"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstateassignment cgGetFirstStateAssignment(CGpass);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstStateAssignment(IntPtr pass);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="pass"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstateassignment cgGetNamedStateAssignment(CGpass, const char *name);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedStateAssignment(IntPtr pass, string name);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstateassignment cgGetNextStateAssignment(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNextStateAssignment(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsStateAssignment(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsStateAssignment(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgCallStateSetCallback(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgCallStateSetCallback(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgCallStateValidateCallback(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgCallStateValidateCallback(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgCallStateResetCallback(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgCallStateResetCallback(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGpass cgGetStateAssignmentPass(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetStateAssignmentPass(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetSamplerStateAssignmentParameter(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetSamplerStateAssignmentParameter(IntPtr stateassignment);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <param name="nVals"></param>
+		/// <returns></returns>
+		// CGDLL_API const float *cgGetFloatStateAssignmentValues(CGstateassignment, int *nVals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern float[] cgGetFloatStateAssignmentValues(IntPtr stateassignment, int[] nVals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <param name="nVals"></param>
+		/// <returns></returns>
+		// CGDLL_API const int *cgGetIntStateAssignmentValues(CGstateassignment, int *nVals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int[] cgGetIntStateAssignmentValues(IntPtr stateassignment, int[] nVals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <param name="nVals"></param>
+		/// <returns></returns>
+		// CGDLL_API const CGbool *cgGetBoolStateAssignmentValues(CGstateassignment, int *nVals);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int[] cgGetBoolStateAssignmentValues(IntPtr stateassignment, int[] nVals);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetStringStateAssignmentValue(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetStringStateAssignmentValue(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGprogram cgGetProgramStateAssignmentValue(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetProgramStateAssignmentValue(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetTextureStateAssignmentValue(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetTextureStateAssignmentValue(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetSamplerStateAssignmentValue(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetSamplerStateAssignmentValue(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetStateAssignmentIndex(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetStateAssignmentIndex(IntPtr stateassignment);
+
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetNumDependentStateAssignmentParameters(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetNumDependentStateAssignmentParameters(IntPtr stateassignment);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <param name="index"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetDependentStateAssignmentParameter(CGstateassignment, int index);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetDependentStateAssignmentParameter(IntPtr stateassignment, int index);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgGetStateAssignmentState(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetStateAssignmentState(IntPtr stateassignment);
+		
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="state"></param>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        // CGDLL_API int cgGetStateEnumerantValue(CGstate, const char*)
+        [DllImport(CG_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int cgGetStateEnumerantValue(IntPtr state, string name);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="stateassignment"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgGetSamplerStateAssignmentState(CGstateassignment);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetSamplerStateAssignmentState(IntPtr stateassignment);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="name"></param>
+		/// <param name="type"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgCreateState(CGcontext, const char *name, CGtype);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateState(IntPtr ctx, string name, int type);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="name"></param>
+		/// <param name="type"></param>
+		/// <param name="nelems"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgCreateArrayState(CGcontext, string name, CGtype, int nelems);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateArrayState(IntPtr ctx, string name, int type, int nelems);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="state"></param>
+		/// <param name="set"></param>
+		/// <param name="reset"></param>
+		/// <param name="validate"></param>
+		// CGDLL_API void cgSetStateCallbacks(CGstate, CGstatecallback set, CGstatecallback reset, CGstatecallback validate);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetStateCallbacks(IntPtr state, CGstatecallbackDelegate set, CGstatecallbackDelegate reset, CGstatecallbackDelegate validate);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="state"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstatecallback cgGetStateSetCallback(CGstate);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern CGstatecallbackDelegate cgGetStateSetCallback(IntPtr state);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="state"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstatecallback cgGetStateResetCallback(CGstate);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern CGstatecallbackDelegate cgGetStateResetCallback(IntPtr state);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="state"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstatecallback cgGetStateValidateCallback(CGstate);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern CGstatecallbackDelegate cgGetStateValidateCallback(IntPtr state);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="state"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtype cgGetStateType(CGstate);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetStateType(IntPtr state);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="state"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetStateName(CGstate);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetStateName(IntPtr state);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgGetNamedState(CGcontext, const char *name);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedState(IntPtr ctx, string name);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgGetFirstState(CGcontext);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstState(IntPtr ctx);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="state"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgGetNextState(CGstate);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNextState(IntPtr state);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="state"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsState(CGstate);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsState(IntPtr state);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="state"></param>
+		/// <param name="name"></param>
+		/// <param name="value"></param>
+		// CGDLL_API void cgAddStateEnumerant(CGstate, string name, int value);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgAddStateEnumerant(IntPtr state, string name, int value);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="name"></param>
+		/// <param name="type"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgCreateSamplerState(CGcontext, string name, CGtype);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateSamplerState(IntPtr ctx, string name, int type);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="name"></param>
+		/// <param name="type"></param>
+		/// <param name="nelems"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgCreateArraySamplerState(CGcontext, const char *name, CGtype, int nelems);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgCreateArraySamplerState(IntPtr ctx, string name, int type, int nelems);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgGetNamedSamplerState(CGcontext, string name);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedSamplerState(IntPtr ctx, string name);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstate cgGetFirstSamplerState(CGcontext);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstSamplerState(IntPtr ctx);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstateassignment cgGetFirstSamplerStateAssignment(CGparameter);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstSamplerStateAssignment(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGstateassignment cgGetNamedSamplerStateAssignment(CGparameter, const char *);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedSamplerStateAssignment(IntPtr param, string name);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		// CGDLL_API void cgSetSamplerState(CGparameter);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetSamplerState(IntPtr param);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetNamedEffectParameter(CGeffect, const char *);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedEffectParameter(IntPtr effect, string name);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetFirstLeafEffectParameter(CGeffect);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstLeafEffectParameter(IntPtr effect);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetFirstEffectParameter(CGeffect);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstEffectParameter(IntPtr effect);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="effect"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetEffectParameterBySemantic(CGeffect, const char *);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetEffectParameterBySemantic(IntPtr effect, string name);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="technique"></param>
+		/// <returns></returns>
+		// CGDLL_API CGannotation cgGetFirstTechniqueAnnotation(CGtechnique);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstTechniqueAnnotation(IntPtr technique);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="pass"></param>
+		/// <returns></returns>
+		// CGDLL_API CGannotation cgGetFirstPassAnnotation(CGpass);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstPassAnnotation(IntPtr pass);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <returns></returns>
+		// CGDLL_API CGannotation cgGetFirstParameterAnnotation(CGparameter);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstParameterAnnotation(IntPtr param);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="prog"></param>
+		/// <returns></returns>
+		// CGDLL_API CGannotation cgGetFirstProgramAnnotation(CGprogram);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstProgramAnnotation(IntPtr prog);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="annotation"></param>
+		/// <returns></returns>
+		// CGDLL_API CGannotation cgGetNextAnnotation(CGannotation);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNextAnnotation(IntPtr annotation);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="technique"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGannotation cgGetNamedTechniqueAnnotation(CGtechnique, const char *);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedTechniqueAnnotation(IntPtr technique, string name);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="pass"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGannotation cgGetNamedPassAnnotation(CGpass, const char *);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedPassAnnotation(IntPtr pass, string name);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="param"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGannotation cgGetNamedParameterAnnotation(CGparameter, const char *);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedParameterAnnotation(IntPtr param, string name);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="prog"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		// CGDLL_API CGannotation cgGetNamedProgramAnnotation(CGprogram, const char *);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedProgramAnnotation(IntPtr prog, string name);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="annotation"></param>
+		/// <returns></returns>
+		// CGDLL_API CGbool cgIsAnnotation(CGannotation);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsAnnotation(IntPtr annotation);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="annotation"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetAnnotationName(CGannotation);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetAnnotationName(IntPtr annotation);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="annotation"></param>
+		/// <returns></returns>
+		// CGDLL_API CGtype cgGetAnnotationType(CGannotation);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetAnnotationType(IntPtr annotation);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="annotation"></param>
+		/// <param name="nvalues"></param>
+		/// <returns></returns>
+		// CGDLL_API const float *cgGetFloatAnnotationValues(CGannotation, int *nvalues);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern float[] cgGetFloatAnnotationValues(IntPtr annotation, out int nvalues);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="annotation"></param>
+		/// <param name="nvalues"></param>
+		/// <returns></returns>
+		// CGDLL_API const int *cgGetIntAnnotationValues(CGannotation, int *nvalues);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int[] cgGetIntAnnotationValues(IntPtr annotation, out int nvalues);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="annotation"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetStringAnnotationValue(CGannotation);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetStringAnnotationValue(IntPtr annotation);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="annotation"></param>
+		/// <param name="nvalues"></param>
+		/// <returns></returns>
+		// CGDLL_API const int *cgGetBooleanAnnotationValues(CGannotation, int *nvalues);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int[] cgGetBooleanAnnotationValues(IntPtr annotation, out int nvalues);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="annotation"></param>
+		/// <returns></returns>
+		// CGDLL_API int cgGetNumDependentAnnotationParameters(CGannotation);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetNumDependentAnnotationParameters(IntPtr annotation);
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="annotation"></param>
+		/// <param name="index"></param>
+		/// <returns></returns>
+		// CGDLL_API CGparameter cgGetDependentAnnotationParameter(CGannotation, int index);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetDependentAnnotationParameter(IntPtr annotation, int index);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="prog"></param>
+		/// <param name="f"></param>
+		/// <param name="ncomps"></param>
+		/// <param name="nx"></param>
+		/// <param name="ny"></param>
+		/// <param name="nz"></param>
+		// CGDLL_API void cgEvaluateProgram(CGprogram, float *, int ncomps, int nx, int ny, int nz);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgEvaluateProgram(IntPtr prog, float[] f , int ncomps, int nx, int ny, int nz);
+		#endregion CgFX Functions 
+
+		#region Profile Functions
+		#region int cgGetProfile(string profile)
+		/// <summary>
+		///     Returns a profile enum value based on the string representation of the profile.
+		/// </summary>
+		/// <param name="profile">
+		///     Name of the profile, i.e. arbvp1, vs_1_1, etc.
+		/// </param>
+		/// <returns>
+		///     Enum value containing the integral representation of the profile.
+		/// </returns>
+		// CGDLL_API CGprofile cgGetProfile(const char *profile_string);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetProfile(string profile);
+		#endregion int cgGetProfile(string profile)
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="profile"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetProfileString(CGprofile profile);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetProfileString(int profile);
+		#endregion Profile Functions
+
+		#region Parameter Functions
+		#region IntPtr cgGetNamedParameter(IntPtr program, string parameter)
+		/// <summary>
+		/// Gets the named parameter from the program.
+		/// </summary>
+		/// <param name="program">
+		/// The program to get parameter from.
+		/// </param>
+		/// <param name="parameter">
+		/// The name of the parameter to return.
+		/// </param>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNamedParameter(IntPtr program, string parameter);
+		#endregion IntPtr cgGetNamedParameter(IntPtr program, string parameter)
+
+		#region IntPtr cgGetFirstLeafParameter(IntPtr program, int nameSpace)
+		/// <summary>
+		///    Used to get the first leaf parameter from the specified program.
+		/// </summary>
+		/// <remarks>
+		///    Leaf params read into params that are structs as well, eliminating the need to explictly 
+		///    determine if the param is a struct or other type.
+		/// </remarks>
+		/// <param name="program">
+		///    Handle to the program to query.
+		/// </param>
+		/// <param name="nameSpace">
+		///    Namespace in which to query for the params (usually CG_PROGRAM).
+		/// </param>
+		/// <returns>
+		///    Handle to the first Cg parameter in the specified program.
+		/// </returns>
+		// CGDLL_API CGparameter cgGetFirstLeafParameter(CGprogram prog, CGenum name_space);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstLeafParameter(IntPtr program, int nameSpace);
+		#endregion IntPtr cgGetFirstLeafParameter(IntPtr program, int nameSpace)
+
+		#region IntPtr cgGetNextLeafParameter(IntPtr currentParam)
+		/// <summary>
+		///    Gets a handle to the leaf parameter directly following the specified param.
+		/// </summary>
+		/// <param name="currentParam">Current Cg parameter.</param>
+		/// <returns>Handle to the next param after the current program, null if the current is the last param.</returns>
+		// CGDLL_API CGparameter cgGetNextLeafParameter(CGparameter current);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNextLeafParameter(IntPtr currentParam);
+		#endregion IntPtr cgGetNextLeafParameter(IntPtr currentParam)
+
+		#region int cgGetParameterDirection(IntPtr param)
+		/// <summary>
+		///    Gets the direction of this parameter, i.e. CG_IN, CG_OUT, CG_INOUT.
+		/// </summary>
+		/// <param name="param">Id of the parameter to query.</param>
+		/// <returns>Enum value representing the parameter's direction.</returns>
+		// CGDLL_API CGenum cgGetParameterDirection(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterDirection(IntPtr param);
+		#endregion cgGetParameterDirection(IntPtr param)
+
+		#region string cgGetParameterName(IntPtr param)
+		/// <summary>
+		///    Gets the name of the specified program.
+		/// </summary>
+		/// <param name="param">Handle to the program to query.</param>
+		/// <returns>The name of the specified program as a string.</returns>
+		public static string cgGetParameterName(IntPtr param) 
+		{
+			return Marshal.PtrToStringAnsi(cgGetParameterNameA(param));
+		}
+
+		/// <summary>
+		///    Gets the name of the specified program.
+		/// </summary>
+		/// <param name="param">Handle to the program to query.</param>
+		/// <returns>IntPtr that must be converted to an Ansi string via Marshal.PtrToStringAnsi.</returns>
+		// CGDLL_API const char *cgGetParameterName(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="cgGetParameterName"), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr cgGetParameterNameA(IntPtr param);
+		#endregion string cgGetParameterName(IntPtr param)
+
+		#region int cgGetParameterResourceIndex(IntPtr param)
+		/// <summary>
+		///    Retrieves the index of the specifed parameter according to its type and variability.
+		/// </summary>
+		/// <remarks>
+		///    For example, if the resource for a given parameter is CG_TEXCOORD7,
+		///    cgGetParameterResourceIndex() returns 7.  Also, for uniform params, it equates
+		///    to the constant index that will be used in the resulting program.
+		/// </remarks>
+		/// <param name="param">
+		///    Handle of the param to query.
+		/// </param>
+		/// <returns>
+		///    Index of the specified parameter according to its type and variability.
+		/// </returns>
+		// CGDLL_API unsigned long cgGetParameterResourceIndex(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterResourceIndex(IntPtr param);
+		#endregion int cgGetParameterResourceIndex(IntPtr param)
+
+		#region int cgGetParameterVariability(IntPtr param)
+		/// <summary>
+		///    Gets the variability of the specified param (i.e, uniform, varying, etc).
+		/// </summary>
+		/// <param name="param">Handle of the program to query.</param>
+		/// <returns>Enum stating the variability of the program.</returns>
+		// CGDLL_API CGenum cgGetParameterVariability(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterVariability(IntPtr param);
+		#endregion cgGetParameterVariability(IntPtr param)
+
+		#region int cgIsParameterReferenced(IntPtr param)
+		/// <summary>
+		///    Queries whether the specified program will be used in the final compiled program.
+		/// </summary>
+		/// <remarks>
+		///    The compiler may ignore parameters that are not actually used within the program.
+		/// </remarks>
+		/// <param name="param">Handle to the Cg parameter.</param>
+		/// <returns>True if the param is being used, false if not.</returns>
+		// CGDLL_API CGbool cgIsParameterReferenced(CGparameter param);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgIsParameterReferenced(IntPtr param);
+		#endregion int cgIsParameterReferenced(IntPtr param)
+
+		#region int cgGetParameterResource(IntPtr param)
+		/// <summary>
+		/// Gets a parameter's resource.
+		/// </summary>
+		/// <param name="param">Parameter to retreive resource from</param>
+		/// <returns>Resource of a given parameter.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterResource(IntPtr param);
+		#endregion int cgGetParameterResource(IntPtr param)
+
+		#region int cgGetParameterBaseResource(IntPtr param)
+		/// <summary>
+		/// Gets a parameter's base resource.
+		/// </summary>
+		/// <param name="param">Parameter to retreive base resource from</param>
+		/// <returns>Base resource of a given parameter.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterBaseResource(IntPtr param);
+		#endregion int cgGetParameterBaseResource(IntPtr param)
+
+		#region IntPtr cgGetFirstParameter(IntPtr prog, int name_space)
+		/// <summary>
+		/// Gets the first parameter in specified program.
+		/// </summary>
+		/// <param name="prog">The program to retreive the first program from.</param>
+		/// <param name="name_space">Namespace of the parameter to iterate through.</param>
+		/// <returns>First parameter in specified program.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstParameter(IntPtr prog, int name_space);
+		#endregion IntPtr cgGetFirstParameter(IntPtr prog, int name_space)
+
+		#region IntPtr cgGetNextParameter(IntPtr currentParam)
+		/// <summary>
+		/// Iterates to next parameter in program.
+		/// </summary>
+		/// <param name="currentParam">The current parameter.</param>
+		/// <returns>The next parameter in the program's internal sequence of parameters.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetNextParameter(IntPtr currentParam);
+		#endregion IntPtr cgGetNextParameter(IntPtr currentParam)
+
+		#region IntPtr cgGetFirstStructParameter(IntPtr param)
+		/// <summary>
+		/// Gets the first child parameter in a struct parameter.
+		/// </summary>
+		/// <param name="param">The struct parameter to get child parameter from.</param>
+		/// <returns>First child parameter in specified struct parameter.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetFirstStructParameter(IntPtr param);
+		#endregion IntPtr cgGetFirstStructParameter(IntPtr param)
+
+		#region IntPtr cgGetArrayParameter(IntPtr aparam, int index)
+		/// <summary>
+		/// Gets the parameter from an array.
+		/// </summary>
+		/// <param name="aparam">Array parameter.</param>
+		/// <param name="index">Index into the array.</param>
+		/// <returns>Parameter of array param specified by the index.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetArrayParameter(IntPtr aparam, int index);
+		#endregion IntPtr cgGetArrayParameter(IntPtr aparam, int index)
+
+		#region int cgGetArrayDimension(IntPtr param)
+		/// <summary>
+		/// Gets the dimension of an array parameter.
+		/// </summary>
+		/// <param name="param">Parameter.</param>
+		/// <returns>Dimension of the specified parameter.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetArrayDimension(IntPtr param);
+		#endregion int cgGetArrayDimension(IntPtr param)
+
+		#region int cgGetArraySize(IntPtr param, int dimension)
+		/// <summary>
+		/// Gets the size of an array.
+		/// </summary>
+		/// <param name="param">Parameter.</param>
+		/// <param name="dimension">The dimension whose size will be returned.</param>
+		/// <returns>Size of specified parameters dimension.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetArraySize(IntPtr param, int dimension);
+		#endregion int cgGetArraySize(IntPtr param, int dimension)
+
+		#region IntPtr cgGetParameterProgram(IntPtr param)
+		/// <summary>
+		/// Gets program that specified parameter belongs to.
+		/// </summary>
+		/// <param name="param">Parameter to retreive it's parent program.</param>
+		/// <returns>A program given parameter belongs to.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetParameterProgram(IntPtr param);
+		#endregion IntPtr cgGetParameterProgram(IntPtr param)
+
+		#region bool cgIsParameter(IntPtr param)
+		/// <summary>
+		/// Determines if parameter is valid Cg parameter object.
+		/// </summary>
+		/// <param name="param">Parameter.</param>
+		/// <returns>CG_TRUE ig parameter is valid Cg parameter object.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern bool cgIsParameter(IntPtr param);
+		#endregion bool cgIsParameter(IntPtr param)
+
+		#region string cgGetParameterSemantic(IntPtr param)
+		/// <summary>
+		/// Gets the parameter's semantic string.
+		/// </summary>
+		/// <param name="param">Parameter to get semantic from.</param>
+		/// <returns>Parameter's semantic string.</returns>
+		public static string cgGetParameterSemantic(IntPtr param) 
+		{
+			return Marshal.PtrToStringAnsi(cgGetParameterSemanticA(param));
+		}
+
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="cgGetErrorString"), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr cgGetParameterSemanticA(IntPtr param);
+		#endregion string cgGetParameterSemantic(IntPtr param)
+
+		#region double[] cgGetParameterValues(IntPtr param, int value_type, int[] nvalues)
+		#region double[] cgGetParameterValues(IntPtr param, int value_type, int[] nvalues)
+		/// <summary>
+		/// Gets a program parameter's values. 
+		/// </summary>
+		/// <param name="param">Parameter to retreive parameter's values from.</param>
+		/// <param name="value_type">CG_CONSTANT or CG?DEFAULT</param>
+		/// <param name="nvalues">Array of integers indicating the number of values in parameters.</param>
+		/// <returns>Array of double values.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern double[] cgGetParameterValues(IntPtr param, int value_type, int[] nvalues);
+		#endregion double[] cgGetParameterValues(IntPtr param, int value_type, int[] nvalues)
+
+		#region double* cgGetParameterValues(IntPtr param, int value_type, int* nvalues)
+		/// <summary>
+		/// Gets a program parameter's values. 
+		/// </summary>
+		/// <param name="param">Parameter to retreive parameter's values from.</param>
+		/// <param name="value_type">CG_CONSTANT or CG?DEFAULT</param>
+		/// <param name="nvalues">Array of integers indicating the number of values in parameters.</param>
+		/// <returns>Array of double values.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern double* cgGetParameterValues(IntPtr param, int value_type, int* nvalues);
+		#endregion double* cgGetParameterValues(IntPtr param, int value_type, int* nvalues)
+
+		#region IntPtr cgGetParameterValues(IntPtr param, int value_type, IntPtr nvalues)
+		/// <summary>
+		/// Gets a program parameter's values. 
+		/// </summary>
+		/// <param name="param">Parameter to retreive parameter's values from.</param>
+		/// <param name="value_type">CG_CONSTANT or CG?DEFAULT</param>
+		/// <param name="nvalues">Array of integers indicating the number of values in parameters.</param>
+		/// <returns>Array of double values.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr cgGetParameterValues(IntPtr param, int value_type, IntPtr nvalues);
+		#endregion IntPtr cgGetParameterValues(IntPtr param, int value_type, IntPtr nvalues)
+		#endregion double[] cgGetParameterValues(IntPtr param, int value_type, int[] nvalues)
+
+		#region int cgGetParameterOrdinalNumber(IntPtr param)
+		/// <summary>
+		/// Returns an integer that represents the position of a parameter when it was declared within the Cg program.
+		/// </summary>
+		/// <param name="param">Parameter to retreive it's ordinal number.</param>
+		/// <returns>Parameter's ordinal number.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetParameterOrdinalNumber(IntPtr param);
+		#endregion int cgGetParameterOrdinalNumber(IntPtr param)
+		#endregion Parameter Functions
+
+		#region Resource Functions
+
+		#region string cgGetResourceString(int resource)
+		/// <summary>
+		/// get the resource name associated with a resource enumerant 
+		/// </summary>
+		/// <param name="resource">Resource ID to get name from.</param>
+		/// <returns>Resource's name.</returns>
+		public static string cgGetResourceString(int resource) 
+		{
+			return Marshal.PtrToStringAnsi(cgGetResourceStringA(resource));
+		}
+
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="cgGetErrorString"), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr cgGetResourceStringA(int resource);
+		#endregion string cgGetResourceString(int resource)
+
+		#region int cgGetResource(string resource_name)
+		/// <summary>
+		/// Gets the resource enumerant assigned to a resource name.
+		/// </summary>
+		/// <param name="resource_name">Resource's name.</param>
+		/// <returns>Resource enumerant.</returns>
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetResource(string resource_name);
+		#endregion int cgGetResource(string resource_name)
+		#endregion Resource Functions
+		
+		#region Enum Functions
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="en"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetEnumString(CGenum en);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetEnumString(int en);
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="enum_string"></param>
+		/// <returns></returns>
+		// CGDLL_API CGenum cgGetEnum(const char *enum_string);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetEnum(string enum_string);
+		#endregion Enum Functions
+
+		#region Misc Functions 
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="sname"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetString(CGenum sname);
+		public static string cgGetString(int sname)
+        {
+            return Marshal.PtrToStringAnsi(_cgGetString(sname));
+        }
+
+        [DllImport(CG_NATIVE_LIBRARY, EntryPoint = "cgGetString", CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr _cgGetString(int sname);
+		#endregion Misc Functions
+
+		#region Error Functions
+
+		#region int cgGetError()
+		/// <summary>
+		///    Returns an error enum if an error has occured in the last Cg method call.
+		/// </summary>
+		/// <returns>Error enum.</returns>
+		//CGDLL_API CGerror cgGetError(void);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetError();
+		#endregion int cgGetError()
+
+		#region string cgGetErrorString(int error)
+
+		/// <summary>
+		///    Returns an error description from the specified error enum value.
+		/// </summary>
+		/// <param name="error">Error enum value.</param>
+		/// <returns>String description of the specified error enum value.</returns>
+		public static string cgGetErrorString(int error) 
+		{
+			return Marshal.PtrToStringAnsi(cgGetErrorStringA(error));
+		}
+
+		/// <summary>
+		///    Returns an error description from the specified error enum value.
+		/// </summary>
+		/// <param name="error">Error enum value.</param>
+		/// <returns>IntPtr that must be converted to Ansi string via Marshal.PtrToStringAnsi.</returns>
+		//CGDLL_API const char *cgGetErrorString(CGerror error);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="cgGetErrorString"), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr cgGetErrorStringA(int error);
+		#endregion string cgGetErrorString(int error)
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		// CGDLL_API CGerror cgGetFirstError(void);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGetFirstError();
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="error"></param>
+		/// <returns></returns>
+		// CGDLL_API const char *cgGetLastErrorString(CGerror *error);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string cgGetLastErrorString(out int error);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="func"></param>
+		// CGDLL_API void cgSetErrorCallback(CGerrorCallbackFunc func);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetErrorCallback(CGerrorCallbackFuncDelegate func);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		// CGDLL_API CGerrorCallbackFunc cgGetErrorCallback(void);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern CGerrorCallbackFuncDelegate cgGetErrorCallback();
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="func"></param>
+		/// <param name="data"></param>
+		// CGDLL_API void cgSetErrorHandler(CGerrorHandlerFunc func, void *data);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgSetErrorHandler(CGerrorHandlerFuncDelegate func, IntPtr data);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="data"></param>
+		/// <returns></returns>
+		// CGDLL_API CGerrorHandlerFunc cgGetErrorHandler(void **data);
+		[DllImport(CG_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern CGerrorHandlerFuncDelegate cgGetErrorHandler(IntPtr data);
+		#endregion Error Functions
+
+		#region Delegates
+		/// <summary>
+		///    
+		/// </summary>
+		// typedef CGbool (*CGstatecallback)(CGstateassignment);
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate int CGstatecallbackDelegate(IntPtr CGstateassignment);
+
+		/// <summary>
+		///    
+		/// </summary>
+		// typedef void (*CGerrorCallbackFunc)(void);
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate void CGerrorCallbackFuncDelegate();
+
+		/// <summary>
+		///    
+		/// </summary>
+		// typedef void (*CGerrorHandlerFunc)(CGcontext ctx, CGerror err, void *data);
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate void CGerrorHandlerFuncDelegate(IntPtr ctx, int err, IntPtr data);
+		#endregion Delegates
+	}
+}
diff --git a/src/Tao.Cg/CgGl.cs b/src/Tao.Cg/CgGl.cs
new file mode 100644
index 0000000..164d488
--- /dev/null
+++ b/src/Tao.Cg/CgGl.cs
@@ -0,0 +1,2136 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.Cg 
+{
+	#region Class Documentation
+	/// <summary>
+	///     Cg core runtime binding for .NET, implementing Cg 1.4.1.
+	/// </summary>
+	/// <remarks>
+	///     Binds functions and definitions in cgGL.dll or libcgGL.so.
+	/// </remarks>
+	#endregion Class Documentation
+    public static class CgGl 
+	{
+		#region Private Constants
+		#region string CGGL_NATIVE_LIBRARY
+		/// <summary>
+		///     Specifies CGGL's native library archive.
+		/// </summary>
+		/// <remarks>
+		///     Specifies cgGL.dll everywhere; will be mapped via .config for mono.
+		/// </remarks>
+		private const string CGGL_NATIVE_LIBRARY = "cgGL.dll";
+		#endregion string CGGL_NATIVE_LIBRARY
+		#region CallingConvention CALLING_CONVENTION
+		/// <summary>
+		///     Specifies the calling convention.
+		/// </summary>
+		/// <remarks>
+		///     Specifies <see cref="CallingConvention.Cdecl" /> for Windows and Linux.
+		/// </remarks>
+		private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+		#endregion CallingConvention CALLING_CONVENTION
+		#endregion Private Constants
+
+		#region Public Constants
+
+		#region Enums
+		#region CG_GL_MATRIX_IDENTITY
+		/// <summary>
+		/// Identity matrix.
+		/// </summary>
+		/// CG_GL_MATRIX_IDENTITY = 0
+		public const int CG_GL_MATRIX_IDENTITY = 0;
+		#endregion
+
+		#region CG_GL_MATRIX_TRANSPOSE
+		/// <summary>
+		/// Transpose matrix.
+		/// </summary>
+		/// CG_GL_MATRIX_TRANSPOSE = 1
+		public const int CG_GL_MATRIX_TRANSPOSE = 1;
+		#endregion
+
+		#region CG_GL_MATRIX_INVERSE
+		/// <summary>
+		/// Inverse matrix.
+		/// </summary>
+		/// CG_GL_MATRIX_INVERSE = 2
+		public const int CG_GL_MATRIX_INVERSE = 2;
+		#endregion
+
+		#region CG_GL_MATRIX_INVERSE_TRANSPOSE
+		/// <summary>
+		/// Inverse and transpose the matrix.
+		/// </summary>
+		/// CG_GL_MATRIX_INVERSE_TRANSPOSE = 3
+		public const int CG_GL_MATRIX_INVERSE_TRANSPOSE = 3;
+		#endregion
+
+		#region CG_GL_MODELVIEW_MATRIX
+		/// <summary>
+		/// Modelview matrix.
+		/// </summary>
+		/// CG_GL_MODELVIEW_MATRIX = 4
+		public const int CG_GL_MODELVIEW_MATRIX = 4;
+		#endregion
+
+		#region CG_GL_PROJECTION_MATRIX
+		/// <summary>
+		/// Projection matrix.
+		/// </summary>
+		/// CG_GL_PROJECTION_MATRIX = 5
+		public const int CG_GL_PROJECTION_MATRIX = 5;
+		#endregion
+
+		#region CG_GL_TEXTURE_MATRIX
+		/// <summary>
+		/// Texture matrix.
+		/// </summary>
+		/// CG_GL_TEXTURE_MATRIX = 6
+		public const int CG_GL_TEXTURE_MATRIX = 6;
+		#endregion
+
+		#region CG_GL_MODELVIEW_PROJECTION_MATRIX
+		/// <summary>
+		/// Concatenated modelview and projection matrices.
+		/// </summary>
+		/// CG_GL_MATRIX_INVERSE_TRANSPOSE = 7
+		public const int CG_GL_MODELVIEW_PROJECTION_MATRIX = 7;
+		#endregion
+
+		#region CG_GL_VERTEX
+		/// <summary>
+		/// Vertex profile (returned by cgGLGetLatestProfile)
+		/// </summary>
+		/// CG_GL_VERTEX = 8
+		public const int CG_GL_VERTEX = 8;
+		#endregion
+
+		#region CG_GL_FRAGMENT
+		/// <summary>
+		/// Fragment profile (returned by cgGLGetLatestProfile)
+		/// </summary>
+		/// CG_GL_FRAGMENT = 9
+		public const int CG_GL_FRAGMENT = 9;
+		#endregion
+
+        #region CG_GL_GEOMETRY
+        /// <summary>
+        /// Geometry profile (returned by cgGLGetLatestProfile)
+        /// </summary>
+        /// CG_GL_GEOMETRY = 9
+        public const int CG_GL_GEOMETRY = 10;
+        #endregion
+        #endregion Enums
+
+		#endregion Public Constants
+
+		// --- Public Externs ---
+		#region Program Functions
+
+		#region void cgGLIsProgramLoaded(IntPtr program)
+		/// <summary>
+		/// Returns true if the specified program is loaded.
+		/// </summary>
+		/// <param name="program">
+		/// Handle to the program.
+		/// </param>
+		/// <returns>
+		/// True if the specified program is loaded.
+		/// </returns>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern bool cgGLIsProgramLoaded(IntPtr program);
+		#endregion bool cgGLIsProgramLoaded(IntPtr program)
+
+		#region void cgGLGetProgramID(IntPtr program)
+		/// <summary>
+		/// Returns the program's ID.
+		/// </summary>
+		/// <param name="program">
+		/// Handle to the program.
+		/// </param>
+		/// <returns>
+		/// Program's ID.
+		/// </returns>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGLGetProgramID(IntPtr program);
+		#endregion bool cgGLGetProgramID(IntPtr program)
+
+		#region void cgGLLoadProgram(IntPtr program)
+		/// <summary>
+		/// Loads program to OpenGL pipeline
+		/// </summary>
+		/// <param name="program">
+		/// Handle to the program to load.
+		/// </param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLLoadProgram(IntPtr program);
+		#endregion void cgGLLoadProgram(IntPtr program)
+
+		#region void cgGLBindProgram(IntPtr program)
+		/// <summary>
+		/// Bind the program to the current OpenGL API state.
+		/// </summary>
+		/// <param name="program">
+		/// Handle to the program to bind.
+		/// </param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLBindProgram(IntPtr program);
+		#endregion void cgGLBindProgram(IntPtr program)
+
+		#region void cgGLUnbindProgram(int profile)
+		/// <summary>
+		/// Unbinds the program bound in a profile.
+		/// </summary>
+		/// <param name="profile">
+		/// Handle to the profile to unbind programs from.
+		/// </param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLUnbindProgram(int profile);
+		#endregion void cgGLUnbindProgram(int profile)
+		#endregion
+
+		#region Profile Functions
+		#region void cgGLSetOptimalOptions(int profile)
+		/// <summary>
+		/// Sets the best compiler options available by card, driver and selected profile.
+		/// </summary>
+		/// <param name="profile">
+		/// Profile.
+		/// </param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetOptimalOptions(int profile);
+		#endregion void cgGLSetOptimalOptions(int profile)
+
+		#region int cgGLGetLatestProfile(int profile_type)
+		/// <summary>
+		/// Returns the best profile available.
+		/// </summary>
+		/// <param name="profile_type">
+		/// CG_GL_VERTEX or CG_GL_FRAGMENT program to look for the best matching profile.
+		/// </param>
+		/// <returns>
+		/// Returns the best profile available.
+		/// </returns>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGLGetLatestProfile(int profile_type);
+		#endregion int cgGLGetLatestProfile(int profile_type)
+
+		#region bool cgGLIsProfileSupported(int profile)
+		/// <summary>
+		/// Checks if the profile is supported.
+		/// </summary>
+		/// <param name="profile">
+		/// The profile to check the support of.
+		/// </param>
+		/// <returns>
+		/// Returns true if the profile is supported.
+		/// </returns>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern bool cgGLIsProfileSupported(int profile);
+		#endregion bool cgGLIsProfileSupported(int profile)
+
+		#region void cgGLEnableProfile(int profile)
+		/// <summary>
+		/// Enables the selected profile.
+		/// </summary>
+		/// <param name="profile">
+		/// Profile to enable.
+		/// </param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLEnableProfile(int profile);
+		#endregion void cgGLEnableProfile(int profile)
+
+		#region void cgGLDisableProfile(int profile)
+		/// <summary>
+		/// Disables the selected profile.
+		/// </summary>
+		/// <param name="profile">
+		/// Profile to disable.
+		/// </param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLDisableProfile(int profile);
+		#endregion void cgGLDisableProfile(int profile)
+		#endregion 
+
+		#region Parameter Managment Functions
+		#region cgGLSetParameterPointer
+		#region void cgGLSetParameterPointer(IntPtr param, int fsize, int type, int stride, [In] float* pointer)
+		/// <summary>
+		/// Sets parameter with attribute array.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="fsize">Number of coordinates per vertex.</param>
+		/// <param name="type">Data type of each coordinate.</param>
+		/// <param name="stride">Specifies the byte offset between consecutive vertices. If stride is 0 the array is assumed to be tightly packed.</param>
+		/// <param name="pointer">The pointer to the first coordinate in the vertex array.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameterPointer(IntPtr param, int fsize, int type, int stride, [In] void* pointer);
+		#endregion void cgGLSetParameterPointer(IntPtr param, int fsize, int type, int stride, [In] void* pointer)
+		#region void cgGLSetParameterPointer(IntPtr param, int fsize, int type, int stride, [In] IntPtr pointer)
+		/// <summary>
+		/// Sets parameter with attribute array.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="fsize">Number of coordinates per vertex.</param>
+		/// <param name="type">Data type of each coordinate.</param>
+		/// <param name="stride">Specifies the byte offset between consecutive vertices. If stride is 0 the array is assumed to be tightly packed.</param>
+		/// <param name="pointer">The pointer to the first coordinate in the vertex array.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterPointer(IntPtr param, int fsize, int type, int stride, [In] IntPtr pointer);
+		#endregion void cgGLSetParameterPointer(IntPtr param, int fsize, int type, int stride, [In] IntPtr pointer)
+		#endregion
+
+		#region void cgGLEnableClientState(IntPtr param)
+		/// <summary>
+		///     Enables a vertex attribute in OpenGL state.
+		/// </summary>
+		/// <param name="param">Parameter to enable.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLEnableClientState(IntPtr param);
+		#endregion void cgGLEnableClientState(IntPtr param)
+		#region void cgGLDisableClientState(IntPtr param)
+		/// <summary>
+		///     Disables a vertex attribute in OpenGL state.
+		/// </summary>
+		/// <param name="param">Parameter to disable.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLDisableClientState(IntPtr param);
+		#endregion void cgGLDisableClientState(IntPtr param)
+
+		#region cgGLSetParameterNf
+		#region void cgGLSetParameter1f(IntPtr param, float x)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter1f(IntPtr param, float x);
+		#endregion void cgGLSetParameter1f(IntPtr param, float x)
+
+		#region void cgGLSetParameter2f(IntPtr param, float x, float y)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter2f(IntPtr param, float x, float y);
+		#endregion void cgGLSetParameter2f(IntPtr param, float x, float y)
+
+		#region void cgGLSetParameter3f(IntPtr param, float x, float y, float z)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter3f(IntPtr param, float x, float y, float z);
+		#endregion void cgGLSetParameter3f(IntPtr param, float x, float y, float z)
+
+		#region void cgGLSetParameter4f(IntPtr param, float x, float y, float z, float w)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter4f(IntPtr param, float x, float y, float z, float w);
+		#endregion void cgGLSetParameter4f(IntPtr param, float x, float y, float z, float w)
+		#endregion
+
+		#region cgGLSetParameterNfv
+		#region void cgGLSetParameter1fv(IntPtr param, [In] float* values)
+		/// <summary>
+		/// Sets the float value to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameter1fv(IntPtr param, [In] float* values);
+		#endregion void cgGLSetParameter1fv(IntPtr param, [In] float* values)
+
+		#region void cgGLSetParameter1fv(IntPtr param, [In] float[] values)
+		/// <summary>
+		/// Sets the float value to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter1fv(IntPtr param, [In] float[] values);
+		#endregion void cgGLSetParameter1fv(IntPtr param, [In] float[] values)
+
+		#region void cgGLSetParameter1fv(IntPtr param, [In] IntPtr values)
+		/// <summary>
+		/// Sets the float value to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter1fv(IntPtr param, [In] IntPtr values);
+		#endregion void cgGLSetParameter1fv(IntPtr param, [In] IntPtr values)
+
+		#region void cgGLSetParameter2fv(IntPtr param, [In] float* values)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameter2fv(IntPtr param, [In] float* values);
+		#endregion void cgGLSetParameter2fv(IntPtr param, [In] float* values)
+
+		#region void cgGLSetParameter2fv(IntPtr param, [In] float[] values)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter2fv(IntPtr param, [In] float[] values);
+		#endregion void cgGLSetParameter2fv(IntPtr param, [In] float[] values)
+
+		#region void cgGLSetParameter2fv(IntPtr param, [In] IntPtr values)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter2fv(IntPtr param, [In] IntPtr values);
+		#endregion void cgGLSetParameter2fv(IntPtr param, [In] IntPtr values)
+
+		#region void cgGLSetParameter3fv(IntPtr param, [In] float* values)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameter3fv(IntPtr param, [In] float* values);
+		#endregion void cgGLSetParameter3fv(IntPtr param, [In] float* values)
+
+		#region void cgGLSetParameter3fv(IntPtr param, [In] float[] values)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter3fv(IntPtr param, [In] float[] values);
+		#endregion void cgGLSetParameter3fv(IntPtr param, [In] float[] values)
+
+		#region void cgGLSetParameter3fv(IntPtr param, [In] IntPtr values)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter3fv(IntPtr param, [In] IntPtr values);
+		#endregion void cgGLSetParameter3fv(IntPtr param, [In] IntPtr values)
+
+		#region void cgGLSetParameter4fv(IntPtr param, [In] float* values)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameter4fv(IntPtr param, [In] float* values);
+		#endregion void cgGLSetParameter4fv(IntPtr param, [In] float* values)
+
+		#region void cgGLSetParameter4fv(IntPtr param, [In] float[] values)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter4fv(IntPtr param, [In] float[] values);
+		#endregion void cgGLSetParameter4fv(IntPtr param, [In] float[] values)
+
+		#region void cgGLSetParameter4fv(IntPtr param, [In] IntPtr values)
+		/// <summary>
+		/// Sets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter4fv(IntPtr param, [In] IntPtr values);
+		#endregion void cgGLSetParameter4fv(IntPtr param, [In] IntPtr values)
+		#endregion 
+
+		#region cgGLSetParameterNd
+		#region void cgGLSetParameter1d(IntPtr param, double x)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter1d(IntPtr param, double x);
+		#endregion void cgGLSetParameter1d(IntPtr param, double x)
+
+		#region void cgGLSetParameter2d(IntPtr param, double x, double y)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter2d(IntPtr param, double x, double y);
+		#endregion void cgGLSetParameter2d(IntPtr param, double x, double y)
+
+		#region void cgGLSetParameter3d(IntPtr param, double x, double y, double z)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter3d(IntPtr param, double x, double y, double z);
+		#endregion void cgGLSetParameter3d(IntPtr param, double x, double y, double z)
+
+		#region void cgGLSetParameter4d(IntPtr param, double x, double y, double z, double w)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter4d(IntPtr param, double x, double y, double z, double w);
+		#endregion void cgGLSetParameter4d(IntPtr param, double x, double y, double z, double w)
+		#endregion
+
+		#region cgGLSetParameterNdv
+		#region void cgGLSetParameter1dv(IntPtr param, [In] double* values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameter1dv(IntPtr param, [In] double* values);
+		#endregion void cgGLSetParameter1dv(IntPtr param, [In] double* values)
+
+		#region void cgGLSetParameter1dv(IntPtr param, [In] double[] values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter1dv(IntPtr param, [In] double[] values);
+		#endregion void cgGLSetParameter1dv(IntPtr param, [In] double[] values)
+
+		#region void cgGLSetParameter1dv(IntPtr param, [In] IntPtr values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter1dv(IntPtr param, [In] IntPtr values);
+		#endregion void cgGLSetParameter1dv(IntPtr param, [In] IntPtr values)
+
+		#region void cgGLSetParameter2dv(IntPtr param, [In] double* values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameter2dv(IntPtr param, [In] double* values);
+		#endregion void cgGLSetParameter2dv(IntPtr param, [In] double* values)
+
+		#region void cgGLSetParameter2dv(IntPtr param, [In] double[] values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter2dv(IntPtr param, [In] double[] values);
+		#endregion void cgGLSetParameter2dv(IntPtr param, [In] double[] values)
+
+		#region void cgGLSetParameter2dv(IntPtr param, [In] IntPtr values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter2dv(IntPtr param, [In] IntPtr values);
+		#endregion void cgGLSetParameter2dv(IntPtr param, [In] IntPtr values)
+
+		#region void cgGLSetParameter3dv(IntPtr param, [In] double* values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameter3dv(IntPtr param, [In] double* values);
+		#endregion void cgGLSetParameter3dv(IntPtr param, [In] double* values)
+
+		#region void cgGLSetParameter3dv(IntPtr param, [In] double[] values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter3dv(IntPtr param, [In] double[] values);
+		#endregion void cgGLSetParameter3dv(IntPtr param, [In] double[] values)
+
+		#region void cgGLSetParameter3dv(IntPtr param, [In] IntPtr values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter3dv(IntPtr param, [In] IntPtr values);
+		#endregion void cgGLSetParameter3dv(IntPtr param, [In] IntPtr values)
+
+		#region void cgGLSetParameter4dv(IntPtr param, [In] double* values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameter4dv(IntPtr param, [In] double* values);
+		#endregion void cgGLSetParameter4dv(IntPtr param, [In] double* values)
+
+		#region void cgGLSetParameter4dv(IntPtr param, [In] double[] values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter4dv(IntPtr param, [In] double[] values);
+		#endregion void cgGLSetParameter4dv(IntPtr param, [In] double[] values)
+
+		#region void cgGLSetParameter4dv(IntPtr param, [In] IntPtr values)
+		/// <summary>
+		/// Sets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameter4dv(IntPtr param, [In] IntPtr values);
+		#endregion void cgGLSetParameter4dv(IntPtr param, [In] IntPtr values)
+		#endregion 
+
+		#region cgGLGetParameterNf
+		#region void cgGLGetParameter1f(IntPtr param, [Out] float* values)
+		/// <summary>
+		/// Gets the float value to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameter1f(IntPtr param, [Out] float* values);
+		#endregion void cgGLGetParameter1f(IntPtr param, [Out] float* values)
+		#region void cgGLGetParameter1f(IntPtr param, [Out] float[] values)
+		/// <summary>
+		/// Gets the float value to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter1f(IntPtr param, [Out] float[] values);
+		#endregion void cgGLGetParameter1f(IntPtr param, [Out] float[] values)
+		#region void cgGLGetParameter1f(IntPtr param, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the float value to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter1f(IntPtr param, [Out] IntPtr values);
+		#endregion void cgGLGetParameter1f(IntPtr param, [Out] IntPtr values)
+
+		#region void cgGLGetParameter2f(IntPtr param, [Out] float* values)
+		/// <summary>
+		/// Gets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameter2f(IntPtr param, [Out] float* values);
+		#endregion void cgGLGetParameter2f(IntPtr param, [Out] float* values)
+		#region void cgGLGetParameter2f(IntPtr param, [Out] float[] values)
+		/// <summary>
+		/// Gets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter2f(IntPtr param, [Out] float[] values);
+		#endregion void cgGLGetParameter2f(IntPtr param, [Out] float[] values)
+		#region void cgGLGetParameter2f(IntPtr param, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter2f(IntPtr param, [Out] IntPtr values);
+		#endregion void cgGLGetParameter2f(IntPtr param, [Out] IntPtr values)
+
+		#region void cgGLGetParameter3f(IntPtr param, [Out] float* values)
+		/// <summary>
+		/// Gets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameter3f(IntPtr param, [Out] float* values);
+		#endregion void cgGLGetParameter3f(IntPtr param, [Out] float* values)
+		#region void cgGLGetParameter3f(IntPtr param, [Out] float[] values)
+		/// <summary>
+		/// Gets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter3f(IntPtr param, [Out] float[] values);
+		#endregion void cgGLGetParameter3f(IntPtr param, [Out] float[] values)
+		#region void cgGLGetParameter3f(IntPtr param, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter3f(IntPtr param, [Out] IntPtr values);
+		#endregion void cgGLGetParameter3f(IntPtr param, [Out] IntPtr values)
+
+		#region void cgGLGetParameter4f(IntPtr param, [Out] float* values)
+		/// <summary>
+		/// Gets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameter4f(IntPtr param, [Out] float* values);
+		#endregion void cgGLGetParameter4f(IntPtr param, [Out] float* values)
+		#region void cgGLGetParameter4f(IntPtr param, [Out] float[] values)
+		/// <summary>
+		/// Gets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter4f(IntPtr param, [Out] float[] values);
+		#endregion void cgGLGetParameter4f(IntPtr param, [Out] float[] values)
+		#region void cgGLGetParameter4f(IntPtr param, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the float values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter4f(IntPtr param, [Out] IntPtr values);
+		#endregion void cgGLGetParameter4f(IntPtr param, [Out] IntPtr values)
+		#endregion
+
+		#region cgGLGetParameterNd
+		#region void cgGLGetParameter1d(IntPtr param, [Out] double* values)
+		/// <summary>
+		/// Gets the double value to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameter1d(IntPtr param, [Out] double* values);
+		#endregion void cgGLGetParameter1d(IntPtr param, [Out] double* values)
+		#region void cgGLGetParameter1d(IntPtr param, [Out] double[] values)
+		/// <summary>
+		/// Gets the double value to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter1d(IntPtr param, [Out] double[] values);
+		#endregion void cgGLGetParameter1d(IntPtr param, [Out] double[] values)
+		#region void cgGLGetParameter1d(IntPtr param, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the double value to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter1d(IntPtr param, [Out] IntPtr values);
+		#endregion void cgGLGetParameter1d(IntPtr param, [Out] IntPtr values)
+
+		#region void cgGLGetParameter2d(IntPtr param, [Out] double* values)
+		/// <summary>
+		/// Gets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameter2d(IntPtr param, [Out] double* values);
+		#endregion void cgGLGetParameter2d(IntPtr param, [Out] double* values)
+		#region void cgGLGetParameter2d(IntPtr param, [Out] double[] values)
+		/// <summary>
+		/// Gets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter2d(IntPtr param, [Out] double[] values);
+		#endregion void cgGLGetParameter2d(IntPtr param, [Out] double[] values)
+		#region void cgGLGetParameter2d(IntPtr param, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter2d(IntPtr param, [Out] IntPtr values);
+		#endregion void cgGLGetParameter2d(IntPtr param, [Out] IntPtr values)
+
+		#region void cgGLGetParameter3d(IntPtr param, [Out] double* values)
+		/// <summary>
+		/// Gets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameter3d(IntPtr param, [Out] double* values);
+		#endregion void cgGLGetParameter3d(IntPtr param, [Out] double* values)
+		#region void cgGLGetParameter3d(IntPtr param, [Out] double[] values)
+		/// <summary>
+		/// Gets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter3d(IntPtr param, [Out] double[] values);
+		#endregion void cgGLGetParameter3d(IntPtr param, [Out] double[] values)
+		#region void cgGLGetParameter3d(IntPtr param, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter3d(IntPtr param, [Out] IntPtr values);
+		#endregion void cgGLGetParameter3d(IntPtr param, [Out] IntPtr values)
+
+		#region void cgGLGetParameter4d(IntPtr param, [Out] double* values)
+		/// <summary>
+		/// Gets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameter4d(IntPtr param, [Out] double* values);
+		#endregion void cgGLGetParameter4d(IntPtr param, [Out] double* values)
+		#region void cgGLGetParameter4d(IntPtr param, [Out] double[] values)
+		/// <summary>
+		/// Gets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter4d(IntPtr param, [Out] double[] values);
+		#endregion void cgGLGetParameter4d(IntPtr param, [Out] double[] values)
+		#region void cgGLGetParameter4d(IntPtr param, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the double values to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameter4d(IntPtr param, [Out] IntPtr values);
+		#endregion void cgGLGetParameter4d(IntPtr param, [Out] IntPtr values)
+		#endregion
+
+		#region Arrays
+		#region cgGLSetParameterArrayNf
+		#region void cgGLSetParameterArray1f(IntPtr param, int offset, int nelements, [In] float* values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameterArray1f(IntPtr param, int offset, int nelements, [In] float* values);
+		#endregion void cgGLSetParameterArray1f(IntPtr param, int offset, int nelements, [In] float* values)
+		#region void cgGLSetParameterArray1f(IntPtr param, int offset, int nelements, [In] float[] values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray1f(IntPtr param, int offset, int nelements, [In] float[] values);
+		#endregion void cgGLSetParameterArray1f(IntPtr param, int offset, int nelements, [In] float[] values)
+		#region void cgGLSetParameterArray1f(IntPtr param, int offset, int nelements, [In] IntPtr values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray1f(IntPtr param, int offset, int nelements, [In] IntPtr values);
+		#endregion void cgGLSetParameterArray1f(IntPtr param, int offset, int nelements, [In] IntPtr values)
+
+		#region void cgGLSetParameterArray2f(IntPtr param, int offset, int nelements, [In] float* values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameterArray2f(IntPtr param, int offset, int nelements, [In] float* values);
+		#endregion void cgGLSetParameterArray2f(IntPtr param, int offset, int nelements, [In] float* values)
+		#region void cgGLSetParameterArray2f(IntPtr param, int offset, int nelements, [In] float[] values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray2f(IntPtr param, int offset, int nelements, [In] float[] values);
+		#endregion void cgGLSetParameterArray2f(IntPtr param, int offset, int nelements, [In] float[] values)
+		#region void cgGLSetParameterArray2f(IntPtr param, int offset, int nelements, [In] IntPtr values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray2f(IntPtr param, int offset, int nelements, [In] IntPtr values);
+		#endregion void cgGLSetParameterArray2f(IntPtr param, int offset, int nelements, [In] IntPtr values)
+
+		#region void cgGLSetParameterArray3f(IntPtr param, int offset, int nelements, [In] float* values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameterArray3f(IntPtr param, int offset, int nelements, [In] float* values);
+		#endregion void cgGLSetParameterArray3f(IntPtr param, int offset, int nelements, [In] float* values)
+		#region void cgGLSetParameterArray3f(IntPtr param, int offset, int nelements, [In] float[] values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray3f(IntPtr param, int offset, int nelements, [In] float[] values);
+		#endregion void cgGLSetParameterArray3f(IntPtr param, int offset, int nelements, [In] float[] values)
+		#region void cgGLSetParameterArray3f(IntPtr param, int offset, int nelements, [In] IntPtr values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray3f(IntPtr param, int offset, int nelements, [In] IntPtr values);
+		#endregion void cgGLSetParameterArray3f(IntPtr param, int offset, int nelements, [In] IntPtr values)
+
+		#region void cgGLSetParameterArray4f(IntPtr param, int offset, int nelements, [In] float* values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameterArray4f(IntPtr param, int offset, int nelements, [In] float* values);
+		#endregion void cgGLSetParameterArray4f(IntPtr param, int offset, int nelements, [In] float* values)
+		#region void cgGLSetParameterArray4f(IntPtr param, int offset, int nelements, [In] float[] values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray4f(IntPtr param, int offset, int nelements, [In] float[] values);
+		#endregion void cgGLSetParameterArray4f(IntPtr param, int offset, int nelements, [In] float[] values)
+		#region void cgGLSetParameterArray4f(IntPtr param, int offset, int nelements, [In] IntPtr values)
+		/// <summary>
+		/// Sets the float values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray4f(IntPtr param, int offset, int nelements, [In] IntPtr values);
+		#endregion void cgGLSetParameterArray4f(IntPtr param, int offset, int nelements, [In] IntPtr values)
+		#endregion
+		#region cgGLSetParameterArrayNd
+		#region void cgGLSetParameterArray1d(IntPtr param, int offset, int nelements, [In] double* values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameterArray1d(IntPtr param, int offset, int nelements, [In] double* values);
+		#endregion void cgGLSetParameterArray1d(IntPtr param, int offset, int nelements, [In] double* values)
+		#region void cgGLSetParameterArray1d(IntPtr param, int offset, int nelements, [In] double[] values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray1d(IntPtr param, int offset, int nelements, [In] double[] values);
+		#endregion void cgGLSetParameterArray1d(IntPtr param, int offset, int nelements, [In] double[] values)
+		#region void cgGLSetParameterArray1d(IntPtr param, int offset, int nelements, [In] IntPtr values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray1d(IntPtr param, int offset, int nelements, [In] IntPtr values);
+		#endregion void cgGLSetParameterArray1d(IntPtr param, int offset, int nelements, [In] IntPtr values)
+
+		#region void cgGLSetParameterArray2d(IntPtr param, int offset, int nelements, [In] double* values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameterArray2d(IntPtr param, int offset, int nelements, [In] double* values);
+		#endregion void cgGLSetParameterArray2d(IntPtr param, int offset, int nelements, [In] double* values)
+		#region void cgGLSetParameterArray2d(IntPtr param, int offset, int nelements, [In] double[] values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray2d(IntPtr param, int offset, int nelements, [In] double[] values);
+		#endregion void cgGLSetParameterArray2d(IntPtr param, int offset, int nelements, [In] double[] values)
+		#region void cgGLSetParameterArray2d(IntPtr param, int offset, int nelements, [In] IntPtr values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray2d(IntPtr param, int offset, int nelements, [In] IntPtr values);
+		#endregion void cgGLSetParameterArray2d(IntPtr param, int offset, int nelements, [In] IntPtr values)
+
+		#region void cgGLSetParameterArray3d(IntPtr param, int offset, int nelements, [In] double* values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameterArray3d(IntPtr param, int offset, int nelements, [In] double* values);
+		#endregion void cgGLSetParameterArray3d(IntPtr param, int offset, int nelements, [In] double* values)
+		#region void cgGLSetParameterArray3d(IntPtr param, int offset, int nelements, [In] double[] values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray3d(IntPtr param, int offset, int nelements, [In] double[] values);
+		#endregion void cgGLSetParameterArray3d(IntPtr param, int offset, int nelements, [In] double[] values)
+		#region void cgGLSetParameterArray3d(IntPtr param, int offset, int nelements, [In] IntPtr values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray3d(IntPtr param, int offset, int nelements, [In] IntPtr values);
+		#endregion void cgGLSetParameterArray3d(IntPtr param, int offset, int nelements, [In] IntPtr values)
+
+		#region void cgGLSetParameterArray4d(IntPtr param, int offset, int nelements, [In] double* values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetParameterArray4d(IntPtr param, int offset, int nelements, [In] double* values);
+		#endregion void cgGLSetParameterArray4d(IntPtr param, int offset, int nelements, [In] double* values)
+		#region void cgGLSetParameterArray4d(IntPtr param, int offset, int nelements, [In] double[] values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray4d(IntPtr param, int offset, int nelements, [In] double[] values);
+		#endregion void cgGLSetParameterArray4d(IntPtr param, int offset, int nelements, [In] double[] values)
+		#region void cgGLSetParameterArray4d(IntPtr param, int offset, int nelements, [In] IntPtr values)
+		/// <summary>
+		/// Sets the double values to the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to set values to.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to set.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetParameterArray4d(IntPtr param, int offset, int nelements, [In] IntPtr values);
+		#endregion void cgGLSetParameterArray4d(IntPtr param, int offset, int nelements, [In] IntPtr values)
+		#endregion
+
+		#region cgGLGetParameterArrayNf
+		#region void cgGLGetParameterArray1f(IntPtr param, int offset, int nelements, [Out] float* values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameterArray1f(IntPtr param, int offset, int nelements, [Out] float* values);
+		#endregion void cgGLGetParameterArray1f(IntPtr param, int offset, int nelements, [Out] float* values)
+		#region void cgGLGetParameterArray1f(IntPtr param, int offset, int nelements, [Out] float[] values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray1f(IntPtr param, int offset, int nelements, [Out] float[] values);
+		#endregion void cgGLGetParameterArray1f(IntPtr param, int offset, int nelements, [Out] float[] values)
+		#region void cgGLGetParameterArray1f(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray1f(IntPtr param, int offset, int nelements, [Out] IntPtr values);
+		#endregion void cgGLGetParameterArray1f(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+
+		#region void cgGLGetParameterArray2f(IntPtr param, int offset, int nelements, [Out] float* values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameterArray2f(IntPtr param, int offset, int nelements, [Out] float* values);
+		#endregion void cgGLGetParameterArray2f(IntPtr param, int offset, int nelements, [Out] float* values)
+		#region void cgGLGetParameterArray2f(IntPtr param, int offset, int nelements, [Out] float[] values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray2f(IntPtr param, int offset, int nelements, [Out] float[] values);
+		#endregion void cgGLGetParameterArray2f(IntPtr param, int offset, int nelements, [Out] float[] values)
+		#region void cgGLGetParameterArray2f(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray2f(IntPtr param, int offset, int nelements, [Out] IntPtr values);
+		#endregion void cgGLGetParameterArray2f(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+
+		#region void cgGLGetParameterArray3f(IntPtr param, int offset, int nelements, [Out] float* values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameterArray3f(IntPtr param, int offset, int nelements, [Out] float* values);
+		#endregion void cgGLGetParameterArray3f(IntPtr param, int offset, int nelements, [Out] float* values)
+		#region void cgGLGetParameterArray3f(IntPtr param, int offset, int nelements, [Out] float[] values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray3f(IntPtr param, int offset, int nelements, [Out] float[] values);
+		#endregion void cgGLGetParameterArray3f(IntPtr param, int offset, int nelements, [Out] float[] values)
+		#region void cgGLGetParameterArray3f(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray3f(IntPtr param, int offset, int nelements, [Out] IntPtr values);
+		#endregion void cgGLGetParameterArray3f(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+
+		#region void cgGLGetParameterArray4f(IntPtr param, int offset, int nelements, [Out] float* values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameterArray4f(IntPtr param, int offset, int nelements, [Out] float* values);
+		#endregion void cgGLGetParameterArray4f(IntPtr param, int offset, int nelements, [Out] float* values)
+		#region void cgGLGetParameterArray4f(IntPtr param, int offset, int nelements, [Out] float[] values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray4f(IntPtr param, int offset, int nelements, [Out] float[] values);
+		#endregion void cgGLGetParameterArray4f(IntPtr param, int offset, int nelements, [Out] float[] values)
+		#region void cgGLGetParameterArray4f(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the float values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray4f(IntPtr param, int offset, int nelements, [Out] IntPtr values);
+		#endregion void cgGLGetParameterArray4f(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+		#endregion
+		#region cgGLGetParameterArrayNd
+		#region void cgGLGetParameterArray1d(IntPtr param, int offset, int nelements, [Out] double* values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameterArray1d(IntPtr param, int offset, int nelements, [Out] double* values);
+		#endregion void cgGLGetParameterArray1d(IntPtr param, int offset, int nelements, [Out] double* values)
+		#region void cgGLGetParameterArray1d(IntPtr param, int offset, int nelements, [Out] double[] values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray1d(IntPtr param, int offset, int nelements, [Out] double[] values);
+		#endregion void cgGLGetParameterArray1d(IntPtr param, int offset, int nelements, [Out] double[] values)
+		#region void cgGLGetParameterArray1d(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray1d(IntPtr param, int offset, int nelements, [Out] IntPtr values);
+		#endregion void cgGLGetParameterArray1d(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+
+		#region void cgGLGetParameterArray2d(IntPtr param, int offset, int nelements, [Out] double* values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameterArray2d(IntPtr param, int offset, int nelements, [Out] double* values);
+		#endregion void cgGLGetParameterArray2d(IntPtr param, int offset, int nelements, [Out] double* values)
+		#region void cgGLGetParameterArray2d(IntPtr param, int offset, int nelements, [Out] double[] values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray2d(IntPtr param, int offset, int nelements, [Out] double[] values);
+		#endregion void cgGLGetParameterArray2d(IntPtr param, int offset, int nelements, [Out] double[] values)
+		#region void cgGLGetParameterArray2d(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray2d(IntPtr param, int offset, int nelements, [Out] IntPtr values);
+		#endregion void cgGLGetParameterArray2d(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+
+		#region void cgGLGetParameterArray3d(IntPtr param, int offset, int nelements, [Out] double* values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameterArray3d(IntPtr param, int offset, int nelements, [Out] double* values);
+		#endregion void cgGLGetParameterArray3d(IntPtr param, int offset, int nelements, [Out] double* values)
+		#region void cgGLGetParameterArray3d(IntPtr param, int offset, int nelements, [Out] double[] values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray3d(IntPtr param, int offset, int nelements, [Out] double[] values);
+		#endregion void cgGLGetParameterArray3d(IntPtr param, int offset, int nelements, [Out] double[] values)
+		#region void cgGLGetParameterArray3d(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray3d(IntPtr param, int offset, int nelements, [Out] IntPtr values);
+		#endregion void cgGLGetParameterArray3d(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+
+		#region void cgGLGetParameterArray4d(IntPtr param, int offset, int nelements, [Out] double* values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetParameterArray4d(IntPtr param, int offset, int nelements, [Out] double* values);
+		#endregion void cgGLGetParameterArray4d(IntPtr param, int offset, int nelements, [Out] double* values)
+		#region void cgGLGetParameterArray4d(IntPtr param, int offset, int nelements, [Out] double[] values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray4d(IntPtr param, int offset, int nelements, [Out] double[] values);
+		#endregion void cgGLGetParameterArray4d(IntPtr param, int offset, int nelements, [Out] double[] values)
+		#region void cgGLGetParameterArray4d(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+		/// <summary>
+		/// Gets the double values from the specific parameter.
+		/// </summary>
+		/// <param name="param">Parameter to get values from.</param>
+		/// <param name="offset">Offset into an array</param>
+		/// <param name="nelements">Number of values to get.</param>
+		/// <param name="values">Array of values.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetParameterArray4d(IntPtr param, int offset, int nelements, [Out] IntPtr values);
+		#endregion void cgGLGetParameterArray4d(IntPtr param, int offset, int nelements, [Out] IntPtr values)
+		#endregion
+		#endregion
+		#endregion
+
+		#region Matrix Parameter Managment Functions
+		#region void cgGLSetStateMatrixParameter(IntPtr param, int matrix, int transform)
+		/// <summary>
+		/// Sets the values of the parameter to a matrix in the OpenGL state.
+		/// </summary>
+		/// <param name="param">
+		/// Parameter that will be set.
+		/// </param>
+		/// <param name="matrix">
+		/// Which matrix should be retreived from the OpenGL state.
+		/// </param>
+		/// <param name="transform">
+		/// Optional transformation that will be aplied to the OpenGL state matrix before it is retreived to the parameter.
+		/// </param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetStateMatrixParameter(IntPtr param, int matrix, int transform);
+		#endregion void cgGLSetStateMatrixParameter(IntPtr param, int matrix, int transform)
+
+		#region cgGLSetMatrixParameter
+		#region cgGLSetMatrixParameterdr
+		#region void cgGLSetMatrixParameterdr(IntPtr param, [In] double* matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetMatrixParameterdr(IntPtr param, [In] double* matrix);
+		#endregion void cgGLSetMatrixParameterdr(IntPtr param, [In] double* matrix)
+
+		#region void cgGLSetMatrixParameterdr(IntPtr param, [In] double[] matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterdr(IntPtr param, [In] double[] matrix);
+		#endregion void cgGLSetMatrixParameterdr(IntPtr param, [In] double[] matrix)
+
+		#region void cgGLSetMatrixParameterdr(IntPtr param, [In] IntPtr matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterdr(IntPtr param, [In] IntPtr matrix);
+		#endregion void cgGLSetMatrixParameterdr(IntPtr param, [In] IntPtr matrix)
+
+		#endregion
+		#region cgGLSetMatrixParameterfr
+
+		#region void cgGLSetMatrixParameterfr(IntPtr param, [In] float* matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetMatrixParameterdr(IntPtr param, [In] float* matrix);
+		#endregion void cgGLSetMatrixParameterfr(IntPtr param, [In] float* matrix)
+
+		#region void cgGLSetMatrixParameterfr(IntPtr param, [In] float[] matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterfr(IntPtr param, [In] float[] matrix);
+		#endregion void cgGLSetMatrixParameterfr(IntPtr param, [In] float[] matrix)
+
+		#region void cgGLSetMatrixParameterfr(IntPtr param, [In] IntPtr matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterfr(IntPtr param, [In] IntPtr matrix);
+		#endregion void cgGLSetMatrixParameterfr(IntPtr param, [In] IntPtr matrix)
+		#endregion
+
+		#region cgGLSetMatrixParameterdc
+		#region void cgGLSetMatrixParameterdc(IntPtr param, [In] double* matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in column  order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetMatrixParameterdc(IntPtr param, [In] double* matrix);
+		#endregion void cgGLSetMatrixParameterdc(IntPtr param, [In] double* matrix)
+
+		#region void cgGLSetMatrixParameterdc(IntPtr param, [In] double[] matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in column  order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterdc(IntPtr param, [In] double[] matrix);
+		#endregion void cgGLSetMatrixParameterdc(IntPtr param, [In] double[] matrix)
+
+		#region void cgGLSetMatrixParameterdc(IntPtr param, [In] IntPtr matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in column  order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterdc(IntPtr param, [In] IntPtr matrix);
+		#endregion void cgGLSetMatrixParameterdc(IntPtr param, [In] IntPtr matrix)
+		#endregion
+		#region cgGLSetMatrixParameterfc
+
+		#region void cgGLSetMatrixParameterfc(IntPtr param, [In] float* matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in column  order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetMatrixParameterfc(IntPtr param, [In] float* matrix);
+		#endregion void cgGLSetMatrixParameterfc(IntPtr param, [In] float* matrix)
+
+		#region void cgGLSetMatrixParameterfc(IntPtr param, [In] float[] matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in column  order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterfc(IntPtr param, [In] float[] matrix);
+		#endregion void cgGLSetMatrixParameterfc(IntPtr param, [In] float[] matrix)
+
+		#region void cgGLSetMatrixParameterfc(IntPtr param, [In] IntPtr matrix)
+		/// <summary>
+		/// Sets the value of matrix parameters in column  order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterfc(IntPtr param, [In] IntPtr matrix);
+		#endregion void cgGLSetMatrixParameterfc(IntPtr param, [In] IntPtr matrix)
+		#endregion
+		#endregion
+
+		#region cgGLGetMatrixParameter
+		#region cgGLGetMatrixParameterdr
+		#region void cgGLGetMatrixParameterdr(IntPtr param, [In] double* matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetMatrixParameterdr(IntPtr param, [In] double* matrix);
+		#endregion void cgGLGetMatrixParameterdr(IntPtr param, [In] double* matrix)
+
+		#region void cgGLGetMatrixParameterdr(IntPtr param, [In] double[] matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterdr(IntPtr param, [In] double[] matrix);
+		#endregion void cgGLGetMatrixParameterdr(IntPtr param, [In] double[] matrix)
+
+		#region void cgGLGetMatrixParameterdr(IntPtr param, [In] IntPtr matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterdr(IntPtr param, [In] IntPtr matrix);
+		#endregion void cgGLGetMatrixParameterdr(IntPtr param, [In] IntPtr matrix)
+		#endregion
+		#region cgGLGetMatrixParameterfr
+
+		#region void cgGLGetMatrixParameterfr(IntPtr param, [In] float* matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetMatrixParameterdr(IntPtr param, [In] float* matrix);
+		#endregion void cgGLGetMatrixParameterfr(IntPtr param, [In] float* matrix)
+
+		#region void cgGLGetMatrixParameterfr(IntPtr param, [In] float[] matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterfr(IntPtr param, [In] float[] matrix);
+		#endregion void cgGLGetMatrixParameterfr(IntPtr param, [In] float[] matrix)
+
+		#region void cgGLGetMatrixParameterfr(IntPtr param, [In] IntPtr matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in row order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterfr(IntPtr param, [In] IntPtr matrix);
+		#endregion void cgGLGetMatrixParameterfr(IntPtr param, [In] IntPtr matrix)
+		#endregion
+        
+		#region cgGLGetMatrixParameterdc
+		#region void cgGLGetMatrixParameterdc(IntPtr param, [In] double* matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in column order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetMatrixParameterdc(IntPtr param, [In] double* matrix);
+		#endregion void cgGLGetMatrixParameterdc(IntPtr param, [In] double* matrix)
+
+		#region void cgGLGetMatrixParameterdc(IntPtr param, [In] double[] matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in column order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterdc(IntPtr param, [In] double[] matrix);
+		#endregion void cgGLGetMatrixParameterdc(IntPtr param, [In] double[] matrix)
+
+		#region void cgGLGetMatrixParameterdc(IntPtr param, [In] IntPtr matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in column order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterdc(IntPtr param, [In] IntPtr matrix);
+		#endregion void cgGLGetMatrixParameterdc(IntPtr param, [In] IntPtr matrix)
+		#endregion
+        
+		#region cgGLGetMatrixParameterfc
+		#region void cgGLGetMatrixParameterfc(IntPtr param, [In] float* matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in column order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetMatrixParameterfc(IntPtr param, [In] float* matrix);
+		#endregion void cgGLGetMatrixParameterfc(IntPtr param, [In] float* matrix)
+
+		#region void cgGLGetMatrixParameterfc(IntPtr param, [In] float[] matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in column order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterfc(IntPtr param, [In] float[] matrix);
+		#endregion void cgGLGetMatrixParameterfc(IntPtr param, [In] float[] matrix)
+
+		#region void cgGLGetMatrixParameterfc(IntPtr param, [In] IntPtr matrix)
+		/// <summary>
+		/// Gets the value of matrix parameters in column order.
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterfc(IntPtr param, [In] IntPtr matrix);
+		#endregion void cgGLGetMatrixParameterfc(IntPtr param, [In] IntPtr matrix)
+		#endregion
+		#endregion
+
+		#region cgGLSetMatrixParameterArray
+		#region cgGLSetMatrixParameterArrayfc
+		#region void cgGLSetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [In] float* matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (float) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [In] float* matrices);
+		#endregion void cgGLSetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, const float* matrices)
+
+		#region void cgGLSetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [In] float[] matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (float) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [In] float[] matrices);
+		#endregion void cgGLSetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, const float[] matrices)
+
+		#region void cgGLSetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [In] IntPtr matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (float) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [In] IntPtr matrices);
+		#endregion void cgGLSetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, const IntPtr matrices)
+		#endregion cgGLSetMatrixParameterArrayfc
+
+		#region cgGLSetMatrixParameterArraydc
+		#region void cgGLSetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [In] double* matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (double) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [In] double* matrices);
+		#endregion void cgGLSetMatrixParameterArraydc(IntPtr param, int offset, int nelements, const double* matrices)
+
+		#region void cgGLSetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [In] double[] matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (double) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [In] double[] matrices);
+		#endregion void cgGLSetMatrixParameterArraydc(IntPtr param, int offset, int nelements, const double[] matrices)
+
+		#region void cgGLSetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [In] IntPtr matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (double) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [In] IntPtr matrices);
+		#endregion void cgGLSetMatrixParameterArraydc(IntPtr param, int offset, int nelements, const IntPtr matrices)
+		#endregion cgGLSetMatrixParameterArraydc
+
+
+		#region cgGLSetMatrixParameterArrayfr
+		#region void cgGLSetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [In] float* matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (float) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [In] float* matrices);
+		#endregion void cgGLSetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, const float* matrices)
+
+		#region void cgGLSetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [In] float[] matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (float) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [In] float[] matrices);
+		#endregion void cgGLSetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, const float[] matrices)
+
+		#region void cgGLSetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [In] IntPtr matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (float) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [In] IntPtr matrices);
+		#endregion void cgGLSetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, const IntPtr matrices)
+		#endregion cgGLSetMatrixParameterArrayfr
+
+		#region cgGLSetMatrixParameterArraydr
+		#region void cgGLSetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [In] double* matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (double) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLSetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [In] double* matrices);
+		#endregion void cgGLSetMatrixParameterArraydr(IntPtr param, int offset, int nelements, const double* matrices)
+
+		#region void cgGLSetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [In] double[] matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (double) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [In] double[] matrices);
+		#endregion void cgGLSetMatrixParameterArraydr(IntPtr param, int offset, int nelements, const double[] matrices)
+
+		#region void cgGLSetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [In] IntPtr matrices)
+		/// <summary>
+		/// Sets an array matrix parameters (double) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to be set.</param>
+		/// <param name="offset">An offset into the array parameter to start setting from.</param>
+		/// <param name="nelements">The number of elements to set. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values to set the parameter to. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [In] IntPtr matrices);
+		#endregion void cgGLSetMatrixParameterArraydr(IntPtr param, int offset, int nelements, const IntPtr matrices)
+		#endregion cgGLSetMatrixParameterArraydr
+		#endregion
+
+		#region cgGLGetMatrixParameterArray
+		#region cgGLGetMatrixParameterArrayfc
+		#region void cgGLGetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [Out] float* matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (float) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [Out] float* matrices);
+		#endregion void cgGLGetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, const float* matrices)
+
+		#region void cgGLGetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [Out] float[] matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (float) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [Out] float[] matrices);
+		#endregion void cgGLGetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, const float[] matrices)
+
+		#region void cgGLGetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [Out] IntPtr matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (float) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, [Out] IntPtr matrices);
+		#endregion void cgGLGetMatrixParameterArrayfc(IntPtr param, int offset, int nelements, const IntPtr matrices)
+
+		#endregion cgGLGetMatrixParameterArrayfc
+
+		#region cgGLGetMatrixParameterArraydc
+
+		#region void cgGLGetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [Out] double* matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (double) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [Out] double* matrices);
+		#endregion void cgGLGetMatrixParameterArraydc(IntPtr param, int offset, int nelements, const double* matrices)
+
+		#region void cgGLGetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [Out] double[] matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (double) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [Out] double[] matrices);
+		#endregion void cgGLGetMatrixParameterArraydc(IntPtr param, int offset, int nelements, const double[] matrices)
+
+		#region void cgGLGetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [Out] IntPtr matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (double) in column order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterArraydc(IntPtr param, int offset, int nelements, [Out] IntPtr matrices);
+		#endregion void cgGLGetMatrixParameterArraydc(IntPtr param, int offset, int nelements, const IntPtr matrices)
+		#endregion cgGLGetMatrixParameterArraydc
+
+
+		#region cgGLGetMatrixParameterArrayfr
+		#region void cgGLGetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [Out] float* matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (float) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [Out] float* matrices);
+		#endregion void cgGLGetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, const float* matrices)
+
+		#region void cgGLGetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [Out] float[] matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (float) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [Out] float[] matrices);
+		#endregion void cgGLGetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, const float[] matrices)
+
+		#region void cgGLGetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [Out] IntPtr matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (float) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, [Out] IntPtr matrices);
+		#endregion void cgGLGetMatrixParameterArrayfr(IntPtr param, int offset, int nelements, const IntPtr matrices)
+		#endregion cgGLGetMatrixParameterArrayfr
+
+		#region cgGLGetMatrixParameterArraydr
+		#region void cgGLGetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [Out] double* matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (double) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+		public unsafe static extern void cgGLGetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [Out] double* matrices);
+		#endregion void cgGLGetMatrixParameterArraydr(IntPtr param, int offset, int nelements, const double* matrices)
+
+		#region void cgGLGetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [Out] double[] matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (double) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [Out] double[] matrices);
+		#endregion void cgGLGetMatrixParameterArraydr(IntPtr param, int offset, int nelements, const double[] matrices)
+
+		#region void cgGLGetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [Out] IntPtr matrices)
+		/// <summary>
+		/// Gets an array matrix parameters (double) in row order.
+		/// </summary>
+		/// <param name="param">Parameter to get data from.</param>
+		/// <param name="offset">An offset into the array parameter to start getting from.</param>
+		/// <param name="nelements">The number of elements to get. A value of 0 will default to the number of elements in the array minus the offset value.</param>
+		/// <param name="matrices">The array of values retreived from parameter.. This must be a contiguous set of values that total nelements times the number of elements in the matrix.</param>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLGetMatrixParameterArraydr(IntPtr param, int offset, int nelements, [Out] IntPtr matrices);
+		#endregion void cgGLGetMatrixParameterArraydr(IntPtr param, int offset, int nelements, const IntPtr matrices)
+		#endregion cgGLGetMatrixParameterArraydr
+		#endregion
+		#endregion
+
+		#region Textures Parameter Managment Functions
+		#region void cgGLSetTextureParameter(IntPtr param, int texobj)
+		/// <summary>
+		/// Sets texture object to the specified parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetTextureParameter(IntPtr param, int texobj);
+		#endregion void cgGLSetTextureParameter(IntPtr param, int texobj)
+
+		#region int cgGLGetTextureParameter(IntPtr param)
+		/// <summary>
+		/// Retreives the value of a texture parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGLGetTextureParameter(IntPtr param);
+		#endregion int cgGLGetTextureParameter(IntPtr param)
+
+		#region void cgGLEnableTextureParameter(IntPtr param)
+		/// <summary>
+		/// Enables (binds) the texture unit associated with the given texture parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLEnableTextureParameter(IntPtr param);
+		#endregion void cgGLEnableTextureParameter(IntPtr param)
+
+		#region void cgGLDisableTextureParameter(IntPtr param)
+		/// <summary>
+		/// Disables the texture unit associated with the given texture parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLDisableTextureParameter(IntPtr param);
+		#endregion void cgGLDisableTextureParameter(IntPtr param)
+
+		#region int cgGLGetTextureEnum(IntPtr param)
+		/// <summary>
+		/// Retreives the OpenGL enumeration for the texture unit associated with the texture parameter.
+		/// <remarks>
+		/// Use cgGetNamedParameter to obtain the valid pointer to param.
+		/// It can be one of the GL_TEXTURE#_ARB if valid.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGLGetTextureEnum(IntPtr param);
+		#endregion int cgGLGetTextureEnum(IntPtr param)
+
+		#region void cgGLSetManageTextureParameters(IntPtr context, bool flag)
+		/// <summary>
+		/// Enables or disables the automatic texture management for the given rendering context.
+		/// <remarks>
+		/// Use CG_TRUE or CG_FALSE to enable/disable automatic texture management.
+		/// </remarks>
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetManageTextureParameters(IntPtr context, bool flag);
+		#endregion void cgGLSetManageTextureParameters(IntPtr context, bool flag)
+
+		#region int cgGLGetManageTextureParameters(IntPtr context)
+		/// <summary>
+		/// Retreives the manage texture parameters flag from a context 
+		/// </summary>
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int cgGLGetManageTextureParameters(IntPtr context);
+		#endregion int cgGLGetManageTextureParameters(IntPtr context)
+        
+		#region void cgGLSetupSampler(IntPtr param, int texobj)
+		/// <summary>
+		///  
+		/// </summary>
+		// CGGLDLL_API void cgGLSetupSampler(CGparameter param, GLuint texobj);
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLSetupSampler(IntPtr param, int texobj);
+		#endregion void cgGLSetupSampler(IntPtr param, int texobj)
+
+		#region void cgGLRegisterStates(IntPtr context)
+		/// <summary>
+		///  
+		/// </summary>
+		// CGGLDLL_API void cgGLRegisterStates(CGcontext);
+		[DllImport(CGGL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void cgGLRegisterStates(IntPtr context);
+		#endregion void cgGLRegisterStates(IntPtr context)
+		#endregion
+	}
+}
diff --git a/src/Tao.Cg/ChangeLog b/src/Tao.Cg/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Cg/INSTALL b/src/Tao.Cg/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Cg/Makefile.am b/src/Tao.Cg/Makefile.am
new file mode 100644
index 0000000..529fd70
--- /dev/null
+++ b/src/Tao.Cg/Makefile.am
@@ -0,0 +1,19 @@
+
+ASSEMBLY = Tao.Cg
+SHORTNAME = tao-cg
+VERSION = @TAOCG_VERSION@
+MAJOR = @TAOCG_MAJOR@
+
+PACKAGES =
+BINARY_LIBS =
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        Cg.cs \
+        CgGl.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.Cg/Makefile.in b/src/Tao.Cg/Makefile.in
new file mode 100644
index 0000000..8d2169e
--- /dev/null
+++ b/src/Tao.Cg/Makefile.in
@@ -0,0 +1,415 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-cg.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.Cg
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-cg.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOCG_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.Cg
+SHORTNAME = tao-cg
+MAJOR = @TAOCG_MAJOR@
+PACKAGES = 
+BINARY_LIBS = 
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        Cg.cs \
+        CgGl.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.Cg/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.Cg/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-cg.pc: $(top_builddir)/config.status $(srcdir)/tao-cg.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.Cg/NEWS b/src/Tao.Cg/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Cg/Properties/AssemblyInfo.cs b/src/Tao.Cg/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..518bcef
--- /dev/null
+++ b/src/Tao.Cg/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.Cg")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework Cg Binding For .NET")]
+[assembly: AssemblyFileVersion("2.0.0.0")]
+[assembly: AssemblyInformationalVersion("2.0.0.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.Cg.dll")]
+[assembly: AssemblyTitle("Tao Framework Cg Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("2.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.Cg/README b/src/Tao.Cg/README
new file mode 100644
index 0000000..e48c2de
--- /dev/null
+++ b/src/Tao.Cg/README
@@ -0,0 +1,18 @@
+Tao.Cg 1.2.1.3
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.Cg is a Cg API binding for .NET, implementing Cg 1.2.1.
+
+
+Change Log:
+2.0.0.0 - January 2008
+    Updated DLL's to 2.0
+
+1.4.1.0 - June 2006:
+    Updated to Cg 1.4.1 by David Hudson
+
+1.2.1.0 - April 20, 2004:
+    Initial release.  Special thanks to Chris McGuirk for doing most of this
+    implementation.
diff --git a/src/Tao.Cg/Tao.Cg.csproj b/src/Tao.Cg/Tao.Cg.csproj
new file mode 100644
index 0000000..b9803fa
--- /dev/null
+++ b/src/Tao.Cg/Tao.Cg.csproj
@@ -0,0 +1,101 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{723454BE-6A6B-4D52-B0A0-F4B0ED4F8C49}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.Cg</AssemblyName>
+    <AssemblyOriginatorKeyFile>../Tao.Cg/Tao.Cg.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.Cg</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Cg.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Cg.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Cg.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="CgGl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.Cg.dll.config" />
+    <None Include="Tao.Cg.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.Cg/Tao.Cg.dll.config b/src/Tao.Cg/Tao.Cg.dll.config
new file mode 100644
index 0000000..b22c402
--- /dev/null
+++ b/src/Tao.Cg/Tao.Cg.dll.config
@@ -0,0 +1,9 @@
+<configuration>
+    <dllmap dll="cg.dll" os="windows" target="cg.dll" />
+    <dllmap dll="cg.dll" os="osx" target="/Library/Frameworks/Cg.framework/Cg" />
+    <dllmap dll="cg.dll" os="!windows,osx" target="libCg.so" />
+
+    <dllmap dll="cgGL.dll" os="windows" target="cgGL.dll" />
+    <dllmap dll="cgGL.dll" os="osx" target="/Library/Frameworks/Cg.framework/Cg" />
+    <dllmap dll="cgGL.dll" os="!windows,osx" target="libCgGL.so" />
+</configuration>
diff --git a/src/Tao.Cg/Tao.Cg.snk b/src/Tao.Cg/Tao.Cg.snk
new file mode 100644
index 0000000..faf0bad
Binary files /dev/null and b/src/Tao.Cg/Tao.Cg.snk differ
diff --git a/src/Tao.Cg/tao-cg.pc.in b/src/Tao.Cg/tao-cg.pc.in
new file mode 100644
index 0000000..e189738
--- /dev/null
+++ b/src/Tao.Cg/tao-cg.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.Cg
+Description: CG portion of the Tao framework
+Version: @TAOCG_VERSION@
+Requires:
+Libs: -r:${libdir}/mono/tao-cg- at TAOCG_MAJOR@/Tao.Cg.dll
+
diff --git a/src/Tao.DevIl/AUTHORS b/src/Tao.DevIl/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.DevIl/COPYING b/src/Tao.DevIl/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.DevIl/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.DevIl/ChangeLog b/src/Tao.DevIl/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.DevIl/INSTALL b/src/Tao.DevIl/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.DevIl/Il.cs b/src/Tao.DevIl/Il.cs
new file mode 100644
index 0000000..524cf07
--- /dev/null
+++ b/src/Tao.DevIl/Il.cs
@@ -0,0 +1,2108 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+#region Aliases
+using ILHANDLE = System.IntPtr;
+//typedef unsigned int   ILenum;
+using ILenum = System.Int32;
+//typedef unsigned char  ILboolean;
+using ILboolean = System.Boolean;
+//typedef unsigned int   ILbitfield;
+using ILbitfield = System.UInt32;
+//typedef char           ILbyte;
+using ILbyte = System.Byte;
+//typedef short          ILshort;
+using ILshort = System.Int16;
+//typedef int            ILint;
+using ILint = System.Int32;
+//typedef int            ILsizei;
+using ILsizei = System.Int32;
+//typedef unsigned char  ILubyte;
+using ILubyte = System.Byte;
+//typedef unsigned short ILushort;
+using ILushort = System.UInt16;
+//typedef unsigned int   ILuint;
+using ILuint = System.Int32;
+//typedef float          ILfloat;
+using ILfloat = System.Single;
+//typedef float          ILclampf;
+using ILclampf = System.Single;
+//typedef double         ILdouble;
+using ILdouble = System.Double;
+//typedef double         ILclampd;
+using ILclampd = System.Double;
+//typedef void           ILvoid;
+//using ILvoid = void;
+using ILstring = System.String;
+#endregion Aliases
+
+namespace Tao.DevIl
+{
+    #region Class Documentation
+    /// <summary>
+    ///     DevIL (Developer's Image Library) IL binding for .NET, implementing DevIL 1.6.8 RC2.
+    /// </summary>
+    #endregion Class Documentation
+    public static class Il
+    {
+        // --- Fields ---
+        #region Private Constants
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Winapi" />.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Winapi;
+        #endregion CallingConvention CALLING_CONVENTION
+        #region string DEVIL_NATIVE_LIBRARY
+        /// <summary>
+        /// Specifies the DevIL native library used in the bindings
+        /// </summary>
+        /// <remarks>
+        /// The Windows dll is specified here universally - note that
+        /// under Mono the non-windows native library can be mapped using
+        /// the ".config" file mechanism.  Kudos to the Mono team for this
+        /// simple yet elegant solution.
+        /// </remarks>
+        private const string DEVIL_NATIVE_LIBRARY = "DevIL.dll";
+        #endregion string DEVIL_NATIVE_LIBRARY
+        #endregion Private Constants
+
+        #region Public Constants
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_FALSE = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TRUE = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_COLOUR_INDEX = 0x1900;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_COLOR_INDEX = 0x1900;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_RGB = 0x1907;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_RGBA = 0x1908;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_BGR = 0x80E0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_BGRA = 0x80E1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_LUMINANCE = 0x1909;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_LUMINANCE_ALPHA = 0x190A;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_BYTE = 0x1400;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_UNSIGNED_BYTE = 0x1401;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_SHORT = 0x1402;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_UNSIGNED_SHORT = 0x1403;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_INT = 0x1404;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_UNSIGNED_INT = 0x1405;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_FLOAT = 0x1406;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_DOUBLE = 0x140A;
+        /// <summary>
+        /// Describes the OpenIL vendor and should be used only with ilGetString
+        /// </summary>
+        public const int IL_VENDOR = 0x1F00;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_LOAD_EXT = 0x1F01;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_SAVE_EXT = 0x1F02;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_VERSION_1_6_8 = 1;
+        /// <summary>
+        /// Used to retrive a string describing the current OpenIL version.
+        /// </summary>
+        public const int IL_VERSION = 168;
+        /// <summary>
+        /// Preserves the origin state set by ilOriginFunc.
+        /// </summary>
+        public const int IL_ORIGIN_BIT = 0x00000001;
+        /// <summary>
+        /// Preserves whether OpenIL is allowed to overwrite files when saving (set by ilEnable, ilDisable).
+        /// </summary>
+        public const int IL_FILE_BIT = 0x00000002;
+        /// <summary>
+        /// d to truecolour images (set by <see cref="ilEnable"/>, <see cref="ilDisable"/>).
+        /// </summary>
+        public const int IL_PAL_BIT = 0x00000004;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_FORMAT_BIT = 0x00000008;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TYPE_BIT = 0x00000010;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_COMPRESS_BIT = 0x00000020;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_LOADFAIL_BIT = 0x00000040;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_FORMAT_SPECIFIC_BIT = 0x00000080;
+        /// <summary>
+        /// Preserves all OpenIL states and attributes.
+        /// </summary>
+        public const int IL_ALL_ATTRIB_BITS = 0x000FFFFF;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PAL_NONE = 0x0400;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PAL_RGB24 = 0x0401;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PAL_RGB32 = 0x0402;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PAL_RGBA32 = 0x0403;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PAL_BGR24 = 0x0404;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PAL_BGR32 = 0x0405;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PAL_BGRA32 = 0x0406;
+        /// <summary>
+        /// Tells OpenIL to try to determine the type of image present in FileName, File or Lump.
+        /// </summary>
+        public const int IL_TYPE_UNKNOWN = 0x0000;
+        /// <summary>
+        /// Microsoft bitmap .
+        /// </summary>
+        public const int IL_BMP = 0x0420;
+        /// <summary>
+        /// Dr. Halo .cut image.
+        /// </summary>
+        public const int IL_CUT = 0x0421;
+        /// <summary>
+        /// Doom texture.
+        /// </summary>
+        public const int IL_DOOM = 0x0422;
+        /// <summary>
+        /// Doom flat (floor).
+        /// </summary>
+        public const int IL_DOOM_FLAT = 0x0423;
+        /// <summary>
+        /// Microsoft icon (.ico).
+        /// </summary>
+        public const int IL_ICO = 0x0424;
+        /// <summary>
+        /// Jpeg.
+        /// </summary>
+        public const int IL_JPG = 0x0425;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_JFIF = 0x0425;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_LBM = 0x0426;
+        /// <summary>
+        /// Kodak PhotoCD image.
+        /// </summary>
+        public const int IL_PCD = 0x0427;
+        /// <summary>
+        ///  .pcx Image.
+        /// </summary>
+        public const int IL_PCX = 0x0428;
+        /// <summary>
+        /// Softimage Pic image.
+        /// </summary>
+        public const int IL_PIC = 0x0429;
+        /// <summary>
+        /// Portable Network Graphics (.png) image.
+        /// </summary>
+        public const int IL_PNG = 0x042A;
+        /// <summary>
+        /// Portable AnyMap (.pbm, .pgm or .ppm).
+        /// </summary>
+        public const int IL_PNM = 0x042B;
+        /// <summary>
+        /// SGI (.bw, .rgb, .rgba or .sgi).
+        /// </summary>
+        public const int IL_SGI = 0x042C;
+        /// <summary>
+        /// TrueVision Targa.
+        /// </summary>
+        public const int IL_TGA = 0x042D;
+        /// <summary>
+        /// TIFF (.tif or .tiff) image.
+        /// </summary>
+        public const int IL_TIF = 0x042E;
+        /// <summary>
+        /// C Header.
+        /// </summary>
+        public const int IL_CHEAD = 0x042F;
+        /// <summary>
+        /// Raw data with a 13-byte header.
+        /// </summary>
+        public const int IL_RAW = 0x0430;
+        /// <summary>
+        /// Half-Life model file (.mdl).
+        /// </summary>
+        public const int IL_MDL = 0x0431;
+        /// <summary>
+        /// Quake .wal texture.
+        /// </summary>
+        public const int IL_WAL = 0x0432;
+        /// <summary>
+        /// Homeworld image.
+        /// </summary>
+        public const int IL_LIF = 0x0434;
+        /// <summary>
+        /// Load a Multiple Network Graphics (.mng).
+        /// </summary>
+        public const int IL_MNG = 0x0435;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_JNG = 0x0435;
+        /// <summary>
+        /// Graphics Interchange Format file.
+        /// </summary>
+        public const int IL_GIF = 0x0436;
+        /// <summary>
+        /// DirectDraw Surface image.
+        /// </summary>
+        public const int IL_DDS = 0x0437;
+        /// <summary>
+        /// .dcx image.
+        /// </summary>
+        public const int IL_DCX = 0x0438;
+        /// <summary>
+        /// PhotoShop (.psd) file.
+        /// </summary>
+        public const int IL_PSD = 0x0439;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_EXIF = 0x043A;
+        /// <summary>
+        /// Paint Shop Pro file.
+        /// </summary>
+        public const int IL_PSP = 0x043B;
+        /// <summary>
+        /// Alias | Wavefront .pix file.
+        /// </summary>
+        public const int IL_PIX = 0x043C;
+        /// <summary>
+        /// Pxrar (.pxr) file.
+        /// </summary>
+        public const int IL_PXR = 0x043D;
+        /// <summary>
+        /// .xpm file.
+        /// </summary>
+        public const int IL_XPM = 0x043E;
+        /// <summary>
+        /// RADIANCE High Dynamic Range Image.
+        /// </summary>
+        public const int IL_HDR = 0x043F;
+        /// <summary>
+        /// Load the file into the current image's palette as a Paint Shop Pro (Jasc) palette.
+        /// </summary>
+        public const int IL_JASC_PAL = 0x0475;
+        /// <summary>
+        /// No detectable error has occured.
+        /// </summary>
+        public const int IL_NO_ERROR = 0x0000;
+        /// <summary>
+        /// An invalid value have been used, which was not part of the set of values that can be used. In the function documentation there should be a more specific descriptionanation.
+        /// </summary>
+        public const int IL_INVALID_ENUM = 0x0501;
+        /// <summary>
+        /// Could not allocate enough memory for the image data.
+        /// </summary>
+        public const int IL_OUT_OF_MEMORY = 0x0502;
+        /// <summary>
+        /// The format a function tried to use was not able to be used by that function.
+        /// </summary>
+        public const int IL_FORMAT_NOT_SUPPORTED = 0x0503;
+        /// <summary>
+        /// A serious error has occurred.
+        /// </summary>
+        public const int IL_INTERNAL_ERROR = 0x0504;
+        /// <summary>
+        /// An invalid value was passed to a function or was in a file.
+        /// </summary>
+        public const int IL_INVALID_VALUE = 0x0505;
+        /// <summary>
+        /// The operation attempted is not allowable in the current state. The function returns with no ill side effects. Generally there is currently no image bound or it has been deleted via ilDeleteImages. You should use ilGenImages and ilBindImage before calling the function.
+        /// </summary>
+        public const int IL_ILLEGAL_OPERATION = 0x0506;
+        /// <summary>
+        /// An illegal value was found in a file trying to be loaded.
+        /// </summary>
+        public const int IL_ILLEGAL_FILE_VALUE = 0x0507;
+        /// <summary>
+        ///  	s header was incorrect.
+        /// </summary>
+        public const int IL_INVALID_FILE_HEADER = 0x0508;
+        /// <summary>
+        /// An invalid value have been used, which was not part of the set of values that can be used. In the function documentation there should be a more specific descriptionanation.
+        /// </summary>
+        public const int IL_INVALID_PARAM = 0x0509;
+        /// <summary>
+        /// Could not open the file specified. The file may already be open by another app or may not exist.
+        /// </summary>
+        public const int IL_COULD_NOT_OPEN_FILE = 0x050A;
+        /// <summary>
+        /// The extension of the specified filename was not correct for the type of image-loading function.
+        /// </summary>
+        public const int IL_INVALID_EXTENSION = 0x050B;
+        /// <summary>
+        /// The filename specified already belongs to another file. To overwrite files by default read more at ilEnable function.
+        /// </summary>
+        public const int IL_FILE_ALREADY_EXISTS = 0x050C;
+        /// <summary>
+        /// Tried to convert an image from its format to the same format.
+        /// </summary>
+        public const int IL_OUT_FORMAT_SAME = 0x050D;
+        /// <summary>
+        /// One of the internal stacks was already filled, and the user tried to add on to the full stack.
+        /// </summary>
+        public const int IL_STACK_OVERFLOW = 0x050E;
+        /// <summary>
+        /// One of the internal stacks was empty, and the user tried to empty the already empty stack.
+        /// </summary>
+        public const int IL_STACK_UNDERFLOW = 0x050F;
+        /// <summary>
+        /// During a conversion destination format and/or dest type was an invalid identifier. In the function documentation there should be a more specific descriptionanation.
+        /// </summary>
+        public const int IL_INVALID_CONVERSION = 0x0510;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_BAD_DIMENSIONS = 0x0511;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_FILE_READ_ERROR = 0x0512;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_FILE_WRITE_ERROR = 0x0512;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_LIB_GIF_ERROR = 0x05E1;
+        /// <summary>
+        /// An error occurred in the libjpeg library.
+        /// </summary>
+        public const int IL_LIB_JPEG_ERROR = 0x05E2;
+        /// <summary>
+        /// An error occurred in the libpng library.
+        /// </summary>
+        public const int IL_LIB_PNG_ERROR = 0x05E3;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_LIB_TIFF_ERROR = 0x05E4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_LIB_MNG_ERROR = 0x05E5;
+        /// <summary>
+        /// No function sets this yet, but it is possible (not probable) it may be used in the future.
+        /// </summary>
+        public const int IL_UNKNOWN_ERROR = 0x05FF;
+        /// <summary>
+        /// nabled, the origin is specified at an absolute position, and all images loaded or saved adhere to this set origin. For more information, check out ilOriginFunc.
+        /// </summary>
+        public const int IL_ORIGIN_SET = 0x0600;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_ORIGIN_LOWER_LEFT = 0x0601;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_ORIGIN_UPPER_LEFT = 0x0602;
+        /// <summary>
+        /// Returns the current origin position.
+        /// </summary>
+        public const int IL_ORIGIN_MODE = 0x0603;
+        /// <summary>
+        /// Returns whether all images loaded are converted to a specific format.
+        /// </summary>
+        public const int IL_FORMAT_SET = 0x0610;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_FORMAT_MODE = 0x0611;
+        /// <summary>
+        /// Returns whether all images loaded are converted to a specific type.
+        /// </summary>
+        public const int IL_TYPE_SET = 0x0612;
+        /// <summary>
+        /// Returns the type images are converted to upon loading.
+        /// </summary>
+        public const int IL_TYPE_MODE = 0x0613;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_FILE_OVERWRITE = 0x0620;
+        /// <summary>
+        /// Returns whether file overwriting when saving is enabled.
+        /// </summary>
+        public const int IL_FILE_MODE = 0x0621;
+        /// <summary>
+        /// d images to their base types, e.g. converting to a bgra image.
+        /// </summary>
+        public const int IL_CONV_PAL = 0x0630;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_DEFAULT_ON_FAIL = 0x0632;
+        /// <summary>
+        /// Returns whether OpenIL uses a key colour (not used yet).
+        /// </summary>
+        public const int IL_USE_KEY_COLOUR = 0x0635;
+        /// <summary>
+        /// Returns whether OpenIL uses a key colour (not used yet).
+        /// </summary>
+        public const int IL_USE_KEY_COLOR = 0x0635;
+        /// <summary>
+        /// /
+        /// </summary>
+        public const int IL_SAVE_INTERLACED = 0x0639;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_INTERLACE_MODE = 0x063A;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_QUANTIZATION_MODE = 0x0640;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_WU_QUANT = 0x0641;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_NEU_QUANT = 0x0642;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_NEU_QUANT_SAMPLE = 0x0643;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_MAX_QUANT_INDEXS = 0x0644;
+        /// <summary>
+        /// Makes the target use a faster but more memory-intensive algorithm.
+        /// </summary>
+        public const int IL_FASTEST = 0x0660;
+        /// <summary>
+        /// Makes the target use less memory but a potentially slower algorithm.
+        /// </summary>
+        public const int IL_LESS_MEM = 0x0661;
+        /// <summary>
+        /// The client does not have a preference.
+        /// </summary>
+        public const int IL_DONT_CARE = 0x0662;
+        /// <summary>
+        /// Controls the memory used vs. speed tradeoff.
+        /// </summary>
+        public const int IL_MEM_SPEED_HINT = 0x0665;
+        /// <summary>
+        /// Specifies that OpenIL should use compression when saving, if possible.
+        /// </summary>
+        public const int IL_USE_COMPRESSION = 0x0666;
+        /// <summary>
+        /// Specifies that OpenIL should never use compression when saving.
+        /// </summary>
+        public const int IL_NO_COMPRESSION = 0x0667;
+        /// <summary>
+        /// Controls whether compression is used when saving images.
+        /// </summary>
+        public const int IL_COMPRESSION_HINT = 0x0668;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_SUB_NEXT = 0x0680;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_SUB_MIPMAP = 0x0681;
+
+        /// <summary>
+        /// /
+        /// </summary>
+        public const int IL_SUB_LAYER = 0x0682;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_COMPRESS_MODE = 0x0700;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_COMPRESS_NONE = 0x0701;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_COMPRESS_RLE = 0x0702;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_COMPRESS_LZO = 0x0703;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_COMPRESS_ZLIB = 0x0704;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TGA_CREATE_STAMP = 0x0710;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_JPG_QUALITY = 0x0711;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PNG_INTERLACE = 0x0712;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TGA_RLE = 0x0713;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_BMP_RLE = 0x0714;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_SGI_RLE = 0x0715;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TGA_ID_STRING = 0x0717;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TGA_AUTHNAME_STRING = 0x0718;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TGA_AUTHCOMMENT_STRING = 0x0719;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PNG_AUTHNAME_STRING = 0x071A;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PNG_TITLE_STRING = 0x071B;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PNG_DESCRIPTION_STRING = 0x071C;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TIF_DESCRIPTION_STRING = 0x071D;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TIF_HOSTCOMPUTER_STRING = 0x071E;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TIF_DOCUMENTNAME_STRING = 0x071F;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_TIF_AUTHNAME_STRING = 0x0720;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_JPG_SAVE_FORMAT = 0x0721;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_CHEAD_HEADER_STRING = 0x0722;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PCD_PICNUM = 0x0723;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PNG_ALPHA_INDEX = 0x0724;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_DXTC_FORMAT = 0x0705;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_DXT1 = 0x0706;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_DXT2 = 0x0707;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_DXT3 = 0x0708;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_DXT4 = 0x0709;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_DXT5 = 0x070A;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_DXT_NO_COMP = 0x070B;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_KEEP_DXTC_DATA = 0x070C;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_DXTC_DATA_FORMAT = 0x070D;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_3DC = 0x070E;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_RXGB = 0x070F;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_ATI1N = 0x0710;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_CUBEMAP_POSITIVEX = 0x00000400;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_CUBEMAP_NEGATIVEX = 0x00000800;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_CUBEMAP_POSITIVEY = 0x00001000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_CUBEMAP_NEGATIVEY = 0x00002000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_CUBEMAP_POSITIVEZ = 0x00004000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_CUBEMAP_NEGATIVEZ = 0x00008000;
+        /// <summary>
+        /// Returns the version number of the shared library. This can be checked against the IL_VERSION #define.
+        /// </summary>
+        public const int IL_VERSION_NUM = 0x0DE2;
+        /// <summary>
+        /// s width.
+        /// </summary>
+        public const int IL_IMAGE_WIDTH = 0x0DE4;
+        /// <summary>
+        /// s height.
+        /// </summary>
+        public const int IL_IMAGE_HEIGHT = 0x0DE5;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_DEPTH = 0x0DE6;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_SIZE_OF_DATA = 0x0DE7;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_BPP = 0x0DE8;
+        /// <summary>
+        /// s data.
+        /// </summary>
+        public const int IL_IMAGE_BYTES_PER_PIXEL = 0x0DE8;
+        /// <summary>
+        /// s data.
+        /// </summary>
+        public const int IL_IMAGE_BITS_PER_PIXEL = 0x0DE9;
+        /// <summary>
+        /// Returns the current image format.
+        /// </summary>
+        public const int IL_IMAGE_FORMAT = 0x0DEA;
+        /// <summary>
+        /// Returns the current images type.
+        /// </summary>
+        public const int IL_IMAGE_TYPE = 0x0DEB;
+        /// <summary>
+        /// Returns the palette type of the current image.
+        /// </summary>
+        public const int IL_PALETTE_TYPE = 0x0DEC;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PALETTE_SIZE = 0x0DED;
+        /// <summary>
+        /// Returns the bytes per pixel of the current images palette.
+        /// </summary>
+        public const int IL_PALETTE_BPP = 0x0DEE;
+        /// <summary>
+        /// Returns the number of colours of the current images palette.
+        /// </summary>
+        public const int IL_PALETTE_NUM_COLS = 0x0DEF;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_PALETTE_BASE_TYPE = 0x0DF0;
+        /// <summary>
+        /// Returns the number of images in the current image animation chain.
+        /// </summary>
+        public const int IL_NUM_IMAGES = 0x0DF1;
+        /// <summary>
+        /// Returns the number of mipmaps of the current image.
+        /// </summary>
+        public const int IL_NUM_MIPMAPS = 0x0DF2;
+        /// <summary>
+        /// /
+        /// </summary>
+        public const int IL_NUM_LAYERS = 0x0DF3;
+        /// <summary>
+        /// Returns the current image number.
+        /// </summary>
+        public const int IL_ACTIVE_IMAGE = 0x0DF4;
+        /// <summary>
+        /// Returns the current mipmap number.
+        /// </summary>
+        public const int IL_ACTIVE_MIPMAP = 0x0DF5;
+        /// <summary>
+        /// Returns the current layer number.
+        /// </summary>
+        public const int IL_ACTIVE_LAYER = 0x0DF6;
+        /// <summary>
+        /// Returns the current bound image name.
+        /// </summary>
+        public const int IL_CUR_IMAGE = 0x0DF7;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_DURATION = 0x0DF8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_PLANESIZE = 0x0DF9;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_BPC = 0x0DFA;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_OFFX = 0x0DFB;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_OFFY = 0x0DFC;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_CUBEFLAGS = 0x0DFD;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_ORIGIN = 0x0DFE;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_IMAGE_CHANNELS = 0x0DFF;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_SEEK_SET = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_SEEK_CUR = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_SEEK_END = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int IL_EOF = -1;
+
+        #endregion Public Constants
+
+        #region Delegates
+
+        // Callback functions for file reading
+        //typedef ILvoid    (ILAPIENTRY *fCloseRProc)(ILHANDLE);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="handle"></param>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void fCloseRProc(ILHANDLE handle);
+        //typedef ILboolean (ILAPIENTRY *fEofProc)   (ILHANDLE);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="handle"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILboolean fEofProc(ILHANDLE handle);
+        //typedef ILint     (ILAPIENTRY *fGetcProc)  (ILHANDLE);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="handle"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILint fGetcProc(ILHANDLE handle);
+        //typedef ILHANDLE  (ILAPIENTRY *fOpenRProc) (const ILstring);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILHANDLE fOpenRProc(ILstring str);
+        //typedef ILint     (ILAPIENTRY *fReadProc)  (void*, ILuint, ILuint, ILHANDLE);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="ptr"></param>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <param name="handle"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILint fReadProc(IntPtr ptr, ILuint a, ILuint b, ILHANDLE handle);
+        //typedef ILint     (ILAPIENTRY *fSeekRProc) (ILHANDLE, ILint, ILint);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="handle"></param>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILint fSeekRProc(ILHANDLE handle, ILint a, ILint b);
+        //typedef ILint     (ILAPIENTRY *fTellRProc) (ILHANDLE);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="handle"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILint fTellRProc(ILHANDLE handle);
+
+        // Callback functions for file writing
+        //typedef ILvoid   (ILAPIENTRY *fCloseWProc)(ILHANDLE);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="handle"></param>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void fCloseWProc(ILHANDLE handle);
+        //typedef ILHANDLE (ILAPIENTRY *fOpenWProc) (const ILstring);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILHANDLE fOpenWProc(ILstring str);
+        //typedef ILint    (ILAPIENTRY *fPutcProc)  (ILubyte, ILHANDLE);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="byt"></param>
+        /// <param name="handle"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILint fPutcProc(ILubyte byt, ILHANDLE handle);
+        //typedef ILint    (ILAPIENTRY *fSeekWProc) (ILHANDLE, ILint, ILint);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="handle"></param>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILint fSeekWProc(ILHANDLE handle, ILint a, ILint b);
+        //typedef ILint    (ILAPIENTRY *fTellWProc) (ILHANDLE);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="handle"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILint fTellWProc(ILHANDLE handle);
+        //typedef ILint    (ILAPIENTRY *fWriteProc) (const void*, ILuint, ILuint, ILHANDLE);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="ptr"></param>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <param name="handle"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILint fWriteProc(IntPtr ptr, ILuint a, ILuint b, ILHANDLE handle);
+
+        // Callback functions for allocation and deallocation
+        //typedef ILvoid* (ILAPIENTRY *mAlloc)(ILuint);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="a"></param>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void mAlloc(ILuint a);
+        //typedef ILvoid  (ILAPIENTRY *mFree) (ILvoid*);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="ptr"></param>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void mFree(IntPtr ptr);
+
+        // Registered format procedures
+        //typedef ILenum (ILAPIENTRY *IL_LOADPROC)(const ILstring);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILenum IL_LOADPROC(ILstring str);
+        //typedef ILenum (ILAPIENTRY *IL_SAVEPROC)(const ILstring);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate ILenum IL_SAVEPROC(ILstring str);
+
+        #endregion Delegates
+
+        #region Externs
+
+        // ImageLib Functions
+        /// <summary>
+        /// ilActiveImage sets the current image to be an image in an animation chain
+        /// </summary>
+        /// <param name="Number">Animation numer to select as current.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilActiveImage(ILuint Number);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilActiveImage(ILuint Number);
+
+        /// <summary>
+        /// ilActiveLayer is not yet used.
+        /// </summary>
+        /// <param name="Number">Layer number to select as current.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilActiveLayer(ILuint Number);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilActiveLayer(ILuint Number);
+
+        /// <summary>
+        /// ilActiveMipmap sets a mipmap of the image as the current mipmap. Currently, the only way to generate mipmaps is by calling iluBuildMipmaps. If neither function has been called for the current image, no mipmaps exist for it. If Number is 0, then the current base image is set.
+        /// </summary>
+        /// <param name="Number">Mipmap level to select as current.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilActiveMipmap(ILuint Number);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilActiveMipmap(ILuint Number);
+
+        // ILAPI ILboolean ILAPIENTRY ilApplyPal(const ILstring FileName);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="FileName"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilApplyPal(ILstring FileName);
+
+        /// <summary>
+        /// iluApplyProfile applies a colour profile (files with extension .icm) to the currently bound image. InProfile describes the current image's colour space, and OutProfile describes the colour space to convert the currently bound image to. If InProfile is NULL, DevIL attempts to use the colour profile present in the image, if one is present, else it returns IL_FALSE.
+        /// </summary>
+        /// <param name="InProfile">Profile file describing the colour space the image is in.</param>
+        /// <param name="OutProfile">Profile file describing the colour space to convert the image to.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilApplyProfile(ILstring InProfile, ILstring OutProfile);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilApplyProfile(ILstring InProfile, ILstring OutProfile);
+
+        /// <summary>
+        /// s, with zero being reserved as the default image. The default image is generated by ilCreateDefaultTex. The only reason the default image would be NULL is if OpenIL could not create the default image, due to memory constraints of the system, so always heed the IL_OUT_OF_MEMORY error. Any dimension image may be bound with ilBindImage. When ilBindImage is called, the bound image remains bound until ilBindImage is called again with a different value in Image.
+        /// </summary>
+        /// <param name="Image">The name of an image.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilBindImage(ILuint Image);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilBindImage(ILuint Image);
+
+        // ILAPI ILboolean ILAPIENTRY ilBlit(ILuint Source, ILint DestX, ILint DestY, ILint DestZ, ILuint SrcX, ILuint SrcY, ILuint SrcZ, ILuint Width, ILuint Height, ILuint Depth);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Source"></param>
+        /// <param name="DestX"></param>
+        /// <param name="DestY"></param>
+        /// <param name="DestZ"></param>
+        /// <param name="SrcX"></param>
+        /// <param name="SrcY"></param>
+        /// <param name="SrcZ"></param>
+        /// <param name="Width"></param>
+        /// <param name="Height"></param>
+        /// <param name="Depth"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilBlit(ILuint Source, ILint DestX, ILint DestY, ILint DestZ, ILuint SrcX, ILuint SrcY, ILuint SrcZ, ILuint Width, ILuint Height, ILuint Depth);
+
+        /// <summary>
+        /// ilClearColour sets the current clearing colour to be used by future calls to ilClearImage. iluRotate and iluEnlargeCanvas both use these values to clear blank space in images, too.
+        /// </summary>
+        /// <param name="Red">Amount of red to clear to.</param>
+        /// <param name="Green">Amount of green to clear to.</param>
+        /// <param name="Blue">Amount of blue to clear to.</param>
+        /// <param name="Alpha">Amount of alpha to clear to.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilClearColour(ILclampf Red, ILclampf Green, ILclampf Blue, ILclampf Alpha);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilClearColour(ILclampf Red, ILclampf Green, ILclampf Blue, ILclampf Alpha);
+
+        /// <summary>
+        /// ilClearImage simply clears the image to the colours specified in ilClearColour. If the current image is of format IL_COLOR_INDEX, the image is cleared to all zeros, and the palette is changed to one entry of all zeros. If the current image is of format IL_LUMINANCE, the image is cleared to all zeros.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilClearImage(ILvoid);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilClearImage();
+
+        /// <summary>
+        /// ilCloneCurImage creates a copy of the current image and returns the id of the new image. If a subimage of the current image is currently selected via ilActiveImage, ilActiveLayer or ilActiveMipmap, the subimage is copied, not the base image.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILuint    ILAPIENTRY ilCloneCurImage(ILvoid);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint ilCloneCurImage();
+
+        // ILAPI ILboolean ILAPIENTRY ilCompressFunc(ILenum Mode);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Mode"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilCompressFunc(ILenum Mode);
+
+        /// <summary>
+        /// ilConvertImage converts the current bound image from its format/type to DestFormat and DestType. Almost all conversions are allowable.
+        /// </summary>
+        /// <param name="DestFormat">The format the current image should be converted to.</param>
+        /// <param name="DestType">The type the current image should be converted to.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilConvertImage(ILenum DestFormat, ILenum DestType);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilConvertImage(ILenum DestFormat, ILenum DestType);
+
+        /// <summary>
+        /// ilIsImage returns whether the image name in Image is a valid image in use. If the image name in Image is in use, ilIsImage returns IL_TRUE. If Image is 0, ilIsImage returns IL_FALSE, because the default image is a special image and is never returned by ilGenImages. If the image name has been deleted by ilDeleteImages or never generated byilGenImages, IL_FALSE is returned.
+        /// </summary>
+        /// <param name="DestFormat">The format the current image palette should be converted to. Accepted Values are: <see cref="IL_PAL_RGB24"/>, <see cref="IL_PAL_RGB32"/>, <see cref="IL_PAL_RGBA32"/>, <see cref="IL_PAL_BGR24"/>, <see cref="IL_PAL_BGR32"/>, <see cref="IL_PAL_BGRA32"/>.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilConvertPal(ILenum DestFormat);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilConvertPal(ILenum DestFormat);
+
+        /// <summary>
+        /// ilCopyImage copies the attributes and data from the image named in Src. The same image bound before calling ilCopyImage remains bound afterward.
+        /// </summary>
+        /// <param name="Src">Name of an image to copy to the current image.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilCopyImage(ILuint Src);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilCopyImage(ILuint Src);
+
+        // ILAPI ILuint    ILAPIENTRY ilCopyPixels(ILuint XOff, ILuint YOff, ILuint ZOff, ILuint Width, ILuint Height, ILuint Depth, ILenum Format, ILenum Type, ILvoid *Data);
+        /// <summary>
+        /// s width, height or depth number of pixels will be copied to Data.
+        /// </summary>
+        /// <param name="XOff">Where to begin copying pixels from in the x direction.</param>
+        /// <param name="YOff">Where to begin copying pixels from in the y direction.</param>
+        /// <param name="ZOff">Where to begin copying pixels from in the z direction.</param>
+        /// <param name="Width">How many pixels to copy in the x direction.</param>
+        /// <param name="Height">How many pixels to copy in the y direction.</param>
+        /// <param name="Depth">How many pixels to copy in the z direction.</param>
+        /// <param name="Format">The desired format the output should be.</param>
+        /// <param name="Type">The desired type the output should be.</param>
+        /// <param name="Data">User-defined buffer to copy the image data to.</param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint ilCopyPixels(ILuint XOff, ILuint YOff, ILuint ZOff, ILuint Width, ILuint Height, ILuint Depth, ILenum Format, ILenum Type, IntPtr Data);
+
+        // ILAPI ILuint    ILAPIENTRY ilCreateSubImage(ILenum Type, ILuint Num);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Type"></param>
+        /// <param name="Num"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint ilCreateSubImage(ILenum Type, ILuint Num);
+
+        /// <summary>
+        /// ilDefaultImage creates an ugly 64x64 image of 8x8 black and yellow squares to form a checkerboard pattern. In future versions of OpenIL, there may be an option that will load this image if an image-loading function failed (unless memory could not be allocated). This way, the user can easily tell if an image was not loaded. Plus, the calling program can continue normally, even though it will have an ugly image.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilDefaultImage(ILvoid);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilDefaultImage();
+
+        // ILAPI ILvoid    ILAPIENTRY ilDeleteImage(const ILuint Num);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Num"></param>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilDeleteImage(ILuint Num);
+
+        /// <summary>
+        /// ilDeleteImages deletes Num image names specified in Image. After a texture is deleted, its characteristics and dimensions are undefined, and the name may be reused byilGenImages. ilDeleteImages ignores zeros and out-of-bounds image names. If the current image is deleted, the binding reverts to the default image (image name of 0).
+        /// </summary>
+        /// <param name="Num">Number of image names to delete.</param>
+        /// <param name="Image">Pointer to image names to delete.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilDeleteImages(ILsizei Num, const ILuint *Images);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilDeleteImages(ILsizei Num, ref ILuint Image);
+
+        /// <summary>
+        /// ilDeleteImages deletes Num image names specified in Images. After a texture is deleted, its characteristics and dimensions are undefined, and the name may be reused byilGenImages. ilDeleteImages ignores zeros and out-of-bounds image names. If the current image is deleted, the binding reverts to the default image (image name of 0).
+        /// </summary>
+        /// <param name="Num">Number of image names to delete.</param>
+        /// <param name="Images">Pointer to image names to delete.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilDeleteImages(ILsizei Num, const ILuint *Images);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilDeleteImages(ILsizei Num, ILuint[] Images);
+
+        /// <summary>
+        /// s OpenGL counterpart glDisable.
+        /// </summary>
+        /// <param name="Mode">Mode to disable.</param>
+        /// <returns></returns>
+        /// <remarks>
+        /// <para><see cref="IL_CONV_PAL"/> - When enabled, OpenIL automatically converts palette'd images to their base types, e.g. converting to a bgra image.</para>
+        /// <para><see cref="IL_FILE_OVERWRITE"/> - If enabled while saving, OpenIL will overwrite existing files, else <see cref="IL_FILE_ALREADY_EXISTS"/> is set, and the image is not saved.</para>
+        /// <para><see cref="IL_ORIGIN_SET"/> - When enabled, the origin is specified at an absolute position, and all images loaded or saved adhere to this set origin. For more information, check out <see cref="ilOriginFunc"/>. </para>
+        /// </remarks>
+        // ILAPI ILboolean ILAPIENTRY ilDisable(ILenum Mode);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilDisable(ILenum Mode);
+
+        /// <summary>
+        /// s OpenGL counterpart glEnable.
+        /// </summary>
+        /// <param name="Mode">Mode to enable.</param>
+        /// <returns></returns>
+        /// <remarks>
+        /// <para><see cref="IL_CONV_PAL"/> - When enabled, OpenIL automatically converts palette'd images to their base types, e.g. converting to a bgra image.</para>
+        /// <para><see cref="IL_FILE_OVERWRITE"/> - If enabled while saving, OpenIL will overwrite existing files, else <see cref="IL_FILE_ALREADY_EXISTS"/> is set, and the image is not saved.</para>
+        /// <para><see cref="IL_ORIGIN_SET"/> - When enabled, the origin is specified at an absolute position, and all images loaded or saved adhere to this set origin. For more information, check out <see cref="ilOriginFunc"/>. </para>
+        /// </remarks>
+        // ILAPI ILboolean ILAPIENTRY ilEnable(ILenum Mode);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilEnable(ILenum Mode);
+
+        // ILAPI ILboolean ILAPIENTRY ilFormatFunc(ILenum Mode);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Mode"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilFormatFunc(ILenum Mode);
+
+        /// <summary>
+        /// ilGenImages stores Num image names in Images. The names stored are not necessarily contiguous, and names can have been deleted via ilDeleteImages beforehand. The image names stored in Images can be used with ilBindImage after calling ilGenImages. After calling ilGenImages, all image dimensions and features are undefined.
+        /// </summary>
+        /// <param name="Num">Number of image names to generate.</param>
+        /// <param name="Images">Pointer in which the generated image names are stored.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilGenImages(ILsizei Num, ILuint *Images);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilGenImages(ILsizei Num, out ILuint Images);
+
+        /// <summary>
+        /// ilGenImages stores Num image names in Images. The names stored are not necessarily contiguous, and names can have been deleted via ilDeleteImages beforehand. The image names stored in Images can be used with ilBindImage after calling ilGenImages. After calling ilGenImages, all image dimensions and features are undefined.
+        /// </summary>
+        /// <param name="Num">Number of image names to generate.</param>
+        /// <param name="Images">Pointer in which the generated image names are stored.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilGenImages(ILsizei Num, ILuint *Images);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilGenImages(ILsizei Num, [Out] ILuint[] Images);
+
+        // ILAPI ILint		ILAPIENTRY ilGenImage();
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILint ilGenImage();
+
+        // ILAPI ILubyte*  ILAPIENTRY ilGetAlpha(ILenum Type);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Type"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilGetAlpha(ILenum Type);
+
+        /// <summary>
+        /// ilGetBoolean returns the value of a selected mode.
+        /// </summary>
+        /// <param name="Mode">The mode value to be returned.</param>
+        /// <returns></returns>
+        /// <remarks>
+        /// <para><see cref="IL_ACTIVE_IMAGE"/> - Returns the current image number.</para>
+        /// <para><see cref="IL_ACTIVE_LAYER"/> - Returns the current layer number.</para>
+        /// <para><see cref="IL_ACTIVE_MIPMAP"/> - Returns the current mipmap number..</para>
+        /// <para><see cref="IL_CONV_PAL"/> - Returns whether palette'd images are converted to their base palettes types on load - e.g. converted to a bgra image.</para>
+        /// <para><see cref="IL_CUR_IMAGE"/> - Returns the current bound image name.</para>
+        /// <para><see cref="IL_FILE_MODE"/> - Returns whether file overwriting when saving is enabled.</para>
+        /// <para><see cref="IL_FORMAT_MODE"/> - Returns the format images are converted to upon loading.</para>
+        /// <para><see cref="IL_FORMAT_SET"/> - Returns whether all images loaded are converted to a specific format.</para>
+        /// <para><see cref="IL_IMAGE_BITS_PER_PIXEL"/> - Returns the bits per pixel of the current image's data.</para>
+        /// <para><see cref="IL_IMAGE_BYTES_PER_PIXEL"/> - Returns the bytes per pixel of the current image's data.</para>
+        /// <para><see cref="IL_IMAGE_FORMAT"/> - Returns the current image's format.</para>
+        /// <para><see cref="IL_IMAGE_HEIGHT"/> - Returns the current image's height.</para>
+        /// <para><see cref="IL_IMAGE_TYPE"/> - Returns the current image's type.</para>
+        /// <para><see cref="IL_IMAGE_WIDTH"/> - Returns the current image's width.</para>
+        /// <para><see cref="IL_NUM_IMAGES"/> - Returns the number of images in the current image animation chain.</para>
+        /// <para><see cref="IL_NUM_MIPMAPS"/> - Returns the number of mipmaps of the current image.</para>
+        /// <para><see cref="IL_ORIGIN_MODE"/> - Returns the current origin position.</para>
+        /// <para><see cref="IL_ORIGIN_SET"/> - Returns whether all images loaded and saved adhere to a specific origin.</para>
+        /// <para><see cref="IL_PALETTE_BPP"/> - Returns the bytes per pixel of the current image's palette.</para>
+        /// <para><see cref="IL_PALETTE_NUM_COLS"/> - Returns the number of colours of the current image's palette.</para>
+        /// <para><see cref="IL_PALETTE_TYPE"/> - Returns the palette type of the current image.</para>
+        /// <para><see cref="IL_TYPE_MODE"/> - Returns the type images are converted to upon loading.</para>
+        /// <para><see cref="IL_TYPE_SET"/> - Returns whether all images loaded are converted to a specific type.</para>
+        /// <para><see cref="IL_USE_KEY_COLOUR"/> - Returns whether OpenIL uses a key colour (not used yet).</para>
+        /// <para><see cref="IL_VERSION_NUM"/> - Returns the version number of the shared library. This can be checked against the <see cref="IL_VERSION"/> #define.</para>
+        /// </remarks>
+        // ILAPI ILboolean ILAPIENTRY ilGetBoolean(ILenum Mode);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilGetBoolean(ILenum Mode);
+
+        /// <summary>
+        /// ilGetBooleanv function returns the mode value in the Param parameter.
+        /// </summary>
+        /// <param name="Mode">The mode value to be returned.</param>
+        /// <param name="Param">Array where the values are stored</param>
+        /// <remarks>
+        /// <para><see cref="IL_ACTIVE_IMAGE"/> - Returns the current image number.</para>
+        /// <para><see cref="IL_ACTIVE_LAYER"/> - Returns the current layer number.</para>
+        /// <para><see cref="IL_ACTIVE_MIPMAP"/> - Returns the current mipmap number..</para>
+        /// <para><see cref="IL_CONV_PAL"/> - Returns whether palette'd images are converted to their base palettes types on load - e.g. converted to a bgra image.</para>
+        /// <para><see cref="IL_CUR_IMAGE"/> - Returns the current bound image name.</para>
+        /// <para><see cref="IL_FILE_MODE"/> - Returns whether file overwriting when saving is enabled.</para>
+        /// <para><see cref="IL_FORMAT_MODE"/> - Returns the format images are converted to upon loading.</para>
+        /// <para><see cref="IL_FORMAT_SET"/> - Returns whether all images loaded are converted to a specific format.</para>
+        /// <para><see cref="IL_IMAGE_BITS_PER_PIXEL"/> - Returns the bits per pixel of the current image's data.</para>
+        /// <para><see cref="IL_IMAGE_BYTES_PER_PIXEL"/> - Returns the bytes per pixel of the current image's data.</para>
+        /// <para><see cref="IL_IMAGE_FORMAT"/> - Returns the current image's format.</para>
+        /// <para><see cref="IL_IMAGE_HEIGHT"/> - Returns the current image's height.</para>
+        /// <para><see cref="IL_IMAGE_TYPE"/> - Returns the current image's type.</para>
+        /// <para><see cref="IL_IMAGE_WIDTH"/> - Returns the current image's width.</para>
+        /// <para><see cref="IL_NUM_IMAGES"/> - Returns the number of images in the current image animation chain.</para>
+        /// <para><see cref="IL_NUM_MIPMAPS"/> - Returns the number of mipmaps of the current image.</para>
+        /// <para><see cref="IL_ORIGIN_MODE"/> - Returns the current origin position.</para>
+        /// <para><see cref="IL_ORIGIN_SET"/> - Returns whether all images loaded and saved adhere to a specific origin.</para>
+        /// <para><see cref="IL_PALETTE_BPP"/> - Returns the bytes per pixel of the current image's palette.</para>
+        /// <para><see cref="IL_PALETTE_NUM_COLS"/> - Returns the number of colours of the current image's palette.</para>
+        /// <para><see cref="IL_PALETTE_TYPE"/> - Returns the palette type of the current image.</para>
+        /// <para><see cref="IL_TYPE_MODE"/> - Returns the type images are converted to upon loading.</para>
+        /// <para><see cref="IL_TYPE_SET"/> - Returns whether all images loaded are converted to a specific type.</para>
+        /// <para><see cref="IL_USE_KEY_COLOUR"/> - Returns whether OpenIL uses a key colour (not used yet).</para>
+        /// <para><see cref="IL_VERSION_NUM"/> - Returns the version number of the shared library. This can be checked against the <see cref="IL_VERSION"/> #define.</para>
+        /// </remarks>
+        // ILAPI ILvoid    ILAPIENTRY ilGetBooleanv(ILenum Mode, ILboolean *Param);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilGetBooleanv(ILenum Mode, out ILboolean Param);
+
+        /// <summary>
+        /// s data to allow direct access and modification to the contents of the image.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILubyte*  ILAPIENTRY ilGetData(ILvoid);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilGetData();
+
+        // ILAPI ILuint    ILAPIENTRY ilGetDXTCData(ILvoid *Buffer, ILuint BufferSize, ILenum DXTCFormat);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Buffer"></param>
+        /// <param name="BufferSize"></param>
+        /// <param name="DXTCFormat"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint ilGetDXTCData(IntPtr Buffer, ILuint BufferSize, ILenum DXTCFormat);
+
+        /// <summary>
+        /// Errors that occur in ILU and ILUT are also reported through ilGetError. ilGetError only returns something other than IL_NO_ERROR if detectable errors have occurred.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILenum    ILAPIENTRY ilGetError(ILvoid);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILenum ilGetError();
+
+        /// <summary>
+        /// ilGetInteger returns the value of a selected mode.
+        /// </summary>
+        /// <param name="Mode">The mode value to be returned.</param>
+        /// <returns></returns>
+        // ILAPI ILint     ILAPIENTRY ilGetInteger(ILenum Mode);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILint ilGetInteger(ILenum Mode);
+
+        /// <summary>
+        /// ilGetIntegerv function returns the mode value in the Param parameter.
+        /// </summary>
+        /// <param name="Mode">The mode value to be returned.</param>
+        /// <param name="Param">Array where the values are stored</param>
+        // ILAPI ILvoid    ILAPIENTRY ilGetIntegerv(ILenum Mode, ILint *Param);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilGetIntegerv(ILenum Mode, out ILint Param);
+
+        /// <summary>
+        /// ilGetIntegerv function returns the mode value in the Param parameter.
+        /// </summary>
+        /// <param name="Mode">The mode value to be returned.</param>
+        /// <param name="Param">Array where the values are stored</param>
+        // ILAPI ILvoid    ILAPIENTRY ilGetIntegerv(ILenum Mode, ILint *Param);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilGetIntegerv(ILenum Mode, [Out] ILint[] Param);
+
+        // ILAPI ILuint    ILAPIENTRY ilGetLumpPos(ILvoid);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint ilGetLumpPos();
+
+        /// <summary>
+        /// ilGetPalette returns an unsigned byte pointer to the current bound image's palette (if one exists) to allow direct access and modification to the contents of the palette.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILubyte*  ILAPIENTRY ilGetPalette(ILvoid);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilGetPalette();
+
+        /// <summary>
+        /// ilGetString returns a constant human-readable string describing the current OpenIL implementation.
+        /// </summary>
+        /// <param name="StringName">Describes the string to be retrieved.</param>
+        /// <returns></returns>
+        // ILAPI ILstring  ILAPIENTRY ilGetString(ILenum StringName);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILstring ilGetString(ILenum StringName);
+
+        /// <summary>
+        /// s behaviour, in order to optimize either speed, memory, compression or quality, depending wholly on what the user desires.
+        /// </summary>
+        /// <param name="Target">An enum indicating what behaviour of the library is to be controlled.</param>
+        /// <param name="Mode">The desired behaviour.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilHint(ILenum Target, ILenum Mode);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilHint(ILenum Target, ILenum Mode);
+
+        /// <summary>
+        /// ilInit starts DevIL and must be called prior to using DevIL, or else DevIL will probably crash when you attempt to use it.
+        /// </summary>
+        // ILAPI ILvoid    ILAPIENTRY ilInit(ILvoid);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilInit();
+
+        /// <summary>
+        /// ilIsDisabled returns whether the mode indicated by Mode is disabled.
+        /// </summary>
+        /// <param name="Mode">Indicates an OpenIL mode</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilIsDisabled(ILenum Mode);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilIsDisabled(ILenum Mode);
+
+        /// <summary>
+        /// ilIsEnabled returns whether the mode indicated by Mode is enabled.
+        /// </summary>
+        /// <param name="Mode">Indicates an OpenIL mode</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilIsEnabled(ILenum Mode);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilIsEnabled(ILenum Mode);
+
+        /// <summary>
+        /// ilIsImage returns whether the image name in Image is a valid image in use. If the image name in Image is in use, ilIsImage returns IL_TRUE. If Image is 0, ilIsImage returns IL_FALSE, because the default image is a special image and is never returned by ilGenImages. If the image name has been deleted by ilDeleteImages or never generated byilGenImages, IL_FALSE is returned.
+        /// </summary>
+        /// <param name="Image">An image name.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilIsImage(ILuint Image);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilIsImage(ILuint Image);
+
+        // ILAPI ILboolean ILAPIENTRY ilIsValid(ILenum Type, ILstring FileName);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Type"></param>
+        /// <param name="FileName"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilIsValid(ILenum Type, ILstring FileName);
+
+        // ILAPI ILboolean ILAPIENTRY ilIsValidF(ILenum Type, ILHANDLE File);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Type"></param>
+        /// <param name="File"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilIsValidF(ILenum Type, ILHANDLE File);
+
+        // ILAPI ILboolean ILAPIENTRY ilIsValidL(ILenum Type, ILvoid *Lump, ILuint Size);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Type"></param>
+        /// <param name="Lump"></param>
+        /// <param name="Size"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilIsValidL(ILenum Type, IntPtr Lump, ILuint Size);
+
+        // ILAPI ILboolean ILAPIENTRY ilIsValidL(ILenum Type, ILvoid *Lump, ILuint Size);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Type"></param>
+        /// <param name="Lump"></param>
+        /// <param name="Size"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilIsValidL(ILenum Type, byte[] Lump, ILuint Size);
+
+        // ILAPI ILvoid    ILAPIENTRY ilKeyColour(ILclampf Red, ILclampf Green, ILclampf Blue, ILclampf Alpha);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Red"></param>
+        /// <param name="Green"></param>
+        /// <param name="Blue"></param>
+        /// <param name="Alpha"></param>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilKeyColour(ILclampf Red, ILclampf Green, ILclampf Blue, ILclampf Alpha);
+
+        /// <summary>
+        /// ilLoad can be used much in the same way ilLoadImage is used, except with ilLoad, it is possible to force OpenIL to load a file as a specific image format, no matter what the extension.
+        /// </summary>
+        /// <param name="Type">Format Specification</param>
+        /// <param name="FileName">File to load the image</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilLoad(ILenum Type, const ILstring FileName);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoad(ILenum Type, ILstring FileName);
+
+        /// <summary>
+        /// ilLoadF loads an image from a previously opened file
+        /// </summary>
+        /// <param name="Type">Image format</param>
+        /// <param name="File">Pointer to a previous opened file</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilLoadF(ILenum Type, ILHANDLE File);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoadF(ILenum Type, ILHANDLE File);
+
+        /// <summary>
+        /// The ilLoadImage function allows a general interface to the specific internal file-loading routines. The approach ilLoadImage takes toward determining image types is three-pronged. First, it finds the extension and checks to see if any user-registered functions (registered through ilRegisterLoad) match the extension. If nothing matches, it takes the extension and determines which function to call based on it. Lastly, it attempts to identify the image based on various image hea [...]
+        /// </summary>
+        /// <param name="FileName">Specifies which file to load an image from.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilLoadImage(const ILstring FileName);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoadImage(ILstring FileName);
+
+        /// <summary>
+        /// ilLoadL loads an image from a memory lump
+        /// </summary>
+        /// <param name="Type">Image format</param>
+        /// <param name="Lump">Lump Address</param>
+        /// <param name="Size">Lump size</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilLoadL(ILenum Type, const ILvoid *Lump, ILuint Size);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoadL(ILenum Type, IntPtr Lump, ILuint Size);
+
+        /// <summary>
+        /// ilLoadL loads an image from a memory lump
+        /// </summary>
+        /// <param name="Type">Image format</param>
+        /// <param name="Lump">Lump Address</param>
+        /// <param name="Size">Lump size</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilLoadL(ILenum Type, const ILvoid *Lump, ILuint Size);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoadL(ILenum Type, byte[] Lump, ILuint Size);
+
+        /// <summary>
+        /// ilLoadPal simply loads a palette from the file specified by FileName into the current bound image's palette. If the current bound image is not of type IL_COLOR_INDEX, the palette is not used, but it is loaded nonetheless. ilLoadPal can load .col, Halo and Jasc PSP palette files.
+        /// </summary>
+        /// <param name="FileName">Filename to load the palette data from.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilLoadPal(const ILstring FileName);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoadPal(ILstring FileName);
+
+        // ILAPI ILvoid    ILAPIENTRY ilModAlpha( ILdouble AlphaValue );
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="AlphaValue"></param>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilModAlpha(ILdouble AlphaValue);
+
+        /// <summary>
+        /// ilOriginFunc sets the origin to be used when loading all images, so that any image with a different origin will be flipped to have the set origin. This behaviour is actually disabled by default but can be enabled using ilEnable with the IL_ORIGIN_SET parameter.
+        /// </summary>
+        /// <param name="Mode">Specifies the origin to be used</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilOriginFunc(ILenum Mode);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern byte ilOriginFunc(ILenum Mode);
+
+        /// <summary>
+        /// The ilOverlayImage function copies the image named by Src onto the current bound image. XCoord, YCoord and ZCoord are allowed to be any number, even negative numbers, for if you want to start copying Src in the middle of it to the current image's left side. If the image named by Src has alpha components, then blending will occur, instead of just a simple overlay.
+        /// </summary>
+        /// <param name="Source">The image to copy.</param>
+        /// <param name="XCoord">The starting x position of the current image to copy Src to.</param>
+        /// <param name="YCoord">The starting y position of the current image to copy Src to.</param>
+        /// <param name="ZCoord">The starting z position of the current image to copy Src to.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilOverlayImage(ILuint Source, ILint XCoord, ILint YCoord, ILint ZCoord);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilOverlayImage(ILuint Source, ILint XCoord, ILint YCoord, ILint ZCoord);
+
+        /// <summary>
+        /// ilPopAttrib pops the last pushed stack entry off the stack and copies the bits specified when pushed by ilPushAttrib to the previous set of states.
+        /// </summary>
+        // ILAPI ILvoid    ILAPIENTRY ilPopAttrib(ILvoid);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilPopAttrib();
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Bits">Attribute bits to push.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilPushAttrib(ILuint Bits);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilPushAttrib(ILuint Bits);
+
+        /// <summary>
+        /// ilRegisterFormat tells OpenIL what format the current registered image is in. This function is to be used from within functions that have been registered via ilRegisterLoad
+        /// </summary>
+        /// <param name="Format">The format that the registered image is in.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilRegisterFormat(ILenum Format);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilRegisterFormat(ILenum Format);
+
+        /// <summary>
+        /// ilRegisterLoad allows the user to register functions for use by OpenIL, when loading unknown image types. The user can also override the default internal loading functions by passing their extension in Ext when using ilLoadImage. ilRegisterLoad allows the user to use their own loading functions while using OpenIL's capabilities, or to extend OpenIL when it does not support a specific image format
+        /// </summary>
+        /// <param name="Ext">Extension of the image type to load</param>
+        /// <param name="Load">Pointer to a loading function</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilRegisterLoad(const ILstring Ext, IL_LOADPROC Load);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilRegisterLoad(ILstring Ext, IL_LOADPROC Load);
+
+        /// <summary>
+        /// ilRegisterMipNum tells OpenIL the number of mipmaps the current image has. The mipmaps can then be chosen and modified via ilActiveMipmap. This function is to be used from within functions that have been registered via ilRegisterLoad.
+        /// </summary>
+        /// <param name="Num">Number of mipmaps to create.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilRegisterMipNum(ILuint Num);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilRegisterMipNum(ILuint Num);
+
+        /// <summary>
+        /// ilRegisterNumImages tells OpenIL the number of images in the current image's animation chain. The "next" images can then be chosen and modified via ilActiveImage. This function is to be used from within functions that have been registered via ilRegisterLoad.
+        /// </summary>
+        /// <param name="Num">Number of images in the animation chain to create.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilRegisterNumImages(ILuint Num);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilRegisterNumImages(ILuint Num);
+
+        /// <summary>
+        /// ilRegisterFormat tells OpenIL what format the current registered image is in. This function is to be used from within functions that have been registered via ilRegisterLoad
+        /// </summary>
+        /// <param name="Origin">The new Origin of the image</param>
+        // ILAPI ILvoid    ILAPIENTRY ilRegisterOrigin(ILenum Origin);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilRegisterOrigin(ILenum Origin);
+
+        /// <summary>
+        /// The ilRegisterPal function registers the current image's palette.
+        /// </summary>
+        /// <param name="Pal">Pointer to palette to be copied to the current image</param>
+        /// <param name="Size">Size of Pal in bytes</param>
+        /// <param name="Type">Type of the palette.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilRegisterPal(ILvoid *Pal, ILuint Size, ILenum Type);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilRegisterPal(IntPtr Pal, ILuint Size, ILenum Type);
+
+        /// <summary>
+        /// ilRegisterType tells OpenIL what datatype the current registered image uses. This function is to be used from within functions that have been registered via ilRegisterLoad.
+        /// </summary>
+        /// <param name="Ext">Extension of the image type to save</param>
+        /// <param name="Save">Pointer to a saving function</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilRegisterSave(const ILstring Ext, IL_SAVEPROC Save);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilRegisterSave(ILstring Ext, IL_SAVEPROC Save);
+
+        /// <summary>
+        /// ilRegisterType tells OpenIL what datatype the current registered image uses. This function is to be used from within functions that have been registered via ilRegisterLoad.
+        /// </summary>
+        /// <param name="Type">The type the current image should be converted to.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilRegisterType(ILenum Type);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilRegisterType(ILenum Type);
+
+        /// <summary>
+        /// ilRemoveLoad removes a registered extension handler from the registered load functions list. Use this function when a new handler for an extension needs to be registered.
+        /// </summary>
+        /// <param name="Ext">Extension to remove (e.g. tga).</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilRemoveLoad(const ILstring Ext);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilRemoveLoad(ILstring Ext);
+
+        /// <summary>
+        /// ilRemoveSave removes a registered extension handler from the registered save functions list. Use this function when a new handler for an extension needs to be registered.
+        /// </summary>
+        /// <param name="Ext">Extension to remove (e.g. tga).</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilRemoveSave(const ILstring Ext);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilRemoveSave(ILstring Ext);
+
+        // ILAPI ILvoid    ILAPIENTRY ilResetMemory(ILvoid);
+        /// <summary>
+        /// 
+        /// </summary>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilResetMemory();
+
+        /// <summary>
+        /// ilResetRead resets the reading functions set by ilSetRead.
+        /// </summary>
+        // ILAPI ILvoid    ILAPIENTRY ilResetRead(ILvoid);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilResetRead();
+
+        /// <summary>
+        /// ilResetWrite resets the writing functions set by ilSetWrite.
+        /// </summary>
+        // ILAPI ILvoid    ILAPIENTRY ilResetWrite(ILvoid);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilResetWrite();
+
+        /// <summary>
+        /// ilSave can be used much in the same way ilSaveImage is used, except with ilSave, it is possible to force OpenIL to save a file as a specific image format, no matter what the extension.
+        /// </summary>
+        /// <param name="Type">Image format.</param>
+        /// <param name="FileName">The filename of the file to save to.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilSave(ILenum Type, ILstring FileName);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilSave(ILenum Type, ILstring FileName);
+
+        /// <summary>
+        /// ilSaveF saves an image to a previously opened file
+        /// </summary>
+        /// <param name="Type">Image format</param>
+        /// <param name="File">Pointer to a previous opened file</param>
+        /// <returns></returns>
+        // ILAPI ILuint    ILAPIENTRY ilSaveF(ILenum Type, ILHANDLE File);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint ilSaveF(ILenum Type, ILHANDLE File);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="FileName">Specifies which file to save an image to</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilSaveImage(const ILstring FileName);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilSaveImage(ILstring FileName);
+
+        /// <summary>
+        /// ilSaveL saves an image to a memory lump
+        /// </summary>
+        /// <param name="Type">Image format</param>
+        /// <param name="Lump">Lump Address</param>
+        /// <param name="Size">Lump size</param>
+        /// <returns></returns>
+        // ILAPI ILuint    ILAPIENTRY ilSaveL(ILenum Type, ILvoid *Lump, ILuint Size);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint ilSaveL(ILenum Type, IntPtr Lump, ILuint Size);
+
+        /// <summary>
+        /// ilSaveL saves an image to a memory lump
+        /// </summary>
+        /// <param name="Type">Image format</param>
+        /// <param name="Lump">Lump Address</param>
+        /// <param name="Size">Lump size</param>
+        /// <returns></returns>
+        // ILAPI ILuint    ILAPIENTRY ilSaveL(ILenum Type, ILvoid *Lump, ILuint Size);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint ilSaveL(ILenum Type, byte[] Lump, ILuint Size);
+
+        /// <summary>
+        /// If the current bound image has a palette, ilSavePal saves the current image's palette to the file specified by FileName. Currently, OpenIL only supports saving to Paint Shop Pro .pal files.
+        /// </summary>
+        /// <param name="FileName">Filename to save the palette data to.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilSavePal(const ILstring FileName);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilSavePal(ILstring FileName);
+
+        // ILAPI ILvoid    ILAPIENTRY ilSetAlpha( ILdouble AlphaValue );
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="AlphaValue"></param>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilSetAlpha(ILdouble AlphaValue);
+
+        /// <summary>
+        /// ilSetData just updates the current bound image data (bound by ilBindImage) with new data of the same size. This way new memory does not have to be allocated, so transfers are much faster.
+        /// </summary>
+        /// <param name="Data">Specifies the new image data to update the image with.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilSetData(ILvoid *Data);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilSetData(IntPtr Data);
+
+        /// <summary>
+        /// ilSetDuration allows you to set how long to show the currently bound image. This function can also change the durations of individual images in animation chains.
+        /// </summary>
+        /// <param name="Duration">Number of milliseconds to play the currently bound image.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilSetDuration(ILuint Duration);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilSetDuration(ILuint Duration);
+
+        /// <summary>
+        /// The ilSetInteger function sets the value of a selected mode. it's the ilGetInteger's counterpart
+        /// </summary>
+        /// <param name="Mode">The mode value to be modified.</param>
+        /// <param name="Param">The value to set the mode with.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilSetInteger(ILenum Mode, ILint Param);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilSetInteger(ILenum Mode, ILint Param);
+
+        /// <summary>
+        /// ilSetMemory was created to let DevIL users override the default memory allocation and deallocation functions present in DevIL. This support can be useful if you are using your own optimized memory handler or anything similar.
+        /// </summary>
+        /// <param name="AllocFunc">Specifies a function to override DevIL's allocation function.</param>
+        /// <param name="FreeFunc">Specifies a function to override DevIL's deallocation function.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilSetMemory(mAlloc, mFree);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilSetMemory(mAlloc AllocFunc, mFree FreeFunc);
+
+        /// <summary>
+        /// ilCopyPixels has very simple behaviour. It simply copies a block of pixels from the Data buffer to the current image's data. XOff, YOff and ZOff can be used to skip a certain number of pixels in each respective direction. If XOff + Width, YOff + Height and/or ZOff + Depth is greater than the current image's width, height or depth, only the current image's width, height or depth number of pixels will be copied to the current image's data buffer.
+        /// </summary>
+        /// <param name="XOff">Where to begin copying pixels to in the x direction.</param>
+        /// <param name="YOff">Where to begin copying pixels to in the y direction.</param>
+        /// <param name="ZOff">Where to begin copying pixels to in the z direction.</param>
+        /// <param name="Width">How many pixels to copy in the x direction.</param>
+        /// <param name="Height">How many pixels to copy in the y direction.</param>
+        /// <param name="Depth">How many pixels to copy in the z direction.</param>
+        /// <param name="Format">The format the input is.</param>
+        /// <param name="Type">The type the input is.</param>
+        /// <param name="Data">User-defined buffer to copy the image data to.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilSetPixels(ILint XOff, ILint YOff, ILint ZOff, ILuint Width, ILuint Height, ILuint Depth, ILenum Format, ILenum Type, ILvoid *Data);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilSetPixels(ILint XOff, ILint YOff, ILint ZOff, ILuint Width, ILuint Height, ILuint Depth, ILuint Format, ILuint Type, IntPtr Data);
+
+        /// <summary>
+        ///  datatype ILHANDLE is passed to these functions when used, so any internal datatype used by the differing language (or file handle) can be used.
+        /// </summary>
+        /// <param name="Open">Pointer to a function to open a file.</param>
+        /// <param name="Close">Pointer to a function to close a file.</param>
+        /// <param name="Eof">Pointer to a function that returns IL_TRUE if the end of file is reached.</param>
+        /// <param name="Getc">Pointer to a function to return one byte from a file.</param>
+        /// <param name="Read">Pointer to a function to read multiple bytes from a file.</param>
+        /// <param name="Seek">Pointer to a function to change position in a file.</param>
+        /// <param name="Tell">Pointer to a function to report the position in a file.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilSetRead(fOpenRProc, fCloseRProc, fEofProc, fGetcProc, fReadProc, fSeekRProc, fTellRProc);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilSetRead(fOpenRProc Open, fCloseRProc Close, fEofProc Eof, fGetcProc Getc, fReadProc Read, fSeekRProc Seek, fTellRProc Tell);
+
+        // ILAPI ILvoid    ILAPIENTRY ilSetString(ILenum Mode, const char *String);
+        /// <summary>
+        /// ilSetString gives DevIL users the option to set strings in certain file formats that have fields for strings, making DevIL highly customizable. Choose one of the acceptable parameters for Mode and specify any string you want. If the string is too long, it will be truncated when writing to the file.
+        /// </summary>
+        /// <param name="Mode">Specifies the string to be set.</param>
+        /// <param name="str">String to use for setting a string field of a specified image format.</param>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilSetString(ILenum Mode, string str);
+
+        /// <summary>
+        /// ilSetWrite allows you to override the default DevIL saving functions with your own. You are virtually unlimited in how your functions work, as long as they have the same behaviour as DevIL's default saving functions. All the functions work on the ILHANDLE type, which is a just a void pointer.
+        /// </summary>
+        /// <param name="Open">Pointer to a function to open a file.</param>
+        /// <param name="Close">Pointer to a function to close a file.</param>
+        /// <param name="Putc">Pointer to a function to write one byte to a file.</param>
+        /// <param name="Seek">Pointer to a function to change position in a file.</param>
+        /// <param name="Tell">Pointer to a function to report the position in a file.</param>
+        /// <param name="Write">Pointer to a function to write multiple bytes to a file.</param>
+        // ILAPI ILvoid    ILAPIENTRY ilSetWrite(fOpenWProc, fCloseWProc, fPutcProc, fSeekWProc, fTellWProc, fWriteProc);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilSetWrite(fOpenWProc Open, fCloseWProc Close, fPutcProc Putc, fSeekWProc Seek, fTellWProc Tell, fWriteProc Write);
+
+        // ILAPI ILvoid    ILAPIENTRY ilShutDown(ILvoid);
+        /// <summary>
+        /// 
+        /// </summary>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilShutDown();
+
+        /// <summary>
+        /// Any current image data is destroyed by ilTexImage and replaced by a new image with the attributes specified. The new image data has undefined values. To set the new image data to a certain value, use ilClearImage or ilClearImageTo.
+        /// </summary>
+        /// <param name="Width">Specifies the new image width. This cannot be 0.</param>
+        /// <param name="Height">Specifies the new image height. This cannot be 0.</param>
+        /// <param name="Depth">Specifies the new image depth. Anything greater than 1 will make the image 3d. This cannot be 0.</param>
+        /// <param name="numChannels">Specifies the new channels. Common values are 3 and 4.</param>
+        /// <param name="Format">Specifies the data format this image has. For a list of values this can be, see the See Also section.</param>
+        /// <param name="Type">Specifies the data format this image has. For a list of values this can be, see the See Also section.</param>
+        /// <param name="Data">Specifies data that should be copied to the new image. If this parameter is NULL, no data is copied, and the new image data consists of undefined values.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean ILAPIENTRY ilTexImage(ILuint Width, ILuint Height, ILuint Depth, ILubyte numChannels, ILenum Format, ILenum Type, ILvoid *Data);
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilTexImage(ILuint Width, ILuint Height, ILuint Depth, ILubyte numChannels, ILenum Format, ILenum Type, IntPtr Data);
+
+        // ILAPI ILenum    ILAPIENTRY ilTypeFromExt(const ILstring FileName);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="FileName"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILenum ilTypeFromExt(ILstring FileName);
+
+        // ILAPI ILboolean ILAPIENTRY ilTypeFunc(ILenum Mode);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Mode"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilTypeFunc(ILenum Mode);
+
+        // ILAPI ILboolean ILAPIENTRY ilLoadData(const ILstring FileName, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="FileName"></param>
+        /// <param name="Width"></param>
+        /// <param name="Height"></param>
+        /// <param name="Depth"></param>
+        /// <param name="Bpp"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoadData(ILstring FileName, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp);
+
+        // ILAPI ILboolean ILAPIENTRY ilLoadDataF(ILHANDLE File, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="File"></param>
+        /// <param name="Width"></param>
+        /// <param name="Height"></param>
+        /// <param name="Depth"></param>
+        /// <param name="Bpp"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoadDataF(ILHANDLE File, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp);
+
+        // ILAPI ILboolean ILAPIENTRY ilLoadDataL(ILvoid *Lump, ILuint Size, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Lump"></param>
+        /// <param name="Size"></param>
+        /// <param name="Width"></param>
+        /// <param name="Height"></param>
+        /// <param name="Depth"></param>
+        /// <param name="Bpp"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoadDataL(IntPtr Lump, ILuint Size, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp);
+
+        // ILAPI ILboolean ILAPIENTRY ilLoadDataL(ILvoid *Lump, ILuint Size, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Lump"></param>
+        /// <param name="Size"></param>
+        /// <param name="Width"></param>
+        /// <param name="Height"></param>
+        /// <param name="Depth"></param>
+        /// <param name="Bpp"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoadDataL(byte[] Lump, ILuint Size, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp);
+
+        // ILAPI ILboolean ILAPIENTRY ilSaveData(const ILstring FileName);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="FileName"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilSaveData(ILstring FileName);
+
+        // ILAPI ILboolean ILAPIENTRY ilLoadFromJpegStruct(ILvoid* JpegDecompressorPtr);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="JpegDecompressorPtr"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilLoadFromJpegStruct(IntPtr JpegDecompressorPtr);
+
+        // ILAPI ILboolean ILAPIENTRY ilSaveFromJpegStruct(ILvoid* JpegCompressorPtr);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="JpegCompressorPtr"></param>
+        /// <returns></returns>
+        [DllImport(DEVIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilSaveFromJpegStruct(IntPtr JpegCompressorPtr);
+
+        #endregion Externs
+    }
+}
diff --git a/src/Tao.DevIl/Ilu.cs b/src/Tao.DevIl/Ilu.cs
new file mode 100644
index 0000000..004d7bb
--- /dev/null
+++ b/src/Tao.DevIl/Ilu.cs
@@ -0,0 +1,805 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+#region Aliases
+using ILHANDLE = System.IntPtr;
+//typedef unsigned int   ILenum;
+using ILenum = System.Int32;
+//typedef unsigned char  ILboolean;
+using ILboolean = System.Boolean;
+//typedef unsigned int   ILbitfield;
+using ILbitfield = System.UInt32;
+//typedef char           ILbyte;
+using ILbyte = System.Byte;
+//typedef short          ILshort;
+using ILshort = System.Int16;
+//typedef int            ILint;
+using ILint = System.Int32;
+//typedef int            ILsizei;
+using ILsizei = System.Int32;
+//typedef unsigned char  ILubyte;
+using ILubyte = System.Byte;
+//typedef unsigned short ILushort;
+using ILushort = System.UInt16;
+//typedef unsigned int   ILuint;
+using ILuint = System.Int32;
+//typedef float          ILfloat;
+using ILfloat = System.Single;
+//typedef float          ILclampf;
+using ILclampf = System.Single;
+//typedef double         ILdouble;
+using ILdouble = System.Double;
+//typedef double         ILclampd;
+using ILclampd = System.Double;
+//typedef void           ILvoid;
+//using ILvoid = void;
+using ILstring = System.String;
+#endregion Aliases
+
+namespace Tao.DevIl
+{
+    #region Class Documentation
+    /// <summary>
+    ///     DevIL (Developer's Image Library) ILU binding for .NET.
+    /// </summary>
+    #endregion Class Documentation
+    public static class Ilu
+    {
+        // --- Fields ---
+        #region Private Constants
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Cdecl" /> for Windows and
+        ///     Linux.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+        #endregion CallingConvention CALLING_CONVENTION
+        #region string ILU_NATIVE_LIBRARY
+        /// <summary>
+        /// Specifies the DevIL ILU native library used in the bindings
+        /// </summary>
+        /// <remarks>
+        /// The Windows dll is specified here universally - note that
+        /// under Mono the non-windows native library can be mapped using
+        /// the ".config" file mechanism.  Kudos to the Mono team for this
+        /// simple yet elegant solution.
+        /// </remarks>
+        private const string ILU_NATIVE_LIBRARY = "ILU.dll";
+        #endregion string ILU_NATIVE_LIBRARY
+        #endregion Private Constants
+
+        #region Public Constants
+
+        // #define ILU_VERSION_1_6_8 1
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_VERSION_1_6_8 = 1;
+        // #define ILU_VERSION       168
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_VERSION = 168;
+        // #define ILU_FILTER         0x2600
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_FILTER = 0x2600;
+        // #define ILU_NEAREST        0x2601
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_NEAREST = 0x2601;
+        // #define ILU_LINEAR         0x2602
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_LINEAR = 0x2602;
+        // #define ILU_BILINEAR       0x2603
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_BILINEAR = 0x2603;
+        // #define ILU_SCALE_BOX      0x2604
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_SCALE_BOX = 0x2604;
+        // #define ILU_SCALE_TRIANGLE 0x2605
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_SCALE_TRIANGLE = 0x2605;
+        // #define ILU_SCALE_BELL     0x2606
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_SCALE_BELL = 0x2606;
+        // #define ILU_SCALE_BSPLINE  0x2607
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_SCALE_BSPLINE = 0x2607;
+        // #define ILU_SCALE_LANCZOS3 0x2608
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_SCALE_LANCZOS3 = 0x2608;
+        // #define ILU_SCALE_MITCHELL 0x2609
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_SCALE_MITCHELL = 0x2609;
+        /// <summary>
+        /// A Parameter was invalid or out of range
+        /// </summary>
+        // #define ILU_INVALID_ENUM      0x0501
+        public const int ILU_INVALID_ENUM = 0x0501;
+        /// <summary>
+        /// Could not allocate enough memory in an operation
+        /// </summary>
+        // #define ILU_OUT_OF_MEMORY     0x0502
+        public const int ILU_OUT_OF_MEMORY = 0x0502;
+        /// <summary>
+        /// A serious error has occurred.
+        /// </summary>
+        // #define ILU_INTERNAL_ERROR    0x0504
+        public const int ILU_INTERNAL_ERROR = 0x0504;
+        /// <summary>
+        /// An invalid value was passed to a function or was in a file
+        /// </summary>
+        // #define ILU_INVALID_VALUE     0x0505
+        public const int ILU_INVALID_VALUE = 0x0505;
+        /// <summary>
+        /// 	The operation attempted is not allowable in the current state. The function returns with no ill side effects. Generally there is currently no image bound or it has been deleted via ilDeleteImages. You should use ilGenImages and ilBindImage before calling the function.
+        /// </summary>
+        // #define ILU_ILLEGAL_OPERATION 0x0506
+        public const int ILU_ILLEGAL_OPERATION = 0x0506;
+        /// <summary>
+        /// A Parameter was invalid or out of range
+        /// </summary>
+        // #define ILU_INVALID_PARAM     0x0509
+        public const int ILU_INVALID_PARAM = 0x0509;
+        // #define ILU_PLACEMENT          0x0700
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_PLACEMENT = 0x0700;
+        // #define ILU_LOWER_LEFT         0x0701
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_LOWER_LEFT = 0x0701;
+        // #define ILU_LOWER_RIGHT        0x0702
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_LOWER_RIGHT = 0x0702;
+        // #define ILU_UPPER_LEFT         0x0703
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_UPPER_LEFT = 0x0703;
+        // #define ILU_UPPER_RIGHT        0x0704
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_UPPER_RIGHT = 0x0704;
+        // #define ILU_CENTER             0x0705
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_CENTER = 0x0705;
+        // #define ILU_CONVOLUTION_MATRIX 0x0710
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_CONVOLUTION_MATRIX = 0x0710;
+        // #define ILU_VERSION_NUM IL_VERSION_NUM
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_VERSION_NUM = Il.IL_VERSION_NUM;
+        // #define ILU_VENDOR      IL_VENDOR
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILU_VENDOR = Il.IL_VENDOR;
+
+        #endregion Public Constants
+
+        #region Externs
+
+        /// <summary>
+        /// The story behind this function is actually sorta funny. I had been using a picture of me (contact me if you want it! =) as a test image, and I started working on some colour matrix filters. Well, my first attempt screwed-up, because I had changed the equations to accomodate my bgr image, but I transposed the equations entirely wrong. I got a really neat output, though, where I looked like an alien. =) I decided to keep the screw-up and placed it in iluAlienify. I can't say I' [...]
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluAlienify(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluAlienify();
+
+        /// <summary>
+        /// iluBlurAvg blurs an image using an averaging convolution filter. The filter is applied up to Iter number of times, giving more of a blurring effect the higher Iter is.
+        /// </summary>
+        /// <param name="Iter">Number of iterations of blurring to perform.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluBlurAvg(ILuint Iter);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluBlurAvg(ILuint Iter);
+
+        /// <summary>
+        /// iluBlurGaussian blurs an image using a Gaussian convolution filter, which usually gives better results than the filter used by iluBlurAvg. The filter is applied up to Iter number of times, giving more of a blurring effect the higher Iter is.
+        /// </summary>
+        /// <param name="Iter">Number of iterations of blurring to perform.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluBlurGaussian(ILuint Iter);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluBlurGaussian(ILuint Iter);
+
+        /// <summary>
+        /// iluBuildMipmaps generates power-of-2 mipmaps for an image. If the image does not have power-of-2 dimensions, then the image is resized via iluScale. Mipmaps are then generated for the image, down to a 1x1 image. To use the mipmaps, see ilActiveMipmap.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluBuildMipmaps(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluBuildMipmaps();
+
+        /// <summary>
+        /// iluColoursUsed creates a copy of the image data, quicksorts it and counts the number of unique colours in the image. This value is returned without affecting the original image.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILuint         ILAPIENTRY iluColoursUsed(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint iluColoursUsed();
+
+        /// <summary>
+        /// iluCompareImage compares the current image to the image having the name in Comp. If both images are identical, IL_TRUE is returned. IL_FALSE is returned if the images are not identical. The bound image before calling this function remains the bound image after calling ilCompareImage.
+        /// </summary>
+        /// <param name="Comp">The image to compare with.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluCompareImage(ILuint Comp);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluCompareImage(ILuint Comp);
+
+        /// <summary>
+        /// iluContrast changes the contrast of an image by using interpolation and extrapolation. Common values for Contrast are in the range -0.5 to 1.7. Anything below 0.0 generates a negative of the image with varying contrast. 1.0 outputs the original image. 0.0 - 1.0 lowers the contrast of the image. 1.0 - 1.7 increases the contrast of the image. This effect is caused by interpolating (or extrapolating) the source image with a totally grey image.
+        /// </summary>
+        /// <param name="Contrast">The factor to contrast by</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluContrast(ILfloat Contrast);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluContrast(ILfloat Contrast);
+
+        /// <summary>
+        /// iluCrop "crops" the current image to new dimensions. The new image appears the same as the original, but portions of the image are clipped-off, depending on the values of the parameters of these functions. If XOff + Width, YOff + Height or ZOff + Depth is larger than the current image's dimensions, ILU_ILLEGAL_OPERATION is set. If ZOff is minus or equal to one the crop will be done only on 2 dimensions
+        /// </summary>
+        /// <param name="XOff">Number of pixels to skip in the x direction.</param>
+        /// <param name="YOff">Number of pixels to skip in the y direction.</param>
+        /// <param name="ZOff">Number of pixels to skip in the z direction.</param>
+        /// <param name="Width">Number of pixels to preserve in the x direction.</param>
+        /// <param name="Height">Number of pixels to preserve in the y direction.</param>
+        /// <param name="Depth">Number of pixels to preserve in the z direction.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluCrop(ILuint XOff, ILuint YOff, ILuint ZOff, ILuint Width, ILuint Height, ILuint Depth);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluCrop(ILuint XOff, ILuint YOff, ILuint ZOff, ILuint Width, ILuint Height, ILuint Depth);
+
+        /// <summary>
+        /// iluDeleteImage is a convenience function to delete a single image instead of calling ilDeleteImages
+        /// </summary>
+        /// <param name="Id">The image name to delete</param>
+        // ILAPI ILvoid         ILAPIENTRY iluDeleteImage(ILuint Id);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void iluDeleteImage(ILuint Id);
+
+        /// <summary>
+        /// iluEdgeDetectP detects the edges in the current image by combining two convolution filters. The filters used are Prewitt filters.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluEdgeDetectE(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluEdgeDetectE();
+
+        /// <summary>
+        /// iluEdgeDetectP detects the edges in the current image by combining two convolution filters. The filters used are Prewitt filters.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluEdgeDetectP(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluEdgeDetectP();
+
+        /// <summary>
+        /// iluEdgeDetectS detects the edges in the current image by combining two convolution filters. The filters used are Sobel filters.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluEdgeDetectS(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluEdgeDetectS();
+
+        /// <summary>
+        /// iluEmboss embosses an image, causing it to have a "relief" feel to it using a convolution filter:
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluEmboss(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluEmboss();
+
+        /// <summary>
+        /// iluEnlargeCanvas enlarges the canvas of the current image, clearing the background to the colour specified in ilClearColour. To control the placement of the image, use iluImageParameter
+        /// </summary>
+        /// <param name="Width">New image width - must be larger than the current image's width.</param>
+        /// <param name="Height">New image height - must be larger than the current image's width.</param>
+        /// <param name="Depth">New image depth - must be larger than the current image's width.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluEnlargeCanvas(ILuint Width, ILuint Height, ILuint Depth);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluEnlargeCanvas(ILuint Width, ILuint Height, ILuint Depth);
+
+        // ILAPI ILboolean      ILAPIENTRY iluEnlargeImage(ILfloat XDim, ILfloat YDim, ILfloat ZDim);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="XDim"></param>
+        /// <param name="YDim"></param>
+        /// <param name="ZDim"></param>
+        /// <returns></returns>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluEnlargeImage(ILfloat XDim, ILfloat YDim, ILfloat ZDim);
+
+        // ILAPI ILboolean      ILAPIENTRY iluEqualize(ILvoid);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluEqualize();
+
+        /// <summary>
+        /// iluErrorString returns a human-readable string of the error in Error. This can be useful for displaying the human-readable error in your program to let the user know wtf just happened.
+        /// </summary>
+        /// <param name="Error">Enum that describes the string to be retrieved.</param>
+        /// <returns></returns>
+        // ILAPI ILstring 		 ILAPIENTRY iluErrorString(ILenum Error);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILstring iluErrorString(ILenum Error);
+
+        // ILAPI ILboolean      ILAPIENTRY iluConvolution(ILint *matrix, ILint scale, ILint bias);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="matrix"></param>
+        /// <param name="scale"></param>
+        /// <param name="bias"></param>
+        /// <returns></returns>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluConvolution(ILint[] matrix, ILint scale, ILint bias);
+
+        /// <summary>
+        /// iluFlipImage inverts an image over the x axis. The image will be upside-down after calling this function. If this function is called twice in succession, the image is restored to its original state. A version of this function in OpenIL is used throughout internally when loading images to correct images that would otherwise be upside-down. Using ilOriginFunc will essentially tell the library which way is up.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluFlipImage(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluFlipImage();
+
+        /// <summary>
+        /// reater than 1.0, the image is brightened. It uses interpolation so it's slower then iluGammaCorrectScale
+        /// </summary>
+        /// <param name="Gamma">Gamma correction.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluGammaCorrect(ILfloat Gamma);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluGammaCorrect(ILfloat Gamma);
+
+        /// <summary>
+        /// iluGenImage is a convenience function to delete a single image instead of calling ilGenImages
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILuint         ILAPIENTRY iluGenImage(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint iluGenImage();
+
+        /// <summary>
+        /// The iluGetImageInfo function retrieves information about the current image in an ILinfo struct. This is useful when you are repeatedly calling ilGetInteger and is more efficient in this case.
+        /// </summary>
+        /// <param name="Info">ILinfo struct to receive the image information.</param>
+        // ILAPI ILvoid         ILAPIENTRY iluGetImageInfo(ILinfo *Info);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void iluGetImageInfo(out ILinfo Info);
+
+        /// <summary>
+        /// The iluGetInteger function returns the value of a selected mode
+        /// </summary>
+        /// <param name="Mode">The mode value to be returned.</param>
+        /// <returns></returns>
+        // ILAPI ILint          ILAPIENTRY iluGetInteger(ILenum Mode);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILint iluGetInteger(ILenum Mode);
+
+        /// <summary>
+        /// The iluGetIntegerv function returns the mode value in the Param parameter.
+        /// </summary>
+        /// <param name="Mode">The mode value to be returned.</param>
+        /// <param name="Param">When used, the value is stored here instead of returned..</param>
+        // ILAPI ILvoid         ILAPIENTRY iluGetIntegerv(ILenum Mode, ILint *Param);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void iluGetIntegerv(ILenum Mode, out ILint Param);
+
+        /// <summary>
+        /// iluGetString returns a constant human-readable string describing the current OpenILU implementation.
+        /// </summary>
+        /// <param name="StringName">Enum that describes the string to be retrieved.</param>
+        /// <returns></returns>
+        // ILAPI ILstring 		 ILAPIENTRY iluGetString(ILenum StringName);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILstring iluGetString(ILenum StringName);
+
+        /// <summary>
+        /// iluImageParameter modifies the behaviour of some ilu functions. Right now, it controls the behaviour of iluEnlargeCanvas and iluScale. For ILU_FILTER, values for Param other than ILU_NEAREST, ILU_LINEAR and ILU_BILINEAR are higher-quality scaling filters and take longer to perform.
+        /// </summary>
+        /// <param name="PName">Parameter name</param>
+        /// <param name="Param">Behaviour to use</param>
+        // ILAPI ILvoid         ILAPIENTRY iluImageParameter(ILenum PName, ILenum Param);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void iluImageParameter(ILenum PName, ILenum Param);
+
+        /// <summary>
+        /// iluInit starts ILU and must be called prior to using ILU
+        /// </summary>
+        // ILAPI ILvoid         ILAPIENTRY iluInit(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void iluInit();
+
+        /// <summary>
+        /// iluInvertAlpha inverts the alpha of the currently bound image.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluInvertAlpha(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluInvertAlpha();
+
+        // ILAPI ILuint         ILAPIENTRY iluLoadImage(const ILstring FileName);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="FileName"></param>
+        /// <returns></returns>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILuint iluLoadImage(ILstring FileName);
+
+        /// <summary>
+        /// iluMirror mirrors an image across its y axis, making it appear backwards.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluMirror(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluMirror();
+
+        /// <summary>
+        /// iluNegative creates a negative version of an image, like it was viewed as a picture negative instead of the actual picture. The effect is caused by inverting the image's colours, such as a green pixel would become purple (red-blue).
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluNegative(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluNegative();
+
+        // ILAPI ILboolean      ILAPIENTRY iluNoisify(ILclampf Tolerance);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Tolerance"></param>
+        /// <returns></returns>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluNoisify(ILclampf Tolerance);
+
+        /// <summary>
+        /// iluPixelize performs the effect that can be seen on television, where people want their identity to remain anonymous, so the editors cover the person's face with a very blocky pixelized version. PixSize specifies how blocky the image should be, with 1 being the lowest blockiness (doesn't change the image).
+        /// </summary>
+        /// <param name="PixSize">New pixel size</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluPixelize(ILuint PixSize);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluPixelize(ILuint PixSize);
+
+        // ILAPI ILvoid         ILAPIENTRY iluRegionfv(ILpointf *Points, ILuint n);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Points"></param>
+        /// <param name="n"></param>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void iluRegionfv(ILpointf[] Points, ILuint n);
+
+        // ILAPI ILvoid         ILAPIENTRY iluRegioniv(ILpointi *Points, ILuint n);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Points"></param>
+        /// <param name="n"></param>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void iluRegioniv(ILpointi[] Points, ILuint n);
+
+        // ILAPI ILboolean      ILAPIENTRY iluReplaceColour(ILubyte Red, ILubyte Green, ILubyte Blue, ILfloat Tolerance);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Red"></param>
+        /// <param name="Green"></param>
+        /// <param name="Blue"></param>
+        /// <param name="Tolerance"></param>
+        /// <returns></returns>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluReplaceColour(ILubyte Red, ILubyte Green, ILubyte Blue, ILfloat Tolerance);
+
+        /// <summary>
+        /// iluRotate simply rotates an image about the center by Angle degrees. The background where there is space left by the rotation will be set to the clear colour.
+        /// </summary>
+        /// <param name="Angle">Angle in degrees to rotate the image.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluRotate(ILfloat Angle);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluRotate(ILfloat Angle);
+
+        // ILAPI ILboolean      ILAPIENTRY iluRotate3D(ILfloat x, ILfloat y, ILfloat z, ILfloat Angle);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="z"></param>
+        /// <param name="Angle"></param>
+        /// <returns></returns>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluRotate3D(ILfloat x, ILfloat y, ILfloat z, ILfloat Angle);
+
+        /// <summary>
+        /// iluSaturate1f applies a saturation consistent with the IL_LUMINANCE conversion values to red, green and blue.
+        /// </summary>
+        /// <param name="Saturation">Amount of saturation to apply to the current bound image. the value must go from -1.0 to 1.0</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluSaturate1f(ILfloat Saturation);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluSaturate1f(ILfloat Saturation);
+
+        /// <summary>
+        /// iluScaleColours scales the individual colour components of the current bound image. Using 1.0f as any of the parameters yields that colour component's original plane in the new image.
+        /// </summary>
+        /// <param name="r">Amount of red to use from the original image</param>
+        /// <param name="g">Amount of green to use from the original image</param>
+        /// <param name="b">Amount of blue to use from the original image</param>
+        /// <param name="Saturation"></param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluSaturate4f(ILfloat r, ILfloat g, ILfloat b, ILfloat Saturation);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluSaturate4f(ILfloat r, ILfloat g, ILfloat b, ILfloat Saturation);
+
+        /// <summary>
+        /// The iluScale function scales the image to the new dimensions specified, shrinking or enlarging the image, depending on the image's original dimensions. There are different filters that can be used to scale an image, and which filter to use can be specified via iluImageParameter.
+        /// </summary>
+        /// <param name="Width">New width of the image.</param>
+        /// <param name="Height">New height of the image.</param>
+        /// <param name="Depth">New depth of the image.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluScale(ILuint Width, ILuint Height, ILuint Depth);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluScale(ILuint Width, ILuint Height, ILuint Depth);
+
+        // ILAPI ILboolean      ILAPIENTRY iluScaleColours(ILfloat r, ILfloat g, ILfloat b);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <returns></returns>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluScaleColours(ILfloat r, ILfloat g, ILfloat b);
+
+        /// <summary>
+        /// iluSharpen can actually either sharpen or blur an image, depending on the value of Factor. iluBlurAvg and iluBlurGaussian are much faster for blurring, though. When Factor is 1.0, the image goes unchanged. When Factor is in the range 0.0 - 1.0, the current image is blurred. When Factor is in the range 1.0 - 2.5, the current image is sharpened. To achieve a more pronounced sharpening/blurring effect, simply increase the number of iterations by increasing the value passed in Iter.
+        /// </summary>
+        /// <param name="Factor">Factor to sharpen by.</param>
+        /// <param name="Iter">Number of iterations to perform on the image.</param>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluSharpen(ILfloat Factor, ILuint Iter);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluSharpen(ILfloat Factor, ILuint Iter);
+
+        /// <summary>
+        /// iluSwapColours "swaps" the colour order of the current image. If the current image is in bgr(a) format, iluSwapColours will change the image to use rgb(a) format, or vice-versa. This can be helpful when you want to manipulate the image data yourself but only want to use a certain colour order. To determine the current colour order, call ilGetInteger with the IL_IMAGE_FORMAT parameter.
+        /// </summary>
+        /// <returns></returns>
+        // ILAPI ILboolean      ILAPIENTRY iluSwapColours(ILvoid);
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluSwapColours();
+
+        // ILAPI ILboolean      ILAPIENTRY iluWave(ILfloat Angle);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Angle"></param>
+        /// <returns></returns>
+        [DllImport(ILU_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean iluWave(ILfloat Angle);
+        
+        #endregion Externs
+    }
+
+    // --- Public Structs ---
+    #region Public Structs
+
+    #region ILinfo
+    // typedef struct ILinfo
+    // {
+    // 	ILuint  Id;         // the image's id
+    // 	ILubyte *Data;      // the image's data
+    // 	ILuint  Width;      // the image's width
+    // 	ILuint  Height;     // the image's height
+    // 	ILuint  Depth;      // the image's depth
+    // 	ILubyte Bpp;        // bytes per pixel (not bits) of the image
+    // 	ILuint  SizeOfData; // the total size of the data (in bytes)
+    // 	ILenum  Format;     // image format (in IL enum style)
+    // 	ILenum  Type;       // image type (in IL enum style)
+    // 	ILenum  Origin;     // origin of the image
+    // 	ILubyte *Palette;   // the image's palette
+    // 	ILenum  PalType;    // palette type
+    // 	ILuint  PalSize;    // palette size
+    // 	ILenum  CubeFlags;  // flags for what cube map sides are present
+    // 	ILuint  NumNext;    // number of images following
+    // 	ILuint  NumMips;    // number of mipmaps
+    // 	ILuint  NumLayers;  // number of layers
+    // } ILinfo;
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential, Pack = 4)]
+    public struct ILinfo
+    {
+        /// <summary>
+        /// /\
+        /// </summary>
+        public ILuint Id;         // the image's id
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILubyte[] Data;      // the image's data
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILuint Width;      // the image's width
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILuint Height;     // the image's height
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILuint Depth;      // the image's depth
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILubyte Bpp;        // bytes per pixel (not bits) of the image
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILuint SizeOfData; // the total size of the data (in bytes)
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILenum Format;     // image format (in IL enum style)
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILenum Type;       // image type (in IL enum style)
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILenum Origin;     // origin of the image
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILubyte[] Palette;   // the image's palette
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILenum PalType;    // palette type
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILuint PalSize;    // palette size
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILenum CubeFlags;  // flags for what cube map sides are present
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILuint NumNext;    // number of images following
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILuint NumMips;    // number of mipmaps
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILuint NumLayers;  // number of layers
+    };
+    #endregion ILinfo
+
+    #region ILpointf
+    // typedef struct ILpointf
+    // {
+    // 	ILfloat x, y;
+    // } ILpointf;
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential, Pack = 4)]
+    public struct ILpointf
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILfloat x;
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILfloat y;
+    };
+    #endregion ILpointf
+
+    #region ILpointi
+    // typedef struct ILpointi
+    // {
+    // 	ILint x, y;
+    // } ILpointi;
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential, Pack = 4)]
+    public struct ILpointi
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILint x;
+        /// <summary>
+        /// 
+        /// </summary>
+        public ILint y;
+    };
+    #endregion ILpointi
+
+    #endregion Public Structs
+}
diff --git a/src/Tao.DevIl/Ilut.cs b/src/Tao.DevIl/Ilut.cs
new file mode 100644
index 0000000..9f8faf0
--- /dev/null
+++ b/src/Tao.DevIl/Ilut.cs
@@ -0,0 +1,1077 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+#region Aliases
+using ILHANDLE = System.IntPtr;
+//typedef unsigned int   ILenum;
+using ILenum = System.Int32;
+//typedef unsigned char  ILboolean;
+using ILboolean = System.Boolean;
+//typedef unsigned int   ILbitfield;
+using ILbitfield = System.UInt32;
+//typedef char           ILbyte;
+using ILbyte = System.Byte;
+//typedef short          ILshort;
+using ILshort = System.Int16;
+//typedef int            ILint;
+using ILint = System.Int32;
+//typedef int            ILsizei;
+using ILsizei = System.Int32;
+//typedef unsigned char  ILubyte;
+using ILubyte = System.Byte;
+//typedef unsigned short ILushort;
+using ILushort = System.UInt16;
+//typedef unsigned int   ILuint;
+using ILuint = System.Int32;
+//typedef float          ILfloat;
+using ILfloat = System.Single;
+//typedef float          ILclampf;
+using ILclampf = System.Single;
+//typedef double         ILdouble;
+using ILdouble = System.Double;
+//typedef double         ILclampd;
+using ILclampd = System.Double;
+//typedef void           ILvoid;
+//using ILvoid = void;
+using ILstring = System.String;
+using GLuint = System.Int32;
+using Lstring = System.String;
+#endregion Aliases
+
+namespace Tao.DevIl
+{
+    #region Class Documentation
+    /// <summary>
+    ///     DevIL (Developer's Image Library) ILUT binding for .NET.
+    /// </summary>
+    #endregion Class Documentation
+    public static class Ilut
+    {
+        // --- Fields ---
+        #region Private Constants
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Winapi" />.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Winapi;
+        #endregion CallingConvention CALLING_CONVENTION
+        #region string ILUT_NATIVE_LIBRARY
+        /// <summary>
+        /// Specifies the DevIL ILUT native library used in the bindings
+        /// </summary>
+        /// <remarks>
+        /// The Windows dll is specified here universally - note that
+        /// under Mono the non-windows native library can be mapped using
+        /// the ".config" file mechanism.  Kudos to the Mono team for this
+        /// simple yet elegant solution.
+        /// </remarks>
+        private const string ILUT_NATIVE_LIBRARY = "ILUT.dll";
+        #endregion string ILUT_NATIVE_LIBRARY
+        #endregion Private Constants
+
+        #region Public Constants
+
+        // #define ILUT_VERSION_1_6_8 1
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_VERSION_1_6_8 = 1;
+        // #define ILUT_VERSION       168
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_VERSION = 168;
+        // #define ILUT_OPENGL_BIT      0x00000001
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_OPENGL_BIT = 0x00000001;
+        // #define ILUT_D3D_BIT         0x00000002
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_D3D_BIT = 0x00000002;
+        // #define ILUT_ALL_ATTRIB_BITS 0x000FFFFF
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_ALL_ATTRIB_BITS = 0x000FFFFF;
+        /// <summary>
+        /// An unacceptable enumerated value was passed to a function.
+        /// </summary>
+        // #define ILUT_INVALID_ENUM        0x0501
+        public const int ILUT_INVALID_ENUM = 0x0501;
+        /// <summary>
+        /// Could not allocate enough memory in an operation.
+        /// </summary>
+        // #define ILUT_OUT_OF_MEMORY       0x0502
+        public const int ILUT_OUT_OF_MEMORY = 0x0502;
+        /// <summary>
+        /// An invalid value was passed to a function or was in a file.
+        /// </summary>
+        // #define ILUT_INVALID_VALUE       0x0505
+        public const int ILUT_INVALID_VALUE = 0x0505;
+        /// <summary>
+        /// The operation attempted is not allowable in the current state. The function returns with no ill side effects.
+        /// </summary>
+        // #define ILUT_ILLEGAL_OPERATION   0x0506
+        public const int ILUT_ILLEGAL_OPERATION = 0x0506;
+        /// <summary>
+        /// An invalid parameter was passed to a function, such as a NULL pointer.
+        /// </summary>
+        // #define ILUT_INVALID_PARAM       0x0509
+        public const int ILUT_INVALID_PARAM = 0x0509;
+        /// <summary>
+        /// Could not open the file specified. The file may already be open by another app or may not exist.
+        /// </summary>
+        // #define ILUT_COULD_NOT_OPEN_FILE 0x050A
+        public const int ILUT_COULD_NOT_OPEN_FILE = 0x050A;
+        /// <summary>
+        /// One of the internal stacks was already filled, and the user tried to add on to the full stack.
+        /// </summary>
+        // #define ILUT_STACK_OVERFLOW      0x050E
+        public const int ILUT_STACK_OVERFLOW = 0x050E;
+        /// <summary>
+        /// One of the internal stacks was empty, and the user tried to empty the already empty stack.
+        /// </summary>
+        // #define ILUT_STACK_UNDERFLOW     0x050F
+        public const int ILUT_STACK_UNDERFLOW = 0x050F;
+        // #define ILUT_BAD_DIMENSIONS      0x0511
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_BAD_DIMENSIONS = 0x0511;
+        /// <summary>
+        /// A type is valid but not supported in the current build.
+        /// </summary>
+        // #define ILUT_NOT_SUPPORTED       0x0550
+        public const int ILUT_NOT_SUPPORTED = 0x0550;
+        /// <summary>
+        /// Whether ilut uses palettes or converts the image to truecolour before sending it to the renderer.
+        /// </summary>
+        // #define ILUT_PALETTE_MODE         0x0600
+        public const int ILUT_PALETTE_MODE = 0x0600;
+        /// <summary>
+        /// Whether to use GL_RGB8 or GL_RGB, etc. when passing data to OpenGL only.
+        /// </summary>
+        // #define ILUT_OPENGL_CONV          0x0610
+        public const int ILUT_OPENGL_CONV = 0x0610;
+        // #define ILUT_D3D_MIPLEVELS        0x0620
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_D3D_MIPLEVELS = 0x0620;
+        // #define ILUT_MAXTEX_WIDTH         0x0630
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_MAXTEX_WIDTH = 0x0630;
+        // #define ILUT_MAXTEX_HEIGHT        0x0631
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_MAXTEX_HEIGHT = 0x0631;
+        // #define ILUT_MAXTEX_DEPTH         0x0632
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_MAXTEX_DEPTH = 0x0632;
+        // #define ILUT_GL_USE_S3TC          0x0634
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_GL_USE_S3TC = 0x0634;
+        // #define ILUT_D3D_USE_DXTC         0x0634
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_D3D_USE_DXTC = 0x0634;
+        // #define ILUT_GL_GEN_S3TC          0x0635
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_GL_GEN_S3TC = 0x0635;
+        // #define ILUT_D3D_GEN_DXTC         0x0635
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_D3D_GEN_DXTC = 0x0635;
+        // #define ILUT_S3TC_FORMAT          0x0705
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_S3TC_FORMAT = 0x0705;
+        // #define ILUT_DXTC_FORMAT          0x0705
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_DXTC_FORMAT = 0x0705;
+        // #define ILUT_D3D_POOL             0x0706
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_D3D_POOL = 0x0706;
+        // #define ILUT_D3D_ALPHA_KEY_COLOR  0x0707
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_D3D_ALPHA_KEY_COLOR = 0x0707;
+        // #define ILUT_D3D_ALPHA_KEY_COLOUR 0x0707
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_D3D_ALPHA_KEY_COLOUR = 0x0707;
+        // #define ILUT_GL_AUTODETECT_TEXTURE_TARGET 0x0807
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_GL_AUTODETECT_TEXTURE_TARGET = 0x0807;
+        /// <summary>
+        /// Returns the version number of the shared library. This can be checked against the ILUT_VERSION #define
+        /// </summary>
+        // #define ILUT_VERSION_NUM IL_VERSION_NUM
+        public const int ILUT_VERSION_NUM = Il.IL_VERSION_NUM;
+        // #define ILUT_VENDOR      IL_VENDOR
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_VENDOR = Il.IL_VENDOR;
+        // #define ILUT_OPENGL    0
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_OPENGL = 0;
+        // #define ILUT_ALLEGRO   1
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_ALLEGRO = 1;
+        // #define ILUT_WIN32     2
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_WIN32 = 2;
+        // #define ILUT_DIRECT3D8 3
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_DIRECT3D8 = 3;
+        // #define	ILUT_DIRECT3D9 4
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ILUT_DIRECT3D9 = 4;
+
+        #endregion Public Constants
+
+        #region Externs
+        
+        // ILAPI ILboolean		ILAPIENTRY ilutDisable(ILenum Mode);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Mode"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutDisable(ILenum Mode);
+
+        // ILAPI ILboolean		ILAPIENTRY ilutEnable(ILenum Mode);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Mode"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutEnable(ILenum Mode);
+
+        // ILAPI ILboolean		ILAPIENTRY ilutGetBoolean(ILenum Mode);
+        /// <summary>
+        /// The ilutGetBooleanv return the value of a selected mode.
+        /// </summary>
+        /// <param name="Mode">The selected mode.</param>
+        /// <returns>The ilutGetBoolean returns the value of a selected mode.</returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutGetBoolean(ILenum Mode);
+
+        /// <summary>
+        /// The ilutGetBoolean return the value of a selected mode.
+        /// </summary>
+        /// <param name="Mode">The ilutGetBoolean returns the value of a selected mode.</param>
+        /// <param name="Param">Used to store the return values.</param>
+        // ILAPI ILvoid		ILAPIENTRY ilutGetBooleanv(ILenum Mode, ILboolean *Param);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilutGetBooleanv(ILenum Mode, ref byte Param);
+
+        /// <summary>
+        /// The ilutGetBoolean return the value of a selected mode.
+        /// </summary>
+        /// <param name="Mode">The ilutGetBoolean returns the value of a selected mode.</param>
+        /// <param name="Param">Used to store the return values.</param>
+        // ILAPI ILvoid		ILAPIENTRY ilutGetBooleanv(ILenum Mode, ILboolean *Param);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilutGetBooleanv(ILenum Mode, [Out] byte[] Param);
+
+        /// <summary>
+        /// The ilutGetInteger return the value of a selected mode.
+        /// </summary>
+        /// <param name="Mode">The ilutGetBoolean returns the value of a selected mode.</param>
+        /// <returns></returns>
+        // ILAPI ILint			ILAPIENTRY ilutGetInteger(ILenum Mode);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILint ilutGetInteger(ILenum Mode);
+
+        // ILAPI ILvoid		ILAPIENTRY ilutGetIntegerv(ILenum Mode, ILint *Param);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Mode"></param>
+        /// <param name="Param"></param>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilutGetIntegerv(ILenum Mode, out int Param);
+
+        // ILAPI ILstring		ILAPIENTRY ilutGetString(ILenum StringName);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="StringName"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILstring ilutGetString(ILenum StringName);
+
+        /// <summary>
+        /// The ilutInit function initializes ILUT.
+        /// </summary>
+        // ILAPI ILvoid		ILAPIENTRY ilutInit(ILvoid);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilutInit();
+
+        /// <summary>
+        /// ilutIsDisabled returns whether the mode indicated by Mode is disabled.
+        /// </summary>
+        /// <param name="Mode">Indicates an OpenIL mode</param>
+        /// <returns></returns>
+        // ILAPI ILboolean		ILAPIENTRY ilutIsDisabled(ILenum Mode);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutIsDisabled(ILenum Mode);
+
+        /// <summary>
+        /// ilutIsEnabled returns whether the mode indicated by Mode is enabled.
+        /// </summary>
+        /// <param name="Mode">Indicates an OpenIL mode</param>
+        /// <returns></returns>
+        // ILAPI ILboolean		ILAPIENTRY ilutIsEnabled(ILenum Mode);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutIsEnabled(ILenum Mode);
+
+        /// <summary>
+        /// ilutPopAttrib pops the last pushed stack entry off the stack and copies the bits specified when pushed by ilutPushAttrib to the previous set of states.
+        /// </summary>
+        // ILAPI ILvoid		ILAPIENTRY ilutPopAttrib(ILvoid);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilutPopAttrib();
+
+        
+        // ILAPI ILvoid		ILAPIENTRY ilutPushAttrib(ILuint Bits);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Bits"></param>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilutPushAttrib(ILenum Bits);
+
+        // ILAPI ILvoid		ILAPIENTRY ilutSetInteger(ILenum Mode, ILint Param);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Mode"></param>
+        /// <param name="Param"></param>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilutSetInteger(ILenum Mode, int Param);
+
+        // ILAPI ILboolean	ILAPIENTRY ilutRenderer(ILenum Renderer);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Renderer"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutRenderer(ILenum Renderer);
+
+        /// <summary>
+        /// The ilutGLBindTexImage function binds an image to a generated OpenGL texture.
+        /// </summary>
+        /// <returns></returns>
+        // 	ILAPI GLuint	ILAPIENTRY ilutGLBindTexImage();
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern GLuint ilutGLBindTexImage();
+
+        /// <summary>
+        /// The ilutGLBindMipmaps function binds an image to an OpenGL texture and creates mipmaps, generates a texture via glGenTextures, binds the current OpenIL image to it, generates mipmaps via gluBuild2DMipmaps and returns the texture name. This function is a more general purpose version of ilutOglBindTexImage.
+        /// </summary>
+        /// <returns></returns>
+        // 	ILAPI GLuint	ILAPIENTRY ilutGLBindMipmaps(ILvoid);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern GLuint ilutGLBindMipmaps();
+
+        /// <summary>
+        /// ilutGLBuildMipmaps generates mipmaps via gluBuild2DMipmaps from an image. This function is similar to ilutGLTexImage but creates mipmaps.
+        /// </summary>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutGLBuildMipmaps(ILvoid);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutGLBuildMipmaps();
+
+        /// <summary>
+        /// ilutGLLoadImage loads an image directly to an OpenGL texture, skipping the use of OpenIL image names.
+        /// </summary>
+        /// <param name="FileName">Name of the image to load</param>
+        /// <returns></returns>
+        // 	ILAPI GLuint	ILAPIENTRY ilutGLLoadImage(ILstring FileName);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern GLuint ilutGLLoadImage(ILstring FileName);
+
+        /// <summary>
+        /// ilutGLScreen copies the current OpenGL window contents to the current bound image, effectively taking a screenshot. The new image attributes are that of the current OpenGL window's.
+        /// </summary>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutGLScreen(ILvoid);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutGLScreen();
+
+        /// <summary>
+        /// ilutGLScreen copies the current OpenGL window contents to a temporary image, effectively taking a screenshot. The screenshot image is then saved to disk as screen0.tga - screen127.tga (the lowest name it can find). This is just a convenience function that uses ilutGLScreen.
+        /// </summary>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutGLScreenie(ILvoid);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutGLScreenie();
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutGLSaveImage(ILstring FileName, GLuint TexID);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="FileName"></param>
+        /// <param name="TexID"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutGLSaveImage(ILstring FileName, GLuint TexID);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutGLSetTex(GLuint TexID);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="TexID"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutGLSetTex(GLuint TexID);
+
+        /// <summary>
+        /// The ilutGLTexImage function binds an image to an OpenGL texture, simply calls glTexImage2D with the current bound image's data and attributes.
+        /// </summary>
+        /// <param name="Level">Texture level to place the image at. 0 is the base image level, and anything lower is a mipmap. Use ilActiveMipmap to access OpenIL's mipmaps.</param>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutGLTexImage(GLuint Level);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutGLTexImage(GLuint Level);
+
+        // 	ILAPI ILboolean ILAPIENTRY ilutGLSubTex(GLuint TexID, ILuint XOff, ILuint YOff);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="TexID"></param>
+        /// <param name="XOff"></param>
+        /// <param name="YOff"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutGLSubTex(GLuint TexID, ILuint XOff, ILuint YOff);
+
+        // 	ILAPI BITMAP* ILAPIENTRY ilutAllegLoadImage(Lstring FileName);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="FileName"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutAllegLoadImage(Lstring FileName);
+
+        // 	ILAPI BITMAP* ILAPIENTRY ilutConvertToAlleg(PALETTE Pal);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Pal"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutConvertToAlleg(IntPtr Pal);
+
+        // 	ILAPI struct SDL_Surface* ILAPIENTRY ilutConvertToSDLSurface(unsigned int flags);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="flags"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutConvertToSDLSurface(ILenum flags);
+
+        // 	ILAPI struct SDL_Surface* ILAPIENTRY ilutSDLSurfaceLoadImage(ILstring FileName);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="FileName"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutSDLSurfaceLoadImage(ILstring FileName);
+
+        // 	ILAPI ILboolean    ILAPIENTRY ilutSDLSurfaceFromBitmap(struct SDL_Surface *Bitmap);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Bitmap"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutSDLSurfaceFromBitmap(IntPtr Bitmap);
+
+        // 	ILAPI BBitmap ILAPIENTRY ilutConvertToBBitmap(ILvoid);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutConvertToBBitmap();
+
+        /// <summary>
+        /// ilutConvertToHBitmap creates a Windows bitmap handle (HBITMAP) copy of the current image, for direct use in Windows.
+        /// </summary>
+        /// <param name="hDC">The ilutGetBoolean returns the value of a selected mode.</param>
+        /// <returns></returns>
+        // 	ILAPI HBITMAP	ILAPIENTRY ilutConvertToHBitmap(HDC hDC);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutConvertToHBitmap(IntPtr hDC);
+
+        // 	ILAPI HBITMAP	ILAPIENTRY ilutConvertSliceToHBitmap(HDC hDC, ILuint slice);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="hDC"></param>
+        /// <param name="slice"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutConvertSliceToHBitmap(IntPtr hDC, ILenum slice);
+
+        // 	ILAPI ILvoid	ILAPIENTRY ilutFreePaddedData(ILubyte *Data);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Data"></param>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilutFreePaddedData(ILubyte[] Data);
+
+        // 	ILAPI ILvoid	ILAPIENTRY ilutFreePaddedData(ILubyte *Data);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Data"></param>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilutFreePaddedData(IntPtr Data);
+
+        /// <summary>
+        /// ilutGetBmpInfo fills a BITMAPINFO struct with the current image's information. The BITMAPINFO struct is used commonly used in Windows applications.
+        /// </summary>
+        /// <param name="Info">BITMAPINFO struct pointer to be filled.</param>
+        // 	ILAPI ILvoid	ILAPIENTRY ilutGetBmpInfo(BITMAPINFO *Info);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ilutGetBmpInfo(IntPtr Info);
+
+        /// <summary>
+        /// The ilutGetHPal function returns a Windows-friendly palette. If the current bound image has a palette, ilutGetHPal returns a Windows-compatible copy of the current image's palette in HPAL format.
+        /// </summary>
+        /// <returns></returns>
+        // 	ILAPI HPALETTE	ILAPIENTRY ilutGetHPal(ILvoid);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutGetHPal();
+
+        /// <summary>
+        /// ilutGetPaddedData gets a copy of the current image's data, but pads it to be DWORD-aligned, just how Windows likes it. Almost all Windows functions that use images expect the images to be DWORD-aligned. The caller is responsible for freeing the memory returned by ilutGetPaddedData.
+        /// </summary>
+        /// <returns></returns>
+        // 	ILAPI ILubyte*	ILAPIENTRY ilutGetPaddedData(ILvoid);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILubyte[] ilutGetPaddedData();
+
+        /// <summary>
+        /// ilutGetWinClipboard copies the contents of the Windows clipboard to the current bound image, resizing as necessary.
+        /// </summary>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutGetWinClipboard(ILvoid);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutGetWinClipboard();
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutLoadResource(HINSTANCE hInst, ILint ID, ILstring ResourceType, ILenum Type);
+        /// <summary>
+        /// ilutLoadResource is a Windows-specific function that loads a resource as the current bound image. This feature allows you to have images directly in your .exe and not worry whether a particular file is present on the user's harddrive. An alternative, more portable solution is to use ilSave with IL_CHEAD as the Type parameter.
+        /// </summary>
+        /// <param name="hInst">The application-s HINSTANCE</param>
+        /// <param name="ID">The resource identifier of the resource to be loaded</param>
+        /// <param name="ResourceType">The type of user-defined resource (name used when creating)</param>
+        /// <param name="Type">The type of image to be loaded. Use IL_TYPE_UNKNOWN to let OpenIL determine the type</param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutLoadResource(IntPtr hInst, ILint ID, ILstring ResourceType, ILenum Type);
+
+        /// <summary>
+        /// ilutSetHBitmap copies Bitmap to the current bound image in a format OpenIL can understand. The image can then be used just as if you had loaded an image via ilLoadImage. This function is the opposite of ilutConvertToHBitmap.
+        /// </summary>
+        /// <param name="Bitmap">Bitmap to copy to the current bound image.</param>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutSetHBitmap(HBITMAP Bitmap);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutSetHBitmap(IntPtr Bitmap);
+
+        /// <summary>
+        /// ilutSetHPal sets the current iamge's palette from a logical Windows palette handle specified in Pal. If the current image is not colour-indexed, the palette is still loaded, though it will never be used.
+        /// </summary>
+        /// <param name="Pal">A Windows palette to set the palette from</param>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutSetHPal(HPALETTE Pal);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutSetHPal(IntPtr Pal);
+
+        /// <summary>
+        /// ilutSetWinClipboard copies the current bound image to the Windows clipboard.
+        /// </summary>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutSetWinClipboard(ILvoid);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutSetWinClipboard();
+
+        /// <summary>
+        /// loads an image directly to a Win32 HBITMAP, skipping the use of OpenIL image names.
+        /// </summary>
+        /// <param name="FileName">Name of the image to load</param>
+        /// <param name="hDC">Device context the bitmap should reside in</param>
+        /// <returns></returns>
+        // 	ILAPI HBITMAP	ILAPIENTRY ilutWinLoadImage(ILstring FileName, HDC hDC);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutWinLoadImage(ILstring FileName, IntPtr hDC);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutWinLoadUrl(ILstring Url);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Url"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutWinLoadUrl(ILstring Url);
+
+        // 	ILAPI ILboolean ILAPIENTRY ilutWinPrint(ILuint XPos, ILuint YPos, ILuint Width, ILuint Height, HDC hDC);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="XPos"></param>
+        /// <param name="YPos"></param>
+        /// <param name="Width"></param>
+        /// <param name="Height"></param>
+        /// <param name="hDC"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutWinPrint(ILuint XPos, ILuint YPos, ILuint Width, ILuint Height, IntPtr hDC);
+
+        /// <summary>
+        /// ilutWinSaveImage saves Bitmap to FileName. This function is the complement of ilutWinLoadImage.
+        /// </summary>
+        /// <param name="FileName">Name of the image file to save to</param>
+        /// <param name="Bitmap">Win32 HBITMAP to save from</param>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutWinSaveImage(ILstring FileName, HBITMAP Bitmap);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutWinSaveImage(ILstring FileName, IntPtr Bitmap);
+
+        // #endif//ILUT_USE_WIN32
+        // 	ILAPI struct IDirect3DTexture8* ILAPIENTRY ilutD3D8Texture(struct IDirect3DDevice8 *Device);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutD3D8Texture(IntPtr Device);
+
+        /// <summary>
+        /// The ilutD3D8VolumeTexture function creates a Direct3D 8 texture (IDirect3DVolumeTexture8) from the current bound image.
+        /// </summary>
+        /// <param name="Device">Pointer to an IDirect3DDevice8 interface, representing the device to be associated with the texture.</param>
+        /// <returns></returns>
+        // 	ILAPI struct IDirect3DVolumeTexture8* ILAPIENTRY ilutD3D8VolumeTexture(struct IDirect3DDevice8 *Device);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutD3D8VolumeTexture(IntPtr Device);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D8TexFromFile(struct IDirect3DDevice8 *Device, char *FileName, struct IDirect3DTexture8 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="FileName"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8TexFromFile(IntPtr Device, string FileName, IntPtr Texture);
+
+        /// <summary>
+        /// ilutD3D8VolTexFromFile loads the file named by FileName and converts it to a Direct3D 8 volume texture (IDirect3DVolumeTexture8). This function creates the texture, so the pointer does not even have to be allocated beforehand. This function is functionally equivalent to D3DX's D3DXCreateTextureFromFile but for a volume texture.
+        /// </summary>
+        /// <param name="Device">Pointer to an IDirect3DDevice8 interface, representing the device to be associated with the texture.</param>
+        /// <param name="FileName">File to create the texture from.</param>
+        /// <param name="Texture">Address of a pointer to an IDirect3DVolumeTexture8 interface, representing the created texture object.</param>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D8VolTexFromFile(struct IDirect3DDevice8 *Device, char *FileName, struct IDirect3DVolumeTexture8 **Texture);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8VolTexFromFile(IntPtr Device, string FileName, IntPtr Texture);
+
+        /// <summary>
+        /// ilutD3D8TexFromFileInMemory loads the file present in Lump and converts it to a Direct3D 8 texture (IDirect3DTexture8). This function creates the texture, so the pointer does not even have to be allocated beforehand. This function is functionally equivalent to D3DX's D3DXCreateTextureFromFileInMemory.
+        /// </summary>
+        /// <param name="Device">Pointer to an IDirect3DDevice8 interface, representing the device to be associated with the texture.</param>
+        /// <param name="Lump">Location of memory file.</param>
+        /// <param name="Size">Size of Lump in bytes</param>
+        /// <param name="Texture">Address of a pointer to an IDirect3DTexture8 interface, representing the created texture object.</param>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D8TexFromFileInMemory(struct IDirect3DDevice8 *Device, ILvoid *Lump, ILuint Size, struct IDirect3DTexture8 **Texture);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8TexFromFileInMemory(IntPtr Device, IntPtr Lump, ILuint Size, IntPtr Texture);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D8VolTexFromFileInMemory(struct IDirect3DDevice8 *Device, ILvoid *Lump, ILuint Size, struct IDirect3DVolumeTexture8 **Texture);
+        /// <summary>
+        /// ilutD3D8VolTexFromFileInMemory loads the file present in Lump and converts it to a Direct3D 8 volume texture (IDirect3DVolumeTexture8). This function creates the texture, so the pointer does not even have to be allocated beforehand. This function is functionally equivalent to D3DX's D3DXCreateTextureFromFileInMemory but for a volume texture.
+        /// </summary>
+        /// <param name="Device">Pointer to an IDirect3DDevice8 interface, representing the device to be associated with the texture.</param>
+        /// <param name="Lump">Location of memory file.</param>
+        /// <param name="Size">Size of Lump in bytes</param>
+        /// <param name="Texture">Address of a pointer to an IDirect3DTexture8 interface, representing the created texture object.</param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8VolTexFromFileInMemory(IntPtr Device, IntPtr Lump, ILuint Size, IntPtr Texture);
+
+        /// <summary>
+        /// ilutD3D8TexFromFileInMemory loads the file present in Lump and converts it to a Direct3D 8 texture (IDirect3DTexture8). This function creates the texture, so the pointer does not even have to be allocated beforehand. This function is functionally equivalent to D3DX's D3DXCreateTextureFromFileInMemory.
+        /// </summary>
+        /// <param name="Device">Pointer to an IDirect3DDevice8 interface, representing the device to be associated with the texture.</param>
+        /// <param name="Lump">Location of memory file.</param>
+        /// <param name="Size">Size of Lump in bytes</param>
+        /// <param name="Texture">Address of a pointer to an IDirect3DTexture8 interface, representing the created texture object.</param>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D8TexFromFileInMemory(struct IDirect3DDevice8 *Device, ILvoid *Lump, ILuint Size, struct IDirect3DTexture8 **Texture);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8TexFromFileInMemory(IntPtr Device, byte[] Lump, ILuint Size, IntPtr Texture);
+
+        /// <summary>
+        /// ilutD3D8VolTexFromFileInMemory loads the file present in Lump and converts it to a Direct3D 8 volume texture (IDirect3DVolumeTexture8). This function creates the texture, so the pointer does not even have to be allocated beforehand. This function is functionally equivalent to D3DX's D3DXCreateTextureFromFileInMemory but for a volume texture.
+        /// </summary>
+        /// <param name="Device">Pointer to an IDirect3DDevice8 interface, representing the device to be associated with the texture.</param>
+        /// <param name="Lump">Location of memory file.</param>
+        /// <param name="Size">Size of Lump in bytes</param>
+        /// <param name="Texture">Address of a pointer to an IDirect3DTexture8 interface, representing the created texture object.</param>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D8VolTexFromFileInMemory(struct IDirect3DDevice8 *Device, ILvoid *Lump, ILuint Size, struct IDirect3DVolumeTexture8 **Texture);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8VolTexFromFileInMemory(IntPtr Device, byte[] Lump, ILuint Size, IntPtr Texture);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D8TexFromFileHandle(struct IDirect3DDevice8 *Device, ILHANDLE File, struct IDirect3DTexture8 **Texture);
+        /// <summary>
+        /// ilutD3D8TexFromFileInMemory loads the file present in Lump and converts it to a Direct3D 8 texture (IDirect3DTexture8). This function creates the texture, so the pointer does not even have to be allocated beforehand. This function is functionally equivalent to D3DX's D3DXCreateTextureFromFile but with a file handle.
+        /// </summary>
+        /// <param name="Device">Pointer to an IDirect3DDevice8 interface, representing the device to be associated with the texture.</param>
+        /// <param name="File">File handle containing the image file</param>
+        /// <param name="Texture">Address of a pointer to an IDirect3DTexture8 interface, representing the created texture object.</param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8TexFromFileHandle(IntPtr Device, ILHANDLE File, IntPtr Texture);
+
+        /// <summary>
+        /// ilutD3D8VolTexFromFileHandle loads the file present in File and converts it to a Direct3D 8 volume texture (IDirect3DVolumeTexture8). This function creates the texture, so the pointer does not even have to be allocated beforehand. This function is functionally equivalent to D3DX's D3DXCreateTextureFromFile but with a file handle and a volume texture.
+        /// </summary>
+        /// <param name="Device">Pointer to an IDirect3DDevice8 interface, representing the device to be associated with the texture.</param>
+        /// <param name="File">File handle containing the image file</param>
+        /// <param name="Texture">Address of a pointer to an IDirect3DTexture8 interface, representing the created texture object.</param>
+        /// <returns></returns>
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D8VolTexFromFileHandle(struct IDirect3DDevice8 *Device, ILHANDLE File, struct IDirect3DVolumeTexture8 **Texture);
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8VolTexFromFileHandle(IntPtr Device, ILHANDLE File, IntPtr Texture);
+
+        // 	ILAPI ILboolean ILAPIENTRY ilutD3D8TexFromResource(struct IDirect3DDevice8 *Device, HMODULE SrcModule, char *SrcResource, struct IDirect3DTexture8 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="SrcModule"></param>
+        /// <param name="SrcResource"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8TexFromResource(IntPtr Device, IntPtr SrcModule, string SrcResource, IntPtr Texture);
+
+        // 	ILAPI ILboolean ILAPIENTRY ilutD3D8VolTexFromResource(struct IDirect3DDevice8 *Device, HMODULE SrcModule, char *SrcResource, struct IDirect3DVolumeTexture8 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="SrcModule"></param>
+        /// <param name="SrcResource"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8VolTexFromResource(IntPtr Device, IntPtr SrcModule, string SrcResource, IntPtr Texture);
+
+        // 	ILAPI ILboolean ILAPIENTRY ilutD3D8LoadSurface(struct IDirect3DDevice8 *Device, struct IDirect3DSurface8 *Surface);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="Surface"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D8LoadSurface(IntPtr Device, IntPtr Surface);
+
+        // 	ILAPI struct IDirect3DTexture9*       ILAPIENTRY ilutD3D9Texture       (struct IDirect3DDevice9* Device);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutD3D9Texture(IntPtr Device);
+
+        // 	ILAPI struct IDirect3DVolumeTexture9* ILAPIENTRY ilutD3D9VolumeTexture (struct IDirect3DDevice9* Device);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutD3D9VolumeTexture(IntPtr Device);
+
+        //     ILAPI struct IDirect3DCubeTexture9*       ILAPIENTRY ilutD3D9CubeTexture (struct IDirect3DDevice9* Device);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr ilutD3D9CubeTexture(IntPtr Device);
+
+        //     ILAPI ILboolean ILAPIENTRY ilutD3D9CubeTexFromFile(struct IDirect3DDevice9 *Device, char *FileName, struct IDirect3DCubeTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="FileName"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9CubeTexFromFile(IntPtr Device, string FileName, IntPtr Texture);
+
+        //     ILAPI ILboolean ILAPIENTRY ilutD3D9CubeTexFromFileInMemory(struct IDirect3DDevice9 *Device, ILvoid *Lump, ILuint Size, struct IDirect3DCubeTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="Lump"></param>
+        /// <param name="Size"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9CubeTexFromFileInMemory(IntPtr Device, IntPtr Lump, ILuint Size, IntPtr Texture);
+
+        //     ILAPI ILboolean ILAPIENTRY ilutD3D9CubeTexFromFileInMemory(struct IDirect3DDevice9 *Device, ILvoid *Lump, ILuint Size, struct IDirect3DCubeTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="Lump"></param>
+        /// <param name="Size"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9CubeTexFromFileInMemory(IntPtr Device, byte[] Lump, ILuint Size, IntPtr Texture);
+
+        //     ILAPI ILboolean ILAPIENTRY ilutD3D9CubeTexFromFileHandle(struct IDirect3DDevice9 *Device, ILHANDLE File, struct IDirect3DCubeTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="File"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9CubeTexFromFileHandle(IntPtr Device, ILHANDLE File, IntPtr Texture);
+
+        //     ILAPI ILboolean ILAPIENTRY ilutD3D9CubeTexFromResource(struct IDirect3DDevice9 *Device, HMODULE SrcModule, char *SrcResource, struct IDirect3DCubeTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="SrcModule"></param>
+        /// <param name="SrcResource"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9CubeTexFromResource(IntPtr Device, IntPtr SrcModule, string SrcResource, IntPtr Texture);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D9TexFromFile(struct IDirect3DDevice9 *Device, char *FileName, struct IDirect3DTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="FileName"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9TexFromFile(IntPtr Device, string FileName, IntPtr Texture);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D9VolTexFromFile(struct IDirect3DDevice9 *Device, char *FileName, struct IDirect3DVolumeTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="FileName"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9VolTexFromFile(IntPtr Device, string FileName, IntPtr Texture);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D9TexFromFileInMemory(struct IDirect3DDevice9 *Device, ILvoid *Lump, ILuint Size, struct IDirect3DTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="Lump"></param>
+        /// <param name="Size"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9TexFromFileInMemory(IntPtr Device, IntPtr Lump, ILuint Size, IntPtr Texture);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D9VolTexFromFileInMemory(struct IDirect3DDevice9 *Device, ILvoid *Lump, ILuint Size, struct IDirect3DVolumeTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="Lump"></param>
+        /// <param name="Size"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9VolTexFromFileInMemory(IntPtr Device, IntPtr Lump, ILuint Size, IntPtr Texture);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D9TexFromFileInMemory(struct IDirect3DDevice9 *Device, ILvoid *Lump, ILuint Size, struct IDirect3DTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="Lump"></param>
+        /// <param name="Size"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9TexFromFileInMemory(IntPtr Device, byte[] Lump, ILuint Size, IntPtr Texture);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D9VolTexFromFileInMemory(struct IDirect3DDevice9 *Device, ILvoid *Lump, ILuint Size, struct IDirect3DVolumeTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="Lump"></param>
+        /// <param name="Size"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9VolTexFromFileInMemory(IntPtr Device, byte[] Lump, ILuint Size, IntPtr Texture);
+        
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D9TexFromFileHandle(struct IDirect3DDevice9 *Device, ILHANDLE File, struct IDirect3DTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="File"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9TexFromFileHandle(IntPtr Device, ILHANDLE File, IntPtr Texture);
+
+        // 	ILAPI ILboolean	ILAPIENTRY ilutD3D9VolTexFromFileHandle(struct IDirect3DDevice9 *Device, ILHANDLE File, struct IDirect3DVolumeTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="File"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9VolTexFromFileHandle(IntPtr Device, ILHANDLE File, IntPtr Texture);
+
+        // 	ILAPI ILboolean ILAPIENTRY ilutD3D9TexFromResource(struct IDirect3DDevice9 *Device, HMODULE SrcModule, char *SrcResource, struct IDirect3DTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="SrcModule"></param>
+        /// <param name="SrcResource"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9TexFromResource(IntPtr Device, IntPtr SrcModule, string SrcResource, IntPtr Texture);
+
+        // 	ILAPI ILboolean ILAPIENTRY ilutD3D9VolTexFromResource(struct IDirect3DDevice9 *Device, HMODULE SrcModule, char *SrcResource, struct IDirect3DVolumeTexture9 **Texture);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="SrcModule"></param>
+        /// <param name="SrcResource"></param>
+        /// <param name="Texture"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9VolTexFromResource(IntPtr Device, IntPtr SrcModule, string SrcResource, IntPtr Texture);
+
+        // 	ILAPI ILboolean ILAPIENTRY ilutD3D9LoadSurface(struct IDirect3DDevice9 *Device, struct IDirect3DSurface9 *Surface);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="Device"></param>
+        /// <param name="Surface"></param>
+        /// <returns></returns>
+        [DllImport(ILUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern ILboolean ilutD3D9LoadSurface(IntPtr Device, IntPtr Surface);
+
+        #endregion Externs
+    }
+}
diff --git a/src/Tao.DevIl/Makefile.am b/src/Tao.DevIl/Makefile.am
new file mode 100644
index 0000000..58ce617
--- /dev/null
+++ b/src/Tao.DevIl/Makefile.am
@@ -0,0 +1,20 @@
+
+ASSEMBLY = Tao.DevIl
+SHORTNAME = tao-devil
+VERSION = @TAODEVIL_VERSION@
+MAJOR = @TAODEVIL_MAJOR@
+
+PACKAGES =
+BINARY_LIBS =
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        Il.cs \
+        Ilu.cs \
+        Ilut.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.DevIl/Makefile.in b/src/Tao.DevIl/Makefile.in
new file mode 100644
index 0000000..df31ace
--- /dev/null
+++ b/src/Tao.DevIl/Makefile.in
@@ -0,0 +1,416 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-devil.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.DevIl
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-devil.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAODEVIL_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.DevIl
+SHORTNAME = tao-devil
+MAJOR = @TAODEVIL_MAJOR@
+PACKAGES = 
+BINARY_LIBS = 
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        Il.cs \
+        Ilu.cs \
+        Ilut.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.DevIl/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.DevIl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-devil.pc: $(top_builddir)/config.status $(srcdir)/tao-devil.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.DevIl/NEWS b/src/Tao.DevIl/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.DevIl/Properties/AssemblyInfo.cs b/src/Tao.DevIl/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..278582a
--- /dev/null
+++ b/src/Tao.DevIl/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright (c)2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright (c)2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.DevIl")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework Tao.DevIl Binding For .NET")]
+[assembly: AssemblyFileVersion("1.6.8.3")]
+[assembly: AssemblyInformationalVersion("1.6.8.3")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.DevIl.dll")]
+[assembly: AssemblyTitle("Tao Framework Tao.DevIl Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.6.8.3")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.DevIl/README b/src/Tao.DevIl/README
new file mode 100644
index 0000000..f4b5d59
--- /dev/null
+++ b/src/Tao.DevIl/README
@@ -0,0 +1,18 @@
+Tao.DevIl 1.6.8.0
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.DevIl is a DevIL API binding for .NET, implementing DevIL 1.6.8 RC2.
+
+
+Change Log:
+1.6.8.0 - September 18, 2006
+    Updated to 1.6.8 RC2, still missing documentation.
+
+1.6.7.0 - December 2, 2004:
+    Updated to 1.6.7, filled in a bunch of missing stuff.
+
+1.6.6.0 - April 20, 2004:
+    Initial release.  Special thanks to Chris McGuirk for doing most of this
+    implementation.
diff --git a/src/Tao.DevIl/Tao.DevIl.csproj b/src/Tao.DevIl/Tao.DevIl.csproj
new file mode 100644
index 0000000..8372210
--- /dev/null
+++ b/src/Tao.DevIl/Tao.DevIl.csproj
@@ -0,0 +1,104 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E644F15A-A963-4B9D-808D-9463CB96D0B2}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.DevIl</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.DevIl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.DevIl</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.DevIl.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.DevIl.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Il.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Ilu.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Ilut.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.DevIl.dll.config" />
+    <None Include="Tao.DevIl.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.DevIl/Tao.DevIl.dll.config b/src/Tao.DevIl/Tao.DevIl.dll.config
new file mode 100644
index 0000000..0fbbc73
--- /dev/null
+++ b/src/Tao.DevIl/Tao.DevIl.dll.config
@@ -0,0 +1,13 @@
+<configuration>
+    <dllmap dll="DevIL.dll" os="windows" target="DevIl.dll" />
+    <dllmap dll="DevIL.dll" os="osx" target="libIL.so.1" />
+    <dllmap dll="DevIL.dll" os="!windows,osx" target="libIL.so.1" />
+
+    <dllmap dll="ILU.dll" os="windows" target="ILU.dll" />
+    <dllmap dll="ILU.dll" os="osx" target="libILU.so.1" />
+    <dllmap dll="ILU.dll" os="!windows,osx" target="libILU.so.1" />
+
+    <dllmap dll="ILUT.dll" os="windows" target="ILUT.dll" />
+    <dllmap dll="ILUT.dll" os="osx" target="libILUT.so.1" />
+    <dllmap dll="ILUT.dll" os="!windows,osx" target="libILUT.so.1" />
+</configuration>
diff --git a/src/Tao.DevIl/Tao.DevIl.snk b/src/Tao.DevIl/Tao.DevIl.snk
new file mode 100644
index 0000000..3dff1b7
Binary files /dev/null and b/src/Tao.DevIl/Tao.DevIl.snk differ
diff --git a/src/Tao.DevIl/tao-devil.pc.in b/src/Tao.DevIl/tao-devil.pc.in
new file mode 100644
index 0000000..0c11001
--- /dev/null
+++ b/src/Tao.DevIl/tao-devil.pc.in
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.DevIl
+Description: DevIl portion of the Tao framework
+Version: @TAODEVIL_VERSION@
+Requires:
+Libs: -r:${libdir}/mono/tao-devil- at TAODEVIL_MAJOR@/Tao.DevIl.dll
diff --git a/src/Tao.FFmpeg/AUTHORS b/src/Tao.FFmpeg/AUTHORS
new file mode 100644
index 0000000..b6d95b9
--- /dev/null
+++ b/src/Tao.FFmpeg/AUTHORS
@@ -0,0 +1 @@
+tzehaw huang
diff --git a/src/Tao.FFmpeg/AVCodec.cs b/src/Tao.FFmpeg/AVCodec.cs
new file mode 100644
index 0000000..1f2bd8a
--- /dev/null
+++ b/src/Tao.FFmpeg/AVCodec.cs
@@ -0,0 +1,5252 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.FFmpeg
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public static partial class FFmpeg
+    {
+        #region Private Constants
+        #region string AVCODEC_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies AVCODEC's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies avcodec.dll everywhere; will be mapped via .config for mono.
+        /// </remarks>
+        private const string AVCODEC_NATIVE_LIBRARY = "avcodec-51.dll";
+        #endregion string AVCODEC_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Cdecl" /> 
+        ///     for Windows and Linux.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION =
+            CallingConvention.Cdecl;
+        #endregion CallingConvention CALLING_CONVENTION
+
+        #endregion Private Constants
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="output_channels"></param>
+        /// <param name="input_channels"></param>
+        /// <param name="output_rate"></param>
+        /// <param name="input_rate"></param>
+        /// <returns>ReSampleContext pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr audio_resample_init(int output_channels, int input_channels,
+        int output_rate, int input_rate);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pResampleContext"></param>
+        /// <param name="output"></param>
+        /// <param name="intput"></param>
+        /// <param name="nb_samples"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int audio_resample(IntPtr pResampleContext, IntPtr output, IntPtr intput, int nb_samples);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pResampleContext"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void audio_resample_close(IntPtr pResampleContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="out_rate"></param>
+        /// <param name="in_rate"></param>
+        /// <param name="filter_length"></param>
+        /// <param name="log2_phase_count"></param>
+        /// <param name="linear"></param>
+        /// <param name="cutoff"></param>
+        /// <returns>AVResampleContext pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_resample_init(int out_rate, int in_rate, int filter_length, int log2_phase_count, int linear, double cutoff);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVResampleContext"></param>
+        /// <param name="dst"></param>
+        /// <param name="src"></param>
+        /// <param name="consumed"></param>
+        /// <param name="src_size"></param>
+        /// <param name="udpate_ctx"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_resample(IntPtr pAVResampleContext, IntPtr dst, IntPtr src, IntPtr consumed, int src_size, int udpate_ctx);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVResampleContext"></param>
+        /// <param name="sample_delta"></param>
+        /// <param name="compensation_distance"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_resample_compensate(IntPtr pAVResampleContext, int sample_delta, int compensation_distance);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVResampleContext"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_resample_close(IntPtr pAVResampleContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="output_width"></param>
+        /// <param name="output_height"></param>
+        /// <param name="input_width"></param>
+        /// <param name="input_height"></param>
+        /// <returns>ImgReSampleContext pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr img_resample_init(int output_width, int output_height,
+        int input_width, int input_height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="owidth"></param>
+        /// <param name="oheight"></param>
+        /// <param name="iwidth"></param>
+        /// <param name="iheight"></param>
+        /// <param name="topBand"></param>
+        /// <param name="bottomBand"></param>
+        /// <param name="leftBand"></param>
+        /// <param name="rightBand"></param>
+        /// <param name="padtop"></param>
+        /// <param name="padbottom"></param>
+        /// <param name="padleft"></param>
+        /// <param name="padright"></param>
+        /// <returns>ImgReSampleContext pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr img_resample_full_init(int owidth, int oheight,
+        int iwidth, int iheight,
+        int topBand, int bottomBand,
+        int leftBand, int rightBand,
+        int padtop, int padbottom,
+        int padleft, int padright);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pImgReSampleContext"></param>
+        /// <param name="p_output_AVPicture"></param>
+        /// <param name="p_input_AVPicture"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void img_resample(IntPtr pImgReSampleContext, IntPtr p_output_AVPicture, IntPtr p_input_AVPicture);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pImgReSampleContext"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ImgReSampleContext(IntPtr pImgReSampleContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVPicture"></param>
+        /// <param name="pix_fmt"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avpicture_alloc(IntPtr pAVPicture, int pix_fmt, int width, int height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVPicture"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avpicture_free(IntPtr pAVPicture);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVPicture"></param>
+        /// <param name="ptr"></param>
+        /// <param name="pix_fmt"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avpicture_fill(IntPtr pAVPicture, IntPtr ptr, int pix_fmt, int width, int height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="p_src_AVPicture"></param>
+        /// <param name="pix_fmt"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="dest"></param>
+        /// <param name="dest_size"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avpicture_layout(IntPtr p_src_AVPicture, int pix_fmt, int width, int height,
+        IntPtr dest, int dest_size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pix_fmt"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avpicture_get_size(int pix_fmt, int width, int height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pix_fmt"></param>
+        /// <param name="h_shift"></param>
+        /// <param name="v_shift"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_get_chroma_sub_sample(int pix_fmt, IntPtr h_shift, IntPtr v_shift);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pix_fmt"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern String avcodec_get_pix_fmt_name(int pix_fmt);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_set_dimensions(IntPtr pAVCodecContext, int width, int height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern PixelFormat avcodec_get_pix_fmt([MarshalAs(UnmanagedType.LPStr)]String name);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="p"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity, CLSCompliant(false)]
+        public static extern uint avcodec_pix_fmt_to_codec_tag(PixelFormat p);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="dst_pix_fmt"></param>
+        /// <param name="src_pix_fmt"></param>
+        /// <param name="has_alpha"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_get_pix_fmt_loss(int dst_pix_fmt, int src_pix_fmt, int has_alpha);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pix_fmt_mask"></param>
+        /// <param name="src_pix_fmt"></param>
+        /// <param name="has_alpha"></param>
+        /// <param name="loss_ptr"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_find_best_pix_fmt(int pix_fmt_mask, int src_pix_fmt, int has_alpha, IntPtr loss_ptr);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVPicture"></param>
+        /// <param name="pix_fmt"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int img_get_alpha_info(IntPtr pAVPicture, int pix_fmt, int width, int height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="p_dst_AVPicture"></param>
+        /// <param name="dst_pix_fmt"></param>
+        /// <param name="p_src_AVPicture"></param>
+        /// <param name="pix_fmt"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int img_convert(IntPtr p_dst_AVPicture, int dst_pix_fmt,
+        IntPtr p_src_AVPicture, int pix_fmt, int width, int height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="p_dst_AVPicture"></param>
+        /// <param name="p_src_AVPicture"></param>
+        /// <param name="pix_fmt"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avpicture_deinterlace(IntPtr p_dst_AVPicture, IntPtr p_src_AVPicture,
+        int pix_fmt, int width, int height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity, CLSCompliant(false)]
+        public static extern uint avcodec_version();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity, CLSCompliant(false)]
+        public static extern uint avcodec_build();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity, CLSCompliant(false)]
+        public static extern uint avcodec_init();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodec"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void register_avcodec(IntPtr pAVCodec);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns>AVCodec pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr avcodec_find_encoder(CodecID id);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="mame"></param>
+        /// <returns>AVCodec pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr avcodec_find_encoder_by_name(
+        [MarshalAs(UnmanagedType.LPStr)]String mame);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns>AVCodec pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr avcodec_find_decoder(CodecID id);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="mame"></param>
+        /// <returns>AVCodec pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr avcodec_find_decoder_by_name(
+        [MarshalAs(UnmanagedType.LPStr)]String mame);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="mam"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="pAVCodeContext"></param>
+        /// <param name="encode"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_string(
+        [MarshalAs(UnmanagedType.LPStr)]String mam, int buf_size,
+        IntPtr pAVCodeContext, int encode);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_get_context_defaults(IntPtr pAVCodecContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns>AVCodecContext pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr avcodec_alloc_context();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFrame"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_get_frame_defaults(IntPtr pAVFrame);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns>AVFrame pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr avcodec_alloc_frame();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pAVFrame"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_default_get_buffer(IntPtr pAVCodecContext, IntPtr pAVFrame);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pAVFrame"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_default_release_buffer(IntPtr pAVCodecContext, IntPtr pAVFrame);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pAVFrame"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_default_reget_buffer(IntPtr pAVCodecContext, IntPtr pAVFrame);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_align_dimensions(IntPtr pAVCodecContext, ref int width, ref int height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="av_log_ctx"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity, CLSCompliant(false)]
+        public static extern int avcodec_check_dimensions(IntPtr av_log_ctx, ref uint width, ref uint height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="fmt"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern PixelFormat avcodec_default_get_format(IntPtr pAVCodecContext, ref PixelFormat fmt);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="thread_count"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_thread_init(IntPtr pAVCodecContext, int thread_count);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_thread_free(IntPtr pAVCodecContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="func"></param>
+        /// <param name="arg"></param>
+        /// <param name="ret"></param>
+        /// <param name="count"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_thread_execute(IntPtr pAVCodecContext,
+        [MarshalAs(UnmanagedType.FunctionPtr)]FuncCallback func,
+        [MarshalAs(UnmanagedType.LPArray)]IntPtr[] arg, ref int ret, int count);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="func"></param>
+        /// <param name="arg"></param>
+        /// <param name="ret"></param>
+        /// <param name="count"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_default_execute(IntPtr pAVCodecContext,
+        [MarshalAs(UnmanagedType.FunctionPtr)]FuncCallback func,
+        [MarshalAs(UnmanagedType.LPArray)]IntPtr[] arg, ref int ret, int count);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pAVCodec"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_open(IntPtr pAVCodecContext, IntPtr pAVCodec);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="samples"></param>
+        /// <param name="frame_size_ptr"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_decode_audio(IntPtr pAVCodecContext,
+        IntPtr samples, [In, Out]ref int frame_size_ptr,
+        IntPtr buf, int buf_size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="samples"></param>
+        /// <param name="frame_size_ptr"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_decode_audio2(IntPtr pAVCodecContext,
+        IntPtr samples, [In, Out]ref int frame_size_ptr,
+        IntPtr buf, int buf_size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pAVFrame"></param>
+        /// <param name="got_picture_ptr"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_decode_video(IntPtr pAVCodecContext, IntPtr pAVFrame,
+        ref int got_picture_ptr, IntPtr buf, int buf_size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pAVSubtitle"></param>
+        /// <param name="got_sub_ptr"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_decode_subtitle(IntPtr pAVCodecContext, IntPtr pAVSubtitle,
+        ref int got_sub_ptr, IntPtr buf, int buf_size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pdata"></param>
+        /// <param name="data_size_ptr"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_parse_frame(IntPtr pAVCodecContext,
+        [MarshalAs(UnmanagedType.LPArray)]IntPtr[] pdata,
+        IntPtr data_size_ptr, IntPtr buf, int buf_size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="samples"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_encode_audio(IntPtr pAVCodecContext, IntPtr buf, int buf_size,
+        IntPtr samples);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="pAVFrame"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_encode_video(IntPtr pAVCodecContext, IntPtr buf, int buf_size,
+        IntPtr pAVFrame);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="pAVSubtitle"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_encode_subtitle(IntPtr pAVCodecContext, IntPtr buf, int buf_size,
+        IntPtr pAVSubtitle);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int avcodec_close(IntPtr pAVCodecContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_register_all();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_flush_buffers(IntPtr pAVCodecContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void avcodec_default_free_buffers(IntPtr pAVCodecContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pict_type"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern byte av_get_pict_type_char(int pict_type);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="codec_id"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_get_bits_per_sample(CodecID codec_id);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVcodecParser"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_register_codec_parser(IntPtr pAVcodecParser);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="codec_id"></param>
+        /// <returns>AVCodecParserContext pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_parser_init(int codec_id);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecParserContext"></param>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="poutbuf"></param>
+        /// <param name="poutbuf_size"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="pts"></param>
+        /// <param name="dts"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_parser_parse(IntPtr pAVCodecParserContext,
+        IntPtr pAVCodecContext,
+        [MarshalAs(UnmanagedType.LPArray)]IntPtr[] poutbuf, ref int poutbuf_size,
+        IntPtr buf, int buf_size, Int64 pts, Int64 dts);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecParserContext"></param>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="poutbuf"></param>
+        /// <param name="poutbuf_size"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="keyframe"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_parser_change(IntPtr pAVCodecParserContext,
+        IntPtr pAVCodecContext,
+        [MarshalAs(UnmanagedType.LPArray)]IntPtr[] poutbuf, ref int poutbuf_size,
+        IntPtr buf, int buf_size, int keyframe);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVCodecParserContext"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_parser_close(IntPtr pAVCodecParserContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVBitStreamFilter"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_register_bitstream_filter(IntPtr pAVBitStreamFilter);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns>AVBitStreamFilterContext pointer</returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_bitstream_filter_init([MarshalAs(UnmanagedType.LPStr)]
+String name);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVBitStreamFilterContext"></param>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="args"></param>
+        /// <param name="poutbuf"></param>
+        /// <param name="poutbuf_size"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="keyframe"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_bitstream_filter_filter(IntPtr pAVBitStreamFilterContext,
+        IntPtr pAVCodecContext,
+        [MarshalAs(UnmanagedType.LPStr)]String args,
+        [MarshalAs(UnmanagedType.LPArray)]IntPtr[] poutbuf,
+        ref int poutbuf_size, IntPtr buf, int buf_size, int keyframe);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVBitStreamFilterContext"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_bitstream_filter_close(IntPtr pAVBitStreamFilterContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="size"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity, CLSCompliant(false)]
+        public static extern void av_mallocz(uint size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="s"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_strdup([MarshalAs(UnmanagedType.LPStr)]String s);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="ptr"></param>
+        /// <param name="size"></param>
+        /// <param name="min_size"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity, CLSCompliant(false)]
+        public static extern void av_fast_realloc(IntPtr ptr, ref uint size, ref uint min_size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_free_static();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="size"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity, CLSCompliant(false)]
+        public static extern void av_mallocz_static(uint size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="ptr"></param>
+        /// <param name="size"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity, CLSCompliant(false)]
+        public static extern void av_realloc_static(IntPtr ptr, uint size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVPicture"></param>
+        /// <param name="p_src_AVPicture"></param>
+        /// <param name="pix_fmt"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void img_copy(IntPtr pAVPicture, IntPtr p_src_AVPicture,
+        int pix_fmt, int width, int height);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="p_dst_pAVPicture"></param>
+        /// <param name="p_src_pAVPicture"></param>
+        /// <param name="pix_fmt"></param>
+        /// <param name="top_band"></param>
+        /// <param name="left_band"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int img_crop(IntPtr p_dst_pAVPicture, IntPtr p_src_pAVPicture,
+        int pix_fmt, int top_band, int left_band);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="p_dst_pAVPicture"></param>
+        /// <param name="p_src_pAVPicture"></param>
+        /// <param name="height"></param>
+        /// <param name="width"></param>
+        /// <param name="pix_fmt"></param>
+        /// <param name="padtop"></param>
+        /// <param name="padbottom"></param>
+        /// <param name="padleft"></param>
+        /// <param name="padright"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(AVCODEC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int img_pad(IntPtr p_dst_pAVPicture, IntPtr p_src_pAVPicture,
+        int height, int width, int pix_fmt, int padtop, int padbottom,
+        int padleft, int padright, ref int color);
+
+        // *********************************************************************************
+        // Constants
+        // *********************************************************************************
+
+        // 1 second of 48khz 32bit audio in bytes
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVCODEC_MAX_AUDIO_FRAME_SIZE = 192000;
+
+
+        /// <summary>
+        ///  Required number of additionally allocated bytes at the end of the input bitstream for decoding.
+        /// this is mainly needed because some optimized bitstream readers read
+        /// 32 or 64 bit at once and could read over the end
+        /// Note, if the first 23 bits of the additional bytes are not 0 then damaged
+        /// MPEG bitstreams could cause overread and segfault
+        /// </summary>
+        public const int FF_INPUT_BUFFER_PADDING_SIZE = 8;
+
+        /*
+        * minimum encoding buffer size.
+        * used to avoid some checks during header writing
+        */
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MIN_BUFFER_SIZE = 16384;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MAX_B_FRAMES = 16;
+
+        /* encoding support
+        these flags can be passed in AVCodecContext.flags before initing
+        Note: not everything is supported yet.
+        */
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_QSCALE = 0x0002; // use fixed qscale
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_4MV = 0x0004; // 4 MV per MB allowed / Advanced prediction for H263
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_QPEL = 0x0010; // use qpel MC
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_GMC = 0x0020; // use GMC
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_MV0 = 0x0040; // always try a MB with MV=<0,0>
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_PART = 0x0080; // use data partitioning
+        /* parent program gurantees that the input for b-frame containing streams is not written to
+        for at least s->max_b_frames+1 frames, if this is not set than the input will be copied */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_INPUT_PRESERVED = 0x0100;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_PASS1 = 0x0200; // use internal 2pass ratecontrol in first pass mode
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_PASS2 = 0x0400; // use internal 2pass ratecontrol in second pass mode
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_EXTERN_HUFF = 0x1000; // use external huffman table (for mjpeg)
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_GRAY = 0x2000; // only decode/encode grayscale
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_EMU_EDGE = 0x4000;// don't draw edges
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_PSNR = 0x8000; // error[?] variables will be set during encoding
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_TRUNCATED = 0x00010000; /** input bitstream might be truncated at a random location instead
+of only at frame boundaries */
+        public const int CODEC_FLAG_NORMALIZE_AQP = 0x00020000; // normalize adaptive quantization
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_INTERLACED_DCT = 0x00040000; // use interlaced dct
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_LOW_DELAY = 0x00080000; // force low delay
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_ALT_SCAN = 0x00100000; // use alternate scan
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_TRELLIS_QUANT = 0x00200000; // use trellis quantization
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_GLOBAL_HEADER = 0x00400000; // place global headers in extradata instead of every keyframe
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_BITEXACT = 0x00800000; // use only bitexact stuff (except (i)dct)
+        /* Fx : Flag for h263+ extra options */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_H263P_AIC = 0x01000000; // H263 Advanced intra coding / MPEG4 AC prediction (remove this)
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_AC_PRED = 0x01000000; // H263 Advanced intra coding / MPEG4 AC prediction
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_H263P_UMV = 0x02000000; // Unlimited motion vector
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_CBP_RD = 0x04000000; // use rate distortion optimization for cbp
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_QP_RD = 0x08000000; // use rate distortion optimization for qp selectioon
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_H263P_AIV = 0x00000008; // H263 Alternative inter vlc
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_OBMC = 0x00000001; // OBMC
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_LOOP_FILTER = 0x00000800; // loop filter
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_H263P_SLICE_STRUCT = 0x10000000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_INTERLACED_ME = 0x20000000; // interlaced motion estimation
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG_SVCD_SCAN_OFFSET = 0x40000000; // will reserve space for SVCD scan offset user data
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint CODEC_FLAG_CLOSED_GOP = ((uint)0x80000000);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_FAST = 0x00000001; // allow non spec compliant speedup tricks
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_STRICT_GOP = 0x00000002; // strictly enforce GOP size
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_NO_OUTPUT = 0x00000004; // skip bitstream encoding
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_LOCAL_HEADER = 0x00000008; // place global headers at every keyframe instead of in extradata
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_BPYRAMID = 0x00000010; // H.264 allow b-frames to be used as references
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_WPRED = 0x00000020; // H.264 weighted biprediction for b-frames
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_MIXED_REFS = 0x00000040; // H.264 multiple references per partition
+        /// <summary>
+        /// /
+        /// </summary>
+        public const int CODEC_FLAG2_8X8DCT = 0x00000080; // H.264 high profile 8x8 transform
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_FASTPSKIP = 0x00000100; // H.264 fast pskip
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_AUD = 0x00000200; // H.264 access unit delimiters
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_BRDO = 0x00000400; // b-frame rate-distortion optimization
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_INTRA_VLC = 0x00000800; // use MPEG-2 intra VLC table
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_FLAG2_MEMC_ONLY = 0x00001000; // only do ME/MC (I frames -> ref, P frame -> ME+MC)
+
+        /* Unsupported options :
+        * Syntax Arithmetic coding (SAC)
+        * Reference Picture Selection
+        * Independant Segment Decoding */
+        /* /Fx */
+        /* codec capabilities */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_CAP_DRAW_HORIZ_BAND = 0x0001; // decoder can use draw_horiz_band callback
+
+        /*
+        * Codec uses get_buffer() for allocating buffers.
+        * direct rendering method 1
+        */
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_CAP_DR1 = 0x0002;
+
+        /* if 'parse_only' field is true, then avcodec_parse_frame() can be
+        used */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_CAP_PARSE_ONLY = 0x0004;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_CAP_TRUNCATED = 0x0008;
+
+        /* codec can export data for HW decoding (XvMC) */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_CAP_HWACCEL = 0x0010;
+
+        /*
+        * codec has a non zero delay and needs to be feeded with NULL at the end to get the delayed data.
+        * if this is not set, the codec is guranteed to never be feeded with NULL data
+        */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CODEC_CAP_DELAY = 0x0020;
+
+
+        /// <summary>
+        /// * Codec can be fed a final frame with a smaller size.
+        /// * This can be used to prevent truncation of the last audio samples.
+        /// </summary>
+        public const int CODEC_CAP_SMALL_LAST_FRAME = 0x0040;
+
+        //the following defines may change, don't expect compatibility if you use them
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_INTRA4x4 = 0x001;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_INTRA16x16 = 0x0002; //FIXME h264 specific
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_INTRA_PCM = 0x0004; //FIXME h264 specific
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_16x16 = 0x0008;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_16x8 = 0x0010;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_8x16 = 0x0020;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_8x8 = 0x0040;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_INTERLACED = 0x0080;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_DIRECT2 = 0x0100; //FIXME
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_ACPRED = 0x0200;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_GMC = 0x0400;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_SKIP = 0x0800;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_P0L0 = 0x1000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_P1L0 = 0x2000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_P0L1 = 0x4000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_P1L1 = 0x8000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_L0 = (MB_TYPE_P0L0 | MB_TYPE_P1L0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_L1 = (MB_TYPE_P0L1 | MB_TYPE_P1L1);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_L0L1 = (MB_TYPE_L0 | MB_TYPE_L1);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_QUANT = 0x00010000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MB_TYPE_CBP = 0x00020000;
+        //Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv, ...)
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_QSCALE_TYPE_MPEG1 = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_QSCALE_TYPE_MPEG2 = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_QSCALE_TYPE_H264 = 2;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUFFER_TYPE_INTERNAL = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUFFER_TYPE_USER = 2; // Direct rendering buffers (image is (de)allocated by user)
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUFFER_TYPE_SHARED = 4; // buffer from somewhere else, don't dealloc image (data/base), all other tables are not shared
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUFFER_TYPE_COPY = 8; // just a (modified) copy of some other buffer, don't dealloc anything
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_I_TYPE = 1; // Intra
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_P_TYPE = 2; // Predicted
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_B_TYPE = 3; // Bi-dir predicted
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_S_TYPE = 4; // S(GMC)-VOP MPEG4
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_SI_TYPE = 5;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_SP_TYPE = 6;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUFFER_HINTS_VALID = 0x01; // Buffer hints value is meaningful (if 0 ignore)
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUFFER_HINTS_READABLE = 0x02; // Codec will read from buffer
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUFFER_HINTS_PRESERVE = 0x04; // User must not alter buffer content
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUFFER_HINTS_REUSABLE = 0x08; // Codec will reuse the buffer (update)
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int DEFAULT_FRAME_RATE_BASE = 1001000;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_ASPECT_EXTENDED = 15;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_RC_STRATEGY_XVID = 1;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_AUTODETECT = 1; // autodetection
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_OLD_MSMPEG4 = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_XVID_ILACE = 4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_UMP4 = 8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_NO_PADDING = 16;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_AMV = 32;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_AC_VLC = 0; // will be removed, libavcodec can now handle these non compliant files by default
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_QPEL_CHROMA = 64;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_STD_QPEL = 128;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_QPEL_CHROMA2 = 256;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_DIRECT_BLOCKSIZE = 512;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_EDGE = 1024;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_HPEL_CHROMA = 2048;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_DC_CLIP = 4096;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_BUG_MS = 8192; // workaround various bugs in microsofts broken decoders
+        // public const int FF_BUG_FAKE_SCALABILITY =16; //autodetection should work 100%
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_COMPLIANCE_VERY_STRICT = 2; // strictly conform to a older more strict version of the spec or reference software
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_COMPLIANCE_STRICT = 1; // strictly conform to all the things in the spec no matter what consequences
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_COMPLIANCE_NORMAL = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_COMPLIANCE_INOFFICIAL = -1; // allow inofficial extensions
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_COMPLIANCE_EXPERIMENTAL = -2; // allow non standarized experimental things
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_ER_CAREFUL = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_ER_COMPLIANT = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_ER_AGGRESSIVE = 3;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_ER_VERY_AGGRESSIVE = 4;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DCT_AUTO = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DCT_FASTINT = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DCT_INT = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DCT_MMX = 3;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DCT_MLIB = 4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DCT_ALTIVEC = 5;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DCT_FAAN = 6;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_AUTO = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_INT = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_SIMPLE = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_SIMPLEMMX = 3;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_LIBMPEG2MMX = 4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_PS2 = 5;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_MLIB = 6;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_ARM = 7;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_ALTIVEC = 8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_SH4 = 9;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_SIMPLEARM = 10;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_H264 = 11;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_VP3 = 12;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_IPP = 13;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_XVIDMMX = 14;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_IDCT_CAVS = 15;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_EC_GUESS_MVS = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_EC_DEBLOCK = 2;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint FF_MM_FORCE = 0x80000000; /* force usage of selected flags (OR) */
+        // /* lower 16 bits - CPU features */
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MM_MMX = 0x0001; /* standard MMX */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MM_3DNOW = 0x0004; /* AMD 3DNOW */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MM_MMXEXT = 0x0002;/* SSE integer functions or AMD MMX ext */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MM_SSE = 0x0008; /* SSE functions */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MM_SSE2 = 0x0010;/* PIV SSE2 functions */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MM_3DNOWEXT = 0x0020;/* AMD 3DNowExt */
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MM_IWMMXT = 0x0100; /* XScale IWMMXT */
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_PRED_LEFT = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_PRED_PLANE = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_PRED_MEDIAN = 2;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_PICT_INFO = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_RC = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_BITSTREAM = 4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_MB_TYPE = 8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_QP = 16;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_MV = 32;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_DCT_COEFF = 0x00000040;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_SKIP = 0x00000080;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_STARTCODE = 0x00000100;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_PTS = 0x00000200;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_ER = 0x00000400;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_MMCO = 0x00000800;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_BUGS = 0x00001000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_VIS_QP = 0x00002000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_VIS_MB_TYPE = 0x00004000;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_VIS_MV_P_FOR = 0x00000001; //visualize forward predicted MVs of P frames
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_VIS_MV_B_FOR = 0x00000002; //visualize forward predicted MVs of B frames
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEBUG_VIS_MV_B_BACK = 0x00000004; //visualize backward predicted MVs of B frames
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_SAD = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_SSE = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_SATD = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_DCT = 3;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_PSNR = 4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_BIT = 5;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_RD = 6;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_ZERO = 7;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_VSAD = 8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_VSSE = 9;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_NSSE = 10;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_W53 = 11;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_W97 = 12;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_DCTMAX = 13;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_DCT264 = 14;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CMP_CHROMA = 256;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DTG_AFD_SAME = 8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DTG_AFD_4_3 = 9;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DTG_AFD_16_9 = 10;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DTG_AFD_14_9 = 11;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DTG_AFD_4_3_SP_14_9 = 13;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DTG_AFD_16_9_SP_14_9 = 14;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DTG_AFD_SP_4_3 = 15;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_DEFAULT_QUANT_BIAS = 999999;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_LAMBDA_SHIFT = 7;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_LAMBDA_SCALE = (1 << FF_LAMBDA_SHIFT);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_QP2LAMBDA = 118; // factor to convert from H.263 QP to lambda
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_LAMBDA_MAX = (256 * 128 - 1);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CODER_TYPE_VLC = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_CODER_TYPE_AC = 1;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SLICE_FLAG_CODED_ORDER = 0x0001; // draw_horiz_band() is called in coded order instead of display
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SLICE_FLAG_ALLOW_FIELD = 0x0002; // allow draw_horiz_band() with field slices (MPEG2 field pics)
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SLICE_FLAG_ALLOW_PLANE = 0x0004; // allow draw_horiz_band() with 1 component at a time (SVQ1)
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MB_DECISION_SIMPLE = 0; // uses mb_cmp
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MB_DECISION_BITS = 1; // chooses the one which needs the fewest bits
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_MB_DECISION_RD = 2; // rate distoration
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_AA_AUTO = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_AA_FASTINT = 1; //not implemented yet
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_AA_INT = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_AA_FLOAT = 3;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_PROFILE_UNKNOWN = -99;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_LEVEL_UNKNOWN = -99;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int X264_PART_I4X4 = 0x001; /* Analyse i4x4 */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int X264_PART_I8X8 = 0x002; /* Analyse i8x8 (requires 8x8 transform) */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int X264_PART_P8X8 = 0x010; /* Analyse p16x8, p8x16 and p8x8 */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int X264_PART_P4X4 = 0x020; /* Analyse p8x4, p4x8, p4x4 */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int X264_PART_B8X8 = 0x100; /* Analyse b16x8, b8x16 and b8x8 */
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_COMPRESSION_DEFAULT = -1;
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVPALETTE_SIZE = 1024;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVPALETTE_COUNT = 256;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_LOSS_RESOLUTION = 0x0001; /* loss due to resolution change */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_LOSS_DEPTH = 0x0002; /* loss due to color depth change */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_LOSS_COLORSPACE = 0x0004; /* loss due to color space conversion */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_LOSS_ALPHA = 0x0008; /* loss of alpha bits */
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_LOSS_COLORQUANT = 0x0010; /* loss due to color quantization */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_LOSS_CHROMA = 0x0020; /* loss of chroma (e.g. rgb to gray conversion) */
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_ALPHA_TRANSP = 0x0001; // image has some totally transparent pixels
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FF_ALPHA_SEMI_TRANSP = 0x0002; // image has some transparent pixels
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AV_PARSER_PTS_NB = 4;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int PARSER_FLAG_COMPLETE_FRAMES = 0x0001;
+
+
+        // *********************************************************************************
+        // Enums
+        // *********************************************************************************
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public enum CodecID
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_NONE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MPEG1VIDEO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MPEG2VIDEO, /* prefered ID for MPEG Video 1 or 2 decoding */
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MPEG2VIDEO_XVMC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_H261,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_H263,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_RV10,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_RV20,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MJPEG,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MJPEGB,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_LJPEG,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SP5X,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_JPEGLS,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MPEG4,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_RAWVIDEO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MSMPEG4V1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MSMPEG4V2,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MSMPEG4V3,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_WMV1,
+            /// <summary>
+            /// /
+            /// </summary>
+            CODEC_ID_WMV2,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_H263P,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_H263I,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_FLV1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SVQ1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SVQ3,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_DVVIDEO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_HUFFYUV,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_CYUV,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_H264,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_INDEO3,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_VP3,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_THEORA,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ASV1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ASV2,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_FFV1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_4XM,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_VCR1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_CLJR,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MDEC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ROQ,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_INTERPLAY_VIDEO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_XAN_WC3,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_XAN_WC4,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_RPZA,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_CINEPAK,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_WS_VQA,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MSRLE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MSVIDEO1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_IDCIN,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_8BPS,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SMC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_FLIC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_TRUEMOTION1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_VMDVIDEO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MSZH,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ZLIB,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_QTRLE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SNOW,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_TSCC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ULTI,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_QDRAW,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_VIXL,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_QPEG,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_XVID,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PNG,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PPM,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PBM,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PGM,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PGMYUV,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PAM,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_FFVHUFF,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_RV30,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_RV40,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_VC1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_WMV3,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_LOCO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_WNV1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_AASC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_INDEO2,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_FRAPS,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_TRUEMOTION2,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_BMP,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_CSCD,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MMVIDEO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ZMBV,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_AVS,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SMACKVIDEO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_NUV,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_KMVC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_FLASHSV,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_CAVS,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_JPEG2000,
+            /// <summary>
+            /// /
+            /// </summary>
+            CODEC_ID_VMNC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_VP5,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_VP6,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_VP6F,
+
+            /* various pcm "codecs" */
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_S16LE = 0x10000,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_S16BE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_U16LE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_U16BE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_S8,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_U8,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_MULAW,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_ALAW,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_S32LE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_S32BE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_U32LE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_U32BE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_S24LE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_S24BE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_U24LE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_U24BE,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_PCM_S24DAUD,
+
+            /* various adpcm codecs */
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_IMA_QT = 0x11000,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_IMA_WAV,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_IMA_DK3,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_IMA_DK4,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_IMA_WS,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_IMA_SMJPEG,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_MS,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_4XM,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_XA,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_ADX,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_EA,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_G726,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_CT,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_SWF,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_YAMAHA,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_SBPRO_4,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_SBPRO_3,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ADPCM_SBPRO_2,
+
+            /* AMR */
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_AMR_NB = 0x12000,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_AMR_WB,
+
+            /* RealAudio codecs*/
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_RA_144 = 0x13000,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_RA_288,
+
+            /* various DPCM codecs */
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ROQ_DPCM = 0x14000,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_INTERPLAY_DPCM,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_XAN_DPCM,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SOL_DPCM,
+
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MP2 = 0x15000,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MP3, /* prefered ID for MPEG Audio layer 1, 2 or3 decoding */
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_AAC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MPEG4AAC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_AC3,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_DTS,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_VORBIS,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_DVAUDIO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_WMAV1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_WMAV2,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MACE3,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MACE6,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_VMDAUDIO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SONIC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SONIC_LS,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_FLAC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MP3ADU,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MP3ON4,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SHORTEN,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_ALAC,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_WESTWOOD_SND1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_GSM,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_QDM2,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_COOK,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_TRUESPEECH,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_TTA,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_SMACKAUDIO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_QCELP,
+
+            /* subtitle codecs */
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_DVD_SUBTITLE = 0x17000,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_DVB_SUBTITLE,
+
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_ID_MPEG2TS = 0x20000, /* _FAKE_ codec to indicate a raw MPEG2 transport
+stream (only used by libavformat) */
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public enum CodecType
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_TYPE_UNKNOWN = -1,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_TYPE_VIDEO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_TYPE_AUDIO,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_TYPE_DATA,
+            /// <summary>
+            /// 
+            /// </summary>
+            CODEC_TYPE_SUBTITLE,
+        };
+
+        /* currently unused, may be used if 24/32 bits samples ever supported */
+        /* all in native endian */
+        /// <summary>
+        /// 
+        /// </summary>
+        public enum SampleFormat
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            SAMPLE_FMT_NONE = -1,
+            /// <summary>
+            /// 
+            /// </summary>
+            SAMPLE_FMT_U8, //< unsigned 8 bits
+            /// <summary>
+            /// 
+            /// </summary>
+            SAMPLE_FMT_S16, //< signed 16 bits
+            /// <summary>
+            /// 
+            /// </summary>
+            SAMPLE_FMT_S24, //< signed 24 bits
+            /// <summary>
+            /// 
+            /// </summary>
+            SAMPLE_FMT_S32, //< signed 32 bits
+            /// <summary>
+            /// 
+            /// </summary>
+            SAMPLE_FMT_FLT, //< float
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public enum Motion_Est_ID
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            ME_ZERO = 1,
+            /// <summary>
+            /// 
+            /// </summary>
+            ME_FULL,
+            /// <summary>
+            /// 
+            /// </summary>
+            ME_LOG,
+            /// <summary>
+            /// 
+            /// </summary>
+            ME_PHODS,
+            /// <summary>
+            /// 
+            /// </summary>
+            ME_EPZS,
+            /// <summary>
+            /// 
+            /// </summary>
+            ME_X1,
+            /// <summary>
+            /// 
+            /// </summary>
+            ME_HEX,
+            /// <summary>
+            /// 
+            /// </summary>
+            ME_UMH,
+            /// <summary>
+            /// 
+            /// </summary>
+            ME_ITER,
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public enum AVDiscard
+        {
+            //we leave some space between them for extensions (drop some keyframes for intra only or drop just some bidir frames)
+            /// <summary>
+            /// 
+            /// </summary>
+            AVDISCARD_NONE = -16, //< discard nothing
+            /// <summary>
+            /// 
+            /// </summary>
+            AVDISCARD_DEFAULT = 0, //< discard useless packets like 0 size packets in avi
+            /// <summary>
+            /// 
+            /// </summary>
+            AVDISCARD_NONREF = 8, //< discard all non reference
+            /// <summary>
+            /// 
+            /// </summary>
+            AVDISCARD_BIDIR = 16, //< discard all bidirectional frames
+            /// <summary>
+            /// 
+            /// </summary>
+            AVDISCARD_NONKEY = 32, //< discard all frames except keyframes
+            /// <summary>
+            /// 
+            /// </summary>
+            AVDISCARD_ALL = 48, //< discard all
+        };
+
+        // *********************************************************************************
+        // Structs
+        // *********************************************************************************
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct RcOverride
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int start_frame;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int end_frame;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int qscale;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.R4)]
+            public float quality_factor;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public struct AVPanScan
+        {
+            /**
+            * id.
+            * - encoding: set by user.
+            * - decoding: set by lavc
+            */
+
+            public int id;
+            /**
+            * width and height in 1/16 pel
+            * - encoding: set by user.
+            * - decoding: set by lavc
+            */
+
+            public int width;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int height;
+            /**
+            * position of the top left corner in 1/16 pel for up to 3 fields/frames.
+            * - encoding: set by user.
+            * - decoding: set by lavc
+            */
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
+            public short[] position;// [3][2] = 3 x 2 = 6
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVFrame
+        {
+            /*
+ * pointer to the picture planes.
+ * This might be different from the first allocated byte
+ * - encoding: 
+ * - decoding: 
+ */
+            /// <summary>
+            /// uint8_t *data[4]
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+            public IntPtr[] data;
+
+            /// <summary>
+            /// int linesize[4];
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+            public int[] linesize;
+            /*
+             * pointer to the first allocated byte of the picture. Can be used in get_buffer/release_buffer.
+             * This isn't used by libavcodec unless the default get/release_buffer() is used.
+             * - encoding: 
+             * - decoding: 
+             */
+            /// <summary>
+            /// uint8_t *base[4];
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+            public IntPtr[] @base;
+            /*
+             * 1 -> keyframe, 0-> not
+             * - encoding: Set by libavcodec.
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int key_frame;
+
+            /*
+             * Picture type of the frame, see ?_TYPE below.
+             * - encoding: Set by libavcodec. for coded_picture (and set by user for input).
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int pict_type;
+
+            /*
+             * presentation timestamp in time_base units (time when frame should be shown to user)
+             * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed.
+             * - encoding: MUST be set by user.
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public long pts;
+
+            /*
+             * picture number in bitstream order
+             * - encoding: set by
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int coded_picture_number;
+            /*
+             * picture number in display order
+             * - encoding: set by
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int display_picture_number;
+
+            /*
+             * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) 
+             * - encoding: Set by libavcodec. for coded_picture (and set by user for input).
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int quality;
+
+            /*
+             * buffer age (1->was last buffer and dint change, 2->..., ...).
+             * Set to INT_MAX if the buffer has not been used yet.
+             * - encoding: unused
+             * - decoding: MUST be set by get_buffer().
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int age;
+
+            /**
+             * is this picture used as reference
+             * - encoding: unused
+             * - decoding: Set by libavcodec. (before get_buffer() call)).
+             */
+            public int reference;
+
+            /*
+             * QP table
+             * - encoding: unused
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// int8_t *qscale_table;
+            /// </summary>
+            public IntPtr qscale_table;
+            /**
+             * QP store stride
+             * - encoding: unused
+             * - decoding: Set by libavcodec.
+             */
+            public int qstride;
+
+            /**
+             * mbskip_table[mb]>=1 if MB didn't change
+             * stride= mb_width = (width+15)>>4
+             * - encoding: unused
+             * - decoding: Set by libavcodec.
+             */
+            public IntPtr mbskip_table;
+
+            /*
+             * motion vector table
+             * @code
+             * example:
+             * int mv_sample_log2= 4 - motion_subsample_log2;
+             * int mb_width= (width+15)>>4;
+             * int mv_stride= (mb_width << mv_sample_log2) + 1;
+             * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];
+             * @endcode
+             * - encoding: Set by user.
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// int16_t (*motion_val[2])[2];
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+            public IntPtr[] motion_val;
+
+            /*
+             * macroblock type table
+             * mb_type_base + mb_width + 2
+             * - encoding: Set by user.
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr mb_type;
+
+            /*
+             * log2 of the size of the block which a single vector in motion_val represents: 
+             * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)
+             * - encoding: unused
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte motion_subsample_log2;
+
+            /*
+             * for some private data of the user
+             * - encoding: unused
+             * - decoding: Set by user.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr opaque;
+
+            /*
+             * error
+             * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR.
+             * - decoding: unused
+             */
+            /// <summary>
+            /// uint64_t error[4];
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+            public long[] error;
+
+            /*
+             * type of the buffer (to keep track of who has to deallocate data[*])
+             * - encoding: Set by the one who allocates it.
+             * - decoding: Set by the one who allocates it.
+             * Note: User allocated (direct rendering) & internal buffers cannot coexist currently.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int type;
+
+            /*
+             * When decoding, this signals how much the picture must be delayed.
+             * extra_delay = repeat_pict / (2*fps)
+             * - encoding: unused
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int repeat_pict;
+
+            /*
+             * 
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int qscale_type;
+
+            /*
+             * The content of the picture is interlaced.
+             * - encoding: Set by user.
+             * - decoding: Set by libavcodec. (default 0)
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int interlaced_frame;
+
+            /*
+             * If the content is interlaced, is top field displayed first.
+             * - encoding: Set by user.
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int top_field_first;
+
+            /*
+             * Pan scan.
+             * - encoding: Set by user.
+             * - decoding: Set by libavcodec.
+             */
+
+            /// <summary>
+            /// AVPanScan *pan_scan;
+            /// </summary>
+            public IntPtr pan_scan;
+
+            /*
+             * Tell user application that palette has changed from previous frame.
+             * - encoding: ??? (no palette-enabled encoder yet)
+             * - decoding: Set by libavcodec. (default 0).
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int palette_has_changed;
+
+            /*
+             * codec suggestion on buffer type if != 0
+             * - encoding: unused
+             * - decoding: Set by libavcodec. (before get_buffer() call)).
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int buffer_hints;
+
+            /*
+             * DCT coefficients
+             * - encoding: unused
+             * - decoding: Set by libavcodec.
+             */
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr dct_coeff;
+
+            /*
+             * motion referece frame index
+             * - encoding: Set by user.
+             * - decoding: Set by libavcodec.
+             */
+
+            /// <summary>
+            /// int8_t *ref_index[2];
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
+            public IntPtr[] ref_index;
+        };
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pAVFrame"></param>
+        /// <param name="offset"></param>
+        /// <param name="y"></param>
+        /// <param name="type"></param>
+        /// <param name="height"></param>
+        public delegate void DrawhorizBandCallback(IntPtr pAVCodecContext, IntPtr pAVFrame,
+        [MarshalAs(UnmanagedType.LPArray, SizeConst = 4)]int[] offset,
+        int y, int type, int height);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pdata"></param>
+        /// <param name="size"></param>
+        /// <param name="mb_nb"></param>
+        public delegate void RtpCallback(IntPtr pAVCodecContext, IntPtr pdata, int size, int mb_nb);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pAVFrame"></param>
+        /// <returns></returns>
+        public delegate int GetBufferCallback(IntPtr pAVCodecContext, IntPtr pAVFrame);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pAVFrame"></param>
+        public delegate void ReleaseBufferCallback(IntPtr pAVCodecContext, IntPtr pAVFrame);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pPixelFormat"></param>
+        /// <returns></returns>
+        public delegate PixelFormat GetFormatCallback(IntPtr pAVCodecContext, IntPtr pPixelFormat);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="pAVFrame"></param>
+        /// <returns></returns>
+        public delegate int RegetBufferCallback(IntPtr pAVCodecContext, IntPtr pAVFrame);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="parg"></param>
+        /// <returns></returns>
+        public delegate int FuncCallback(IntPtr pAVCodecContext, IntPtr parg);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="func"></param>
+        /// <param name="arg2"></param>
+        /// <param name="ret"></param>
+        /// <param name="count"></param>
+        /// <returns></returns>
+        public delegate int ExecuteCallback(IntPtr pAVCodecContext,
+        [MarshalAs(UnmanagedType.FunctionPtr)]FuncCallback func,
+        [MarshalAs(UnmanagedType.LPArray)]IntPtr[] arg2, ref int ret, int count);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public struct AVCodecContext
+        {
+            /**
+            * Info on struct for av_log
+            * - set by avcodec_alloc_context
+            */
+            public IntPtr av_class; // AVClass *av_class;
+
+            /**
+            * the average bitrate.
+            * - encoding: set by user. unused for constant quantizer encoding
+            * - decoding: set by lavc. 0 or some bitrate if this info is available in the stream
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int bit_rate;
+
+            /**
+            * number of bits the bitstream is allowed to diverge from the reference.
+            * the reference can be CBR (for CBR pass1) or VBR (for pass2)
+            * - encoding: set by user. unused for constant quantizer encoding
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int bit_rate_tolerance;
+
+            /**
+            * CODEC_FLAG_*.
+            * - encoding: set by user.
+            * - decoding: set by user.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int flags;
+
+            /**
+            * some codecs needs additionnal format info. It is stored here
+            * - encoding: set by user.
+            * - decoding: set by lavc. (FIXME is this ok?)
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int sub_id;
+
+            /**
+            * motion estimation algorithm used for video coding.
+            * 1 (zero), 2 (full), 3 (log), 4 (phods), 5 (epzs), 6 (x1), 7 (hex),
+            * 8 (umh), 9 (iter) [7, 8 are x264 specific, 9 is snow specific]
+            * - encoding: MUST be set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int me_method;
+
+            /*
+            * some codecs need / can use extra-data like huffman tables.
+            * mjpeg: huffman tables
+            * rv10: additional flags
+            * mpeg4: global headers (they can be in the bitstream or here)
+            * the allocated memory should be FF_INPUT_BUFFER_PADDING_SIZE bytes larger
+            * then extradata_size to avoid prolems if its read with the bitstream reader
+            * the bytewise contents of extradata must not depend on the architecture or cpu endianness
+            * - encoding: set/allocated/freed by lavc.
+            * - decoding: set/allocated/freed by user.
+            */
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr extradata; // void* extradata;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int extradata_size;
+
+            /*
+            * this is the fundamental unit of time (in seconds) in terms
+            * of which frame timestamps are represented. for fixed-fps content,
+            * timebase should be 1/framerate and timestamp increments should be
+            * identically 1.
+            * - encoding: MUST be set by user
+            * - decoding: set by lavc.
+            */
+            /// <summary>
+            /// /
+            /// </summary>
+            public AVRational time_base;
+
+            /* video only */
+            /*
+            * picture width / height.
+            * - encoding: MUST be set by user.
+            * - decoding: set by lavc.
+            * Note, for compatibility its possible to set this instead of
+            * coded_width/height before decoding
+            */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int width;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int height;
+
+            /*
+            * the number of pictures in a group of pitures, or 0 for intra_only.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int gop_size;
+
+            /**
+            * pixel format, see PIX_FMT_xxx.
+            * - encoding: set by user.
+            * - decoding: set by lavc.
+            */
+            public PixelFormat pix_fmt;
+
+            /**
+            * Frame rate emulation. If not zero lower layer (i.e. format handler)
+            * has to read frames at native frame rate.
+            * - encoding: set by user.
+            * - decoding: unused.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int rate_emu;
+
+            /**
+            * if non NULL, 'draw_horiz_band' is called by the libavcodec
+            * decoder to draw an horizontal band. It improve cache usage. Not
+            * all codecs can do that. You must check the codec capabilities
+            * before
+            * - encoding: unused
+            * - decoding: set by user.
+            * @param height the height of the slice
+            * @param y the y position of the slice
+            * @param type 1->top field, 2->bottom field, 3->frame
+            * @param offset offset into the AVFrame.data from which the slice should be read
+            */
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public DrawhorizBandCallback draw_horiz_band;
+
+            /* audio only */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int sample_rate; // samples per sec
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int channels;
+
+            /**
+            * audio sample format.
+            * - encoding: set by user.
+            * - decoding: set by lavc.
+            */
+            public SampleFormat sample_fmt; // sample format, currenly unused
+
+            /* the following data should not be initialized */
+            /**
+            * samples per packet. initialized when calling 'init'
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int frame_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int frame_number; // audio or video frame number
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int real_pict_num; // returns the real picture number of previous encoded frame
+
+            /**
+            * number of frames the decoded output will be delayed relative to
+            * the encoded input.
+            * - encoding: set by lavc.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int delay;
+
+            /* - encoding parameters */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.R4)]
+            public float qcompress; // amount of qscale change between easy & hard scenes (0.0-1.0)
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.R4)]
+            public float qblur; // amount of qscale smoothing over time (0.0-1.0)
+
+            /**
+            * minimum quantizer.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int qmin;
+
+            /**
+            * maximum quantizer.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int qmax;
+
+            /**
+            * maximum quantizer difference etween frames.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int max_qdiff;
+
+            /**
+            * maximum number of b frames between non b frames.
+            * note: the output will be delayed by max_b_frames+1 relative to the input
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int max_b_frames;
+
+            /**
+            * qscale factor between ip and b frames.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float b_quant_factor;
+
+            /** obsolete FIXME remove */
+            [MarshalAs(UnmanagedType.I4)]
+            public int rc_strategy;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int b_frame_strategy;
+
+            /**
+            * hurry up amount.
+            * deprecated in favor of skip_idct and skip_frame
+            * - encoding: unused
+            * - decoding: set by user. 1-> skip b frames, 2-> skip idct/dequant too, 5-> skip everything except header
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int hurry_up;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr codec; // AVCodec
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr priv_data;
+
+            /* unused, FIXME remove*/
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int rtp_mode;
+
+            /* The size of the RTP payload: the coder will */
+            /* do it's best to deliver a chunk with size */
+            /* below rtp_payload_size, the chunk will start */
+            /* with a start code on some codecs like H.263 */
+            /* This doesn't take account of any particular */
+            /* headers inside the transmited RTP payload */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int rtp_payload_size;
+
+            /* The RTP callback: This function is called */
+            /* every time the encoder has a packet to send */
+            /* Depends on the encoder if the data starts */
+            /* with a Start Code (it should) H.263 does. */
+            /* mb_nb contains the number of macroblocks */
+            /* encoded in the RTP payload */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public RtpCallback rtp_callback;
+
+            /* statistics, used for 2-pass encoding */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int mv_bits;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int header_bits;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int i_tex_bits;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int p_tex_bits;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int i_count;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int p_count;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int skip_count;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int misc_bits;
+
+            /**
+            * number of bits used for the previously encoded frame.
+            * - encoding: set by lavc
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int frame_bits;
+
+            /**
+            * private data of the user, can be used to carry app specific stuff.
+            * - encoding: set by user
+            * - decoding: set by user
+            */
+            public IntPtr opaque;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
+            public byte[] codec_name;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public CodecType codec_type; /* see CODEC_TYPE_xxx */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public CodecID codec_id; /* see CODEC_ID_xxx */
+
+            /*
+            * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
+            * this is used to workaround some encoder bugs
+            * - encoding: set by user, if not then the default based on codec_id will be used
+            * - decoding: set by user, will be converted to upper case by lavc during init
+            */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U4), CLSCompliant(false)]
+            public uint codec_tag;
+
+            /**
+            * workaround bugs in encoders which sometimes cannot be detected automatically.
+            * - encoding: set by user
+            * - decoding: set by user
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int workaround_bugs;
+
+            /**
+            * luma single coeff elimination threshold.
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int luma_elim_threshold;
+
+            /**
+            * chroma single coeff elimination threshold.
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int chroma_elim_threshold;
+
+            /**
+            * strictly follow the std (MPEG4, ...).
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int strict_std_compliance;
+
+            /**
+            * qscale offset between ip and b frames.
+            * if > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset)
+            * if < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset)
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float b_quant_offset;
+
+            /**
+            * error resilience higher values will detect more errors but may missdetect
+            * some more or less valid parts as errors.
+            * - encoding: unused
+            * - decoding: set by user
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int error_resilience;
+
+            /**
+            * called at the beginning of each frame to get a buffer for it.
+            * if pic.reference is set then the frame will be read later by lavc
+            * avcodec_align_dimensions() should be used to find the required width and
+            * height, as they normally need to be rounded up to the next multiple of 16
+            * - encoding: unused
+            * - decoding: set by lavc, user can override
+            */
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public GetBufferCallback get_buffer;
+
+            /**
+            * called to release buffers which where allocated with get_buffer.
+            * a released buffer can be reused in get_buffer()
+            * pic.data[*] must be set to NULL
+            * - encoding: unused
+            * - decoding: set by lavc, user can override
+            */
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ReleaseBufferCallback release_buffer;
+
+            /**
+            * if 1 the stream has a 1 frame delay during decoding.
+            * - encoding: set by lavc
+            * - decoding: set by lavc
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int has_b_frames;
+
+            /**
+            * number of bytes per packet if constant and known or 0
+            * used by some WAV based audio codecs
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int block_align;
+
+            /* - decoding only: if true, only parsing is done
+            (function avcodec_parse_frame()). The frame
+            data is returned. Only MPEG codecs support this now. */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int parse_only;
+
+            /**
+            * 0-> h263 quant 1-> mpeg quant.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int mpeg_quant;
+
+            /**
+            * pass1 encoding statistics output buffer.
+            * - encoding: set by lavc
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String stats_out; // char* stats_out
+
+            /**
+            * pass2 encoding statistics input buffer.
+            * concatenated stuff from stats_out of pass1 should be placed here
+            * - encoding: allocated/set/freed by user
+            * - decoding: unused
+            */
+            public String stats_in;// char *stats_in
+
+
+            /**
+            * ratecontrol qmin qmax limiting method.
+            * 0-> clipping, 1-> use a nice continous function to limit qscale wthin qmin/qmax
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float rc_qsquish;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.R4)]
+            public float rc_qmod_amp;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int rc_qmod_freq;
+
+            /**
+            * ratecontrol override, see RcOverride.
+            * - encoding: allocated/set/freed by user.
+            * - decoding: unused
+            */
+            public IntPtr rc_override; // RcOverride* rc_override;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int rc_override_count;
+
+            /**
+            * rate control equation.
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String rc_eq; // char* rc_eq;
+
+            /**
+            * maximum bitrate.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int rc_max_rate;
+
+            /**
+            * minimum bitrate.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int rc_min_rate;
+
+            /**
+            * decoder bitstream buffer size.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int rc_buffer_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.R4)]
+            public float rc_buffer_aggressivity;
+
+            /**
+            * qscale factor between p and i frames.
+            * if > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset)
+            * if < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset)
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float i_quant_factor;
+
+            /**
+            * qscale offset between p and i frames.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float i_quant_offset;
+
+            /**
+            * initial complexity for pass1 ratecontrol.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float rc_initial_cplx;
+
+            /**
+            * dct algorithm, see FF_DCT_* below.
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int dct_algo;
+
+            /**
+            * luminance masking (0-> disabled).
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float lumi_masking;
+
+            /**
+            * temporary complexity masking (0-> disabled).
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float temporal_cplx_masking;
+
+            /**
+            * spatial complexity masking (0-> disabled).
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float spatial_cplx_masking;
+
+            /**
+            * p block masking (0-> disabled).
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float p_masking;
+
+            /**
+            * darkness masking (0-> disabled).
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float dark_masking;
+
+            /* for binary compatibility */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int unused;
+
+            /**
+            * idct algorithm, see FF_IDCT_* below.
+            * - encoding: set by user
+            * - decoding: set by user
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int idct_algo;
+
+            /**
+            * slice count.
+            * - encoding: set by lavc
+            * - decoding: set by user (or 0)
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int slice_count;
+
+            /**
+            * slice offsets in the frame in bytes.
+            * - encoding: set/allocated by lavc
+            * - decoding: set/allocated by user (or NULL)
+            */
+            public IntPtr slice_offset; // int *slice_offset
+
+            /**
+            * error concealment flags.
+            * - encoding: unused
+            * - decoding: set by user
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int error_concealment;
+
+            /**
+            * dsp_mask could be add used to disable unwanted CPU features
+            * CPU features (i.e. MMX, SSE. ...)
+            *
+            * with FORCE flag you may instead enable given CPU features
+            * (Dangerous: usable in case of misdetection, improper usage however will
+            * result into program crash)
+            */
+            [MarshalAs(UnmanagedType.U4), CLSCompliant(false)]
+            public uint dsp_mask;
+
+            /**
+            * bits per sample/pixel from the demuxer (needed for huffyuv).
+            * - encoding: set by lavc
+            * - decoding: set by user
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int bits_per_sample;
+
+            /**
+            * prediction method (needed for huffyuv).
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int prediction_method;
+
+            /**
+            * sample aspect ratio (0 if unknown).
+            * numerator and denominator must be relative prime and smaller then 256 for some video standards
+            * - encoding: set by user.
+            * - decoding: set by lavc.
+            */
+            public AVRational sample_aspect_ratio;
+
+            /**
+            * the picture in the bitstream.
+            * - encoding: set by lavc
+            * - decoding: set by lavc
+            */
+            public IntPtr coded_frame; // AVFrame* coded_frame;
+
+            /**
+            * debug.
+            * - encoding: set by user.
+            * - decoding: set by user.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int debug;
+
+            /**
+            * debug.
+            * - encoding: set by user.
+            * - decoding: set by user.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int debug_mv;
+
+            /**
+            * error.
+            * - encoding: set by lavc if flags&CODEC_FLAG_PSNR
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+            public Int64[] error;
+
+            /**
+            * minimum MB quantizer.
+            * - encoding: unused
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int mb_qmin;
+
+            /**
+            * maximum MB quantizer.
+            * - encoding: unused
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int mb_qmax;
+
+            /**
+            * motion estimation compare function.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int me_cmp;
+
+
+            /**
+            * subpixel motion estimation compare function.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int me_sub_cmp;
+
+            /**
+            * macroblock compare function (not supported yet).
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int mb_cmp;
+
+            /**
+            * interlaced dct compare function
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int ildct_cmp;
+
+            /**
+            * ME diamond size & shape.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int dia_size;
+
+            /**
+            * amount of previous MV predictors (2a+1 x 2a+1 square).
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int last_predictor_count;
+
+            /**
+            * pre pass for motion estimation.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int pre_me;
+
+            /**
+            * motion estimation pre pass compare function.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int me_pre_cmp;
+
+            /**
+            * ME pre pass diamond size & shape.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int pre_dia_size;
+
+            /**
+            * subpel ME quality.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int me_subpel_quality;
+
+            /**
+            * callback to negotiate the pixelFormat.
+            * @param fmt is the list of formats which are supported by the codec,
+            * its terminated by -1 as 0 is a valid format, the formats are ordered by quality
+            * the first is allways the native one
+            * @return the choosen format
+            * - encoding: unused
+            * - decoding: set by user, if not set then the native format will always be choosen
+            */
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public GetFormatCallback get_format;
+
+            /**
+            * DTG active format information (additionnal aspect ratio
+            * information only used in DVB MPEG2 transport streams). 0 if
+            * not set.
+            *
+            * - encoding: unused.
+            * - decoding: set by decoder
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int dtg_active_format;
+
+            /**
+            * Maximum motion estimation search range in subpel units.
+            * if 0 then no limit
+            *
+            * - encoding: set by user.
+            * - decoding: unused.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int me_range;
+
+            /**
+            * intra quantizer bias.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int intra_quant_bias;
+
+            /**
+            * inter quantizer bias.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int inter_quant_bias;
+
+            /**
+            * color table ID.
+            * - encoding: unused.
+            * - decoding: which clrtable should be used for 8bit RGB images
+            * table have to be stored somewhere FIXME
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int color_table_id;
+
+            /**
+            * internal_buffer count.
+            * Don't touch, used by lavc default_get_buffer()
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int internal_buffer_count;
+
+            /**
+            * internal_buffers.
+            * Don't touch, used by lavc default_get_buffer()
+            */
+            public IntPtr internal_buffer; // void* internal_buffer;
+
+            /**
+            * global quality for codecs which cannot change it per frame.
+            * this should be proportional to MPEG1/2/4 qscale.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int global_quality;
+
+            /**
+            * coder type
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int coder_type;
+
+            /**
+            * context model
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int context_model;
+
+#if FALSE
+/**
+*
+* - encoding: unused
+* - decoding: set by user.
+*/
+uint8_t * (*realloc)(struct AVCodecContext *s, uint8_t *buf, int buf_size);
+#endif
+            /**
+* slice flags
+* - encoding: unused
+* - decoding: set by user.
+*/
+            [MarshalAs(UnmanagedType.I4)]
+            public int slice_flags;
+
+            /**
+            * XVideo Motion Acceleration
+            * - encoding: forbidden
+            * - decoding: set by decoder
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int xvmc_acceleration;
+
+            /**
+            * macroblock decision mode
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int mb_decision;
+
+            /**
+            * custom intra quantization matrix
+            * - encoding: set by user, can be NULL
+            * - decoding: set by lavc
+            */
+            public IntPtr intra_matrix; // uint16_t* intra_matrix;
+
+            /**
+            * custom inter quantization matrix
+            * - encoding: set by user, can be NULL
+            * - decoding: set by lavc
+            */
+            public IntPtr inter_matrix; // uint16_t* inter_matrix;
+
+            /**
+            * fourcc from the AVI stream header (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
+            * this is used to workaround some encoder bugs
+            * - encoding: unused
+            * - decoding: set by user, will be converted to upper case by lavc during init
+            */
+            [MarshalAs(UnmanagedType.U4), CLSCompliant(false)]
+            public uint stream_codec_tag;
+
+            /**
+            * scene change detection threshold.
+            * 0 is default, larger means fewer detected scene changes
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int scenechange_threshold;
+
+            /**
+            * minimum lagrange multipler
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int lmin;
+
+            /**
+            * maximum lagrange multipler
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int lmax;
+
+            /**
+            * Palette control structure
+            * - encoding: ??? (no palette-enabled encoder yet)
+            * - decoding: set by user.
+            */
+            public IntPtr palctrl; // AVPaletteControl *palctrl;
+
+            /**
+            * noise reduction strength
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int noise_reduction;
+
+            /**
+            * called at the beginning of a frame to get cr buffer for it.
+            * buffer type (size, hints) must be the same. lavc won't check it.
+            * lavc will pass previous buffer in pic, function should return
+            * same buffer or new buffer with old frame "painted" into it.
+            * if pic.data[0] == NULL must behave like get_buffer().
+            * - encoding: unused
+            * - decoding: set by lavc, user can override
+            */
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public RegetBufferCallback reget_buffer;
+
+            /**
+            * number of bits which should be loaded into the rc buffer before decoding starts
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int rc_initial_buffer_occupancy;
+
+            /**
+            *
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int inter_threshold;
+
+            /**
+            * CODEC_FLAG2_*.
+            * - encoding: set by user.
+            * - decoding: set by user.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int flags2;
+
+            /**
+            * simulates errors in the bitstream to test error concealment.
+            * - encoding: set by user.
+            * - decoding: unused.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int error_rate;
+
+            /**
+            * MP3 antialias algorithm, see FF_AA_* below.
+            * - encoding: unused
+            * - decoding: set by user
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int antialias_algo;
+
+            /**
+            * Quantizer noise shaping.
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int quantizer_noise_shaping;
+
+            /**
+            * Thread count.
+            * is used to decide how many independant tasks should be passed to execute()
+            * - encoding: set by user
+            * - decoding: set by user
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int thread_count;
+
+            /**
+            * the codec may call this to execute several independant things. it will return only after
+            * finishing all tasks, the user may replace this with some multithreaded implementation, the
+            * default implementation will execute the parts serially
+            * @param count the number of things to execute
+            * - encoding: set by lavc, user can override
+            * - decoding: set by lavc, user can override
+            */
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ExecuteCallback execute;
+
+            /**
+            * Thread opaque.
+            * can be used by execute() to store some per AVCodecContext stuff.
+            * - encoding: set by execute()
+            * - decoding: set by execute()
+            */
+            public IntPtr thread_opaque; // void* thread_opaque;
+
+            /**
+            * Motion estimation threshold. under which no motion estimation is
+            * performed, but instead the user specified motion vectors are used
+            *
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int me_threshold;
+
+            /**
+            * Macroblock threshold. under which the user specified macroblock types will be used
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int mb_threshold;
+
+            /**
+            * precision of the intra dc coefficient - 8.
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int intra_dc_precision;
+
+            /**
+            * noise vs. sse weight for the nsse comparsion function.
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int nsse_weight;
+
+            /**
+            * number of macroblock rows at the top which are skipped.
+            * - encoding: unused
+            * - decoding: set by user
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int skip_top;
+
+            /**
+            * number of macroblock rows at the bottom which are skipped.
+            * - encoding: unused
+            * - decoding: set by user
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int skip_bottom;
+
+            /**
+            * profile
+            * - encoding: set by user
+            * - decoding: set by lavc
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int profile;
+
+            /**
+            * level
+            * - encoding: set by user
+            * - decoding: set by lavc
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int level;
+
+            /**
+            * low resolution decoding. 1-> 1/2 size, 2->1/4 size
+            * - encoding: unused
+            * - decoding: set by user
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int lowres;
+
+            /**
+            * bitsream width / height. may be different from width/height if lowres
+            * or other things are used
+            * - encoding: unused
+            * - decoding: set by user before init if known, codec should override / dynamically change if needed
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int coded_width, coded_height;
+
+            /**
+            * frame skip threshold
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int frame_skip_threshold;
+
+            /**
+            * frame skip factor
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int frame_skip_factor;
+
+
+            /**
+            * frame skip exponent
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int frame_skip_exp;
+
+            /**
+            * frame skip comparission function
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int frame_skip_cmp;
+
+            /**
+            * border processing masking. raises the quantizer for mbs on the borders
+            * of the picture.
+            * - encoding: set by user
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float border_masking;
+
+            /**
+            * minimum MB lagrange multipler.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int mb_lmin;
+
+            /**
+            * maximum MB lagrange multipler.
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int mb_lmax;
+
+            /**
+            *
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int me_penalty_compensation;
+
+            /**
+            *
+            * - encoding: unused
+            * - decoding: set by user.
+            */
+            public AVDiscard skip_loop_filter;
+
+            /**
+            *
+            * - encoding: unused
+            * - decoding: set by user.
+            */
+            public AVDiscard skip_frame;
+
+            /**
+            *
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int bidir_refine;
+
+            /**
+            *
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int brd_scale;
+
+            /**
+            * constant rate factor - quality-based VBR - values ~correspond to qps
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int crf;
+
+
+            /**
+            * constant quantization parameter rate control method
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int cqp;
+
+            /**
+            * minimum gop size
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int keyint_min;
+
+            /**
+            * number of reference frames
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int refs;
+
+            /**
+            * chroma qp offset from luma
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int chromaoffset;
+
+            /**
+            * influences how often b-frames are used
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int bframebias;
+
+            /**
+            * trellis RD quantization
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int trellis;
+
+            /**
+            * reduce fluctuations in qp (before curve compression)
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.R4)]
+            public float complexityblur;
+
+            /**
+            * in-loop deblocking filter alphac0 parameter
+            * alpha is in the range -6...6
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int deblockalpha;
+
+            /**
+            * in-loop deblocking filter beta parameter
+            * beta is in the range -6...6
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int deblockbeta;
+
+            /**
+            * macroblock subpartition sizes to consider - p8x8, p4x4, b8x8, i8x8, i4x4
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int partitions;
+
+            /**
+            * direct mv prediction mode - 0 (none), 1 (spatial), 2 (temporal)
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int directpred;
+
+            /**
+            * audio cutoff bandwidth (0 means "automatic") . Currently used only by FAAC
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int cutoff;
+
+            /**
+            * multiplied by qscale for each frame and added to scene_change_score
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int scenechange_factor;
+
+            /**
+            *
+            * note: value depends upon the compare functin used for fullpel ME
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int mv0_threshold;
+
+            /**
+            * adjusts sensitivity of b_frame_strategy 1
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int b_sensitivity;
+
+            /**
+            * - encoding: set by user.
+            * - decoding: unused
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int compression_level;
+
+            /**
+            * sets whether to use LPC mode - used by FLAC encoder
+            * - encoding: set by user.
+            * - decoding: unused.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int use_lpc;
+
+            /**
+            * LPC coefficient precision - used by FLAC encoder
+            * - encoding: set by user.
+            * - decoding: unused.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int lpc_coeff_precision;
+
+            /**
+            * - encoding: set by user.
+            * - decoding: unused.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int min_prediction_order;
+
+            /**
+            * - encoding: set by user.
+            * - decoding: unused.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int max_prediction_order;
+
+            /**
+            * search method for selecting prediction order
+            * - encoding: set by user.
+            * - decoding: unused.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int prediction_order_method;
+
+            /**
+            * - encoding: set by user.
+            * - decoding: unused.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int min_partition_order;
+
+            /**
+            * - encoding: set by user.
+            * - decoding: unused.
+            */
+            [MarshalAs(UnmanagedType.I4)]
+            public int max_partition_order;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <returns></returns>
+        public delegate int InitCallback(IntPtr pAVCodecContext);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        public delegate int EncodeCallback(IntPtr pAVCodecContext, IntPtr buf, int buf_size, IntPtr data);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <returns></returns>
+        public delegate int CloseCallback(IntPtr pAVCodecContext);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="outdata"></param>
+        /// <param name="outdata_size"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <returns></returns>
+        public delegate int DecodeCallback(IntPtr pAVCodecContext, IntPtr outdata, ref int outdata_size,
+        IntPtr buf, int buf_size);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <returns></returns>
+        public delegate int FlushCallback(IntPtr pAVCodecContext);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVCodec
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String name;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public CodecType type;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public CodecID id;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int priv_data_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public InitCallback init;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public EncodeCallback encode;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public CloseCallback close;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public DecodeCallback decode;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int capabilities;
+
+            //#if LIBAVCODEC_VERSION_INT < ((50<<16)+(0<<8)+0)
+            // void *dummy; // FIXME remove next time we break binary compatibility
+            //#endif
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr next; // AVCodec *next
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public FlushCallback flush;
+
+            // array of supported framerates, or NULL if any, array is terminated by {0,0}
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr supported_framerates;
+
+            // array of supported pixel formats, or NULL if unknown, array is terminanted by -1
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr pix_fmts; // enum PixelFormat *pix_fmts
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVPicture
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+            public IntPtr[] data; // uint8_t *data[4]
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+            public int[] linesize;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVPaletteControl
+        {
+            /* demuxer sets this to 1 to indicate the palette has changed;
+            * decoder resets to 0 */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int palette_changed;
+
+            /* 4-byte ARGB palette entries, stored in native byte order; note that
+            * the individual palette components should be on a 8-bit scale; if
+            * the palette data comes from a IBM VGA native format, the component
+            * data is probably 6 bits in size and needs to be scaled */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = AVPALETTE_COUNT), CLSCompliant(false)]
+            public uint[] palette;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVSubtitleRect
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U2), CLSCompliant(false)]
+            public ushort x;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U2), CLSCompliant(false)]
+            public ushort y;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U2), CLSCompliant(false)]
+            public ushort w;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U2), CLSCompliant(false)]
+            public ushort h;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U2), CLSCompliant(false)]
+            public ushort nb_colors;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int linesize;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr bitmap; // uint8_t *bitmap;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVSubtitle
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U2), CLSCompliant(false)]
+            public ushort format; /* 0 = graphics */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U4), CLSCompliant(false)]
+            public uint start_display_time; /* relative to packet pts, in ms */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U4), CLSCompliant(false)]
+            public uint end_display_time; /* relative to packet pts, in ms */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U4), CLSCompliant(false)]
+            public uint num_rects;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr rects; // AVSubtitleRect *rects;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVCodecParserContext
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr priv_data;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr parser; // AVCodecParser *parser
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 frame_offset; // offset of the current frame
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 cur_offset; // current offset incremented by each av_parser_parse()
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 last_frame_offset; // offset of the last frame
+
+            /* video info */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int pict_type; /* XXX: put it back in AVCodecContext */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int repeat_pict; /* XXX: put it back in AVCodecContext */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 pts; /* pts of the current frame */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 dts; /* dts of the current frame */
+
+            /* private data */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 last_pts;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 last_dts;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int fetch_timestamp;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int cur_frame_start_index;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = AV_PARSER_PTS_NB)]
+            public Int64[] cur_frame_offset;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = AV_PARSER_PTS_NB)]
+            public Int64[] cur_frame_pts;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = AV_PARSER_PTS_NB)]
+            public Int64[] cur_frame_dts;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int flags;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecParserContext"></param>
+        /// <returns></returns>
+        public delegate int ParaerInitCallback(IntPtr pAVCodecParserContext);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecParserContext"></param>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="poutbuf"></param>
+        /// <param name="poutbuf_size"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <returns></returns>
+        public delegate int ParserParseCallback(IntPtr pAVCodecParserContext,
+        IntPtr pAVCodecContext,
+        [MarshalAs(UnmanagedType.LPArray)]IntPtr[] poutbuf,
+        ref int poutbuf_size,
+        IntPtr buf, int buf_size);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVcodecParserContext"></param>
+        public delegate void ParserCloseCallback(IntPtr pAVcodecParserContext);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <returns></returns>
+        public delegate int SplitCallback(IntPtr pAVCodecContext, IntPtr buf, int buf_size);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVCodecParser
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
+            public int[] codec_ids; /* several codec IDs are permitted */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int priv_data_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ParaerInitCallback parser_init;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ParserParseCallback parser_parse;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ParserCloseCallback parser_close;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public SplitCallback split;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr next;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVBitStreamFilterContext
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr priv_data;
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr filter; // AVBitStreamFilter *filter
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr parser; // AVCodecParserContext *parser
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr next; // AVBitStreamFilterContext *next
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVBitStreamFilterContext"></param>
+        /// <param name="pAVCodecContext"></param>
+        /// <param name="args"></param>
+        /// <param name="poutbuf"></param>
+        /// <param name="poutbuf_size"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="keyframe"></param>
+        /// <returns></returns>
+        public delegate int FilterCallback(IntPtr pAVBitStreamFilterContext,
+        IntPtr pAVCodecContext,
+        [MarshalAs(UnmanagedType.LPStr)]String args,
+        [MarshalAs(UnmanagedType.LPArray)]IntPtr[] poutbuf, ref int poutbuf_size,
+        IntPtr buf, int buf_size, int keyframe);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVBitStreamFilter
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String name;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int priv_data_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public FilterCallback filter;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr next; // AVBitStreamFilter *next
+        };
+    }
+}
diff --git a/src/Tao.FFmpeg/AVFormat.cs b/src/Tao.FFmpeg/AVFormat.cs
new file mode 100644
index 0000000..56e6d93
--- /dev/null
+++ b/src/Tao.FFmpeg/AVFormat.cs
@@ -0,0 +1,1896 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.FFmpeg
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public static partial class FFmpeg
+    {
+        #region Private Constants
+        #region string AVFORMAT_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies AVFORMAT's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies avformat.dll everywhere; will be mapped via .config for mono.
+        /// </remarks>
+        private const string AVFORMAT_NATIVE_LIBRARY = "avformat-52.dll";
+        #endregion string AVFORMAT_NATIVE_LIBRARY
+        #endregion Private Constants
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="protocol"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int register_protocol(IntPtr protocol);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVPacket"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_destruct_packet_nofree(IntPtr pAVPacket);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVPacket"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_destruct_packet(IntPtr pAVPacket);
+
+        /// <summary>
+        /// Initialize optional fields of a packet.
+        /// </summary>
+        /// <param name="pAVPacket"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_init_packet(IntPtr pAVPacket);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVPacket"></param>
+        /// <param name="size"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_new_packet(IntPtr pAVPacket, int size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pByteIOContext"></param>
+        /// <param name="pAVPacket"></param>
+        /// <param name="size"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_get_packet(IntPtr pByteIOContext, IntPtr pAVPacket, int size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVPacket"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_dup_packet(IntPtr pAVPacket);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVPacket"></param>
+        // av_free_packet is internal, so reimplemented in managed code
+        public static void av_free_packet(IntPtr pAVPacket)
+        {
+            if (pAVPacket == IntPtr.Zero)
+                return;
+
+            AVPacket packet = (AVPacket)Marshal.PtrToStructure(pAVPacket, typeof(AVPacket));
+            if (packet.destruct == null)
+                return;
+
+            packet.destruct(pAVPacket);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVImageFormat"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_register_image_format(IntPtr pAVImageFormat);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVProbeData"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_probe_image_format(IntPtr pAVProbeData);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="filename"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr guess_image_format([MarshalAs(UnmanagedType.LPTStr)]String filename);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="filename"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern CodecID av_guess_image2_codec([MarshalAs(UnmanagedType.LPTStr)]
+String filename);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pByteIOContext"></param>
+        /// <param name="filename"></param>
+        /// <param name="pAVImageFormat"></param>
+        /// <param name="alloc_cb"></param>
+        /// <param name="opaque"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_read_image(IntPtr pByteIOContext,
+        [MarshalAs(UnmanagedType.LPTStr)]String filename,
+        IntPtr pAVImageFormat,
+        [MarshalAs(UnmanagedType.FunctionPtr)]
+AllocCBCallback alloc_cb,
+        IntPtr opaque);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pByteIOContext"></param>
+        /// <param name="pAVImageFormat"></param>
+        /// <param name="pAVImageInfo"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_write_image(IntPtr pByteIOContext, IntPtr pAVImageFormat, IntPtr pAVImageInfo);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVInputFormat"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_register_input_format(IntPtr pAVInputFormat);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVOutputFormat"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_register_output_format(IntPtr pAVOutputFormat);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="short_name"></param>
+        /// <param name="filename"></param>
+        /// <param name="mime_type"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr guess_stream_format([MarshalAs(UnmanagedType.LPTStr)]
+String short_name,
+        [MarshalAs(UnmanagedType.LPTStr)]
+String filename,
+        [MarshalAs(UnmanagedType.LPTStr)]
+String mime_type);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="short_name"></param>
+        /// <param name="filename"></param>
+        /// <param name="mime_type"></param>
+        /// <returns>AVOutputFormat pointer</returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr guess_format([MarshalAs(UnmanagedType.LPTStr)]
+String short_name,
+        [MarshalAs(UnmanagedType.LPTStr)]
+String filename,
+        [MarshalAs(UnmanagedType.LPTStr)]
+String mime_type);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVOutoutFormat"></param>
+        /// <param name="short_name"></param>
+        /// <param name="filename"></param>
+        /// <param name="mime_type"></param>
+        /// <param name="type"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern CodecID av_guess_codec(IntPtr pAVOutoutFormat,
+        [MarshalAs(UnmanagedType.LPTStr)]
+String short_name,
+        [MarshalAs(UnmanagedType.LPTStr)]
+String filename,
+        [MarshalAs(UnmanagedType.LPTStr)]
+String mime_type,
+        CodecType type);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pFile"></param>
+        /// <param name="buf"></param>
+        /// <param name="size"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_hex_dump(IntPtr pFile, IntPtr buf, int size);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pFile"></param>
+        /// <param name="pAVPacket"></param>
+        /// <param name="dump_payload"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_pkt_dump(IntPtr pFile, IntPtr pAVPacket, int dump_payload);
+
+        /// <summary>
+        ///
+        /// </summary>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_register_all();
+
+
+        /* media file input */
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="short_name"></param>
+        /// <returns>AVInputFormat pointer</returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_find_input_format([MarshalAs(UnmanagedType.LPTStr)]String short_name);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVProbeData"></param>
+        /// <param name="is_opened"></param>
+        /// <returns>AVInputFormat pointer</returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_probe_input_format(IntPtr pAVProbeData, int is_opened);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pFormatContext"></param>
+        /// <param name="filename"></param>
+        /// <param name="pAVInputFormat"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="pAVFormatParameters"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_open_input_file([Out]out IntPtr pFormatContext,
+        [MarshalAs(UnmanagedType.LPStr)]String filename,
+        IntPtr pAVInputFormat, int buf_size, IntPtr pAVFormatParameters);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns>AVFormatContext pointer</returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_alloc_format_context();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_find_stream_info(IntPtr pAVFormatContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pAVPacket"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_read_packet(IntPtr pAVFormatContext, IntPtr pAVPacket);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pAVPacket"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_read_frame(IntPtr pAVFormatContext, IntPtr pAVPacket);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="stream_index"></param>
+        /// <param name="timestamp"></param>
+        /// <param name="flags"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_seek_frame(IntPtr pAVFormatContext, int stream_index, Int64 timestamp, int flags);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_read_play(IntPtr pAVFormatContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_read_pause(IntPtr pAVFormatContext);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_close_input_stream(IntPtr pAVFormatContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_close_input_file(IntPtr pAVFormatContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="id"></param>
+        /// <returns>AVStream pointer</returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_new_stream(IntPtr pAVFormatContext, int id);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_new_program(IntPtr pAVFormatContext, int id);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVStream"></param>
+        /// <param name="pts_wrap_bits"></param>
+        /// <param name="pts_num"></param>
+        /// <param name="pts_den"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_set_pts_info(IntPtr pAVStream, int pts_wrap_bits, int pts_num, int pts_den);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_find_default_stream_index(IntPtr pAVFormatContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVStream"></param>
+        /// <param name="timestamp"></param>
+        /// <param name="flags"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_index_search_timestamp(IntPtr pAVStream, Int64 timestamp, int flags);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVStream"></param>
+        /// <param name="pos"></param>
+        /// <param name="timestamp"></param>
+        /// <param name="size"></param>
+        /// <param name="distance"></param>
+        /// <param name="flags"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_add_index_entry(IntPtr pAVStream, Int64 pos, Int64 timestamp, int size, int distance, int flags);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="stream_index"></param>
+        /// <param name="target_ts"></param>
+        /// <param name="flags"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_seek_frame_binary(IntPtr pAVFormatContext, int stream_index, Int64 target_ts, int flags);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pAVStream"></param>
+        /// <param name="timestamp"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_update_cur_dts(IntPtr pAVFormatContext, IntPtr pAVStream, Int64 timestamp);
+
+        /* media file output */
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pAVFormatParameters"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_set_parameters(IntPtr pAVFormatContext, IntPtr pAVFormatParameters);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_write_header(IntPtr pAVFormatContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pAVPacket"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_write_frame(IntPtr pAVFormatContext, IntPtr pAVPacket);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pAVPacket"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_interleaved_write_frame(IntPtr pAVFormatContext, IntPtr pAVPacket);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="p_out_AVPacket"></param>
+        /// <param name="pAVPacket"></param>
+        /// <param name="flush"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_interleave_packet_per_dts(IntPtr pAVFormatContext, out IntPtr p_out_AVPacket, IntPtr pAVPacket, int flush);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_write_trailer(IntPtr pAVFormatContext);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="index"></param>
+        /// <param name="url"></param>
+        /// <param name="is_output"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dump_format(IntPtr pAVFormatContext, int index,
+        [MarshalAs(UnmanagedType.LPTStr)]
+String url,
+        int is_output);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="width_ptr"></param>
+        /// <param name="height_ptr"></param>
+        /// <param name="arg"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int parse_image_size(IntPtr width_ptr, IntPtr height_ptr,
+        [MarshalAs(UnmanagedType.LPTStr)]String arg);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pFrame_rate"></param>
+        /// <param name="pFrame_rate_base"></param>
+        /// <param name="arg"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int parse_frame_rate(IntPtr pFrame_rate, IntPtr pFrame_rate_base,
+        [MarshalAs(UnmanagedType.LPTStr)]String arg);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="datestr"></param>
+        /// <param name="duration"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int64 parse_date([MarshalAs(UnmanagedType.LPTStr)]String datestr, int duration);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int64 av_gettime();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="fd"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int64 ffm_read_write_index(int fd);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="fd"></param>
+        /// <param name="pos"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ffm_write_write_index(int fd, Int64 pos);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pos"></param>
+        /// <param name="file_size"></param>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void ffm_set_write_index(IntPtr pAVFormatContext, Int64 pos, Int64 file_size);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="arg"></param>
+        /// <param name="arg_size"></param>
+        /// <param name="tag1"></param>
+        /// <param name="info"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int find_info_tag([MarshalAs(UnmanagedType.LPTStr)]String arg,
+        int arg_size,
+        [MarshalAs(UnmanagedType.LPTStr)]String tag1,
+        [MarshalAs(UnmanagedType.LPTStr)]String info);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <param name="path"></param>
+        /// <param name="number"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_get_frame_filename(IntPtr buf, int buf_size,
+        [MarshalAs(UnmanagedType.LPTStr)]String path, int number);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="filename"></param>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int av_filename_number_test([MarshalAs(UnmanagedType.LPTStr)]String filename);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int video_grab_init();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int audio_init();
+
+        /* DV1394 */
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int dv1394_init();
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int dc1394_init();
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="f">Pointer to <see cref="AVInputFormat"/> or <see cref="IntPtr.Zero"/></param>
+        /// <returns>Pointer to <see cref="AVInputFormat"/> or <see cref="IntPtr.Zero"/></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_iformat_next(IntPtr f);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="f">Pointer to <see cref="AVOutputFormat"/> or <see cref="IntPtr.Zero"/></param>
+        /// <returns>Pointer to <see cref="AVOutputFormat"/> or <see cref="IntPtr.Zero"/></returns>
+        [DllImport(AVFORMAT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr av_oformat_next(IntPtr f);
+
+        // *********************************************************************************
+        // Constants
+        // *********************************************************************************
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AV_TIME_BASE = 1000000;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVFMT_INFINITEOUTPUTLOOP = 0;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint AVFMT_FLAG_GENPTS = 0x0001;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint AVFMT_FLAG_IGNIDX = 0x0002;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const int AVFMT_NOOUTPUTLOOP = -1;
+
+        // no file should be opened
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint AVFMT_NOFILE = 0x0001;
+
+        // needs '%d' in filename
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint AVFMT_NEEDNUMBER = 0x0002;
+
+        // show format stream IDs numbers
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint AVFMT_SHOW_IDS = 0x0008;
+
+        // format wants AVPicture structure for raw picture data
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint AVFMT_RAWPICTURE = 0x0020;
+
+        // format wants global header
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint AVFMT_GLOBALHEADER = 0x0040;
+
+        // format doesnt need / has any timestamps
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint AVFMT_NOTIMESTAMPS = 0x0080;
+
+        // AVImageFormat.flags field constants
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint AVIMAGE_INTERLEAVED = 0x0001;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVPROBE_SCORE_MAX = 100;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int PKT_FLAG_KEY = 0x0001;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVINDEX_KEYFRAME = 0x001;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MAX_REORDER_DELAY = 4;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public const uint AVFMTCTX_NOHEADER = 0x001;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MAX_STREAMS = 20;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVERROR_UNKNOWN = -1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVERROR_IO = -2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVERROR_NUMEXPECTED = -3;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVERROR_INVALIDDATA = -4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVERROR_NOMEM = -5;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVERROR_NOFMT = -6;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVERROR_NOTSUPP = -7;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVSEEK_FLAG_BACKWARD = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVSEEK_FLAG_BYTE = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int AVSEEK_FLAG_ANY = 4;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FFM_PACKET_SIZE = 4096;
+
+        // *********************************************************************************
+        // Constants
+        // *********************************************************************************
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVPacket"></param>
+        public delegate void DestructCallback(IntPtr pAVPacket);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVPacket
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 pts; // presentation time stamp in time_base units
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 dts; // decompression time stamp in time_base units
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr data;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int stream_index;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int flags;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int duration;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public DestructCallback destruct;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr priv;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 pos;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVFrac
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 val;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 num;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 den;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVProbeData
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String filename;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr buf;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int buf_size;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVFormatParameters
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public AVRational time_base;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int sample_rate;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int channels;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int width;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int height;
+            /// <summary>
+            /// 
+            /// </summary>
+            public PixelFormat pix_fmt;
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr image_format; // AVImageFormat
+            /// <summary>
+            /// 
+            /// </summary>
+            public int channel;
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String standard;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int mpeg2ts_raw;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int mpeg2ts_compute_pcr;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int initial_pause;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int prealloced_context;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        public delegate int WriteHeader(IntPtr pAVFormatContext);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pAVPacket"></param>
+        /// <returns></returns>
+        public delegate int WritePacket(IntPtr pAVFormatContext, IntPtr pAVPacket);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        public delegate int WriteTrailer(IntPtr pAVFormatContext);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="avFormatParameters"></param>
+        /// <returns></returns>
+        public delegate int SetParametersCallback(IntPtr pAVFormatContext, IntPtr avFormatParameters);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pOutAVPacket"></param>
+        /// <param name="pInAVPacket"></param>
+        /// <param name="flush"></param>
+        /// <returns></returns>
+        public delegate int InterleavePacketCallback(IntPtr pAVFormatContext, IntPtr pOutAVPacket, IntPtr pInAVPacket, int flush);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVOutputFormat
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String name;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String long_name;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String mime_type;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String extensions;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int priv_data_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public CodecID audio_codec;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public CodecID video_codec;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public WriteHeader write_header;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public WritePacket write_packet;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public WriteTrailer write_trailer;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int flags;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public SetParametersCallback set_parameters;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public InterleavePacketCallback interleave_packet;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr nextAVOutputFormat;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVProbeData"></param>
+        /// <returns></returns>
+        public delegate int ReadProbeCallback(IntPtr pAVProbeData);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pAVFormatParameters"></param>
+        /// <returns></returns>
+        public delegate int ReadHeaderCallback(IntPtr pAVFormatContext, IntPtr pAVFormatParameters);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="pAVPacket"></param>
+        /// <returns></returns>
+        public delegate int ReadPacketCallback(IntPtr pAVFormatContext, IntPtr pAVPacket);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        public delegate int ReadCloseCallback(IntPtr pAVFormatContext);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="stream_index"></param>
+        /// <param name="timestamp"></param>
+        /// <param name="flags"></param>
+        /// <returns></returns>
+        public delegate int ReadSeekCallback(IntPtr pAVFormatContext, int stream_index, Int64 timestamp, int flags);
+
+        //int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,
+        //int64_t *pos, int64_t pos_limit);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <param name="stream_index"></param>
+        /// <param name="pos"></param>
+        /// <param name="pos_limit"></param>
+        /// <returns></returns>
+        public delegate int ReadTimestampCallback(IntPtr pAVFormatContext, int stream_index, IntPtr pos, Int64 pos_limit);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        public delegate int ReadPlayCallback(IntPtr pAVFormatContext);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVFormatContext"></param>
+        /// <returns></returns>
+        public delegate int ReadPauseCallback(IntPtr pAVFormatContext);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVInputFormat
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String name;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String long_name;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int priv_data_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ReadProbeCallback read_probe;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ReadHeaderCallback read_header;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ReadPacketCallback read_packet;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ReadCloseCallback read_close;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ReadSeekCallback read_seek;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ReadTimestampCallback read_timestamp;
+
+            // can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER
+            /// <summary>
+            /// 
+            /// </summary>
+            public int flags;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String extensions;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int value;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ReadPlayCallback read_play;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ReadPauseCallback read_pause;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr nextAVInputFormat;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVIndexEntry
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public Int64 pos;
+            /// <summary>
+            /// 
+            /// </summary>
+            public Int64 timestamp;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int flags;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int size;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int min_distance;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVStream
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int index; // stream index in AVFormatContext
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int id; // format specific stream id
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr codec; // AVCodecContext
+
+            /**
+            * real base frame rate of the stream.
+            * for example if the timebase is 1/90000 and all frames have either
+            * approximately 3600 or 1800 timer ticks then r_frame_rate will be 50/1
+            */
+            public AVRational r_frame_rate;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr priv_data;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 codec_info_duration; // internal data used in av_find_stream_info()
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public AVFrac pts; // encoding: PTS generation when outputing stream
+
+            /**
+            * this is the fundamental unit of time (in seconds) in terms
+            * of which frame timestamps are represented. for fixed-fps content,
+            * timebase should be 1/framerate and timestamp increments should be
+            * identically 1.
+            */
+            public AVRational time_base;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int pts_wrap_bits; // number of bits in pts (used for wrapping control)
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int stream_copy; // if TRUE, just copy stream
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public AVDiscard discard; // selects which packets can be discarded at will and dont need to be demuxed
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.R4)]
+            public float quality;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 start_time;
+
+            // decoding: duration of the stream, in AV_TIME_BASE fractional seconds.
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 duration;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+            public byte[] language; // ISO 639 3-letter language code (empty string if undefined)
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int need_parsing;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr pAVCodecParserContext;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 cur_dts;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int last_IP_duration;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 last_IP_pts;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr pAVIndexEntry; // only used if the format does not support seeking natively
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int nb_index_entries;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int index_entries_allocated_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 nb_frames; // number of frames in this stream if known or 0
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = (MAX_REORDER_DELAY + 1))]
+            public Int64[] pts_buffer; // pts_buffer[MAX_REORDER_DELAY+1]
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVFormatContext
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr pAVClass; // set by av_alloc_format_context
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr pAVInputFormat; // can only be iformat or oformat, not both at the same time
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr pAVOutputFormat;
+
+            //[MarshalAs(UnmanagedType.FunctionPtr)]
+            //AnonymousCallback priv_data;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr priv_data;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr pb; // ByteIOContext
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int nb_streams;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_STREAMS)]
+            public IntPtr[] streams; // AVStream
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
+            public byte[] filename; // input or output filename
+
+            /* stream info */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 timestamp;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
+            public byte[] title;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
+            public byte[] author;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
+            public byte[] copyright;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
+            public byte[] comment;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
+            public byte[] album;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int year; // ID3 year, 0 if none
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int tract; // track number, 0 if none
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
+            public byte[] genre; // ID3 genre
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int ctx_flags; // format specific flags, see AVFMTCTX_xx
+
+            /* This buffer is only needed when packets were already buffered but
+            not decoded, for example to get the codec parameters in mpeg
+            streams */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr packet_buffer; // AVPacketList
+            /* decoding: position of the first frame of the component, in
+            AV_TIME_BASE fractional seconds. NEVER set this value directly:
+            it is deduced from the AVStream values. */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 start_time;
+            /* decoding: duration of the stream, in AV_TIME_BASE fractional
+            seconds. NEVER set this value directly: it is deduced from the
+            AVStream values. */
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 duration;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 file_size; // decoding: total file size. 0 if unknown
+
+            /* decoding: total stream bitrate in bit/s, 0 if not
+            available. Never set it directly if the file_size and the
+            duration are known as ffmpeg can compute it automatically. */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int bit_rate;
+
+            /* av_read_frame() support */
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr cur_st; // AVStream
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr cur_ptr; // uint8_t
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int cur_len;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public AVPacket cur_pkt; // AVPacket
+
+            /* av_seek_frame() support */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 data_offset; // offset of the first packet
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int index_built;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int mux_rate;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int packet_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int preload;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int max_delay;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int loop_output; // number of times to loop output in formats that support it
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int flags;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int loop_input;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U4)]
+            [CLSCompliant(false)]
+            public uint probesize; // decoding: size of data to probe; encoding unused
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int max_analyze_duration;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr key;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int keylen;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.U4)]
+            [CLSCompliant(false)]
+            public uint nb_programs;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr programs;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public CodecID video_codec_id;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public CodecID audio_codec_id;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public CodecID subtitle_codec_id;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVPacketList
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public AVPacket pkt;
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr next; // AVPacketList
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVImageInfo
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public PixelFormat pix_fmt; // requested pixel format
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int width; // requested width
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int height; // requested height
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int interleaved; // image is interleaved (e.g. interleaved GIF)
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public AVPicture pict; // returned allocated image
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pVoid"></param>
+        /// <param name="pAVImageInfo"></param>
+        /// <returns></returns>
+        public delegate int AllocCBCallback(IntPtr pVoid, IntPtr pAVImageInfo);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pAVProbeData"></param>
+        /// <returns></returns>
+        public delegate int ImgProbeCallback(IntPtr pAVProbeData);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pByteIOContext"></param>
+        /// <param name="alloc_cb"></param>
+        /// <param name="pVoid"></param>
+        /// <returns></returns>
+        public delegate int ImgReadCallback(IntPtr pByteIOContext,
+        [MarshalAs(UnmanagedType.FunctionPtr)]
+AllocCBCallback alloc_cb,
+        IntPtr pVoid);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="pByteIOContext"></param>
+        /// <param name="pAVImageInfo"></param>
+        /// <returns></returns>
+        public delegate int ImgWriteCallback(IntPtr pByteIOContext, IntPtr pAVImageInfo);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVImageFormat
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPTStr)]
+            public String name;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPTStr)]
+            public String extensions;
+
+            // tell if a given file has a chance of being parsing by this format
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ImgProbeCallback img_probe;
+
+            /* read a whole image. 'alloc_cb' is called when the image size is
+            known so that the caller can allocate the image. If 'allo_cb'
+            returns non zero, then the parsing is aborted. Return '0' if
+            OK. */
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ImgReadCallback img_read;
+
+            /* write the image */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int supported_pixel_formats; // mask of supported formats for output
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public ImgWriteCallback img_write;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int flags;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr next; // AVImageFormat
+        };
+    }
+}
diff --git a/src/Tao.FFmpeg/AVSWScale.cs b/src/Tao.FFmpeg/AVSWScale.cs
new file mode 100644
index 0000000..5a1c239
--- /dev/null
+++ b/src/Tao.FFmpeg/AVSWScale.cs
@@ -0,0 +1,214 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.FFmpeg
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public static partial class FFmpeg
+    {
+        #region Private Constants
+        #region string AVSWSCALE_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies AVUTIL's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies avutil.dll everywhere; will be mapped via .config for mono.
+        /// </remarks>
+        private const string AVSWSCALE_NATIVE_LIBRARY = "swscale-0.dll";
+        #endregion string AVSWSCALE_NATIVE_LIBRARY
+        #endregion Private Constants
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="SwsContext"></param>
+        [DllImport(AVSWSCALE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void sws_freeContext(IntPtr SwsContext);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="source_width"></param>
+        /// <param name="source_height"></param>
+        /// <param name="source_pix_fmt"></param>
+        /// <param name="dest_width"></param>
+        /// <param name="dest_height"></param>
+        /// <param name="dest_pix_fmt"></param>
+        /// <param name="flags"></param>
+        /// <param name="srcFilter"></param>
+        /// <param name="destFilter"></param>
+        /// <param name="Param"></param>
+        /// <returns></returns>
+        [DllImport(AVSWSCALE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr sws_getContext(int source_width, int source_height,
+        int source_pix_fmt, int dest_width, int dest_height, int dest_pix_fmt, int flags,
+        IntPtr srcFilter, IntPtr destFilter, IntPtr Param);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="context"></param>
+        /// <param name="source_width"></param>
+        /// <param name="source_height"></param>
+        /// <param name="source_pix_fmt"></param>
+        /// <param name="dest_width"></param>
+        /// <param name="dest_height"></param>
+        /// <param name="dest_pix_fmt"></param>
+        /// <param name="flags"></param>
+        /// <param name="srcFilter"></param>
+        /// <param name="destFilter"></param>
+        /// <param name="Param"></param>
+        /// <returns></returns>
+        [DllImport(AVSWSCALE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr sws_getCachedContext(IntPtr context, int source_width, int source_height,
+                                                         int source_pix_fmt, int dest_width, int dest_height,
+                                                         int dest_pix_fmt, int flags,
+                                                         IntPtr srcFilter, IntPtr destFilter, IntPtr Param);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="SwsContext"></param>
+        /// <param name="src"></param>
+        /// <param name="srcStride"></param>
+        /// <param name="srcSliceY"></param>
+        /// <param name="srcSliceH"></param>
+        /// <param name="dst"></param>
+        /// <param name="dstStride"></param>
+        /// <returns></returns>
+        [DllImport(AVSWSCALE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int sws_scale(IntPtr SwsContext,
+        IntPtr[] src,
+        int[] srcStride,
+        int srcSliceY, int srcSliceH,
+        IntPtr[] dst,
+        int[] dstStride);
+
+        /* values for the flags, the stuff on the command line is different */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_FAST_BILINEAR = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_BILINEAR = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_BICUBIC = 4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_X = 8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_POINT = 0x10;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_AREA = 0x20;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_BICUBLIN = 0x40;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_GAUSS = 0x80;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_SINC = 0x100;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_LANCZOS = 0x200;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_SPLINE = 0x400;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_SRC_V_CHR_DROP_MASK = 0x30000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_SRC_V_CHR_DROP_SHIFT = 16;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_PARAM_DEFAULT = 123456;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_PRINT_INFO = 0x1000;
+
+        //the following 3 flags are not completely implemented
+        //internal chrominace subsampling info
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_FULL_CHR_H_INT = 0x2000;
+        //input subsampling info
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_FULL_CHR_H_INP = 0x4000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_DIRECT_BGR = 0x8000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SWS_ACCURATE_RND = 0x40000;
+
+        // public const int SWS_CPU_CAPS_MMX     = 0x80000000;
+        // public const int SWS_CPU_CAPS_MMX2    = 0x20000000;
+        // public const int SWS_CPU_CAPS_3DNOW   = 0x40000000;
+        //public const int SWS_CPU_CAPS_ALTIVEC = 0x10000000;
+        //public const int SWS_CPU_CAPS_BFIN    = 0x01000000;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const double SWS_MAX_REDUCE_CUTOFF = 0.002;
+    }
+}
diff --git a/src/Tao.FFmpeg/AVUtil.cs b/src/Tao.FFmpeg/AVUtil.cs
new file mode 100644
index 0000000..f5af70d
--- /dev/null
+++ b/src/Tao.FFmpeg/AVUtil.cs
@@ -0,0 +1,427 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.FFmpeg
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public static partial class FFmpeg
+    {
+        #region Private Constants
+        #region string AVUTIL_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies AVUTIL's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies avutil.dll everywhere; will be mapped via .config for mono.
+        /// </remarks>
+        private const string AVUTIL_NATIVE_LIBRARY = "avutil-49.dll";
+        #endregion string AVUTIL_NATIVE_LIBRARY
+
+        #endregion Private Constants
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="ptr"></param>
+        [DllImport(AVUTIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_free(IntPtr ptr);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="ptr"></param>
+        [DllImport(AVUTIL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void av_freep(IntPtr ptr);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="opaque"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <returns></returns>
+        public delegate int Read_PacketCallback(IntPtr opaque, IntPtr buf, int buf_size);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="opaque"></param>
+        /// <param name="buf"></param>
+        /// <param name="buf_size"></param>
+        /// <returns></returns>
+        public delegate int WritePacketCallback(IntPtr opaque, IntPtr buf, int buf_size);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="opaque"></param>
+        /// <param name="offset"></param>
+        /// <param name="whence"></param>
+        /// <returns></returns>
+        public delegate Int64 SeekCallback(IntPtr opaque, Int64 offset, int whence);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="checksum"></param>
+        /// <param name="buf"></param>
+        /// <param name="size"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        public delegate UInt32 UpdateChecksumCallback(UInt32 checksum, IntPtr buf, UInt32 size);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public enum PixelFormat
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_NONE = -1,
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_YUV420P, // Planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_YUYV422, // Packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_RGB24, // Packed RGB 8:8:8, 24bpp, RGBRGB...
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_BGR24, // Packed RGB 8:8:8, 24bpp, BGRBGR...
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_YUV422P, // Planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_YUV444P, // Planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_RGB32, // Packed RGB 8:8:8, 32bpp, (msb)8A 8R 8G 8B(lsb), in cpu endianness
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_YUV410P, // Planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_YUV411P, // Planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_RGB565, // Packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), in cpu endianness
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_RGB555, // Packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), in cpu endianness most significant bit to 1
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_GRAY8, // Y , 8bpp
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_MONOWHITE, // Y , 1bpp, 1 is white
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_MONOBLACK, // Y , 1bpp, 0 is black
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_PAL8, // 8 bit with PIX_FMT_RGB32 palette
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_YUVJ420P, // Planar YUV 4:2:0, 12bpp, full scale (jpeg)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_YUVJ422P, // Planar YUV 4:2:2, 16bpp, full scale (jpeg)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_YUVJ444P, // Planar YUV 4:4:4, 24bpp, full scale (jpeg)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_XVMC_MPEG2_MC,// XVideo Motion Acceleration via common packet passing(xvmc_render.h)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_XVMC_MPEG2_IDCT,
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_UYVY422, // Packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_UYYVYY411, // Packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_BGR32, // Packed RGB 8:8:8, 32bpp, (msb)8A 8B 8G 8R(lsb), in cpu endianness
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_BGR565, // Packed RGB 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), in cpu endianness
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_BGR555, // Packed RGB 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), in cpu endianness most significant bit to 1
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_BGR8, // Packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_BGR4, // Packed RGB 1:2:1, 4bpp, (msb)1B 2G 1R(lsb)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_BGR4_BYTE, // Packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_RGB8, // Packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_RGB4, // Packed RGB 1:2:1, 4bpp, (msb)2R 3G 3B(lsb)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_RGB4_BYTE, // Packed RGB 1:2:1, 8bpp, (msb)2R 3G 3B(lsb)
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_NV12, // Planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 for UV
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_NV21, // as above, but U and V bytes are swapped
+
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_RGB32_1, // Packed RGB 8:8:8, 32bpp, (msb)8R 8G 8B 8A(lsb), in cpu endianness
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_BGR32_1, // Packed RGB 8:8:8, 32bpp, (msb)8B 8G 8R 8A(lsb), in cpu endianness
+
+            /// <summary>
+            /// 
+            /// </summary>
+            PIX_FMT_NB, // number of pixel
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public class ByteIOContext
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr buffer;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int buffer_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr buf_ptr;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr buf_end;
+
+            //[MarshalAs(UnmanagedType.FunctionPtr)]
+            //AnonymousCallback opaque;
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr opaque;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public Read_PacketCallback read_packet;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public WritePacketCallback write_packet;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public SeekCallback seek;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I8)]
+            public Int64 pos; // position in the file of the current buffer
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int must_flush; // true if the next seek should flush
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int eof_reached; // true if eof reached
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int write_flag; // true if open for writing
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int is_streamed;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int max_packet_size;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [CLSCompliant(false)]
+            [MarshalAs(UnmanagedType.U4)]
+            public uint checksum;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr checksum_ptr;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [CLSCompliant(false)]
+            [MarshalAs(UnmanagedType.FunctionPtr)]
+            public UpdateChecksumCallback update_checksum;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int error; // contains the error code or 0 if no error happened
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public delegate String ItemNameCallback();
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVClass
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public String class_name;
+            /// <summary>
+            /// 
+            /// </summary>
+            public ItemNameCallback item_name;
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr pAVOption;
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public struct AVOption
+        {
+        };
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct AVRational
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int num;
+            /// <summary>
+            /// 
+            /// </summary>
+            [MarshalAs(UnmanagedType.I4)]
+            public int den;
+        };
+    }
+}
diff --git a/src/Tao.FFmpeg/COPYING b/src/Tao.FFmpeg/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.FFmpeg/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.FFmpeg/ChangeLog b/src/Tao.FFmpeg/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FFmpeg/INSTALL b/src/Tao.FFmpeg/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FFmpeg/Makefile.am b/src/Tao.FFmpeg/Makefile.am
new file mode 100644
index 0000000..7d4c7b7
--- /dev/null
+++ b/src/Tao.FFmpeg/Makefile.am
@@ -0,0 +1,21 @@
+
+ASSEMBLY = Tao.FFmpeg
+SHORTNAME = tao-ffmpeg
+VERSION = @TAOFFMPEG_VERSION@
+MAJOR = @TAOFFMPEG_MAJOR@
+
+PACKAGES =
+BINARY_LIBS =
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        AVCodec.cs \
+        AVFormat.cs \
+        AVSWScale.cs \
+        AVUtil.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.FFmpeg/Makefile.in b/src/Tao.FFmpeg/Makefile.in
new file mode 100644
index 0000000..3ad6a9a
--- /dev/null
+++ b/src/Tao.FFmpeg/Makefile.in
@@ -0,0 +1,417 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-ffmpeg.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.FFmpeg
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-ffmpeg.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOFFMPEG_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.FFmpeg
+SHORTNAME = tao-ffmpeg
+MAJOR = @TAOFFMPEG_MAJOR@
+PACKAGES = 
+BINARY_LIBS = 
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        AVCodec.cs \
+        AVFormat.cs \
+        AVSWScale.cs \
+        AVUtil.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.FFmpeg/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.FFmpeg/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-ffmpeg.pc: $(top_builddir)/config.status $(srcdir)/tao-ffmpeg.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.FFmpeg/NEWS b/src/Tao.FFmpeg/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FFmpeg/Properties/AssemblyInfo.cs b/src/Tao.FFmpeg/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..06a8ab9
--- /dev/null
+++ b/src/Tao.FFmpeg/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.FFmpeg")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework FFmpeg Binding For .NET")]
+[assembly: AssemblyFileVersion("0.4.9.1")]
+[assembly: AssemblyInformationalVersion("0.4.9.1")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.FFmpeg.dll")]
+[assembly: AssemblyTitle("Tao Framework FFmpeg Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("0.4.9.1")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.FFmpeg/README b/src/Tao.FFmpeg/README
new file mode 100644
index 0000000..51c958d
--- /dev/null
+++ b/src/Tao.FFmpeg/README
@@ -0,0 +1,15 @@
+Tao.FFmpeg 0.4.9.0
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.FFmpeg is an FFmpeg API binding for .NET, implementing FFmpeg 0.4.9.
+
+Change Log:
+0.4.9.1 - June 2008:
+    Updated lib to latest version.
+
+0.4.9.0 - August 2007:
+    Initial version by Tzehaw Huang (jackaroomaster at users.sourceforge.net). 
+    Tzehaw has graciously changed the license from GPL to MIT for inclulsion in the Tao Framework.
+    Changes for Tao version by David Hudson
diff --git a/src/Tao.FFmpeg/Tao.FFmpeg.csproj b/src/Tao.FFmpeg/Tao.FFmpeg.csproj
new file mode 100644
index 0000000..1f55abb
--- /dev/null
+++ b/src/Tao.FFmpeg/Tao.FFmpeg.csproj
@@ -0,0 +1,104 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{ABF4DD1F-C5CE-40E1-86B2-AA82127B1927}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.FFmpeg</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.FFmpeg.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.FFmpeg</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.FFmpeg.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.FFmpeg.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.FFmpeg.dll.config" />
+    <None Include="Tao.FFmpeg.snk">
+    </None>
+    <Compile Include="AVCodec.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AVFormat.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AVSWScale.cs" />
+    <Compile Include="AVUtil.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.FFmpeg/Tao.FFmpeg.dll.config b/src/Tao.FFmpeg/Tao.FFmpeg.dll.config
new file mode 100644
index 0000000..9383fba
--- /dev/null
+++ b/src/Tao.FFmpeg/Tao.FFmpeg.dll.config
@@ -0,0 +1,17 @@
+<configuration>
+    <dllmap dll="avcodec-51.dll" os="windows" target="avcodec-51.dll" />
+    <dllmap dll="avcodec-51.dll" os="osx" target="libavcodec.so.51" />
+    <dllmap dll="avcodec-51.dll" os="!windows,osx" target="libavcodec.so.51" />
+
+    <dllmap dll="avformat-52.dll" os="windows" target="avformat-52.dll" />
+    <dllmap dll="avformat-52.dll" os="osx" target="libavformat.so.52" />
+    <dllmap dll="avformat-52.dll" os="!windows,osx" target="libavformat.so.52" />
+
+    <dllmap dll="avutil-49.dll" os="windows" target="avutil-49.dll" />
+    <dllmap dll="avutil-49.dll" os="osx" target="libavutil.so.49" />
+    <dllmap dll="avutil-49.dll" os="!windows,osx" target="libavutil.so.49" />
+
+    <dllmap dll="swscale-0.dll" os="windows" target="swscale-0.dll" />
+    <dllmap dll="swscale-0.dll" os="osx" target="libswscale.so.0" />
+    <dllmap dll="swscale-0.dll" os="!windows,osx" target="libswscale.so.0" />
+</configuration>
diff --git a/src/Tao.FFmpeg/Tao.FFmpeg.snk b/src/Tao.FFmpeg/Tao.FFmpeg.snk
new file mode 100644
index 0000000..6446c6a
Binary files /dev/null and b/src/Tao.FFmpeg/Tao.FFmpeg.snk differ
diff --git a/src/Tao.FFmpeg/tao-ffmpeg.pc.in b/src/Tao.FFmpeg/tao-ffmpeg.pc.in
new file mode 100644
index 0000000..856ebc1
--- /dev/null
+++ b/src/Tao.FFmpeg/tao-ffmpeg.pc.in
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.FFmpeg
+Description: FFmpeg portion of the Tao framework
+Version: @TAOFFMPEG_VERSION@
+Requires:
+Libs: -r:${libdir}/mono/tao-ffmpeg- at TAOFFMPEG_MAJOR@/Tao.FFmpeg.dll
diff --git a/src/Tao.FreeGlut/AUTHORS b/src/Tao.FreeGlut/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FreeGlut/COPYING b/src/Tao.FreeGlut/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.FreeGlut/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.FreeGlut/ChangeLog b/src/Tao.FreeGlut/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FreeGlut/Glut.cs b/src/Tao.FreeGlut/Glut.cs
new file mode 100644
index 0000000..ef56029
--- /dev/null
+++ b/src/Tao.FreeGlut/Glut.cs
@@ -0,0 +1,8783 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Text;
+using Tao.OpenGl;
+
+namespace Tao.FreeGlut {
+    #region Class Documentation
+    /// <summary>
+    ///     FreeGLUT (OpenGL Utility Toolkit) binding for .NET, implementing FreeGlut 2.4.0.
+    /// </summary>
+    #endregion Class Documentation
+    public static class Glut
+    {
+        // --- Fields ---
+        #region Private Constants
+	#region string FREEGLUT_NATIVE_LIBRARY
+	/// <summary>
+	///     Specifies FREEGLUT's native library archive.
+	/// </summary>
+	/// <remarks>
+	///     Specifies freeglut.dll everywhere; will be mapped via .config for mono.
+	/// </remarks>
+	private const string FREEGLUT_NATIVE_LIBRARY = "freeglut.dll";
+	#endregion string FREEGLUT_NATIVE_LIBRARY
+        
+	#region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Winapi" />.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Winapi;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+
+        #region Public Constants
+        #region Versions
+        #region int FREEGLUT
+        /// <summary>
+        ///     FreeGLUT API marker.
+        /// </summary>
+        // #define FREEGLUT 1
+        public const int FREEGLUT = 1;
+        #endregion int FREEGLUT
+
+        #region int FREEGLUT_VERSION_2_0
+        /// <summary>
+        ///     FreeGLUT API version marker.
+        /// </summary>
+        // #define FREEGLUT_VERSION_2_0 1
+        public const int FREEGLUT_VERSION_2_0 = 1;
+        #endregion int FREEGLUT_VERSION_2_0
+
+        #region int GLUT_API_VERSION
+        /// <summary>
+        ///     GLUT API revision.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         GLUT_API_VERSION is updated to reflect incompatible GLUT API changes
+        ///         (interface changes, semantic changes, deletions, or additions).
+        ///     </para>
+        ///     <para>
+        ///         GLUT_API_VERSION=1  First public release of GLUT.  11/29/94
+        ///     </para>
+        ///     <para>
+        ///         GLUT_API_VERSION=2  Added support for OpenGL/GLX multisampling, extension.
+        ///         Supports new input devices like tablet, dial and button box, and Spaceball.
+        ///         Easy to query OpenGL extensions.
+        ///     </para>
+        ///     <para>
+        ///         GLUT_API_VERSION=3  glutMenuStatus added.
+        ///     </para>
+        ///     <para>
+        ///          GLUT_API_VERSION=4  glutInitDisplayString, glutWarpPointer, glutBitmapLength,
+        ///          glutStrokeLength, glutWindowStatusFunc, dynamic video resize subAPI,
+        ///          glutPostWindowRedisplay, glutKeyboardUpFunc, glutSpecialUpFunc,
+        ///          glutIgnoreKeyRepeat, glutSetKeyRepeat, glutJoystickFunc,
+        ///          glutForceJoystickFunc (NOT FINALIZED!).
+        ///     </para>
+        /// </remarks>
+        // #define GLUT_API_VERSION 4
+        public const int GLUT_API_VERSION = 4;
+        #endregion int GLUT_API_VERSION
+
+	#region int GLUT_XLIB_IMPLEMENTATION
+	// #define  GLUT_XLIB_IMPLEMENTATION 13
+	/// <summary>
+        ///     
+        /// </summary>
+	public const int GLUT_XLIB_IMPLEMENTATION = 13;
+	#endregion int GLUT_XLIB_IMPLEMENTATION
+        #endregion Versions
+
+        #region Display mode bit masks
+        #region int GLUT_RGB
+        /// <summary>
+        ///     An alias for <see cref="GLUT_RGBA" />.
+        /// </summary>
+        // #define GLUT_RGB 0
+        public const int GLUT_RGB = 0;
+        #endregion int GLUT_RGB
+
+        #region int GLUT_RGBA
+        /// <summary>
+        ///     Bit mask to select an RGBA mode window.  This is the default if neither
+        ///     <see cref="GLUT_RGB" />, <i>GLUT_RGBA</i>, nor <see cref="GLUT_INDEX" /> are
+        ///     specified.
+        /// </summary>
+        // #define GLUT_RGBA GLUT_RGB
+        public const int GLUT_RGBA = GLUT_RGB;
+        #endregion int GLUT_RGBA
+
+        #region int GLUT_INDEX
+        /// <summary>
+        ///     Bit mask to select a color index mode window.  This overrides
+        ///     <see cref="GLUT_RGB" /> or <see cref="GLUT_RGBA" /> if they are also
+        ///     specified.
+        /// </summary>
+        // #define GLUT_INDEX 1
+        public const int GLUT_INDEX = 1;
+        #endregion int GLUT_INDEX
+
+        #region int GLUT_SINGLE
+        /// <summary>
+        ///     Bit mask to select a single buffered window.  This is the default if neither
+        ///     <see cref="GLUT_DOUBLE" /> or <i>GLUT_SINGLE</i> are specified.
+        /// </summary>
+        // #define GLUT_SINGLE 0
+        public const int GLUT_SINGLE = 0;
+        #endregion int GLUT_SINGLE
+
+        #region int GLUT_DOUBLE
+        /// <summary>
+        ///     Bit mask to select a double buffered window.  This overrides
+        ///     <see cref="GLUT_SINGLE" /> if it is also specified.
+        /// </summary>
+        // #define GLUT_DOUBLE 2
+        public const int GLUT_DOUBLE = 2;
+        #endregion int GLUT_DOUBLE
+
+        #region int GLUT_ACCUM
+        /// <summary>
+        ///     Bit mask to select a window with an accumulation buffer.
+        /// </summary>
+        // #define GLUT_ACCUM 4
+        public const int GLUT_ACCUM = 4;
+        #endregion int GLUT_ACCUM
+
+        #region int GLUT_ALPHA
+        /// <summary>
+        ///     Bit mask to select a window with an alpha component to the color buffer(s).
+        /// </summary>
+        // #define GLUT_ALPHA 8
+        public const int GLUT_ALPHA = 8;
+        #endregion int GLUT_ALPHA
+
+        #region int GLUT_DEPTH
+        /// <summary>
+        ///     Bit mask to select a window with a depth buffer.
+        /// </summary>
+        // #define GLUT_DEPTH 16
+        public const int GLUT_DEPTH = 16;
+        #endregion int GLUT_DEPTH
+
+        #region int GLUT_STENCIL
+        /// <summary>
+        ///     Bit mask to select a window with a stencil buffer.
+        /// </summary>
+        // #define GLUT_STENCIL 32
+        public const int GLUT_STENCIL = 32;
+        #endregion int GLUT_STENCIL
+
+        #region int GLUT_MULTISAMPLE
+        /// <summary>
+        ///     Bit mask to select a window with multisampling support.  If multisampling is
+        ///     not available, a non-multisampling window will automatically be chosen.  Note:
+        ///     both the OpenGL client-side and server-side implementations must support the
+        ///     GLX_SAMPLE_SGIS extension for multisampling to be available.
+        /// </summary>
+        // #define GLUT_MULTISAMPLE 128
+        public const int GLUT_MULTISAMPLE = 128;
+        #endregion int GLUT_MULTISAMPLE
+
+        #region int GLUT_STEREO
+        /// <summary>
+        ///     Bit mask to select a stereo window.
+        /// </summary>
+        // #define GLUT_STEREO 256
+        public const int GLUT_STEREO = 256;
+        #endregion int GLUT_STEREO
+
+        #region int GLUT_LUMINANCE
+        /// <summary>
+        ///     Bit mask to select a window with a "luminance" color model.  This model
+        ///     provides the functionality of OpenGL's RGBA color model, but the green and
+        ///     blue components are not maintained in the frame buffer.  Instead each pixel's
+        ///     red component is converted to an index between zero and
+        ///     <c>Glut.glutGet(Glut.GLUT_WINDOW_COLORMAP_SIZE) - 1</c> and looked up in a
+        ///     per-window color map to determine the color of pixels within the window.  The
+        ///     initial colormap of <see cref="GLUT_LUMINANCE" /> windows is initialized to
+        ///     be a linear gray ramp, but can be modified with GLUT's colormap routines.
+        /// </summary>
+        // #define GLUT_LUMINANCE 512
+        public const int GLUT_LUMINANCE = 512;
+        #endregion int GLUT_LUMINANCE
+        #endregion Display mode bit masks
+
+        #region Mouse buttons
+        #region int GLUT_LEFT_BUTTON
+        /// <summary>
+        ///     Left mouse button.
+        /// </summary>
+        // #define GLUT_LEFT_BUTTON 0
+        public const int GLUT_LEFT_BUTTON = 0;
+        #endregion int GLUT_LEFT_BUTTON
+
+        #region int GLUT_MIDDLE_BUTTON
+        /// <summary>
+        ///     Middle mouse button.
+        /// </summary>
+        // #define GLUT_MIDDLE_BUTTON 1
+        public const int GLUT_MIDDLE_BUTTON = 1;
+        #endregion int GLUT_MIDDLE_BUTTON
+
+        #region int GLUT_RIGHT_BUTTON
+        /// <summary>
+        ///     Right mouse button.
+        /// </summary>
+        // #define GLUT_RIGHT_BUTTON 2
+        public const int GLUT_RIGHT_BUTTON = 2;
+        #endregion int GLUT_RIGHT_BUTTON
+        #endregion Mouse buttons
+
+        #region Mouse button state
+        #region int GLUT_DOWN
+        /// <summary>
+        ///     Mouse button down.
+        /// </summary>
+        // #define GLUT_DOWN 0
+        public const int GLUT_DOWN = 0;
+        #endregion int GLUT_DOWN
+
+        #region int GLUT_UP
+        /// <summary>
+        ///     Mouse button up.
+        /// </summary>
+        // #define GLUT_UP 1
+        public const int GLUT_UP = 1;
+        #endregion int GLUT_UP
+        #endregion Mouse button state
+
+        #region Function keys
+        #region int GLUT_KEY_F1
+        /// <summary>
+        ///     F1 function key.
+        /// </summary>
+        // #define GLUT_KEY_F1 1
+        public const int GLUT_KEY_F1 = 1;
+        #endregion int GLUT_KEY_F1
+
+        #region int GLUT_KEY_F2
+        /// <summary>
+        ///     F2 function key.
+        /// </summary>
+        // #define GLUT_KEY_F2 2
+        public const int GLUT_KEY_F2 = 2;
+        #endregion int GLUT_KEY_F2
+
+        #region int GLUT_KEY_F3
+        /// <summary>
+        ///     F3 function key.
+        /// </summary>
+        // #define GLUT_KEY_F3 3
+        public const int GLUT_KEY_F3 = 3;
+        #endregion int GLUT_KEY_F3
+
+        #region int GLUT_KEY_F4
+        /// <summary>
+        ///     F4 function key.
+        /// </summary>
+        // #define GLUT_KEY_F4 4
+        public const int GLUT_KEY_F4 = 4;
+        #endregion int GLUT_KEY_F4
+
+        #region int GLUT_KEY_F5
+        /// <summary>
+        ///     F5 function key.
+        /// </summary>
+        // #define GLUT_KEY_F5 5
+        public const int GLUT_KEY_F5 = 5;
+        #endregion int GLUT_KEY_F5
+
+        #region int GLUT_KEY_F6
+        /// <summary>
+        ///     F6 function key.
+        /// </summary>
+        // #define GLUT_KEY_F6 6
+        public const int GLUT_KEY_F6 = 6;
+        #endregion int GLUT_KEY_F6
+
+        #region int GLUT_KEY_F7
+        /// <summary>
+        ///     F7 function key.
+        /// </summary>
+        // #define GLUT_KEY_F7 7
+        public const int GLUT_KEY_F7 = 7;
+        #endregion int GLUT_KEY_F7
+
+        #region int GLUT_KEY_F8
+        /// <summary>
+        ///     F8 function key.
+        /// </summary>
+        // #define GLUT_KEY_F8 8
+        public const int GLUT_KEY_F8 = 8;
+        #endregion int GLUT_KEY_F8
+
+        #region int GLUT_KEY_F9
+        /// <summary>
+        ///     F9 function key.
+        /// </summary>
+        // #define GLUT_KEY_F9 9
+        public const int GLUT_KEY_F9 = 9;
+        #endregion int GLUT_KEY_F9
+
+        #region int GLUT_KEY_F10
+        /// <summary>
+        ///     F10 function key.
+        /// </summary>
+        // #define GLUT_KEY_F10 10
+        public const int GLUT_KEY_F10 = 10;
+        #endregion int GLUT_KEY_F10
+
+        #region int GLUT_KEY_F11
+        /// <summary>
+        ///     F11 function key.
+        /// </summary>
+        // #define GLUT_KEY_F11 11
+        public const int GLUT_KEY_F11 = 11;
+        #endregion int GLUT_KEY_F11
+
+        #region int GLUT_KEY_F12
+        /// <summary>
+        ///     F12 function key.
+        /// </summary>
+        // #define GLUT_KEY_F12 12
+        public const int GLUT_KEY_F12 = 12;
+        #endregion int GLUT_KEY_F12
+        #endregion Function keys
+
+        #region Directional keys
+        #region int GLUT_KEY_LEFT
+        /// <summary>
+        ///     Left directional key.
+        /// </summary>
+        // #define GLUT_KEY_LEFT 100
+        public const int GLUT_KEY_LEFT = 100;
+        #endregion int GLUT_KEY_LEFT
+
+        #region int GLUT_KEY_UP
+        /// <summary>
+        ///     Up directional key.
+        /// </summary>
+        // #define GLUT_KEY_UP 101
+        public const int GLUT_KEY_UP = 101;
+        #endregion int GLUT_KEY_UP
+
+        #region int GLUT_KEY_RIGHT
+        /// <summary>
+        ///     Right directional key.
+        /// </summary>
+        // #define GLUT_KEY_RIGHT 102
+        public const int GLUT_KEY_RIGHT = 102;
+        #endregion int GLUT_KEY_RIGHT
+
+        #region int GLUT_KEY_DOWN
+        /// <summary>
+        ///     Down directional key.
+        /// </summary>
+        // #define GLUT_KEY_DOWN 103
+        public const int GLUT_KEY_DOWN = 103;
+        #endregion int GLUT_KEY_DOWN
+
+        #region int GLUT_KEY_PAGE_UP
+        /// <summary>
+        ///     Page Up directional key.
+        /// </summary>
+        // #define GLUT_KEY_PAGE_UP 104
+        public const int GLUT_KEY_PAGE_UP = 104;
+        #endregion int GLUT_KEY_PAGE_UP
+
+        #region int GLUT_KEY_PAGE_DOWN
+        /// <summary>
+        ///     Page Down directional key.
+        /// </summary>
+        // #define GLUT_KEY_PAGE_DOWN 105
+        public const int GLUT_KEY_PAGE_DOWN = 105;
+        #endregion int GLUT_KEY_PAGE_DOWN
+
+        #region int GLUT_KEY_HOME
+        /// <summary>
+        ///     Home directional key.
+        /// </summary>
+        // #define GLUT_KEY_HOME 106
+        public const int GLUT_KEY_HOME = 106;
+        #endregion int GLUT_KEY_HOME
+
+        #region int GLUT_KEY_END
+        /// <summary>
+        ///     End directional key.
+        /// </summary>
+        // #define GLUT_KEY_END 107
+        public const int GLUT_KEY_END = 107;
+        #endregion int GLUT_KEY_END
+
+        #region int GLUT_KEY_INSERT
+        /// <summary>
+        ///     Insert directional key.
+        /// </summary>
+        // #define GLUT_KEY_INSERT 108
+        public const int GLUT_KEY_INSERT = 108;
+        #endregion int GLUT_KEY_INSERT
+        #endregion Directional keys
+
+        #region Entry/exit state
+        #region int GLUT_LEFT
+        /// <summary>
+        ///     Mouse pointer has left the window.
+        /// </summary>
+        // #define GLUT_LEFT 0
+        public const int GLUT_LEFT = 0;
+        #endregion int GLUT_LEFT
+
+        #region int GLUT_ENTERED
+        /// <summary>
+        ///     Mouse pointer has entered the window.
+        /// </summary>
+        // #define GLUT_ENTERED 1
+        public const int GLUT_ENTERED = 1;
+        #endregion int GLUT_ENTERED
+        #endregion Entry/exit state
+
+        #region Menu usage state
+        #region int GLUT_MENU_NOT_IN_USE
+        /// <summary>
+        ///     Pop-up menus are not in use by the user.
+        /// </summary>
+        // #define GLUT_MENU_NOT_IN_USE 0
+        public const int GLUT_MENU_NOT_IN_USE = 0;
+        #endregion int GLUT_MENU_NOT_IN_USE
+
+        #region int GLUT_MENU_IN_USE
+        /// <summary>
+        ///     Pop-up menus are in use by the user.
+        /// </summary>
+        // #define GLUT_MENU_IN_USE 1
+        public const int GLUT_MENU_IN_USE = 1;
+        #endregion int GLUT_MENU_IN_USE
+        #endregion Menu usage state
+
+        #region Visibility state
+        #region int GLUT_NOT_VISIBLE
+        /// <summary>
+        ///     The window is not visible.  No part of the window is visible.  All further
+        ///     rendering to the window is discarded until the window's visibility changes.
+        /// </summary>
+        // #define GLUT_NOT_VISIBLE 0
+        public const int GLUT_NOT_VISIBLE = 0;
+        #endregion int GLUT_NOT_VISIBLE
+
+        #region int GLUT_VISIBLE
+        /// <summary>
+        ///     The window is visible.  Does not distinguish a window being totally versus
+        ///     partially visible.
+        /// </summary>
+        // #define GLUT_VISIBLE 1
+        public const int GLUT_VISIBLE = 1;
+        #endregion int GLUT_VISIBLE
+        #endregion Visibility state
+
+        #region Window status state
+        #region int GLUT_HIDDEN
+        /// <summary>
+        ///     The window is not shown or iconified.
+        /// </summary>
+        // #define GLUT_HIDDEN 0
+        public const int GLUT_HIDDEN = 0;
+        #endregion int GLUT_HIDDEN
+
+        #region int GLUT_FULLY_RETAINED
+        /// <summary>
+        ///     No pixels belonging to the window are covered by other windows.
+        /// </summary>
+        // #define GLUT_FULLY_RETAINED 1
+        public const int GLUT_FULLY_RETAINED = 1;
+        #endregion int GLUT_FULLY_RETAINED
+
+        #region int GLUT_PARTIALLY_RETAINED
+        /// <summary>
+        ///     Some but not all pixels belonging to the window are covered by other windows.
+        /// </summary>
+        // #define GLUT_PARTIALLY_RETAINED 2
+        public const int GLUT_PARTIALLY_RETAINED = 2;
+        #endregion int GLUT_PARTIALLY_RETAINED
+
+        #region int GLUT_FULLY_COVERED
+        /// <summary>
+        ///     The window is shown but no part of the window is visible.
+        /// </summary>
+        // #define GLUT_FULLY_COVERED 3
+        public const int GLUT_FULLY_COVERED = 3;
+        #endregion int GLUT_FULLY_COVERED
+        #endregion Window status state
+
+        #region Color index component selection values
+        #region int GLUT_RED
+        /// <summary>
+        ///     Red color component.
+        /// </summary>
+        // #define GLUT_RED 0
+        public const int GLUT_RED = 0;
+        #endregion int GLUT_RED
+
+        #region int GLUT_GREEN
+        /// <summary>
+        ///     Green color component.
+        /// </summary>
+        // #define GLUT_GREEN 1
+        public const int GLUT_GREEN = 1;
+        #endregion int GLUT_GREEN
+
+        #region int GLUT_BLUE
+        /// <summary>
+        ///     Blue color component.
+        /// </summary>
+        // #define GLUT_BLUE 2
+        public const int GLUT_BLUE = 2;
+        #endregion int GLUT_BLUE
+        #endregion Color index component selection values
+
+        #region glutGet parameters
+        #region int GLUT_WINDOW_X
+        /// <summary>
+        ///     X location in pixels (relative to the screen origin) of the current window.
+        /// </summary>
+        // #define GLUT_WINDOW_X ((GLenum) 100)
+        public const int GLUT_WINDOW_X = 100;
+        #endregion int GLUT_WINDOW_X
+
+        #region int GLUT_WINDOW_Y
+        /// <summary>
+        ///     Y location in pixels (relative to the screen origin) of the current window.
+        /// </summary>
+        // #define GLUT_WINDOW_Y ((GLenum) 101)
+        public const int GLUT_WINDOW_Y = 101;
+        #endregion int GLUT_WINDOW_Y
+
+        #region int GLUT_WINDOW_WIDTH
+        /// <summary>
+        ///     Width in pixels of the current window.
+        /// </summary>
+        // #define GLUT_WINDOW_WIDTH ((GLenum) 102)
+        public const int GLUT_WINDOW_WIDTH = 102;
+        #endregion int GLUT_WINDOW_WIDTH
+
+        #region int GLUT_WINDOW_HEIGHT
+        /// <summary>
+        ///     Height in pixels of the current window.
+        /// </summary>
+        // #define GLUT_WINDOW_HEIGHT ((GLenum) 103)
+        public const int GLUT_WINDOW_HEIGHT = 103;
+        #endregion int GLUT_WINDOW_HEIGHT
+
+        #region int GLUT_WINDOW_BUFFER_SIZE
+        /// <summary>
+        ///     Total number of bits for current window's color buffer.  For an RGBA window,
+        ///     this is the sum of <see cref="GLUT_WINDOW_RED_SIZE" />,
+        ///     <see cref="GLUT_WINDOW_GREEN_SIZE" />, <see cref="GLUT_WINDOW_BLUE_SIZE" />,
+        ///     and <see cref="GLUT_WINDOW_ALPHA_SIZE" />.  For color index windows, this is
+        ///     the size of the color indexes.
+        /// </summary>
+        // #define GLUT_WINDOW_BUFFER_SIZE ((GLenum) 104)
+        public const int GLUT_WINDOW_BUFFER_SIZE = 104;
+        #endregion int GLUT_WINDOW_BUFFER_SIZE
+
+        #region int GLUT_WINDOW_STENCIL_SIZE
+        /// <summary>
+        ///     Number of bits in the current window's stencil buffer.
+        /// </summary>
+        // #define GLUT_WINDOW_STENCIL_SIZE ((GLenum) 105)
+        public const int GLUT_WINDOW_STENCIL_SIZE = 105;
+        #endregion int GLUT_WINDOW_STENCIL_SIZE
+
+        #region int GLUT_WINDOW_DEPTH_SIZE
+        /// <summary>
+        ///     Number of bits in the current window's depth buffer.
+        /// </summary>
+        // #define GLUT_WINDOW_DEPTH_SIZE ((GLenum) 106)
+        public const int GLUT_WINDOW_DEPTH_SIZE = 106;
+        #endregion int GLUT_WINDOW_DEPTH_SIZE
+
+        #region int GLUT_WINDOW_RED_SIZE
+        /// <summary>
+        ///     Number of bits of red stored the current window's color buffer.  Zero if the
+        ///     window is color index.
+        /// </summary>
+        // #define GLUT_WINDOW_RED_SIZE ((GLenum) 107)
+        public const int GLUT_WINDOW_RED_SIZE = 107;
+        #endregion int GLUT_WINDOW_RED_SIZE
+
+        #region int GLUT_WINDOW_GREEN_SIZE
+        /// <summary>
+        ///     Number of bits of green stored the current window's color buffer.  Zero if the
+        ///     window is color index.
+        /// </summary>
+        // #define GLUT_WINDOW_GREEN_SIZE ((GLenum) 108)
+        public const int GLUT_WINDOW_GREEN_SIZE = 108;
+        #endregion int GLUT_WINDOW_GREEN_SIZE
+
+        #region int GLUT_WINDOW_BLUE_SIZE
+        /// <summary>
+        ///     Number of bits of blue stored the current window's color buffer.  Zero if the
+        ///     window is color index.
+        /// </summary>
+        // #define GLUT_WINDOW_BLUE_SIZE ((GLenum) 109)
+        public const int GLUT_WINDOW_BLUE_SIZE = 109;
+        #endregion int GLUT_WINDOW_BLUE_SIZE
+
+        #region int GLUT_WINDOW_ALPHA_SIZE
+        /// <summary>
+        ///     Number of bits of alpha stored the current window's color buffer.  Zero if the
+        ///     window is color index.
+        /// </summary>
+        // #define GLUT_WINDOW_ALPHA_SIZE ((GLenum) 110)
+        public const int GLUT_WINDOW_ALPHA_SIZE = 110;
+        #endregion int GLUT_WINDOW_ALPHA_SIZE
+
+        #region int GLUT_WINDOW_ACCUM_RED_SIZE
+        /// <summary>
+        ///     Number of bits of red stored in the current window's accumulation buffer.
+        ///     Zero if the window is color index.
+        /// </summary>
+        // #define GLUT_WINDOW_ACCUM_RED_SIZE ((GLenum) 111)
+        public const int GLUT_WINDOW_ACCUM_RED_SIZE = 111;
+        #endregion int GLUT_WINDOW_ACCUM_RED_SIZE
+
+        #region int GLUT_WINDOW_ACCUM_GREEN_SIZE
+        /// <summary>
+        ///     Number of bits of green stored in the current window's accumulation buffer.
+        ///     Zero if the window is color index.
+        /// </summary>
+        // #define GLUT_WINDOW_ACCUM_GREEN_SIZE ((GLenum) 112)
+        public const int GLUT_WINDOW_ACCUM_GREEN_SIZE = 112;
+        #endregion int GLUT_WINDOW_ACCUM_GREEN_SIZE
+
+        #region int GLUT_WINDOW_ACCUM_BLUE_SIZE
+        /// <summary>
+        ///     Number of bits of blue stored in the current window's accumulation buffer.
+        ///     Zero if the window is color index.
+        /// </summary>
+        // #define GLUT_WINDOW_ACCUM_BLUE_SIZE ((GLenum) 113)
+        public const int GLUT_WINDOW_ACCUM_BLUE_SIZE = 113;
+        #endregion int GLUT_WINDOW_ACCUM_BLUE_SIZE
+
+        #region int GLUT_WINDOW_ACCUM_ALPHA_SIZE
+        /// <summary>
+        ///     Number of bits of alpha stored in the current window's accumulation buffer.
+        ///     Zero if the window is color index.
+        /// </summary>
+        // #define GLUT_WINDOW_ACCUM_ALPHA_SIZE ((GLenum) 114)
+        public const int GLUT_WINDOW_ACCUM_ALPHA_SIZE = 114;
+        #endregion int GLUT_WINDOW_ACCUM_ALPHA_SIZE
+
+        #region int GLUT_WINDOW_DOUBLEBUFFER
+        /// <summary>
+        ///     One if the current window is double buffered, zero otherwise.
+        /// </summary>
+        // #define GLUT_WINDOW_DOUBLEBUFFER ((GLenum) 115)
+        public const int GLUT_WINDOW_DOUBLEBUFFER = 115;
+        #endregion int GLUT_WINDOW_DOUBLEBUFFER
+
+        #region int GLUT_WINDOW_RGBA
+        /// <summary>
+        ///     One if the current window is RGBA mode, zero otherwise (i.e., color index).
+        /// </summary>
+        // #define GLUT_WINDOW_RGBA ((GLenum) 116)
+        public const int GLUT_WINDOW_RGBA = 116;
+        #endregion int GLUT_WINDOW_RGBA
+
+        #region int GLUT_WINDOW_PARENT
+        /// <summary>
+        ///     The window number of the current window's parent; zero if the window is a
+        ///     top-level window.
+        /// </summary>
+        // #define GLUT_WINDOW_PARENT ((GLenum) 117)
+        public const int GLUT_WINDOW_PARENT = 117;
+        #endregion int GLUT_WINDOW_PARENT
+
+        #region int GLUT_WINDOW_NUM_CHILDREN
+        /// <summary>
+        ///     The number of subwindows the current window has (not counting children of
+        ///     children).
+        /// </summary>
+        // #define GLUT_WINDOW_NUM_CHILDREN ((GLenum) 118)
+        public const int GLUT_WINDOW_NUM_CHILDREN = 118;
+        #endregion int GLUT_WINDOW_NUM_CHILDREN
+
+        #region int GLUT_WINDOW_COLORMAP_SIZE
+        /// <summary>
+        ///     Size of current window's color index colormap; zero for RGBA color model
+        ///     windows.
+        /// </summary>
+        // #define GLUT_WINDOW_COLORMAP_SIZE ((GLenum) 119)
+        public const int GLUT_WINDOW_COLORMAP_SIZE = 119;
+        #endregion int GLUT_WINDOW_COLORMAP_SIZE
+
+        #region int GLUT_WINDOW_NUM_SAMPLES
+        /// <summary>
+        ///     Number of samples for multisampling for the current window.
+        /// </summary>
+        // #define GLUT_WINDOW_NUM_SAMPLES ((GLenum) 120)
+        public const int GLUT_WINDOW_NUM_SAMPLES = 120;
+        #endregion int GLUT_WINDOW_NUM_SAMPLES
+
+        #region int GLUT_WINDOW_STEREO
+        /// <summary>
+        ///     One if the current window is stereo, zero otherwise.
+        /// </summary>
+        // #define GLUT_WINDOW_STEREO ((GLenum) 121)
+        public const int GLUT_WINDOW_STEREO = 121;
+        #endregion int GLUT_WINDOW_STEREO
+
+        #region int GLUT_WINDOW_CURSOR
+        /// <summary>
+        ///     Current cursor for the current window.
+        /// </summary>
+        // #define GLUT_WINDOW_CURSOR ((GLenum) 122)
+        public const int GLUT_WINDOW_CURSOR = 122;
+        #endregion int GLUT_WINDOW_CURSOR
+
+        #region int GLUT_SCREEN_WIDTH
+        /// <summary>
+        ///     Width of the screen in pixels.  Zero indicates the width is unknown or not
+        ///     available.
+        /// </summary>
+        // #define GLUT_SCREEN_WIDTH ((GLenum) 200)
+        public const int GLUT_SCREEN_WIDTH = 200;
+        #endregion int GLUT_SCREEN_WIDTH
+
+        #region int GLUT_SCREEN_HEIGHT
+        /// <summary>
+        ///     Height of the screen in pixels.  Zero indicates the height is unknown or not
+        ///     available.
+        /// </summary>
+        // #define GLUT_SCREEN_HEIGHT ((GLenum) 201)
+        public const int GLUT_SCREEN_HEIGHT = 201;
+        #endregion int GLUT_SCREEN_HEIGHT
+
+        #region int GLUT_SCREEN_WIDTH_MM
+        /// <summary>
+        ///     Width of the screen in millimeters.  Zero indicates the width is unknown or
+        ///     not available.
+        /// </summary>
+        // #define GLUT_SCREEN_WIDTH_MM ((GLenum) 202)
+        public const int GLUT_SCREEN_WIDTH_MM = 202;
+        #endregion int GLUT_SCREEN_WIDTH_MM
+
+        #region int GLUT_SCREEN_HEIGHT_MM
+        /// <summary>
+        ///     Height of the screen in millimeters.  Zero indicates the height is unknown or
+        ///     not available.
+        /// </summary>
+        // #define GLUT_SCREEN_HEIGHT_MM ((GLenum) 203)
+        public const int GLUT_SCREEN_HEIGHT_MM = 203;
+        #endregion int GLUT_SCREEN_HEIGHT_MM
+
+        #region int GLUT_MENU_NUM_ITEMS
+        /// <summary>
+        ///     Number of menu items in the current menu.
+        /// </summary>
+        // #define GLUT_MENU_NUM_ITEMS ((GLenum) 300)
+        public const int GLUT_MENU_NUM_ITEMS = 300;
+        #endregion int GLUT_MENU_NUM_ITEMS
+
+        #region int GLUT_DISPLAY_MODE_POSSIBLE
+        /// <summary>
+        ///     Whether the current display mode is supported or not.
+        /// </summary>
+        // #define GLUT_DISPLAY_MODE_POSSIBLE ((GLenum) 400)
+        public const int GLUT_DISPLAY_MODE_POSSIBLE = 400;
+        #endregion int GLUT_DISPLAY_MODE_POSSIBLE
+
+        #region int GLUT_INIT_WINDOW_X
+        /// <summary>
+        ///     The X value of the initial window position.
+        /// </summary>
+        // #define GLUT_INIT_WINDOW_X ((GLenum) 500)
+        public const int GLUT_INIT_WINDOW_X = 500;
+        #endregion int GLUT_INIT_WINDOW_X
+
+        #region int GLUT_INIT_WINDOW_Y
+        /// <summary>
+        ///     The Y value of the initial window position.
+        /// </summary>
+        // #define GLUT_INIT_WINDOW_Y ((GLenum) 501)
+        public const int GLUT_INIT_WINDOW_Y = 501;
+        #endregion int GLUT_INIT_WINDOW_Y
+
+        #region int GLUT_INIT_WINDOW_WIDTH
+        /// <summary>
+        ///     The width value of the initial window size.
+        /// </summary>
+        // #define GLUT_INIT_WINDOW_WIDTH ((GLenum) 502)
+        public const int GLUT_INIT_WINDOW_WIDTH = 502;
+        #endregion int GLUT_INIT_WINDOW_WIDTH
+
+        #region int GLUT_INIT_WINDOW_HEIGHT
+        /// <summary>
+        ///     The height value of the initial window size.
+        /// </summary>
+        // #define GLUT_INIT_WINDOW_HEIGHT ((GLenum) 503)
+        public const int GLUT_INIT_WINDOW_HEIGHT = 503;
+        #endregion int GLUT_INIT_WINDOW_HEIGHT
+
+        #region int GLUT_INIT_DISPLAY_MODE
+        /// <summary>
+        ///     The initial display mode bit mask.
+        /// </summary>
+        // #define GLUT_INIT_DISPLAY_MODE ((GLenum) 504)
+        public const int GLUT_INIT_DISPLAY_MODE = 504;
+        #endregion int GLUT_INIT_DISPLAY_MODE
+
+        #region int GLUT_ELAPSED_TIME
+        /// <summary>
+        ///     Number of milliseconds since <see cref="glutInit()" /> called (or first call to
+        ///     <c>glutGet(GLUT_ELAPSED_TIME)</c>).
+        /// </summary>
+        // #define GLUT_ELAPSED_TIME ((GLenum) 700)
+        public const int GLUT_ELAPSED_TIME = 700;
+        #endregion int GLUT_ELAPSED_TIME
+
+        #region int GLUT_WINDOW_FORMAT_ID
+        /// <summary>
+        ///     The window system dependent format ID for the current layer of the current
+        ///     window.  On X11 GLUT implementations, this is the X visual ID.  On Win32 GLUT
+        ///     implementations, this is the Win32 Pixel Format Descriptor number.  This value
+        ///     is returned for debugging, benchmarking, and testing ease.
+        /// </summary>
+        // #define GLUT_WINDOW_FORMAT_ID ((GLenum) 123)
+        public const int GLUT_WINDOW_FORMAT_ID = 123;
+        #endregion int GLUT_WINDOW_FORMAT_ID
+
+        #region int GLUT_INIT_STATE
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        public const int GLUT_INIT_STATE = 124;
+        #endregion int GLUT_INIT_STATE
+        #endregion glutGet parameters
+
+        #region glutDeviceGet parameters
+        #region int GLUT_HAS_KEYBOARD
+        /// <summary>
+        ///     Non-zero if a keyboard is available; zero if not available.  For most GLUT
+        ///     implementations, a keyboard can be assumed.
+        /// </summary>
+        // #define GLUT_HAS_KEYBOARD ((GLenum) 600)
+        public const int GLUT_HAS_KEYBOARD = 600;
+        #endregion int GLUT_HAS_KEYBOARD
+
+        #region int GLUT_HAS_MOUSE
+        /// <summary>
+        ///     Non-zero if a mouse is available; zero if not available.  For most GLUT
+        ///     implementations, a keyboard can be assumed.
+        /// </summary>
+        // #define GLUT_HAS_MOUSE ((GLenum) 601)
+        public const int GLUT_HAS_MOUSE = 601;
+        #endregion int GLUT_HAS_MOUSE
+
+        #region int GLUT_HAS_SPACEBALL
+        /// <summary>
+        ///     Non-zero if a Spaceball is available; zero if not available.
+        /// </summary>
+        // #define GLUT_HAS_SPACEBALL ((GLenum) 602)
+        public const int GLUT_HAS_SPACEBALL = 602;
+        #endregion int GLUT_HAS_SPACEBALL
+
+        #region int GLUT_HAS_DIAL_AND_BUTTON_BOX
+        /// <summary>
+        ///     Non-zero if a dial and button box is available; zero if not available.
+        /// </summary>
+        // #define GLUT_HAS_DIAL_AND_BUTTON_BOX ((GLenum) 603)
+        public const int GLUT_HAS_DIAL_AND_BUTTON_BOX = 603;
+        #endregion int GLUT_HAS_DIAL_AND_BUTTON_BOX
+
+        #region int GLUT_HAS_TABLET
+        /// <summary>
+        ///     Non-zero if a tablet is available; zero if not available.
+        /// </summary>
+        // #define GLUT_HAS_TABLET ((GLenum) 604)
+        public const int GLUT_HAS_TABLET = 604;
+        #endregion int GLUT_HAS_TABLET
+
+        #region int GLUT_NUM_MOUSE_BUTTONS
+        /// <summary>
+        ///     Number of buttons supported by the mouse.  If no mouse is supported, zero is
+        ///     returned.
+        /// </summary>
+        // #define GLUT_NUM_MOUSE_BUTTONS ((GLenum) 605)
+        public const int GLUT_NUM_MOUSE_BUTTONS = 605;
+        #endregion int GLUT_NUM_MOUSE_BUTTONS
+
+        #region int GLUT_NUM_SPACEBALL_BUTTONS
+        /// <summary>
+        ///     Number of buttons supported by the Spaceball.  If no Spaceball is
+        ///     supported, zero is returned.
+        /// </summary>
+        // #define GLUT_NUM_SPACEBALL_BUTTONS ((GLenum) 606)
+        public const int GLUT_NUM_SPACEBALL_BUTTONS = 606;
+        #endregion int GLUT_NUM_SPACEBALL_BUTTONS
+
+        #region int GLUT_NUM_BUTTON_BOX_BUTTONS
+        /// <summary>
+        ///     Number of buttons supported by the dial and button box device.  If no dials
+        ///     and button box device is supported, zero is returned.
+        /// </summary>
+        // #define GLUT_NUM_BUTTON_BOX_BUTTONS ((GLenum) 607)
+        public const int GLUT_NUM_BUTTON_BOX_BUTTONS = 607;
+        #endregion int GLUT_NUM_BUTTON_BOX_BUTTONS
+
+        #region int GLUT_NUM_DIALS
+        /// <summary>
+        ///     Number of dials supported by the dial and button box device.  If no dials and
+        ///     button box device is supported, zero is returned.
+        /// </summary>
+        // #define GLUT_NUM_DIALS ((GLenum) 608)
+        public const int GLUT_NUM_DIALS = 608;
+        #endregion int GLUT_NUM_DIALS
+
+        #region int GLUT_NUM_TABLET_BUTTONS
+        /// <summary>
+        ///     Number of buttons supported by the tablet.  If no tablet is supported, zero is
+        ///     returned.
+        /// </summary>
+        // #define GLUT_NUM_TABLET_BUTTONS ((GLenum) 609)
+        public const int GLUT_NUM_TABLET_BUTTONS = 609;
+        #endregion int GLUT_NUM_TABLET_BUTTONS
+
+        #region int GLUT_DEVICE_IGNORE_KEY_REPEAT
+        /// <summary>
+        ///     Returns true if the current window's auto repeated keys are ignored.  This
+        ///     state is controlled by <see cref="glutIgnoreKeyRepeat" />.
+        /// </summary>
+        // #define GLUT_DEVICE_IGNORE_KEY_REPEAT ((GLenum) 610)
+        public const int GLUT_DEVICE_IGNORE_KEY_REPEAT = 610;
+        #endregion int GLUT_DEVICE_IGNORE_KEY_REPEAT
+
+        #region int GLUT_DEVICE_KEY_REPEAT
+        /// <summary>
+        ///     The window system's global key repeat state.  Returns either
+        ///     <see cref="GLUT_KEY_REPEAT_OFF" />, <see cref="GLUT_KEY_REPEAT_ON" />, or
+        ///     <see cref="GLUT_KEY_REPEAT_DEFAULT" />.  This will not necessarily return the
+        ///     value last passed to <see cref="glutSetKeyRepeat" />.
+        /// </summary>
+        // #define GLUT_DEVICE_KEY_REPEAT ((GLenum) 611)
+        public const int GLUT_DEVICE_KEY_REPEAT = 611;
+        #endregion int GLUT_DEVICE_KEY_REPEAT
+
+        #region int GLUT_HAS_JOYSTICK
+        /// <summary>
+        ///     Non-zero if a joystick is available; zero if not available.
+        /// </summary>
+        // #define GLUT_HAS_JOYSTICK ((GLenum) 612)
+        public const int GLUT_HAS_JOYSTICK = 612;
+        #endregion int GLUT_HAS_JOYSTICK
+
+        #region int GLUT_OWNS_JOYSTICK
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        /// <remarks>
+        ///     Unofficially, this doesn't appear to be implemented.
+        /// </remarks>
+        // #define GLUT_OWNS_JOYSTICK ((GLenum) 613)
+        public const int GLUT_OWNS_JOYSTICK = 613;
+        #endregion int GLUT_OWNS_JOYSTICK
+
+        #region int GLUT_JOYSTICK_BUTTONS
+        /// <summary>
+        ///     Number of buttons supported by the joystick.  If no joystick is supported,
+        ///     zero is returned.
+        /// </summary>
+        // #define GLUT_JOYSTICK_BUTTONS ((GLenum) 614)
+        public const int GLUT_JOYSTICK_BUTTONS = 614;
+        #endregion int GLUT_JOYSTICK_BUTTONS
+
+        #region int GLUT_JOYSTICK_AXES
+        /// <summary>
+        ///     Number of axes supported by the joystick.  If no joystick is supposrted, zero
+        ///     is returned.
+        /// </summary>
+        // #define GLUT_JOYSTICK_AXES ((GLenum) 615)
+        public const int GLUT_JOYSTICK_AXES = 615;
+        #endregion int GLUT_JOYSTICK_AXES
+
+        #region int GLUT_JOYSTICK_POLL_RATE
+        /// <summary>
+        ///     Returns the current window's joystick poll rate as set by
+        ///     <see cref="glutJoystickFunc" />.  If no joystick is supported, the poll rate
+        ///     will always be zero.  The joystick poll rate also returns zero if the poll
+        ///     rate last specified to <see cref="glutJoystickFunc" /> is negative or a NULL
+        ///     callback was registered. 
+        /// </summary>
+        // #define GLUT_JOYSTICK_POLL_RATE ((GLenum) 616)
+        public const int GLUT_JOYSTICK_POLL_RATE = 616;
+        #endregion int GLUT_JOYSTICK_POLL_RATE
+        #endregion glutDeviceGet parameters
+
+        #region glutLayerGet parameters
+        #region int GLUT_OVERLAY_POSSIBLE
+        /// <summary>
+        ///     Whether an overlay could be established for the current window given the
+        ///     current initial display mode.  If false, <see cref="glutEstablishOverlay" />
+        ///     will fail with a fatal error if called.
+        /// </summary>
+        // #define GLUT_OVERLAY_POSSIBLE ((GLenum) 800)
+        public const int GLUT_OVERLAY_POSSIBLE = 800;
+        #endregion int GLUT_OVERLAY_POSSIBLE
+
+        #region int GLUT_LAYER_IN_USE
+        /// <summary>
+        ///     Either <see cref="GLUT_NORMAL" /> or <see cref="GLUT_OVERLAY" /> depending on
+        ///     whether the normal plane or overlay is the layer in use.
+        /// </summary>
+        // #define GLUT_LAYER_IN_USE ((GLenum) 801)
+        public const int GLUT_LAYER_IN_USE = 801;
+        #endregion int GLUT_LAYER_IN_USE
+
+        #region int GLUT_HAS_OVERLAY
+        /// <summary>
+        ///     If the current window has an overlay established.
+        /// </summary>
+        // #define GLUT_HAS_OVERLAY ((GLenum) 802)
+        public const int GLUT_HAS_OVERLAY = 802;
+        #endregion int GLUT_HAS_OVERLAY
+
+        #region int GLUT_TRANSPARENT_INDEX
+        /// <summary>
+        ///     The transparent color index of the overlay of the current window; negative
+        ///     one is returned if no overlay is in use.
+        /// </summary>
+        // #define GLUT_TRANSPARENT_INDEX ((GLenum) 803)
+        public const int GLUT_TRANSPARENT_INDEX = 803;
+        #endregion int GLUT_TRANSPARENT_INDEX
+
+        #region int GLUT_NORMAL_DAMAGED
+        /// <summary>
+        ///     True if the normal plane of the current window has damaged (by window system
+        ///     activity) since the last display callback was triggered.  Calling
+        ///     <see cref="glutPostRedisplay" /> will not set this true.
+        /// </summary>
+        // #define GLUT_NORMAL_DAMAGED ((GLenum) 804)
+        public const int GLUT_NORMAL_DAMAGED = 804;
+        #endregion int GLUT_NORMAL_DAMAGED
+
+        #region int GLUT_OVERLAY_DAMAGED
+        /// <summary>
+        ///     True if the overlay plane of the current window has damaged (by window system
+        ///     activity) since the last display callback was triggered.  Calling
+        ///     <see cref="glutPostRedisplay" /> or <see cref="glutPostOverlayRedisplay" />
+        ///     will not set this true.  Negative one is returned if no overlay is in use.
+        /// </summary>
+        // #define GLUT_OVERLAY_DAMAGED ((GLenum) 805)
+        public const int GLUT_OVERLAY_DAMAGED = 805;
+        #endregion int GLUT_OVERLAY_DAMAGED
+        #endregion #region glutLayerGet parameters
+
+        #region glutVideoResizeGet parameters
+        #region int GLUT_VIDEO_RESIZE_POSSIBLE
+        /// <summary>
+        ///     Non-zero if video resizing is supported by the underlying system; zero if not
+        ///     supported.  If this is zero, the other video resize GLUT calls do nothing when
+        ///     called.
+        /// </summary>
+        // #define GLUT_VIDEO_RESIZE_POSSIBLE ((GLenum) 900)
+        public const int GLUT_VIDEO_RESIZE_POSSIBLE = 900;
+        #endregion int GLUT_VIDEO_RESIZE_POSSIBLE
+
+        #region int GLUT_VIDEO_RESIZE_IN_USE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_VIDEO_RESIZE_IN_USE ((GLenum) 901)
+        public const int GLUT_VIDEO_RESIZE_IN_USE = 901;
+        #endregion int GLUT_VIDEO_RESIZE_IN_USE
+
+        #region int GLUT_VIDEO_RESIZE_X_DELTA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_VIDEO_RESIZE_X_DELTA ((GLenum) 902)
+        public const int GLUT_VIDEO_RESIZE_X_DELTA = 902;
+        #endregion int GLUT_VIDEO_RESIZE_X_DELTA
+
+        #region int GLUT_VIDEO_RESIZE_Y_DELTA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_VIDEO_RESIZE_Y_DELTA ((GLenum) 903)
+        public const int GLUT_VIDEO_RESIZE_Y_DELTA = 903;
+        #endregion int GLUT_VIDEO_RESIZE_Y_DELTA
+
+        #region int GLUT_VIDEO_RESIZE_WIDTH_DELTA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_VIDEO_RESIZE_WIDTH_DELTA ((GLenum) 904)
+        public const int GLUT_VIDEO_RESIZE_WIDTH_DELTA = 904;
+        #endregion int GLUT_VIDEO_RESIZE_WIDTH_DELTA
+
+        #region int GLUT_VIDEO_RESIZE_HEIGHT_DELTA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_VIDEO_RESIZE_HEIGHT_DELTA ((GLenum) 905)
+        public const int GLUT_VIDEO_RESIZE_HEIGHT_DELTA = 905;
+        #endregion int GLUT_VIDEO_RESIZE_HEIGHT_DELTA
+
+        #region int GLUT_VIDEO_RESIZE_X
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_VIDEO_RESIZE_X ((GLenum) 906)
+        public const int GLUT_VIDEO_RESIZE_X = 906;
+        #endregion int GLUT_VIDEO_RESIZE_X
+
+        #region int GLUT_VIDEO_RESIZE_Y
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_VIDEO_RESIZE_Y ((GLenum) 907)
+        public const int GLUT_VIDEO_RESIZE_Y = 907;
+        #endregion int GLUT_VIDEO_RESIZE_Y
+
+        #region int GLUT_VIDEO_RESIZE_WIDTH
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_VIDEO_RESIZE_WIDTH ((GLenum) 908)
+        public const int GLUT_VIDEO_RESIZE_WIDTH = 908;
+        #endregion int GLUT_VIDEO_RESIZE_WIDTH
+
+        #region int GLUT_VIDEO_RESIZE_HEIGHT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_VIDEO_RESIZE_HEIGHT ((GLenum) 909)
+        public const int GLUT_VIDEO_RESIZE_HEIGHT = 909;
+        #endregion int GLUT_VIDEO_RESIZE_HEIGHT
+        #endregion glutVideoResizeGet parameters
+
+        #region glutUseLayer parameters
+        #region int GLUT_NORMAL
+        /// <summary>
+        ///     The normal plane.
+        /// </summary>
+        // #define GLUT_NORMAL ((GLenum) 0)
+        public const int GLUT_NORMAL = 0;
+        #endregion int GLUT_NORMAL
+
+        #region int GLUT_OVERLAY
+        /// <summary>
+        ///     The overlay plane.
+        /// </summary>
+        // #define GLUT_OVERLAY ((GLenum) 1)
+        public const int GLUT_OVERLAY = 1;
+        #endregion int GLUT_OVERLAY
+        #endregion glutUseLayer parameters
+
+        #region glutGetModifiers return mask
+        #region int GLUT_ACTIVE_SHIFT
+        /// <summary>
+        ///     Set if the Shift modifier or Caps Lock is active.
+        /// </summary>
+        // #define GLUT_ACTIVE_SHIFT 1
+        public const int GLUT_ACTIVE_SHIFT = 1;
+        #endregion int GLUT_ACTIVE_SHIFT
+
+        #region int GLUT_ACTIVE_CTRL
+        /// <summary>
+        ///     Set if the Ctrl modifier is active.
+        /// </summary>
+        // #define GLUT_ACTIVE_CTRL 2
+        public const int GLUT_ACTIVE_CTRL = 2;
+        #endregion int GLUT_ACTIVE_CTRL
+
+        #region int GLUT_ACTIVE_ALT
+        /// <summary>
+        ///     Set if the Alt modifier is active.
+        /// </summary>
+        // #define GLUT_ACTIVE_ALT 4
+        public const int GLUT_ACTIVE_ALT = 4;
+        #endregion int GLUT_ACTIVE_ALT
+        #endregion glutGetModifiers return mask
+
+        #region glutSetCursor parameters
+        #region Basic arrows
+        #region int GLUT_CURSOR_RIGHT_ARROW
+        /// <summary>
+        ///     Arrow pointing up and to the right.
+        /// </summary>
+        // #define GLUT_CURSOR_RIGHT_ARROW 0
+        public const int GLUT_CURSOR_RIGHT_ARROW = 0;
+        #endregion int GLUT_CURSOR_RIGHT_ARROW
+
+        #region int GLUT_CURSOR_LEFT_ARROW
+        /// <summary>
+        ///     Arrow pointing up and to the left.
+        /// </summary>
+        // #define GLUT_CURSOR_LEFT_ARROW 1
+        public const int GLUT_CURSOR_LEFT_ARROW = 1;
+        #endregion int GLUT_CURSOR_LEFT_ARROW
+        #endregion Basic arrows
+
+        #region Symbolic cursor shapes
+        #region int GLUT_CURSOR_INFO
+        /// <summary>
+        ///     Pointing hand.
+        /// </summary>
+        // #define GLUT_CURSOR_INFO 2
+        public const int GLUT_CURSOR_INFO = 2;
+        #endregion int GLUT_CURSOR_INFO
+
+        #region int GLUT_CURSOR_DESTROY
+        /// <summary>
+        ///     Skull and cross bones.
+        /// </summary>
+        // #define GLUT_CURSOR_DESTROY 3
+        public const int GLUT_CURSOR_DESTROY = 3;
+        #endregion int GLUT_CURSOR_DESTROY
+
+        #region int GLUT_CURSOR_HELP
+        /// <summary>
+        ///     Question mark.
+        /// </summary>
+        // #define GLUT_CURSOR_HELP 4
+        public const int GLUT_CURSOR_HELP = 4;
+        #endregion int GLUT_CURSOR_HELP
+
+        #region int GLUT_CURSOR_CYCLE
+        /// <summary>
+        ///     Arrows rotating in a circle.
+        /// </summary>
+        // #define GLUT_CURSOR_CYCLE 5
+        public const int GLUT_CURSOR_CYCLE = 5;
+        #endregion int GLUT_CURSOR_CYCLE
+
+        #region int GLUT_CURSOR_SPRAY
+        /// <summary>
+        ///     Spray can.
+        /// </summary>
+        // #define GLUT_CURSOR_SPRAY 6
+        public const int GLUT_CURSOR_SPRAY = 6;
+        #endregion int GLUT_CURSOR_SPRAY
+
+        #region int GLUT_CURSOR_WAIT
+        /// <summary>
+        ///     Wrist watch.
+        /// </summary>
+        // #define GLUT_CURSOR_WAIT 7
+        public const int GLUT_CURSOR_WAIT = 7;
+        #endregion int GLUT_CURSOR_WAIT
+
+        #region int GLUT_CURSOR_TEXT
+        /// <summary>
+        ///     Insertion point cursor for text.
+        /// </summary>
+        // #define GLUT_CURSOR_TEXT 8
+        public const int GLUT_CURSOR_TEXT = 8;
+        #endregion int GLUT_CURSOR_TEXT
+
+        #region int GLUT_CURSOR_CROSSHAIR
+        /// <summary>
+        ///     Simple cross-hair.
+        /// </summary>
+        // #define GLUT_CURSOR_CROSSHAIR 9
+        public const int GLUT_CURSOR_CROSSHAIR = 9;
+        #endregion int GLUT_CURSOR_CROSSHAIR
+        #endregion Symbolic cursor shapes
+
+        #region Directional cursors
+        #region int GLUT_CURSOR_UP_DOWN
+        /// <summary>
+        ///     Bi-directional pointing up and down.
+        /// </summary>
+        // #define GLUT_CURSOR_UP_DOWN 10
+        public const int GLUT_CURSOR_UP_DOWN = 10;
+        #endregion int GLUT_CURSOR_UP_DOWN
+
+        #region int GLUT_CURSOR_LEFT_RIGHT
+        /// <summary>
+        ///     Bi-directional pointing left and right.
+        /// </summary>
+        // #define GLUT_CURSOR_LEFT_RIGHT 11
+        public const int GLUT_CURSOR_LEFT_RIGHT = 11;
+        #endregion int GLUT_CURSOR_LEFT_RIGHT
+        #endregion Directional cursors
+
+        #region Sizing cursors
+        #region int GLUT_CURSOR_TOP_SIDE
+        /// <summary>
+        ///     Arrow pointing to top side.
+        /// </summary>
+        // #define GLUT_CURSOR_TOP_SIDE 12
+        public const int GLUT_CURSOR_TOP_SIDE = 12;
+        #endregion int GLUT_CURSOR_TOP_SIDE
+
+        #region int GLUT_CURSOR_BOTTOM_SIDE
+        /// <summary>
+        ///     Arrow pointing to bottom side.
+        /// </summary>
+        // #define GLUT_CURSOR_BOTTOM_SIDE 13
+        public const int GLUT_CURSOR_BOTTOM_SIDE = 13;
+        #endregion int GLUT_CURSOR_BOTTOM_SIDE
+
+        #region int GLUT_CURSOR_LEFT_SIDE
+        /// <summary>
+        ///     Arrow pointing to left side.
+        /// </summary>
+        // #define GLUT_CURSOR_LEFT_SIDE 14
+        public const int GLUT_CURSOR_LEFT_SIDE = 14;
+        #endregion int GLUT_CURSOR_LEFT_SIDE
+
+        #region int GLUT_CURSOR_RIGHT_SIDE
+        /// <summary>
+        ///     Arrow pointing to right side.
+        /// </summary>
+        // #define GLUT_CURSOR_RIGHT_SIDE 15
+        public const int GLUT_CURSOR_RIGHT_SIDE = 15;
+        #endregion int GLUT_CURSOR_RIGHT_SIDE
+
+        #region int GLUT_CURSOR_TOP_LEFT_CORNER
+        /// <summary>
+        ///     Arrow pointing to top-left corner.
+        /// </summary>
+        // #define GLUT_CURSOR_TOP_LEFT_CORNER 16
+        public const int GLUT_CURSOR_TOP_LEFT_CORNER = 16;
+        #endregion int GLUT_CURSOR_TOP_LEFT_CORNER
+
+        #region int GLUT_CURSOR_TOP_RIGHT_CORNER
+        /// <summary>
+        ///     Arrow pointing to top-right corner.
+        /// </summary>
+        // #define GLUT_CURSOR_TOP_RIGHT_CORNER 17
+        public const int GLUT_CURSOR_TOP_RIGHT_CORNER = 17;
+        #endregion int GLUT_CURSOR_TOP_RIGHT_CORNER
+
+        #region int GLUT_CURSOR_BOTTOM_RIGHT_CORNER
+        /// <summary>
+        ///     Arrow pointing to bottom-right corner.
+        /// </summary>
+        // #define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18
+        public const int GLUT_CURSOR_BOTTOM_RIGHT_CORNER = 18;
+        #endregion int GLUT_CURSOR_BOTTOM_RIGHT_CORNER
+
+        #region int GLUT_CURSOR_BOTTOM_LEFT_CORNER
+        /// <summary>
+        ///     Arrow pointing to bottom-left corner.
+        /// </summary>
+        // #define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19
+        public const int GLUT_CURSOR_BOTTOM_LEFT_CORNER = 19;
+        #endregion int GLUT_CURSOR_BOTTOM_LEFT_CORNER
+        #endregion Sizing cursors
+
+        #region Inherit from parent window
+        #region int GLUT_CURSOR_INHERIT
+        /// <summary>
+        ///     Use parent's cursor.
+        /// </summary>
+        // #define GLUT_CURSOR_INHERIT 100
+        public const int GLUT_CURSOR_INHERIT = 100;
+        #endregion int GLUT_CURSOR_INHERIT
+        #endregion Inherit from parent window
+
+        #region Blank cursor
+        #region int GLUT_CURSOR_NONE
+        /// <summary>
+        ///     Invisible cursor.
+        /// </summary>
+        // #define GLUT_CURSOR_NONE 101
+        public const int GLUT_CURSOR_NONE = 101;
+        #endregion int GLUT_CURSOR_NONE
+        #endregion Blank cursor
+
+        #region Fullscreen crosshair (if available)
+        #region int GLUT_CURSOR_FULL_CROSSHAIR
+        /// <summary>
+        ///     Full-screen cross-hair cursor (if possible, otherwise
+        ///     <see cref="GLUT_CURSOR_CROSSHAIR" />.
+        /// </summary>
+        // #define GLUT_CURSOR_FULL_CROSSHAIR 102
+        public const int GLUT_CURSOR_FULL_CROSSHAIR = 102;
+        #endregion int GLUT_CURSOR_FULL_CROSSHAIR
+        #endregion Fullscreen crosshair (if available)
+        #endregion glutSetCursor parameters
+
+        #region glutSetKeyRepeat modes
+        #region int GLUT_KEY_REPEAT_OFF
+        /// <summary>
+        ///     Disable key repeat for the window system on a global basis.
+        /// </summary>
+        // #define GLUT_KEY_REPEAT_OFF 0
+        public const int GLUT_KEY_REPEAT_OFF = 0;
+        #endregion int GLUT_KEY_REPEAT_OFF
+
+        #region int GLUT_KEY_REPEAT_ON
+        /// <summary>
+        ///     Enable key repeat for the window system on a global basis.
+        /// </summary>
+        // #define GLUT_KEY_REPEAT_ON 1
+        public const int GLUT_KEY_REPEAT_ON = 1;
+        #endregion int GLUT_KEY_REPEAT_ON
+
+        #region int GLUT_KEY_REPEAT_DEFAULT
+        /// <summary>
+        ///     Reset the key repeat mode for the window system to its default state.
+        /// </summary>
+        // #define GLUT_KEY_REPEAT_DEFAULT 2
+        public const int GLUT_KEY_REPEAT_DEFAULT = 2;
+        #endregion int GLUT_KEY_REPEAT_DEFAULT
+        #endregion glutSetKeyRepeat modes
+
+        #region Joystick button masks
+        #region int GLUT_JOYSTICK_BUTTON_A
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_JOYSTICK_BUTTON_A 1
+        public const int GLUT_JOYSTICK_BUTTON_A = 1;
+        #endregion int GLUT_JOYSTICK_BUTTON_A
+
+        #region int GLUT_JOYSTICK_BUTTON_B
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_JOYSTICK_BUTTON_B 2
+        public const int GLUT_JOYSTICK_BUTTON_B = 2;
+        #endregion int GLUT_JOYSTICK_BUTTON_B
+
+        #region int GLUT_JOYSTICK_BUTTON_C
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_JOYSTICK_BUTTON_C 4
+        public const int GLUT_JOYSTICK_BUTTON_C = 4;
+        #endregion int GLUT_JOYSTICK_BUTTON_C
+
+        #region int GLUT_JOYSTICK_BUTTON_D
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLUT_JOYSTICK_BUTTON_D 8
+        public const int GLUT_JOYSTICK_BUTTON_D = 8;
+        #endregion int GLUT_JOYSTICK_BUTTON_D
+        #endregion Joystick button masks
+
+        #region glutGameModeGet parameters
+        #region int GLUT_GAME_MODE_ACTIVE
+        /// <summary>
+        ///     Non-zero if GLUT's game mode is active; zero if not active.  Game mode is not
+        ///     active initially.  Game mode becomes active when
+        ///     <see cref="glutEnterGameMode" /> is called.  Game mode becomes inactive when
+        ///     <see cref="glutLeaveGameMode" /> is called.
+        /// </summary>
+        // #define GLUT_GAME_MODE_ACTIVE ((GLenum) 0)
+        public const int GLUT_GAME_MODE_ACTIVE = 0;
+        #endregion int GLUT_GAME_MODE_ACTIVE
+
+        #region int GLUT_GAME_MODE_POSSIBLE
+        /// <summary>
+        ///     Non-zero if the game mode string last specified to
+        ///     <see cref="glutGameModeString" /> is a possible game mode configuration; zero
+        ///     otherwise.  Being "possible" does not guarantee that if game mode is entered
+        ///     with <see cref="glutEnterGameMode" /> that the display settings will actually
+        ///     changed.  <see cref="GLUT_GAME_MODE_DISPLAY_CHANGED" /> should be called once
+        ///     game mode is entered to determine if the display mode is actually changed.
+        /// </summary>
+        // #define GLUT_GAME_MODE_POSSIBLE ((GLenum) 1)
+        public const int GLUT_GAME_MODE_POSSIBLE = 1;
+        #endregion int GLUT_GAME_MODE_POSSIBLE
+
+        #region int GLUT_GAME_MODE_WIDTH
+        /// <summary>
+        ///     Width in pixels of the screen when game mode is activated.
+        /// </summary>
+        // #define GLUT_GAME_MODE_WIDTH ((GLenum) 2)
+        public const int GLUT_GAME_MODE_WIDTH = 2;
+        #endregion int GLUT_GAME_MODE_WIDTH
+
+        #region int GLUT_GAME_MODE_HEIGHT
+        /// <summary>
+        ///     Height in pixels of the screen when game mode is activated.
+        /// </summary>
+        // #define GLUT_GAME_MODE_HEIGHT ((GLenum) 3)
+        public const int GLUT_GAME_MODE_HEIGHT = 3;
+        #endregion int GLUT_GAME_MODE_HEIGHT
+
+        #region int GLUT_GAME_MODE_PIXEL_DEPTH
+        /// <summary>
+        ///     Pixel depth of the screen when game mode is activiated.
+        /// </summary>
+        // #define GLUT_GAME_MODE_PIXEL_DEPTH ((GLenum) 4)
+        public const int GLUT_GAME_MODE_PIXEL_DEPTH = 4;
+        #endregion int GLUT_GAME_MODE_PIXEL_DEPTH
+
+        #region int GLUT_GAME_MODE_REFRESH_RATE
+        /// <summary>
+        ///     Screen refresh rate in cyles per second (hertz) when game mode is activated.
+        ///     Zero is returned if the refresh rate is unknown or cannot be queried.
+        /// </summary>
+        // #define GLUT_GAME_MODE_REFRESH_RATE ((GLenum) 5)
+        public const int GLUT_GAME_MODE_REFRESH_RATE = 5;
+        #endregion int GLUT_GAME_MODE_REFRESH_RATE
+
+        #region int GLUT_GAME_MODE_DISPLAY_CHANGED
+        /// <summary>
+        ///     Non-zero if entering game mode actually changed the display settings.  If the
+        ///     game mode string is not possible or the display mode could not be changed for
+        ///     any other reason, zero is returned.
+        /// </summary>
+        // #define GLUT_GAME_MODE_DISPLAY_CHANGED ((GLenum) 6)
+        public const int GLUT_GAME_MODE_DISPLAY_CHANGED = 6;
+        #endregion int GLUT_GAME_MODE_DISPLAY_CHANGED
+        #endregion glutGameModeGet parameters
+
+        #region FreeGLUT Additions
+        #region Window Close Actions
+        #region int GLUT_ACTION_EXIT
+        /// <summary>
+        ///     Close window on window close button click.
+        /// </summary>
+        public const int GLUT_ACTION_EXIT = 0;
+        #endregion int GLUT_ACTION_EXIT
+
+        #region int GLUT_ACTION_GLUTMAINLOOP_RETURNS
+        /// <summary>
+        ///     Return from main loop on window close button click.
+        /// </summary>
+        public const int GLUT_ACTION_GLUTMAINLOOP_RETURNS = 1;
+        #endregion int GLUT_ACTION_GLUTMAINLOOP_RETURNS
+
+        #region int GLUT_ACTION_CONTINUE_EXECUTION
+        /// <summary>
+        ///     Continue execution on window close button click.
+        /// </summary>
+        public const int GLUT_ACTION_CONTINUE_EXECUTION = 2;
+        #endregion int GLUT_ACTION_CONTINUE_EXECUTION
+        #endregion Window Close Actions
+
+        #region Contexts For New Windows
+        #region int GLUT_CREATE_NEW_CONTEXT
+        /// <summary>
+        ///     Create a new context when user opens a new window.
+        /// </summary>
+        public const int GLUT_CREATE_NEW_CONTEXT = 0;
+        #endregion int GLUT_CREATE_NEW_CONTEXT
+
+        #region int GLUT_USE_CURRENT_CONTEXT
+        /// <summary>
+        ///     Use current context when user opens a new window.
+        /// </summary>
+        public const int GLUT_USE_CURRENT_CONTEXT = 1;
+        #endregion int GLUT_USE_CURRENT_CONTEXT
+        
+	#region int GLUT_FORCE_INDIRECT_CONTEXT
+        /// <summary>
+        ///     Direct/Indirect rendering context options (has meaning only in Unix/X11)
+        /// </summary>
+	public const int GLUT_FORCE_INDIRECT_CONTEXT = 0;
+        #endregion int GLUT_FORCE_INDIRECT_CONTEXT
+        
+	#region int GLUT_ALLOW_DIRECT_CONTEXT
+        /// <summary>
+        ///     Direct/Indirect rendering context options (has meaning only in Unix/X11)
+        /// </summary>
+	public const int GLUT_ALLOW_DIRECT_CONTEXT = 1;
+        #endregion int GLUT_ALLOW_DIRECT_CONTEXT
+        
+	#region int GLUT_TRY_DIRECT_CONTEXT
+        /// <summary>
+        ///     Direct/Indirect rendering context options (has meaning only in Unix/X11)
+        /// </summary>
+	public const int GLUT_TRY_DIRECT_CONTEXT = 2;
+        #endregion int GLUT_TRY_DIRECT_CONTEXT
+        
+	#region int GLUT_FORCE_DIRECT_CONTEXT
+        /// <summary>
+        ///     Direct/Indirect rendering context options (has meaning only in Unix/X11)
+        /// </summary>
+	public const int GLUT_FORCE_DIRECT_CONTEXT = 3;
+        #endregion int GLUT_FORCE_DIRECT_CONTEXT
+        #endregion Contexts For New Windows
+
+        #region glutGet Parameters
+        #region int GLUT_ACTION_ON_WINDOW_CLOSE
+        /// <summary>
+        ///     Gets current action for window-close.
+        /// </summary>
+        public const int GLUT_ACTION_ON_WINDOW_CLOSE = 0x01F9;
+        #endregion int GLUT_ACTION_ON_WINDOW_CLOSE
+
+        #region int GLUT_WINDOW_BORDER_WIDTH
+        /// <summary>
+        ///     Gets the window border width.
+        /// </summary>
+        public const int GLUT_WINDOW_BORDER_WIDTH = 0x01FA;
+        #endregion int GLUT_WINDOW_BORDER_WIDTH
+
+        #region int GLUT_WINDOW_HEADER_HEIGHT
+        /// <summary>
+        ///     Gets window header height.
+        /// </summary>
+        public const int GLUT_WINDOW_HEADER_HEIGHT = 0x01FB;
+        #endregion int GLUT_WINDOW_HEADER_HEIGHT
+
+        #region int GLUT_VERSION
+        /// <summary>
+        ///     Gets GLUT version.
+        /// </summary>
+        public const int GLUT_VERSION = 0x01FC;
+        #endregion int GLUT_VERSION
+
+        #region int GLUT_RENDERING_CONTEXT
+        /// <summary>
+        ///     Gets GLUT's rendering context.
+        /// </summary>
+        public const int GLUT_RENDERING_CONTEXT = 0x01FD;
+        #endregion int GLUT_RENDERING_CONTEXT
+	
+        #region int GLUT_DIRECT_RENDERING
+        /// <summary>
+        ///     
+        /// </summary>
+	public const int GLUT_DIRECT_RENDERING = 0x01FE;
+        #endregion int GLUT_DIRECT_RENDERING
+/*
+ * New tokens for glutInitDisplayMode.
+ * Only one GLUT_AUXn bit may be used at a time.
+ * Value 0x0400 is defined in OpenGLUT.
+ */
+	#region int GLUT_AUX1
+        /// <summary>
+        ///     
+        /// </summary>
+	public const int GLUT_AUX1 = 0x1000;
+        #endregion int GLUT_AUX1
+
+	#region int GLUT_AUX2
+        /// <summary>
+        ///     
+        /// </summary>
+	public const int GLUT_AUX2 = 0x2000;
+        #endregion int GLUT_AUX2
+
+	#region int GLUT_AUX3
+        /// <summary>
+        ///     
+        /// </summary>
+	public const int GLUT_AUX3 = 0x4000;
+        #endregion int GLUT_AUX3
+
+	#region int GLUT_AUX4
+        /// <summary>
+        ///     
+        /// </summary>
+	public const int GLUT_AUX4 = 0x8000;
+        #endregion int GLUT_AUX4
+        #endregion glutGet Parameters
+        #endregion FreeGLUT Additions
+        #endregion Public Constants
+
+        #region Public Static Readonly Fields
+        #region Fonts
+        #region IntPtr GLUT_STROKE_ROMAN
+        /// <summary>
+        ///     A proportionally spaced Roman Simplex font for ASCII characters 32 through
+        ///     127.  The maximum top character in the font is 119.05 units; the bottom
+        ///     descends 33.33 units.
+        /// </summary>
+        // #define GLUT_STROKE_ROMAN ((void*)0)
+        // #define GLUT_STROKE_ROMAN (&glutStrokeRoman)
+        public static readonly IntPtr GLUT_STROKE_ROMAN;
+        #endregion IntPtr GLUT_STROKE_ROMAN
+
+        #region IntPtr GLUT_STROKE_MONO_ROMAN
+        /// <summary>
+        ///     A mono-spaced spaced Roman Simplex font (same characters as
+        ///     <see cref="GLUT_STROKE_ROMAN" />) for ASCII characters 32 through 127.  The
+        ///     maximum top character in the font is 119.05 units; the bottom descends 33.33
+        ///     units.  Each character is 104.76 units wide.
+        /// </summary>
+        // #define GLUT_STROKE_MONO_ROMAN ((void*)1)
+        // #define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman)
+        public static readonly IntPtr GLUT_STROKE_MONO_ROMAN;
+        #endregion IntPtr GLUT_STROKE_MONO_ROMAN
+
+        #region IntPtr GLUT_BITMAP_9_BY_15
+        /// <summary>
+        ///     A fixed width font with every character fitting in an 9 by 15 pixel rectangle.
+        /// </summary>
+        // #define GLUT_BITMAP_9_BY_15 ((void*)2)
+        // #define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15)
+        public static readonly IntPtr GLUT_BITMAP_9_BY_15;
+        #endregion IntPtr GLUT_BITMAP_9_BY_15
+
+        #region IntPtr GLUT_BITMAP_8_BY_13
+        /// <summary>
+        ///     A fixed width font with every character fitting in an 8 by 13 pixel rectangle.
+        /// </summary>
+        // #define GLUT_BITMAP_8_BY_13 ((void*)3)
+        // #define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13)
+        public static readonly IntPtr GLUT_BITMAP_8_BY_13;
+        #endregion IntPtr GLUT_BITMAP_8_BY_13
+
+        #region IntPtr GLUT_BITMAP_TIMES_ROMAN_10
+        /// <summary>
+        ///     A 10-point proportional spaced Times Roman font.
+        /// </summary>
+        // #define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4)
+        // #define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10)
+        public static readonly IntPtr GLUT_BITMAP_TIMES_ROMAN_10;
+        #endregion IntPtr GLUT_BITMAP_TIMES_ROMAN_10
+
+        #region IntPtr GLUT_BITMAP_TIMES_ROMAN_24
+        /// <summary>
+        ///     A 24-point proportional spaced Times Roman font.
+        /// </summary>
+        // #define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5)
+        // #define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24)
+        public static readonly IntPtr GLUT_BITMAP_TIMES_ROMAN_24;
+        #endregion IntPtr GLUT_BITMAP_TIMES_ROMAN_24
+
+        #region IntPtr GLUT_BITMAP_HELVETICA_10
+        /// <summary>
+        ///     A 10-point proportional spaced Helvetica font.
+        /// </summary>
+        // #define GLUT_BITMAP_HELVETICA_10 ((void*)6)
+        // #define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10)
+        public static readonly IntPtr GLUT_BITMAP_HELVETICA_10;
+        #endregion IntPtr GLUT_BITMAP_HELVETICA_10
+
+        #region IntPtr GLUT_BITMAP_HELVETICA_12
+        /// <summary>
+        ///     A 12-point proportional spaced Helvetica font.
+        /// </summary>
+        // #define GLUT_BITMAP_HELVETICA_12 ((void*)7)
+        // #define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12)
+        public static readonly IntPtr GLUT_BITMAP_HELVETICA_12;
+        #endregion IntPtr GLUT_BITMAP_HELVETICA_12
+
+        #region IntPtr GLUT_BITMAP_HELVETICA_18
+        /// <summary>
+        ///     A 18-point proportional spaced Helvetica font.
+        /// </summary>
+        // #define GLUT_BITMAP_HELVETICA_18 ((void*)8)
+        // #define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18)
+        public static readonly IntPtr GLUT_BITMAP_HELVETICA_18;
+        #endregion IntPtr GLUT_BITMAP_HELVETICA_18
+        #endregion Fonts
+        #endregion Public Static Readonly Fields
+
+        #region Private Fields
+        // These fields hold references to any callbacks used so as to prevent the garbage
+        // collector from sweeping the delegates even though the application may not be done
+        // with them.
+        private static ButtonBoxCallback buttonBoxCallback;
+        private static CreateMenuCallback createMenuCallback;
+        private static DialsCallback dialsCallback;
+        private static DisplayCallback displayCallback;
+        private static EntryCallback entryCallback;
+        private static IdleCallback idleCallback;
+        private static JoystickCallback joystickCallback;
+        private static KeyboardCallback keyboardCallback;
+        private static KeyboardUpCallback keyboardUpCallback;
+        private static MenuStateCallback menuStateCallback;
+        private static MenuStatusCallback menuStatusCallback;
+        private static MotionCallback motionCallback;
+        private static MouseCallback mouseCallback;
+        private static OverlayDisplayCallback overlayDisplayCallback;
+        private static PassiveMotionCallback passiveMotionCallback;
+        private static ReshapeCallback reshapeCallback;
+        private static SpaceballButtonCallback spaceballButtonCallback;
+        private static SpaceballMotionCallback spaceballMotionCallback;
+        private static SpaceballRotateCallback spaceballRotateCallback;
+        private static SpecialCallback specialCallback;
+        private static SpecialUpCallback specialUpCallback;
+        private static TabletButtonCallback tabletButtonCallback;
+        private static TabletMotionCallback tabletMotionCallback;
+        private static TimerCallback timerCallback;
+        private static WindowStatusCallback windowStatusCallback;
+        private static VisibilityCallback visibilityCallback;
+
+        // --- FreeGLUT Additions ---
+        private static MouseWheelCallback mouseWheelCallback;
+        private static CloseCallback closeCallback;
+        private static WindowCloseCallback windowCloseCallback;
+        private static MenuDestroyCallback menuDestroyCallback;
+        #endregion Private Fields
+
+        // --- Constructors & Destructors ---
+        #region Static Glut()
+        /// <summary>
+        ///     Static Glut constructor.
+        /// </summary>
+        /// <remarks>
+        ///     Sets up GLUT font addresses.
+        /// </remarks>
+        static Glut() {
+            // TODO: Look into how to implement the broken font shit on Unix.
+            // GLUT fonts on non-Windows platforms is broken, probably need to implement the
+            // appropriate byte arrays specifiying the font layout...  Ugh.
+            unsafe {
+                GLUT_STROKE_ROMAN = new IntPtr((void*) 0);
+                GLUT_STROKE_MONO_ROMAN = new IntPtr((void*) 1);
+                GLUT_BITMAP_9_BY_15 = new IntPtr((void*) 2);
+                GLUT_BITMAP_8_BY_13 = new IntPtr((void*) 3);
+                GLUT_BITMAP_TIMES_ROMAN_10 = new IntPtr((void*) 4);
+                GLUT_BITMAP_TIMES_ROMAN_24 = new IntPtr((void*) 5);
+                GLUT_BITMAP_HELVETICA_10 = new IntPtr((void*) 6);
+                GLUT_BITMAP_HELVETICA_12 = new IntPtr((void*) 7);
+                GLUT_BITMAP_HELVETICA_18 = new IntPtr((void*) 8);
+            }
+//            GLUT_STROKE_ROMAN = glutStrokeRoman();
+//            GLUT_STROKE_MONO_ROMAN = glutStrokeMonoRoman();
+//            GLUT_BITMAP_9_BY_15 = glutBitmap9By15();
+//            GLUT_BITMAP_8_BY_13 = glutBitmap8By13();
+//            GLUT_BITMAP_TIMES_ROMAN_10 = glutBitmapTimesRoman10();
+//            GLUT_BITMAP_TIMES_ROMAN_24 = glutBitmapTimesRoman24();
+//            GLUT_BITMAP_HELVETICA_10 = glutBitmapHelvetica10();
+//            GLUT_BITMAP_HELVETICA_12 = glutBitmapHelvetica12();
+//            GLUT_BITMAP_HELVETICA_18 = glutBitmapHelvetica18();
+        }
+        #endregion Static Glut()
+
+        // --- Public Delegates ---
+        #region Callbacks
+        #region ButtonBoxCallback(int button, int state)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutButtonBoxFunc" />.
+        /// </summary>
+        /// <seealso cref="glutButtonBoxFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void ButtonBoxCallback(int button, int state);
+        #endregion ButtonBoxCallback(int button, int state)
+
+        #region CreateMenuCallback(int val)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutCreateMenu" />.
+        /// </summary>
+        /// <seealso cref="glutCreateMenu" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void CreateMenuCallback(int val);
+        #endregion CreateMenuCallback(int val)
+
+        #region DialsCallback(int dial, int val)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutDialsFunc" />.
+        /// </summary>
+        /// <seealso cref="glutDialsFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void DialsCallback(int dial, int val);
+        #endregion DialsCallback(int dial, int val)
+
+        #region DisplayCallback()
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutDisplayFunc" />.
+        /// </summary>
+        /// <seealso cref="glutDisplayFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void DisplayCallback();
+        #endregion DisplayCallback()
+
+        #region EntryCallback(int state)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutEntryFunc" />.
+        /// </summary>
+        /// <seealso cref="glutEntryFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void EntryCallback(int state);
+        #endregion EntryCallback(int state)
+
+        #region IdleCallback()
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutIdleFunc" />.
+        /// </summary>
+        /// <seealso cref="glutIdleFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void IdleCallback();
+        #endregion IdleCallback()
+
+        #region JoystickCallback(int buttonMask, int x, int y, int z)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutJoystickFunc" />.
+        /// </summary>
+        /// <seealso cref="glutJoystickFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void JoystickCallback(int buttonMask, int x, int y, int z);
+        #endregion JoystickCallback(int buttonMask, int x, int y, int z)
+
+        #region KeyboardCallback(byte key, int x, int y)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutKeyboardFunc" />.
+        /// </summary>
+        /// <seealso cref="glutKeyboardFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void KeyboardCallback(byte key, int x, int y);
+        #endregion KeyboardCallback(byte key, int x, int y)
+
+        #region KeyboardUpCallback(byte key, int x, int y)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutKeyboardUpFunc" />.
+        /// </summary>
+        /// <seealso cref="glutKeyboardUpFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void KeyboardUpCallback(byte key, int x, int y);
+        #endregion KeyboardUpCallback(byte key, int x, int y)
+
+        #region MenuStateCallback(int state)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutMenuStateFunc" />.
+        /// </summary>
+        /// <seealso cref="glutMenuStateFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void MenuStateCallback(int state);
+        #endregion MenuStateCallback(int state)
+
+        #region MenuStatusCallback(int status, int x, int y)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutMenuStatusFunc" />.
+        /// </summary>
+        /// <seealso cref="glutMenuStatusFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void MenuStatusCallback(int status, int x, int y);
+        #endregion MenuStatusCallback(int status, int x, int y)
+
+        #region MotionCallback(int x, int y)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutMotionFunc" />.
+        /// </summary>
+        /// <seealso cref="glutMotionFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void MotionCallback(int x, int y);
+        #endregion MotionCallback(int x, int y)
+
+        #region MouseCallback(int button, int state, int x, int y)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutMouseFunc" />.
+        /// </summary>
+        /// <seealso cref="glutMouseFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void MouseCallback(int button, int state, int x, int y);
+        #endregion MouseCallback(int button, int state, int x, int y)
+
+        #region OverlayDisplayCallback()
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutOverlayDisplayFunc" />.
+        /// </summary>
+        /// <seealso cref="glutOverlayDisplayFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void OverlayDisplayCallback();
+        #endregion OverlayDisplayCallback()
+
+        #region PassiveMotionCallback(int x, int y)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutPassiveMotionFunc" />.
+        /// </summary>
+        /// <seealso cref="glutPassiveMotionFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void PassiveMotionCallback(int x, int y);
+        #endregion PassiveMotionCallback(int x, int y)
+
+        #region ReshapeCallback(int width, int height)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutReshapeFunc" />.
+        /// </summary>
+        /// <seealso cref="glutReshapeFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void ReshapeCallback(int width, int height);
+        #endregion ReshapeCallback(int width, int height)
+
+        #region SpaceballButtonCallback(int button, int state)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutSpaceballButtonFunc" />.
+        /// </summary>
+        /// <seealso cref="glutSpaceballButtonFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void SpaceballButtonCallback(int button, int state);
+        #endregion SpaceballButtonCallback(int button, int state)
+
+        #region SpaceballMotionCallback(int x, int y, int z)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutSpaceballMotionFunc" />.
+        /// </summary>
+        /// <seealso cref="glutSpaceballMotionFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void SpaceballMotionCallback(int x, int y, int z);
+        #endregion SpaceballMotionCallback(int x, int y, int z)
+
+        #region SpaceballRotateCallback(int x, int y, int z)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutSpaceballRotateFunc" />.
+        /// </summary>
+        /// <seealso cref="glutSpaceballRotateFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void SpaceballRotateCallback(int x, int y, int z);
+        #endregion SpaceballRotateCallback(int x, int y, int z)
+
+        #region SpecialCallback(int key, int x, int y)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutSpecialFunc" />.
+        /// </summary>
+        /// <seealso cref="glutSpecialFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void SpecialCallback(int key, int x, int y);
+        #endregion SpecialCallback(int key, int x, int y)
+
+        #region SpecialUpCallback(int key, int x, int y)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutSpecialUpFunc" />.
+        /// </summary>
+        /// <seealso cref="glutSpecialUpFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void SpecialUpCallback(int key, int x, int y);
+        #endregion SpecialUpCallback(int key, int x, int y)
+
+        #region TabletButtonCallback(int button, int state, int x, int y)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutTabletButtonFunc" />.
+        /// </summary>
+        /// <seealso cref="glutTabletButtonFunc" />
+        public delegate void TabletButtonCallback(int button, int state, int x, int y);
+        #endregion TabletButtonCallback(int button, int state, int x, int y)
+
+        #region TabletMotionCallback(int x, int y)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutTabletMotionFunc" />.
+        /// </summary>
+        /// <seealso cref="glutTabletMotionFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void TabletMotionCallback(int x, int y);
+        #endregion TabletMotionCallback(int x, int y)
+
+        #region TimerCallback(int val)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutTimerFunc" />.
+        /// </summary>
+        /// <seealso cref="glutTimerFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void TimerCallback(int val);
+        #endregion TimerCallback(int val)
+
+        #region WindowStatusCallback(int state)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutWindowStatusFunc" />.
+        /// </summary>
+        /// <seealso cref="glutWindowStatusFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void WindowStatusCallback(int state);
+        #endregion WindowStatusCallback(int state)
+
+        #region VisibilityCallback(int state)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="glutVisibilityFunc" />.
+        /// </summary>
+        /// <seealso cref="glutVisibilityFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void VisibilityCallback(int state);
+        #endregion VisibilityCallback(int state)
+
+        // --- FreeGLUT Additions ---
+        #region MouseWheelCallback(int wheel, int direction, int x, int y)
+        /// <summary>
+        ///     Callback (delegate for use with <see cref="glutMouseWheelFunc" />.
+        /// </summary>
+        /// <param name="wheel">
+        ///     Wheel number.
+        /// </param>
+        /// <param name="direction">
+        ///     Direction, +/- 1.
+        /// </param>
+        /// <param name="x">
+        ///     Pointer X coordinate.
+        /// </param>
+        /// <param name="y">
+        ///     Pointer Y coordinate.
+        /// </param>
+        /// <remarks>
+        ///     This may not work reliably on X Windows.
+        /// </remarks>
+        /// <seealso cref="glutMouseWheelFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void MouseWheelCallback(int wheel, int direction, int x, int y);
+        #endregion MouseWheelCallback(int wheel, int direction, int x, int y)
+
+        #region CloseCallback()
+        /// <summary>
+        ///     Callback (delegate for use with <see cref="glutCloseFunc" />.
+        /// </summary>
+        /// <seealso cref="glutCloseFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void CloseCallback();
+        #endregion CloseCallback()
+
+        #region WindowCloseCallback()
+        /// <summary>
+        ///     Callback (delegate for use with <see cref="glutWMCloseFunc" />.
+        /// </summary>
+        /// <seealso cref="glutWMCloseFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void WindowCloseCallback();
+        #endregion WindowCloseCallback()
+
+        #region MenuDestroyCallback()
+        /// <summary>
+        ///     Callback (delegate for use with <see cref="glutMenuDestroyFunc" />.
+        /// </summary>
+        /// <seealso cref="glutMenuDestroyFunc" />
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void MenuDestroyCallback();
+        #endregion MenuDestroyCallback()
+        #endregion Callbacks
+
+        // --- Private Methods ---
+        #region Commented-Out LINUX Font Methods
+        // TODO: WTF mate...
+//        #region IntPtr glutStrokeRoman()
+//        /// <summary>
+//        ///     Use <see cref="GLUT_STROKE_ROMAN" /> instead.
+//        /// </summary>
+//        /// <returns>
+//        ///     Pointer to font.
+//        /// </returns>
+//        // GLUTAPI void *glutStrokeRoman;
+//        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+//        private static extern IntPtr glutStrokeRoman();
+//        #endregion IntPtr glutStrokeRoman()
+//
+//        #region IntPtr glutStrokeMonoRoman()
+//        /// <summary>
+//        ///     Use <see cref="GLUT_STROKE_MONO_ROMAN" /> instead.
+//        /// </summary>
+//        /// <returns>
+//        ///     Pointer to font.
+//        /// </returns>
+//        // GLUTAPI void *glutStrokeMonoRoman;
+//        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+//        private static extern IntPtr glutStrokeMonoRoman();
+//        #endregion IntPtr glutStrokeMonoRoman()
+//
+//        #region IntPtr glutBitmap9By15()
+//        /// <summary>
+//        ///     Use <see cref="GLUT_BITMAP_9_BY_15" /> instead.
+//        /// </summary>
+//        /// <returns>
+//        ///     Pointer to font.
+//        /// </returns>
+//        // GLUTAPI void *glutBitmap9By15;
+//        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+//        private static extern IntPtr glutBitmap9By15();
+//        #endregion IntPtr glutBitmap9By15()
+//
+//        #region IntPtr glutBitmap8By13()
+//        /// <summary>
+//        ///     Use <see cref="GLUT_BITMAP_8_BY_13" /> instead.
+//        /// </summary>
+//        /// <returns>
+//        ///     Pointer to font.
+//        /// </returns>
+//        // GLUTAPI void *glutBitmap8By13;
+//        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+//        private static extern IntPtr glutBitmap8By13();
+//        #endregion IntPtr glutBitmap8By13()
+//
+//        #region IntPtr glutBitmapTimesRoman10()
+//        /// <summary>
+//        ///     Use <see cref="GLUT_BITMAP_TIMES_ROMAN_10" /> instead.
+//        /// </summary>
+//        /// <returns>
+//        ///     Pointer to font.
+//        /// </returns>
+//        // GLUTAPI void *glutBitmapTimesRoman10;
+//        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+//        private static extern IntPtr glutBitmapTimesRoman10();
+//        #endregion IntPtr glutBitmapTimesRoman10()
+//
+//        #region IntPtr glutBitmapTimesRoman24()
+//        /// <summary>
+//        ///     Use <see cref="GLUT_BITMAP_TIMES_ROMAN_24" /> instead.
+//        /// </summary>
+//        /// <returns>
+//        ///     Pointer to font.
+//        /// </returns>
+//        // GLUTAPI void *glutBitmapTimesRoman24;
+//        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+//        private static extern IntPtr glutBitmapTimesRoman24();
+//        #endregion IntPtr glutBitmapTimesRoman24()
+//
+//        #region IntPtr glutBitmapHelvetica10()
+//        /// <summary>
+//        ///     Use <see cref="GLUT_BITMAP_HELVETICA_10" /> instead.
+//        /// </summary>
+//        /// <returns>
+//        ///     Pointer to font.
+//        /// </returns>
+//        // GLUTAPI void *glutBitmapHelvetica10;
+//        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+//        private static extern IntPtr glutBitmapHelvetica10();
+//        #endregion IntPtr glutBitmapHelvetica10()
+//
+//        #region IntPtr glutBitmapHelvetica12()
+//        /// <summary>
+//        ///     Use <see cref="GLUT_BITMAP_HELVETICA_12" /> instead.
+//        /// </summary>
+//        /// <returns>
+//        ///     Pointer to font.
+//        /// </returns>
+//        // GLUTAPI void *glutBitmapHelvetica12;
+//        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+//        private static extern IntPtr glutBitmapHelvetica12();
+//        #endregion IntPtr glutBitmapHelvetica12()
+//
+//        #region IntPtr glutBitmapHelvetica18()
+//        /// <summary>
+//        ///     Use <see cref="GLUT_BITMAP_HELVETICA_18" /> instead.
+//        /// </summary>
+//        /// <returns>
+//        ///     Pointer to font.
+//        /// </returns>
+//        // GLUTAPI void *glutBitmapHelvetica18;
+//        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+//        private static extern IntPtr glutBitmapHelvetica18();
+//        #endregion IntPtr glutBitmapHelvetica18()
+        #endregion Commented-Out LINUX Font Methods
+
+        // --- Private Externs ---
+        #region Internal Callback Sub-API
+        #region int __glutCreateMenu([In] CreateMenuCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutCreateMenu" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "glutCreateMenu"), SuppressUnmanagedCodeSecurity]
+        private static extern int __glutCreateMenu([In] CreateMenuCallback func);
+        #endregion int __glutCreateMenu([In] CreateMenuCallback func)
+
+        #region __glutDisplayFunc(DisplayCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutDisplayFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutDisplayFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutDisplayFunc(DisplayCallback func);
+        #endregion __glutDisplayFunc(DisplayCallback func)
+
+        #region __glutReshapeFunc(ReshapeCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutReshapeFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutReshapeFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutReshapeFunc(ReshapeCallback func);
+        #endregion __glutReshapeFunc(ReshapeCallback func)
+
+        #region __glutKeyboardFunc(KeyboardCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutKeyboardFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutKeyboardFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutKeyboardFunc(KeyboardCallback func);
+        #endregion __glutKeyboardFunc(KeyboardCallback func)
+
+        #region __glutMouseFunc(MouseCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutMouseFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutMouseFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutMouseFunc(MouseCallback func);
+        #endregion __glutMouseFunc(MouseCallback func)
+
+        #region __glutMotionFunc(MotionCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutMotionFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutMotionFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutMotionFunc(MotionCallback func);
+        #endregion __glutMotionFunc(MotionCallback func)
+
+        #region __glutPassiveMotionFunc(PassiveMotionCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutPassiveMotionFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutPassiveMotionFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutPassiveMotionFunc(PassiveMotionCallback func);
+        #endregion __glutPassiveMotionFunc(PassiveMotionCallback func)
+
+        #region __glutEntryFunc(EntryCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutEntryFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutEntryFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutEntryFunc(EntryCallback func);
+        #endregion __glutEntryFunc(EntryCallback func)
+
+        #region __glutVisibilityFunc(VisibilityCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutVisibilityFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutVisibilityFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutVisibilityFunc(VisibilityCallback func);
+        #endregion __glutVisibilityFunc(VisibilityCallback func)
+
+        #region __glutIdleFunc(IdleCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutIdleFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutIdleFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutIdleFunc(IdleCallback func);
+        #endregion __glutIdleFunc(IdleCallback func)
+
+        #region __glutTimerFunc(int msecs, TimerCallback func, int val)
+        /// <summary>
+        ///     Called from <see cref="glutTimerFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutTimerFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutTimerFunc(int msecs, TimerCallback func, int val);
+        #endregion __glutTimerFunc(int msecs, TimerCallback func, int val)
+
+        #region __glutMenuStateFunc(MenuStateCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutMenuStateFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutMenuStateFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutMenuStateFunc(MenuStateCallback func);
+        #endregion __glutMenuStateFunc(MenuStateCallback func)
+
+        #region __glutSpecialFunc(SpecialCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutSpecialFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutSpecialFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutSpecialFunc(SpecialCallback func);
+        #endregion __glutSpecialFunc(SpecialCallback func)
+
+        #region __glutSpaceballMotionFunc(SpaceballMotionCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutSpaceballMotionFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutSpaceballMotionFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutSpaceballMotionFunc(SpaceballMotionCallback func);
+        #endregion __glutSpaceballMotionFunc(SpaceballMotionCallback func)
+
+        #region __glutSpaceballRotateFunc(SpaceballRotateCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutSpaceballRotateFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutSpaceballRotateFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutSpaceballRotateFunc(SpaceballRotateCallback func);
+        #endregion __glutSpaceballRotateFunc(SpaceballRotateCallback func)
+
+        #region __glutSpaceballButtonFunc(SpaceballButtonCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutSpaceballButtonFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutSpaceballButtonFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutSpaceballButtonFunc(SpaceballButtonCallback func);
+        #endregion __glutSpaceballButtonFunc(SpaceballButtonCallback func)
+
+        #region __glutButtonBoxFunc(ButtonBoxCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutButtonBoxFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutButtonBoxFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutButtonBoxFunc(ButtonBoxCallback func);
+        #endregion __glutButtonBoxFunc(ButtonBoxCallback func)
+
+        #region __glutDialsFunc(DialsCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutDialsFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutDialsFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutDialsFunc(DialsCallback func);
+        #endregion __glutDialsFunc(DialsCallback func)
+
+        #region __glutTabletMotionFunc(TabletMotionCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutTabletMotionFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutTabletMotionFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutTabletMotionFunc(TabletMotionCallback func);
+        #endregion __glutTabletMotionFunc(TabletMotionCallback func)
+
+        #region __glutTabletButtonFunc(TabletButtonCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutTabletButtonFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutTabletButtonFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutTabletButtonFunc(TabletButtonCallback func);
+        #endregion __glutTabletButtonFunc(TabletButtonCallback func)
+
+        #region __glutMenuStatusFunc(MenuStatusCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutMenuStatusFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutMenuStatusFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutMenuStatusFunc(MenuStatusCallback func);
+        #endregion __glutMenuStatusFunc(MenuStatusCallback func)
+
+        #region __glutOverlayDisplayFunc(OverlayDisplayCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutOverlayDisplayFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutOverlayDisplayFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutOverlayDisplayFunc(OverlayDisplayCallback func);
+        #endregion __glutOverlayDisplayFunc(OverlayDisplayCallback func)
+
+        #region __glutWindowStatusFunc(WindowStatusCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutWindowStatusFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutWindowStatusFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutWindowStatusFunc(WindowStatusCallback func);
+        #endregion __glutWindowStatusFunc(WindowStatusCallback func)
+
+        #region __glutKeyboardUpFunc(KeyboardUpCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutKeyboardUpFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutKeyboardUpFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutKeyboardUpFunc(KeyboardUpCallback func);
+        #endregion __glutKeyboardUpFunc(KeyboardUpCallback func)
+
+        #region __glutSpecialUpFunc(SpecialUpCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutSpecialUpFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutSpecialUpFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutSpecialUpFunc(SpecialUpCallback func);
+        #endregion __glutSpecialUpFunc(SpecialUpCallback func)
+
+        #region __glutJoystickFunc(JoystickCallback func, int pollInterval)
+        /// <summary>
+        ///     Called from <see cref="glutJoystickFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutJoystickFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutJoystickFunc(JoystickCallback func, int pollInterval);
+        #endregion __glutJoystickFunc(JoystickCallback func, int pollInterval)
+
+        // --- FreeGLUT Additions ---
+        #region __glutMouseWheelFunc(MouseWheelCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutMouseWheelFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions and it's called
+        ///     from a non-standard method!</b>
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutMouseWheelFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutMouseWheelFunc(MouseWheelCallback func);
+        #endregion __glutMouseWheelFunc(MouseWheelCallback func)
+
+        #region __glutCloseFunc(CloseCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutCloseFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions and it's called
+        ///     from a non-standard method!</b>
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutCloseFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutCloseFunc(CloseCallback func);
+        #endregion __glutCloseFunc(CloseCallback func)
+
+        #region __glutWMCloseFunc(WindowCloseCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutWMCloseFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions and it's called
+        ///     from a non-standard method!</b>
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutWMCloseFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutWMCloseFunc(WindowCloseCallback func);
+        #endregion __glutWMCloseFunc(WindowCloseCallback func)
+
+        #region __glutMenuDestroyFunc(MenuDestroyCallback func)
+        /// <summary>
+        ///     Called from <see cref="glutMenuDestroyFunc" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions and it's called
+        ///     from a non-standard method!</b>
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="glutMenuDestroyFunc"), SuppressUnmanagedCodeSecurity]
+        private static extern void __glutMenuDestroyFunc(MenuDestroyCallback func);
+        #endregion __glutMenuDestroyFunc(MenuDestroyCallback func)
+        #endregion Internal Callback Sub-API
+
+        // --- Public Externs ---
+        #region Initialization Sub-API
+        #region glutInit()
+        /// <summary>
+        ///     Initializes the GLUT library.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         This is a non-standard version of <b>glutInit</b> that passes the appropriate
+        ///         commandline arguments automatically.
+        ///     </para>
+        ///     <para>
+        ///         <b>glutInit</b> will initialize the GLUT library and negotiate a session with
+        ///         the window system.  During this process, <b>glutInit</b> may cause the
+        ///         termination of the GLUT program with an error message to the user if GLUT
+        ///         cannot be properly initialized.  Examples of this situation include the
+        ///         failure to connect to the window system, the lack of window system support for
+        ///         OpenGL, and invalid command line options.
+        ///     </para>
+        ///     <para>
+        ///         <b>glutInit</b> also processes command line options, but the specific options
+        ///         parsed are window system dependent.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The X Window System specific options parsed by <b>glutInit</b> are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>-display DISPLAY</term>
+        ///                 <description>
+        ///                     Specify the X server to connect to.  If not specified, the value
+        ///                     of the DISPLAY environment variable is used.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-geometry WxH+X+Y</term>
+        ///                 <description>
+        ///                     Determines where window's should be created on the screen.  The
+        ///                     parameter following -geometry should be formatted as a standard X
+        ///                     geometry specification.  The effect of using this option is to
+        ///                     change the GLUT initial size and initial position the same as if
+        ///                     <see cref="glutInitWindowSize" /> or
+        ///                     <see cref="glutInitWindowPosition" /> were called directly.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-iconic</term>
+        ///                 <description>
+        ///                     Requests all top-level windows be created in an iconic state.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-indirect</term>
+        ///                 <description>
+        ///                     Force the use of indirect OpenGL rendering contexts.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-direct</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Force the use of direct OpenGL rendering contexts (not all GLX
+        ///                         implementations support direct rendering contexts).  A fatal
+        ///                         error is generated if direct rendering is not supported by the
+        ///                         OpenGL implementation.
+        ///                     </para>
+        ///                     <para>
+        ///                         If neither -indirect or -direct are used to force a particular
+        ///                         behavior, GLUT will attempt to use direct rendering if
+        ///                         possible and otherwise fallback to indirect rendering.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-gldebug</term>
+        ///                 <description>
+        ///                     After processing callbacks and/or events, check if there are any
+        ///                     OpenGL errors by calling <see cref="Gl.glGetError" />.  If an
+        ///                     error is reported, print out a warning by looking up the error
+        ///                     code with /*see cref="Glu.gluErrorString" />*/.  Using this option is
+        ///                     helpful in detecting OpenGL run-time errors.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-sync</term>
+        ///                 <description>
+        ///                     Enable synchronous X protocol transactions.  This option makes it
+        ///                     easier to track down potential X protocol errors.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutInitWindowPosition" />
+        /// <seealso cref="glutInitWindowSize" />
+        /// <seealso cref="glutMainLoop" />
+        public static void glutInit() {
+            string[] argsArray = Environment.GetCommandLineArgs();
+            StringBuilder[] args = new StringBuilder[argsArray.Length];
+            int argsLength = args.Length;
+
+            for(int i = 0; i < argsArray.Length; i++) {
+                args[i] = new StringBuilder(argsArray[i], argsArray[i].Length);
+            }
+
+            glutInit(ref argsLength, args);
+        }
+        #endregion glutInit()
+
+        #region glutInit(ref int argcp, [In, Out] StringBuilder[] argv)
+        /// <summary>
+        ///     Initializes the GLUT library.
+        /// </summary>
+        /// <param name="argcp">
+        ///     A pointer to the program�s unmodified argc variable from main.  Upon return,
+        ///     the value pointed to by <i>argcp</i> will be updated, because <b>glutInit</b>
+        ///     extracts any command line options intended for the GLUT library.
+        /// </param>
+        /// <param name="argv">
+        ///     The program�s unmodified <i>argv</i> variable from main.  Like <i>argcp</i>,
+        ///     the data for <i>argv</i> will be updated because <b>glutInit</b> extracts any
+        ///     command line options understood by the GLUT library.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutInit</b> will initialize the GLUT library and negotiate a session with
+        ///         the window system.  During this process, <b>glutInit</b> may cause the
+        ///         termination of the GLUT program with an error message to the user if GLUT
+        ///         cannot be properly initialized.  Examples of this situation include the
+        ///         failure to connect to the window system, the lack of window system support for
+        ///         OpenGL, and invalid command line options.
+        ///     </para>
+        ///     <para>
+        ///         <b>glutInit</b> also processes command line options, but the specific options
+        ///         parsed are window system dependent.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The X Window System specific options parsed by <b>glutInit</b> are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>-display DISPLAY</term>
+        ///                 <description>
+        ///                     Specify the X server to connect to.  If not specified, the value
+        ///                     of the DISPLAY environment variable is used.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-geometry WxH+X+Y</term>
+        ///                 <description>
+        ///                     Determines where window's should be created on the screen.  The
+        ///                     parameter following -geometry should be formatted as a standard X
+        ///                     geometry specification.  The effect of using this option is to
+        ///                     change the GLUT initial size and initial position the same as if
+        ///                     <see cref="glutInitWindowSize" /> or
+        ///                     <see cref="glutInitWindowPosition" /> were called directly.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-iconic</term>
+        ///                 <description>
+        ///                     Requests all top-level windows be created in an iconic state.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-indirect</term>
+        ///                 <description>
+        ///                     Force the use of indirect OpenGL rendering contexts.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-direct</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Force the use of direct OpenGL rendering contexts (not all GLX
+        ///                         implementations support direct rendering contexts).  A fatal
+        ///                         error is generated if direct rendering is not supported by the
+        ///                         OpenGL implementation.
+        ///                     </para>
+        ///                     <para>
+        ///                         If neither -indirect or -direct are used to force a particular
+        ///                         behavior, GLUT will attempt to use direct rendering if
+        ///                         possible and otherwise fallback to indirect rendering.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-gldebug</term>
+        ///                 <description>
+        ///                     After processing callbacks and/or events, check if there are any
+        ///                     OpenGL errors by calling <see cref="Gl.glGetError" />.  If an
+        ///                     error is reported, print out a warning by looking up the error
+        ///                     code with /*see cref="Glu.gluErrorString" />*/.  Using this option is
+        ///                     helpful in detecting OpenGL run-time errors.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>-sync</term>
+        ///                 <description>
+        ///                     Enable synchronous X protocol transactions.  This option makes it
+        ///                     easier to track down potential X protocol errors.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutInitWindowPosition" />
+        /// <seealso cref="glutInitWindowSize" />
+        /// <seealso cref="glutMainLoop" />
+        // GLUTAPI void APIENTRY glutInit(int *argcp, char **argv);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutInit(ref int argcp, StringBuilder[] argv);
+        #endregion glutInit(ref int argcp, [In, Out] StringBuilder[] argv)
+
+        #region glutInitDisplayMode(int mode)
+        /// <summary>
+        ///     Sets the initial display mode.
+        /// </summary>
+        /// <param name="mode">
+        ///     <para>
+        ///         Display mode, normally the bitwise OR-ing of GLUT display mode bit masks.  See
+        ///         values below:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_RGBA" /></term>
+        ///                 <description>
+        ///                     Bit mask to select an RGBA mode window.  This is the default if
+        ///                     neither <see cref="GLUT_RGBA" /> nor <see cref="GLUT_INDEX" />
+        ///                     are specified.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_RGB" /></term>
+        ///                 <description>An alias for <see cref="GLUT_RGBA" />.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_INDEX" /></term>
+        ///                 <description>
+        ///                     Bit mask to select a color index mode window.  This overrides
+        ///                     <see cref="GLUT_RGBA" /> if it is also specified.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_SINGLE" /></term>
+        ///                 <description>
+        ///                     Bit mask to select a single buffered window.  This is the default
+        ///                     if neither <see cref="GLUT_DOUBLE" /> or
+        ///                     <see cref="GLUT_SINGLE" /> are specified.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_DOUBLE" /></term>
+        ///                 <description>
+        ///                     Bit mask to select a double buffered window.  This overrides
+        ///                     <see cref="GLUT_SINGLE" /> if it is also specified.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_ACCUM" /></term>
+        ///                 <description>
+        ///                     Bit mask to select a window with an accumulation buffer.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_ALPHA" /></term>
+        ///                 <description>
+        ///                     Bit mask to select a window with an alpha component to the color
+        ///                     buffer(s).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_DEPTH" /></term>
+        ///                 <description>
+        ///                     Bit mask to select a window with a depth buffer.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_STENCIL" /></term>
+        ///                 <description>
+        ///                     Bit mask to select a window with a stencil buffer.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_MULTISAMPLE" /></term>
+        ///                 <description>
+        ///                     Bit mask to select a window with multisampling support.  If
+        ///                     multisampling is not available, a non-multisampling window will
+        ///                     automatically be chosen.  Note: both the OpenGL client-side and
+        ///                     server-side implementations must support the GLX_SAMPLE_SGIS
+        ///                     extension for multisampling to be available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_STEREO" /></term>
+        ///                 <description>
+        ///                     Bit mask to select a stereo window.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_LUMINANCE" /></term>
+        ///                 <description>
+        ///                     Bit mask to select a window with a "luminance" color model.  This
+        ///                     model provides the functionality of OpenGL's RGBA color model, but
+        ///                     the green and blue components are not maintained in the frame
+        ///                     buffer.  Instead each pixel's red component is converted to an
+        ///                     index between zero and
+        ///                     <c>Glut.glutGet(Glut.GLUT_WINDOW_COLORMAP_SIZE) - 1</c> and looked
+        ///                     up in a per-window color map to determine the color of pixels
+        ///                     within the window.  The initial colormap of
+        ///                     <see cref="GLUT_LUMINANCE" /> windows is initialized to be a
+        ///                     linear gray ramp, but can be modified with GLUT's colormap
+        ///                     routines.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         The initial display mode is used when creating top-level windows, subwindows,
+        ///         and overlays to determine the OpenGL display mode for the to-be-created
+        ///         window or overlay.
+        ///     </para>
+        ///     <para>
+        ///         Note that <see cref="GLUT_RGBA" /> selects the RGBA color model, but it does
+        ///         not request any bits of alpha (sometimes called an alpha buffer or destination
+        ///         alpha) be allocated.  To request alpha, specify <see cref="GLUT_ALPHA" />.
+        ///         The same applies to <see cref="GLUT_LUMINANCE" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTE</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLUT_LUMINANCE" /> is not supported on most OpenGL platforms.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutInit()" />
+        /// <seealso cref="glutInitDisplayString" />
+        // GLUTAPI void APIENTRY glutInitDisplayMode(unsigned int mode);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutInitDisplayMode(int mode);
+        #endregion glutInitDisplayMode(int mode)
+
+        #region glutInitDisplayString(string str)
+        /// <summary>
+        ///     Sets the initial display mode via a string.
+        /// </summary>
+        /// <param name="str">
+        ///     Display mode description string, see below.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         The initial display mode description string is used when creating
+        ///         top-level windows, subwindows, and overlays to determine the OpenGL display
+        ///         mode for the to-be-created window or overlay.
+        ///     </para>
+        ///     <para>
+        ///         The string is a list of zero or more capability descriptions separated by
+        ///         spaces and tabs.  Each capability description is a capability name that is
+        ///         optionally followed by a comparator and a numeric value.  For example,
+        ///         "double" and "depth>=12" are both valid criteria.
+        ///     </para>
+        ///     <para>
+        ///         The capability descriptions are translated into a set of criteria used to
+        ///         select the appropriate frame buffer configuration.
+        ///     </para>
+        ///     <para>
+        ///         The criteria are matched in strict left to right order of precdence.  That is,
+        ///         the first specified criteria (leftmost) takes precedence over the later
+        ///         criteria for non-exact criteria (greater than, less than, etc. comparators).
+        ///         Exact criteria (equal, not equal compartors) must match exactly so precedence
+        ///         is not relevant.
+        ///     </para>
+        ///     <para>
+        ///         The numeric value is an integer that is parsed according to ANSI C's
+        ///         <c>strtol(str, strptr, 0)</c> behavior.  This means that decimal, octal
+        ///         (leading 0), and hexidecimal values (leading 0x) are accepted.
+        ///     </para>
+        ///     <para>
+        ///         The valid compartors are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>=</term>
+        ///                 <description>Equal.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>!=</term>
+        ///                 <description>Not equal.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><</term>
+        ///                 <description>
+        ///                     Less than and preferring larger difference (the least is best).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>></term>
+        ///                 <description>
+        ///                     Greeater than and preferring larger differences (the most is
+        ///                     best).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><=</term>
+        ///                 <description>
+        ///                     Less than or equal and preferring larger difference (the least is
+        ///                     best).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>>=</term>
+        ///                 <description>
+        ///                     Greater than or equal and preferring more instead of less.  This
+        ///                     comparator is useful for allocating resources like color precsion
+        ///                     or depth buffer precision where the maximum precison is
+        ///                     generally preferred.  Contrast with the tilde (~) comprator.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>~</term>
+        ///                 <description>
+        ///                     Greater than or equal but preferring less instead of more.  This
+        ///                     compartor is useful for allocating resources such as stencil bits
+        ///                     or auxillary color buffers where you would rather not over
+        ///                     allocate.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         When the compartor and numeric value are not specified, each capability name
+        ///         has a different default (one default is to require a compartor and numeric
+        ///         value).
+        ///     </para>
+        ///     <para>
+        ///         The valid capability names are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>alpha</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Alpha color buffer precision in bits.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>acca</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Red, green, blue, and alpha accumulation buffer precision in
+        ///                         bits.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1" for red, green, blue, and alpha
+        ///                         capabilities.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>acc</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Red, green, and green accumulation buffer precision in bits
+        ///                         and zero bits of alpha accumulation buffer precision.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1" for red, green, and blue capabilities,
+        ///                         and "~0" for the alpha capability.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>blue</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Blue color buffer precision in bits.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>buffer</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Number of bits in the color index color buffer.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>conformant</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         bool indicating if the frame buffer configuration is
+        ///                         conformant or not.  Conformance information is based on
+        ///                         GLX's EXT_visual_rating extension if supported.  If the
+        ///                         extension is not supported, all visuals are assumed
+        ///                         conformat.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is "=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>depth</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Number of bits of precsion in the depth buffer.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=12".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>double</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         bool indicating if the color buffer is double buffered.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is "=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>green</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Green color buffer precision in bits.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>index</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         bool if the color model is color index or not.  True is
+        ///                         color index.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>num</term>
+        ///                 <description>
+        ///                     A special capability name indicating where the value represents
+        ///                     the Nth frame buffer configuration matching the description
+        ///                     string.  When not specified, <b>glutInitDisplayString</b> also
+        ///                     returns the first (best matching) configuration.  <i>num</i>
+        ///                     requires a compartor and numeric value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>red</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Red color buffer precision in bits.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>rgba</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Number of bits of red, green, blue, and alpha in the RGBA
+        ///                         color buffer.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1" for red, green, blue, and alpha
+        ///                         capabilities, and "=1" for the RGBA color model capability.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>rgb</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Number of bits of red, green, and blue in the RGBA color
+        ///                         buffer and zero bits of alpha color buffer precision.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1" for the red, green, and blue capabilities,
+        ///                         and "~0" for alpha capability, and "=1" for the RGBA color
+        ///                         model capability.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>luminance</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Number of bits of red in the RGBA and zero bits of green, blue
+        ///                         (alpha not specified) of color buffer precision.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=1" for the red capabilities, and "=0" for the
+        ///                         green and blue capabilities, and "=1" for the RGBA color model
+        ///                         capability, and, for X11, "=1" for the StaticGray
+        ///                         ("xstaticgray") capability.
+        ///                     </para>
+        ///                     <para>
+        ///                         SGI InfiniteReality (and other future machines) support a
+        ///                         16-bit luminance (single channel) display mode (an additional
+        ///                         16-bit alpha channel can also be requested).  The red channel
+        ///                         maps to gray scale and green and blue channels are not
+        ///                         available.  A 16-bit precision luminance display mode is often
+        ///                         appropriate for medical imaging applications.  Do not expect
+        ///                         many machines to support extended precision luminance display
+        ///                         modes.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>stencil</term>
+        ///                 <description>Number of bits in the stencil buffer.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>single</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         bool indicate the color buffer is single buffered.
+        ///                     </para>
+        ///                     <para>
+        ///                         double buffer capability "=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>stereo</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         bool indicating the color buffer is supports OpenGL-style
+        ///                         stereo.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is "=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>samples</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Indicates the number of multisamples to use based on GLX's
+        ///                         SGIS_multisample extension (for antialiasing).
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is "<=4".  This default means that a GLUT
+        ///                         application can request multipsampling if available by simply
+        ///                         specifying "samples".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>slow</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         bool indicating if the frame buffer configuration is slow
+        ///                         or not.  Slowness information is based on GLX's
+        ///                         EXT_visual_rating extension if supported.  If the extension is
+        ///                         not supported, all visuals are assumed fast.  Note that
+        ///                         slowness is a relative designation relative to other frame
+        ///                         buffer configurations available.  The intent of the slow
+        ///                         capability is to help programs avoid frame buffer
+        ///                         configurations that are slower (but perhaps higher precision)
+        ///                         for the current machine.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is ">=0".  This default means that slow visuals are
+        ///                         used in preference to fast visuals, but fast visuals will
+        ///                         still be allowed.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>win32pfd</term>
+        ///                 <description>
+        ///                     Only recognized on GLUT implementations for Win32, this
+        ///                     capability name matches the Win32 Pixel Format Descriptor by
+        ///                     number.  <i>win32pfd</i> requires a compartor and numeric value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>xvisual</term>
+        ///                 <description>
+        ///                     Only recognized on GLUT implementations for the X Window System,
+        ///                     this capability name matches the X visual ID by number.
+        ///                     xvisual requires a compartor and numeric value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>xstaticgray</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Only recognized on GLUT implementations for the X Window
+        ///                         System, boolean indicating if the frame buffer configuration's
+        ///                         X visual is of type StaticGray.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is "=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>xgrayscale</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Only recognized on GLUT implementations for the X Window
+        ///                         System, boolean indicating if the frame buffer configuration's
+        ///                         X visual is of type GrayScale.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is "=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>xstaticcolor</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Only recognized on GLUT implementations for the X Window
+        ///                         System, boolean indicating if the frame buffer configuration's
+        ///                         X visual is of type StaticColor.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is "=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>xpseudocolor</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Only recognized on GLUT implementations for the X Window
+        ///                         System, boolean indicating if the frame buffer configuration's
+        ///                         X visual is of type PsuedoColor.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is "=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>xtruecolor</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Only recognized on GLUT implementations for the X Window
+        ///                         System, boolean indicating if the frame buffer configuration's
+        ///                         X visual is of type TrueColor.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is "=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>xdirectcolor</term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Only recognized on GLUT implementations for the X Window
+        ///                         System, boolean indicating if the frame buffer configuration's
+        ///                         X visual is of type DirectColor.
+        ///                     </para>
+        ///                     <para>
+        ///                         Default is "=1".
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         Unspecifed capability descriptions will result in unspecified criteria being
+        ///         generated.  These unspecified criteria help <b>glutInitDisplayString</b>
+        ///         behave sensibly with terse display mode description strings.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         Here is an example using <b>glutInitDisplayString</b>:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glut.glutInitDisplayString("stencil~2 rgb double depth>=16 samples");
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         The above call requests a window with an RGBA color model (but requesting no
+        ///         bits of alpha), a depth buffer with at least 16 bits of precsion but
+        ///         preferring more, mutlisampling if available, and at least 2 bits of stencil
+        ///         (favoring less stencil to more as long as 2 bits are available).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutInit()" />
+        /// <seealso cref="glutInitDisplayMode" />
+        // GLUTAPI void APIENTRY glutInitDisplayString(const char *string);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutInitDisplayString(string str);
+        #endregion glutInitDisplayString(string str)
+
+        #region glutInitWindowPosition(int x, int y)
+        /// <summary>
+        ///     Sets the initial window position.
+        /// </summary>
+        /// <param name="x">
+        ///     Window X location in pixels.
+        /// </param>
+        /// <param name="y">
+        ///     Window Y location in pixels.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Windows created by <see cref="glutCreateWindow" /> will be requested to be
+        ///         created with the current initial window position.  The initial value of the
+        ///         initial window position GLUT state is -1 and -1.  If either the X or Y
+        ///         component to the initial window position is negative, the actual window
+        ///         position is left to the window system to determine.
+        ///     </para>
+        ///     <para>
+        ///         The intent of the initial window position values is to provide a suggestion to
+        ///         the window system for a window�s initial position.  The window system is not
+        ///         obligated to use this information.  Therefore, GLUT programs should not assume
+        ///         the window was created at the specified position.
+        ///     </para>
+        ///     <para>
+        ///         <b>Example</b>
+        ///     </para>
+        ///     <para>
+        ///         If you would like your GLUT program to default to starting at a given screen
+        ///         location and at a given size, but you would also like to let the user override
+        ///         these default via a command line argument (such as -geometry for X11), call
+        ///         <see cref="glutInitWindowSize" /> and <see cref="glutInitWindowPosition"/>
+        ///         before your call to <see cref="glutInit()" />.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             using Tao.OpenGL;
+        /// 
+        ///             [STAThread]
+        ///             public static void Main(string[] args) {
+        ///                 Glut.glutInitWindowSize(500, 300);
+        ///                 Glut.glutInitWindowPosition(100, 100);
+        ///                 Glut.glutInit();
+        ///             }
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         However, if you'd like to force your program to start up at a given size and
+        ///         position, call <see cref="glutInitWindowSize" /> and
+        ///         <see cref="glutInitWindowPosition" /> after your call to
+        ///         <see cref="glutInit()" />. For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             using Tao.OpenGL;
+        /// 
+        ///             [STAThread]
+        ///             public static void Main(string[] args) {
+        ///                 Glut.glutInit();
+        ///                 Glut.glutInitWindowSize(500, 300);
+        ///                 Glut.glutInitWindowPosition(100, 100);
+        ///             }
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutCreateSubWindow" />
+        /// <seealso cref="glutGet" />
+        /// <seealso cref="glutInit()" />
+        /// <seealso cref="glutInitWindowSize" />
+        /// <seealso cref="glutReshapeFunc" />
+        /// <seealso cref="ReshapeCallback" />
+        // GLUTAPI void APIENTRY glutInitWindowPosition(int x, int y);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutInitWindowPosition(int x, int y);
+        #endregion glutInitWindowPosition(int x, int y)
+
+        #region glutInitWindowSize(int width, int height)
+        /// <summary>
+        ///     Sets the initial window size.
+        /// </summary>
+        /// <param name="width">
+        ///     Width in pixels.
+        /// </param>
+        /// <param name="height">
+        ///     Height in pixels.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Windows created by <see cref="glutCreateWindow" /> will be requested to be
+        ///         created with the current initial window size.  The initial value of the
+        ///         initial window size GLUT state is 300 by 300.  The initial window size
+        ///         components must be greater than zero.
+        ///     </para>
+        ///     <para>
+        ///         The intent of the initial window size values is to provide a suggestion to the
+        ///         window system for a window�s initial size.  The window system is not obligated
+        ///         to use this information.  Therefore, GLUT programs should not assume the
+        ///         window was created at the specified size.  A GLUT program should use the
+        ///         window�s reshape callback to determine the true size of the window.
+        ///     </para>
+        ///     <para>
+        ///         <b>Example</b>
+        ///     </para>
+        ///     <para>
+        ///         If you would like your GLUT program to default to starting at a given screen
+        ///         location and at a given size, but you would also like to let the user
+        ///         override these default via a command line argument (such as -geometry for
+        ///         X11), call <see cref="glutInitWindowSize" /> and
+        ///         <see cref="glutInitWindowPosition"/> before your call to
+        ///         <see cref="glutInit()" />.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             using Tao.OpenGL;
+        /// 
+        ///             [STAThread]
+        ///             public static void Main(string[] args) {
+        ///                 Glut.glutInitWindowSize(500, 300);
+        ///                 Glut.glutInitWindowPosition(100, 100);
+        ///                 Glut.glutInit();
+        ///             }
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         However, if you'd like to force your program to start up at a given size and
+        ///         position, call <see cref="glutInitWindowSize" /> and
+        ///         <see cref="glutInitWindowPosition" /> after your call to
+        ///         <see cref="glutInit()" />.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             using Tao.OpenGL;
+        /// 
+        ///             [STAThread]
+        ///             public static void Main(string[] args) {
+        ///                 Glut.glutInit();
+        ///                 Glut.glutInitWindowSize(500, 300);
+        ///                 Glut.glutInitWindowPosition(100, 100);
+        ///             }
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutCreateSubWindow" />
+        /// <seealso cref="glutGet" />
+        /// <seealso cref="glutInit()" />
+        /// <seealso cref="glutInitWindowPosition" />
+        /// <seealso cref="glutReshapeFunc" />
+        /// <seealso cref="ReshapeCallback" />
+        // GLUTAPI void APIENTRY glutInitWindowSize(int width, int height);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutInitWindowSize(int width, int height);
+        #endregion glutInitWindowSize(int width, int height)
+        #endregion Initialization Sub-API
+
+        #region Beginning Event Processing Sub-API
+        #region glutMainLoop()
+        /// <summary>
+        ///     Enters the GLUT event processing loop.
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutMainLoop</b> enters the GLUT event processing loop.  This routine
+        ///     should be called at most once in a GLUT program.  Once called, this
+        ///     routine will never return.  It will call as necessary any callbacks
+        ///     (delegates) that have been registered.
+        /// </remarks>
+        /// <seealso cref="glutInit()" />
+        // GLUTAPI void APIENTRY glutMainLoop(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutMainLoop();
+        #endregion glutMainLoop()
+        #endregion Beginning Event Processing Sub-API
+
+        #region Window Management Sub-API
+        #region int glutCreateWindow(string name)
+        /// <summary>
+        ///     Creates a top-level window.
+        /// </summary>
+        /// <param name="name">
+        ///     Character string for use as window name.
+        /// </param>
+        /// <returns>
+        ///     The value returned is a unique small integer identifier for the window.  The
+        ///     range of allocated identifiers starts at one.  This window identifier can be
+        ///     used when calling <see cref="glutSetWindow" />.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutCreateWindow</b> creates a top-level window.  The <i>name</i> will be
+        ///         provided to the window system as the window�s title.  The intent is that the
+        ///         window system will label the window with <i>name</i> as the title.
+        ///     </para>
+        ///     <para>
+        ///         Implicitly, the current window is set to the newly created window.
+        ///     </para>
+        ///     <para>
+        ///         Each created window has a unique associated OpenGL context.  State changes to
+        ///         a window�s associated OpenGL context can be done immediately after the window
+        ///         is created.
+        ///     </para>
+        ///     <para>
+        ///         The display state of a window is initially for the window to be shown.  But
+        ///         the window�s display state is not actually acted upon until
+        ///         <see cref="glutMainLoop" /> is entered.  This means until <b>glutMainLoop</b>
+        ///         is called, rendering to a created window is ineffective because the window can
+        ///         not yet be displayed.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The proper X Inter-Client Communications Convention Manual (ICCCM) top-level
+        ///         properties are established.  The WM_COMMAND property that lists the
+        ///         commandline used to invoke the GLUT program is only established for the first
+        ///         window created.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateMenu" />
+        /// <seealso cref="glutCreateSubWindow" />
+        /// <seealso cref="glutDestroyWindow" />
+        // GLUTAPI int APIENTRY glutCreateWindow(const char *name);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutCreateWindow(string name);
+        #endregion int glutCreateWindow(string name)
+
+        #region int glutCreateSubWindow(int win, int x, int y, int width, int height)
+        /// <summary>
+        ///     Creates a subwindow.
+        /// </summary>
+        /// <param name="win">
+        ///     Identifier of the subwindow�s parent window.
+        /// </param>
+        /// <param name="x">
+        ///     Window X location in pixels relative to parent window�s origin.
+        /// </param>
+        /// <param name="y">
+        ///     Window Y location in pixels relative to parent window�s origin.
+        /// </param>
+        /// <param name="width">
+        ///     Width in pixels.
+        /// </param>
+        /// <param name="height">
+        ///     Height in pixels.
+        /// </param>
+        /// <returns>
+        ///     The value returned is a unique small integer identifier for the window.  The
+        ///     range of allocated identifiers starts at one.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutCreateSubWindow</b> creates a subwindow of the window identified by
+        ///         <i>win</i> of size <i>width</i> and <i>height</i> at location <i>x</i> and
+        ///         <i>y</i> within the current window.  Implicitly, the current window is set to
+        ///         the newly created subwindow.
+        ///     </para>
+        ///     <para>
+        ///         Each created window has a unique associated OpenGL context.  State changes to
+        ///         a window�s associated OpenGL context can be done immediately after the window
+        ///         is created.
+        ///     </para>
+        ///     <para>
+        ///         The display state of a window is initially for the window to be shown.  But
+        ///         the window�s display state is not actually acted upon until
+        ///         <see cref="glutMainLoop" /> is entered.   This means until <b>glutMainLoop</b>
+        ///         is called, rendering to a created window is ineffective.  Subwindows can not
+        ///         be iconified.
+        ///     </para>
+        ///     <para>
+        ///         Subwindows can be nested arbitrarily deep.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutDestroyWindow" />
+        // GLUTAPI int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutCreateSubWindow(int win, int x, int y, int width, int height);
+        #endregion int glutCreateSubWindow(int win, int x, int y, int width, int height)
+
+        #region glutDestroyWindow(int win)
+        /// <summary>
+        ///     Destroys the specified window.
+        /// </summary>
+        /// <param name="win">
+        ///     Identifier of GLUT window to destroy.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutDestroyWindow</b> destroys the window specified by <i>win</i> and the
+        ///     window�s associated OpenGL context, logical colormap (if the window is color
+        ///     index), and overlay and related state (if an overlay has been established).
+        ///     Any subwindows of destroyed windows are also destroyed by
+        ///     <b>glutDestroyWindow</b>.  If <i>win</i> was the current window, the current
+        ///     window becomes invalid (<see cref="glutGetWindow" /> will return zero).
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow"/>
+        /// <seealso cref="glutCreateSubWindow" />
+        /// <seealso cref="glutDestroyMenu" />
+        // GLUTAPI void APIENTRY glutDestroyWindow(int win);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutDestroyWindow(int win);
+        #endregion glutDestroyWindow(int win)
+
+        #region glutPostRedisplay()
+        /// <summary>
+        ///     Marks the current window as needing to be redisplayed.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutPostRedisplay</b> marks the normal plane of current window as needing
+        ///         to be redisplayed.  The next iteration through <see cref="glutMainLoop" />,
+        ///         the window's display callback will be called to redisplay the window's normal
+        ///         plane.  Multiple calls to <b>glutPostRedisplay</b> before the next display
+        ///         callback opportunity generates only a single redisplay callback.
+        ///         <b>glutPostRedisplay</b> may be called within a window's display or overlay
+        ///         display callback to re-mark that window for redisplay.
+        ///     </para>
+        ///     <para>
+        ///         Logically, normal plane damage notification for a window is treated as a
+        ///         <b>glutPostRedisplay</b> on the damaged window.  Unlike damage reported by the
+        ///         window system, <b>glutPostRedisplay</b> will not set to <c>true</c> the normal
+        ///         plane's damaged status (returned by
+        ///         <c>Glut.glutLayerGet(Glut.GLUT_NORMAL_DAMAGED)</c>.
+        ///     </para>
+        ///     <para>
+        ///         If the window you want to post a redisplay on is not already current (and you
+        ///         do not require it to be immediately made current), using
+        ///         <see cref="glutPostWindowRedisplay" /> is more efficient than calling
+        ///         <see cref="glutSetWindow" /> to the desired window and then calling
+        ///         <b>glutPostRedisplay</b>.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutDisplayFunc" />
+        /// <seealso cref="glutPostOverlayRedisplay" />
+        /// <seealso cref="glutPostWindowRedisplay" />
+        // GLUTAPI void APIENTRY glutPostRedisplay(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutPostRedisplay();
+        #endregion glutPostRedisplay()
+
+        #region glutPostWindowRedisplay(int win)
+        /// <summary>
+        ///     Marks the specified window as needing to be redisplayed.
+        /// </summary>
+        /// <param name="win">
+        ///     Identifier of GLUT window to mark for redisplay.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutPostWindowRedisplay</b> marks the specified window as needing to be
+        ///         redisplayed.  The next iteration through <see cref="glutMainLoop" />, the
+        ///         window's display callback will be called to redisplay the window's normal
+        ///         plane.
+        ///     </para>
+        ///     <para>
+        ///         If the window you want to post a redisplay on is not already current (and you
+        ///         do not require it to be immediately made current), using
+        ///         <b>glutPostWindowRedisplay</b> is more efficient than calling
+        ///         <see cref="glutSetWindow" /> to the desired window and then calling
+        ///         <see cref="glutPostRedisplay" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutDisplayFunc" />
+        /// <seealso cref="glutPostOverlayRedisplay" />
+        /// <seealso cref="glutPostRedisplay" />
+        // GLUTAPI void APIENTRY glutPostWindowRedisplay(int win);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutPostWindowRedisplay(int win);
+        #endregion glutPostWindowRedisplay(int win)
+
+        #region glutSwapBuffers()
+        /// <summary>
+        ///     Swaps the buffers of the current window if double buffered.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         Performs a buffer swap on the layer in use for the current window.
+        ///         Specifically, <b>glutSwapBuffers</b> promotes the contents of the back buffer
+        ///         of the layer in use of the current window to become the contents of the front
+        ///         buffer.  The contents of the back buffer then become undefined.  The update
+        ///         typically takes place during the vertical retrace of the monitor, rather than
+        ///         immediately after <b>glutSwapBuffers</b> is called.
+        ///     </para>
+        ///     <para>
+        ///         An implicit <see cref="Gl.glFlush"/> is done by <b>glutSwapBuffers</b> before
+        ///         it returns.  Subsequent OpenGL commands can be issued immediately after
+        ///         calling <b>glutSwapBuffers</b>, but are not executed until the buffer exchange
+        ///         is completed.
+        ///     </para>
+        ///     <para>
+        ///         If the layer in use is not double buffered, <b>glutSwapBuffers</b> has no
+        ///         effect.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutDisplayFunc" />
+        /// <seealso cref="glutPostRedisplay" />
+        // GLUTAPI void APIENTRY glutSwapBuffers(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSwapBuffers();
+        #endregion glutSwapBuffers()
+
+        #region int glutGetWindow()
+        /// <summary>
+        ///     Returns the identifier of the current window.
+        /// </summary>
+        /// <returns>
+        ///     <b>glutGetWindow</b> returns the identifier of the current window.  If no
+        ///     windows exist or the previously current window was destroyed,
+        ///     <b>glutGetWindow</b> returns zero.
+        /// </returns>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutSetWindow" />
+        // GLUTAPI int APIENTRY glutGetWindow(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutGetWindow();
+        #endregion int glutGetWindow()
+
+        #region glutSetWindow(int win)
+        /// <summary>
+        ///     Sets the current window.
+        /// </summary>
+        /// <param name="win">
+        ///     Identifier of GLUT window to make the current window.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutSetWindow</b> sets the current window.  <b>glutSetWindow</b> does not
+        ///     change the layer in use for the window; this is done using
+        ///     <see cref="glutUseLayer" />.
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutGetWindow" />
+        /// <seealso cref="glutSetMenu" />
+        // GLUTAPI void APIENTRY glutSetWindow(int win);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetWindow(int win);
+        #endregion glutSetWindow(int win)
+
+        #region glutSetWindowTitle(string name)
+        /// <summary>
+        ///     Changes the window title of the current top-level window.
+        /// </summary>
+        /// <param name="name">
+        ///     Character string for the window name to be set for the window.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutSetWindowTitle</b> should be called only when the current window is a
+        ///     top-level window.  Upon creation of a top-level window, the window title is
+        ///     determined by the <i>name</i> parameter to <see cref="glutCreateWindow" />.
+        ///     Once created, <b>glutSetWindowTitle</b> can change the window title of
+        ///     top-level windows.  Each call requests the window system change the title
+        ///     appropriately.  Requests are not buffered or coalesced.  The policy by which
+        ///     the window title is displayed is window system dependent.
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutSetIconTitle" />
+        // GLUTAPI void APIENTRY glutSetWindowTitle(const char *name);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetWindowTitle(string name);
+        #endregion glutSetWindowTitle(string name)
+
+        #region glutSetIconTitle(string name)
+        /// <summary>
+        ///     Changes the icon title of the current top-level window.
+        /// </summary>
+        /// <param name="name">
+        ///     Character string for the icon name to be set for the window.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutSetIconTitle</b> should be called only when the current window is a
+        ///     top-level window.  Upon creation of a top-level window, the icon name is
+        ///     determined by the <i>name</i> parameter to <see cref="glutCreateWindow" />.
+        ///     Once created, <b>glutSetIconTitle</b> can change the icon name of top-level
+        ///     windows.  Each call requests the window system change the name appropriately.
+        ///     Requests are not buffered or coalesced.  The policy by which the icon name are
+        ///     displayed is window system dependent.
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutIconifyWindow" />
+        /// <seealso cref="glutSetWindowTitle" />
+        // GLUTAPI void APIENTRY glutSetIconTitle(const char *name);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetIconTitle(string name);
+        #endregion glutSetIconTitle(string name)
+
+        #region glutPositionWindow(int x, int y)
+        /// <summary>
+        ///     Requests a change to the position of the current window.
+        /// </summary>
+        /// <param name="x">
+        ///     New X location of window in pixels.
+        /// </param>
+        /// <param name="y">
+        ///     New Y location of window in pixels.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutPositionWindow</b> requests a change in the position of the current
+        ///         window.  For top-level windows, the <i>x</i> and <i>y</i> parameters are
+        ///         pixel offsets from the screen origin.  For subwindows, the <i>x</i> and
+        ///         <i>y</i> parameters are pixel offsets from the window's parent window origin.
+        ///     </para>
+        ///     <para>
+        ///         The requests by <b>glutPositionWindow</b> are not processed immediately.  The
+        ///         request is executed after returning to the main event loop.  This allows
+        ///         multiple <b>glutPositionWindow</b>, <see cref="glutReshapeWindow" />, and
+        ///         <see cref="glutFullScreen" /> requests to the same window to be coalesced.
+        ///     </para>
+        ///     <para>
+        ///         In the case of top-level windows, a <b>glutPositionWindow</b> call is
+        ///         considered only a request for positioning the window.  The window system is
+        ///         free to apply its own policies to top-level window placement.  The intent is
+        ///         that top-level windows should be repositioned according to
+        ///         <b>glutPositionWindow's</b> parameters.
+        ///     </para>
+        ///     <para>
+        ///         <b>glutPositionWindow</b> disables the full screen status of a window if
+        ///         previously enabled.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutInitWindowPosition" />
+        /// <seealso cref="glutReshapeWindow" />
+        // GLUTAPI void APIENTRY glutPositionWindow(int x, int y);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutPositionWindow(int x, int y);
+        #endregion glutPositionWindow(int x, int y)
+
+        #region glutReshapeWindow(int width, int height)
+        /// <summary>
+        ///     Requests a change to the size of the current window.
+        /// </summary>
+        /// <param name="width">
+        ///     New width of window in pixels.
+        /// </param>
+        /// <param name="height">
+        ///     New height of window in pixels.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutReshapeWindow</b> requests a change in the size of the current window.
+        ///         The <i>width</i> and <i>height</i> parameters are size extents in pixels.  The
+        ///         <i>width</i> and <i>height</i> must be positive values.
+        ///     </para>
+        ///     <para>
+        ///         The requests by <b>glutReshapeWindow</b> are not processed immediately.  The
+        ///         request is executed after returning to the main event loop.  This allows
+        ///         multiple <b>glutReshapeWindow</b>, <see cref="glutPositionWindow" />, and
+        ///         <see cref="glutFullScreen" /> requests to the same window to be coalesced.
+        ///     </para>
+        ///     <para>
+        ///         In the case of top-level windows, a <b>glutReshapeWindow</b> call is
+        ///         considered only a request for sizing the window.  The window system is free to
+        ///         apply its own policies to top-level window sizing.  The intent is that
+        ///         top-level windows should be reshaped according to <b>glutReshapeWindow's</b>
+        ///         parameters.  Whether a reshape actually takes effect and, if so, the reshaped
+        ///         dimensions are reported to the program by a reshape callback.
+        ///     </para>
+        ///     <para>
+        ///         <b>glutReshapeWindow</b> disables the full screen status of a window if
+        ///         previously enabled.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutPositionWindow" />
+        /// <seealso cref="glutReshapeFunc" />
+        // GLUTAPI void APIENTRY glutReshapeWindow(int width, int height);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutReshapeWindow(int width, int height);
+        #endregion glutReshapeWindow(int width, int height)
+
+        #region glutPopWindow()
+        /// <summary>
+        ///     Changes the stacking order of the current window relative to its siblings.
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutPopWindow</b> works on both top-level windows and subwindows.  The
+        ///     effect of popping windows does not take place immediately.  Instead the pop is
+        ///     saved for execution upon return to the GLUT event loop.  Subsequent pop
+        ///     requests on a window replace the previously saved request for that window.
+        ///     The effect of popping top-level windows is subject to the window system's
+        ///     policy for restacking windows.
+        /// </remarks>
+        /// <seealso cref="glutHideWindow" />
+        /// <seealso cref="glutIconifyWindow" />
+        /// <seealso cref="glutPushWindow" />
+        /// <seealso cref="glutShowWindow" />
+        // GLUTAPI void APIENTRY glutPopWindow(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutPopWindow();
+        #endregion glutPopWindow()
+
+        #region glutPushWindow()
+        /// <summary>
+        ///     Changes the stacking order of the current window relative to its siblings.
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutPushWindow</b> works on both top-level windows and subwindows.  The
+        ///     effect of pushing windows does not take place immediately.  Instead the push
+        ///     is saved for execution upon return to the GLUT event loop.  Subsequent push
+        ///     requests on a window replace the previously saved request for that window.
+        ///     The effect of pushing top-level windows is subject to the window system's
+        ///     policy for restacking windows.
+        /// </remarks>
+        /// <seealso cref="glutHideWindow" />
+        /// <seealso cref="glutIconifyWindow" />
+        /// <seealso cref="glutPopWindow" />
+        /// <seealso cref="glutShowWindow" />
+        // GLUTAPI void APIENTRY glutPushWindow(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutPushWindow();
+        #endregion glutPushWindow()
+
+        #region glutIconifyWindow()
+        /// <summary>
+        ///     Changes the display status of the current window.
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutIconifyWindow</b> will iconify a top-level window, but GLUT prohibits
+        ///     iconification of a subwindow.  The effect of iconifying windows does not take
+        ///     place immediately.  Instead the requests are saved for execution upon return
+        ///     to the GLUT event loop.  Subsequent iconification requests on a window replace
+        ///     the previously saved request for that window.  The effect of iconifying
+        ///     top-level windows is subject to the window system's policy for displaying
+        ///     windows.
+        /// </remarks>
+        /// <seealso cref="glutHideWindow" />
+        /// <seealso cref="glutPopWindow" />
+        /// <seealso cref="glutPushWindow" />
+        /// <seealso cref="glutShowWindow" />
+        // GLUTAPI void APIENTRY glutIconifyWindow(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutIconifyWindow();
+        #endregion glutIconifyWindow()
+
+        #region glutShowWindow()
+        /// <summary>
+        ///     Changes the display status of the current window.
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutShowWindow</b> will show the current window (though it may still not be
+        ///     visible if obscured by other shown windows).  The effect of showing windows
+        ///     does not take place immediately.  Instead the requests are saved for execution
+        ///     upon return to the GLUT event loop.  Subsequent show requests on a window
+        ///     replace the previously saved request for that window.  The effect of showing
+        ///     top-level windows is subject to the window system's policy for displaying
+        ///     windows.
+        /// </remarks>
+        /// <seealso cref="glutHideWindow" />
+        /// <seealso cref="glutIconifyWindow" />
+        /// <seealso cref="glutPopWindow" />
+        /// <seealso cref="glutPushWindow" />
+        // GLUTAPI void APIENTRY glutShowWindow(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutShowWindow();
+        #endregion glutShowWindow()
+
+        #region glutHideWindow()
+        /// <summary>
+        ///     Changes the display status of the current window.
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutHideWindow</b> will hide the current window.  The effect of hiding
+        ///     windows does not take place immediately.  Instead the requests are saved for
+        ///     execution upon return to the GLUT event loop.  Subsequent hide requests on a
+        ///     window replace the previously saved request for that window.  The effect of
+        ///     hiding top-level windows is subject to the window system's policy for
+        ///     displaying windows.
+        /// </remarks>
+        /// <seealso cref="glutIconifyWindow" />
+        /// <seealso cref="glutPopWindow" />
+        /// <seealso cref="glutPushWindow" />
+        /// <seealso cref="glutShowWindow" />
+        // GLUTAPI void APIENTRY glutHideWindow(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutHideWindow();
+        #endregion glutHideWindow()
+
+        #region glutFullScreen()
+        /// <summary>
+        ///     Requests that the current window be made full screen.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutFullScreen</b> requests that the current window be made full screen.
+        ///         The exact semantics of what full screen means may vary by window system.  The
+        ///         intent is to make the window as large as possible and disable any window
+        ///         decorations or borders added by the window system.  The window width and
+        ///         height are not guaranteed to be the same as the screen width and height, but
+        ///         that is the intent of making a window full screen.
+        ///     </para>
+        ///     <para>
+        ///         <b>glutFullScreen</b> is defined to work only on top-level windows.
+        ///     </para>
+        ///     <para>
+        ///         The <b>glutFullScreen</b> requests are not processed immediately.  The request
+        ///         is executed after returning to the main event loop.  This allows multiple
+        ///         <see cref="glutReshapeWindow" />, <see cref="glutPositionWindow" />, and
+        ///         <b>glutFullScreen</b> requests to the same window to be coalesced.
+        ///     </para>
+        ///     <para>
+        ///         Subsequent <b>glutReshapeWindow</b> and <b>glutPositionWindow</b> requests on
+        ///         the window will disable the full screen status of the window.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         In the X implementation of GLUT, full screen is implemented by sizing and
+        ///         positioning the window to cover the entire screen and posting the
+        ///         _MOTIF_WM_HINTS property on the window requesting absolutely no decorations.
+        ///         Non-Motif window managers may not respond to _MOTIF_WM_HINTS.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutPositionWindow" />
+        /// <seealso cref="glutReshapeWindow" />
+        // GLUTAPI void APIENTRY glutFullScreen(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutFullScreen();
+        #endregion glutFullScreen()
+
+        #region glutSetCursor(int cursor)
+        /// <summary>
+        ///     Changes the cursor image of the current window.
+        /// </summary>
+        /// <param name="cursor">
+        ///     <para>
+        ///         Name of cursor image to change to. Possible values follow:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_RIGHT_ARROW" /></term>
+        ///                 <description>Arrow pointing up and to the right.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_LEFT_ARROW" /></term>
+        ///                 <description>Arrow pointing up and to the left.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_INFO" /></term>
+        ///                 <description>Pointing hand.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_DESTROY" /></term>
+        ///                 <description>Skull and cross bones.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_HELP" /></term>
+        ///                 <description>Question mark.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_CYCLE" /></term>
+        ///                 <description>Arrows rotating in a circle.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_SPRAY" /></term>
+        ///                 <description>Spray can.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_WAIT" /></term>
+        ///                 <description>Wrist watch.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_TEXT" /></term>
+        ///                 <description>Insertion point cursor for text.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_CROSSHAIR" /></term>
+        ///                 <description>Simple cross-hair.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_UP_DOWN" /></term>
+        ///                 <description>Bi-directional pointing up and down.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_LEFT_RIGHT" /></term>
+        ///                 <description>Bi-directional pointing left and right.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_TOP_SIDE" /></term>
+        ///                 <description>Arrow pointing to top side.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_BOTTOM_SIDE" /></term>
+        ///                 <description>Arrow pointing to bottom side.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_LEFT_SIDE" /></term>
+        ///                 <description>Arrow pointing to left side.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_RIGHT_SIDE" /></term>
+        ///                 <description>Arrow pointing to right side.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_TOP_LEFT_CORNER" /></term>
+        ///                 <description>Arrow pointing to top-left corner.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_TOP_RIGHT_CORNER" /></term>
+        ///                 <description>Arrow pointing to top-right corner.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_BOTTOM_RIGHT_CORNER" /></term>
+        ///                 <description>Arrow pointing to bottom-right corner.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_BOTTOM_LEFT_CORNER" /></term>
+        ///                 <description>Arrow pointing to bottom-left corner.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_FULL_CROSSHAIR" /></term>
+        ///                 <description>
+        ///                     Full-screen cross-hair cursor (if possible, otherwise
+        ///                     <see cref="GLUT_CURSOR_CROSSHAIR" />).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_NONE" /></term>
+        ///                 <description>Invisible cursor.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_CURSOR_INHERIT" /></term>
+        ///                 <description>Use parent's cursor.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutSetCursor</b> changes the cursor image of the current window.  Each
+        ///         call requests the window system change the cursor appropriately.  The cursor
+        ///         image when a window is created is <see cref="GLUT_CURSOR_INHERIT" />.  The
+        ///         exact cursor images used are implementation dependent.  The intent is for the
+        ///         image to convey the meaning of the cursor name.  For a top-level window,
+        ///         <i>GLUT_CURSOR_INHERIT</i> uses the default window system cursor.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         GLUT for X uses SGI's _SGI_CROSSHAIR_CURSOR convention to access a full-screen
+        ///         cross-hair cursor if possible.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutCreateSubWindow" />
+        // GLUTAPI void APIENTRY glutSetCursor(int cursor);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetCursor(int cursor);
+        #endregion glutSetCursor(int cursor)
+
+        #region glutWarpPointer(int x, int y)
+        /// <summary>
+        ///     Warps the pointer's location.
+        /// </summary>
+        /// <param name="x">
+        ///     X offset relative to the current window's origin (upper left).
+        /// </param>
+        /// <param name="y">
+        ///     Y offset relative to the current window's origin (upper left).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutWarpPointer</b> warps the window system's pointer to a new location
+        ///         relative to the origin of the current window.  The new location will be offset
+        ///         <i>x</i> pixels on the X axis and <i>y</i> pixels on the Y axis.  These
+        ///         parameters may be negative.  The warp is done immediately.
+        ///     </para>
+        ///     <para>
+        ///         If the pointer would be warped outside the screen's frame buffer region, the
+        ///         location will be clamped to the nearest screen edge.  The window system is
+        ///         allowed to further constrain the pointer's location in window system dependent
+        ///         ways.
+        ///     </para>
+        ///     <para>
+        ///         The following is good advice that applies to <b>glutWarpPointer</b>: "There is
+        ///         seldom any reason for calling this function.  The pointer should normally be
+        ///         left to the user." (from Xlib's XWarpPointer man page.)
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutMotionFunc" />
+        /// <seealso cref="glutMouseFunc" />
+        // GLUTAPI void APIENTRY glutWarpPointer(int x, int y);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWarpPointer(int x, int y);
+        #endregion glutWarpPointer(int x, int y)
+        #endregion Window Management Sub-API
+
+        #region Overlay Sub-API
+        #region glutEstablishOverlay()
+        /// <summary>
+        ///     Establishes an overlay (if possible) for the current window.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutEstablishOverlay</b> establishes an overlay (if possible) for the
+        ///         current window.  The requested display mode for the overlay is determined by
+        ///         the initial display mode.  <c>glutLayerGet(GLUT_OVERLAY_POSSIBLE)</c> can be
+        ///         called to determine if an overlay is possible for the current window with the
+        ///         current initial display mode.  Do not attempt to establish an overlay when
+        ///         one is not possible; GLUT will terminate the program.
+        ///     </para>
+        ///     <para>
+        ///         If <b>glutEstablishOverlay</b> is called when an overlay already exists, the
+        ///         existing overlay is first removed, and then a new overlay is established.  The
+        ///         state of the old overlay's OpenGL context is discarded.
+        ///     </para>
+        ///     <para>
+        ///         The initial display state of an overlay is shown, however the overlay is only
+        ///         actually shown if the overlay's window is shown.
+        ///     </para>
+        ///     <para>
+        ///         Implicitly, the window's layer in use changes to the overlay immediately after
+        ///         the overlay is established.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         Establishing an overlay is a bit involved, but easy once you get the hang of
+        ///         it.  Here is an example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             int overlaySupport;
+        ///             int transparent, red, white;
+        ///         
+        ///             Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_INDEX);
+        ///             overlaySupport = Glut.glutLayerGet(Glut.GLUT_OVERLAY_POSSIBLE);
+        ///         
+        ///             if(overlaySupport) {
+        ///                 Glut.glutEstablishOverlay();
+        ///                 Glut.glutHideOverlay();
+        ///                 transparent = Glut.glutLayerGet(Glut.GLUT_TRANSPARENT_INDEX);
+        ///                 Gl.glClearIndex(transparent);
+        ///                 red = (transparent + 1) % Glut.glutGet(Glut.GLUT_WINDOW_COLORMAP_SIZE);
+        ///                 white = (transparent + 2) % Glut.glutGet(Glut.GLUT_WINDOW_COLORMAP_SIZE);
+        ///                 Glut.glutSetColor(red, 1.0f, 0.0f, 0.0f);
+        ///                 Glut.glutSetColor(white, 1.0f, 1.0f, 1.0f);
+        ///                 Glut.glutOverlayDisplayFunc(redrawOverlay);
+        ///                 Glut.glutReshapFunc(reshape);
+        ///             }
+        ///             else {
+        ///                 System.Console.WriteLine("Sorry, no nifty overlay support!");
+        ///             }
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         If you setup an overlay and you install a reshape callback, you need to update
+        ///         the viewports and possibly projection matrices of both the normal plane and
+        ///         the overlay.  For example, your reshape callback might look like this:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             private void Reshape(int w, int h) {
+        ///                 if(overlaySupport) {
+        ///                     Glut.glutUseLayer(Glut.GLUT_OVERLAY);
+        ///                     Gl.glViewport(0, 0, w, h);
+        ///                     Gl.glMatrixMode(Gl.GL_PROJECTION);
+        ///                     Gl.glLoadIdentity();
+        ///                     Glu.gluOrtho2D(0, w, 0, h);
+        ///                     Gl.glScalef(1, -1, 1);
+        ///                     Gl.glTranslatef(0, -h, 0);
+        ///                     Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        ///                     Glut.glutUseLayer(Glut.GLUT_NORMAL);
+        ///                 }
+        ///                 Gl.glViewport(0, 0, w, h);
+        ///             }
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         See <see cref="glutOverlayDisplayFunc" /> for an example showing one way to
+        ///         write your overlay display callback.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         GLUT for X uses the SERVER_OVERLAY_VISUALS convention to determine if overlay
+        ///         visuals are available.  While the convention allows for opaque overlays (no
+        ///         transparency) and overlays with the transparency specified as a bitmask, GLUT
+        ///         overlay management only provides access to transparent pixel overlays.
+        ///     </para>
+        ///     <para>
+        ///         Until RGBA overlays are better understood, GLUT only supports color index
+        ///         overlays.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutLayerGet" />
+        /// <seealso cref="glutOverlayDisplayFunc" />
+        /// <seealso cref="glutPostOverlayRedisplay" />
+        /// <seealso cref="glutRemoveOverlay" />
+        /// <seealso cref="glutShowOverlay" />
+        /// <seealso cref="glutUseLayer" />
+        // GLUTAPI void APIENTRY glutEstablishOverlay(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutEstablishOverlay();
+        #endregion glutEstablishOverlay()
+
+        #region glutRemoveOverlay()
+        /// <summary>
+        ///     Removes the overlay (if one exists) from the current window.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutRemoveOverlay</b> removes the overlay (if one exists).  It is safe to
+        ///         call <b>glutRemoveOverlay</b> even if no overlay is currently established --
+        ///         it does nothing in this case.  Implicitly, the window's layer in use changes
+        ///         to the normal plane immediately once the overlay is removed.
+        ///     </para>
+        ///     <para>
+        ///         If the program intends to re-establish the overlay later, it is typically
+        ///         faster and less resource intensive to use <see cref="glutHideOverlay" /> and
+        ///         <see cref="glutShowOverlay" /> to simply change the display status of the
+        ///         overlay.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutDestroyWindow" />
+        /// <seealso cref="glutEstablishOverlay" />
+        // GLUTAPI void APIENTRY glutRemoveOverlay(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutRemoveOverlay();
+        #endregion glutRemoveOverlay()
+
+        #region glutUseLayer(int layer)
+        /// <summary>
+        ///     Changes the layer in use for the current window.
+        /// </summary>
+        /// <param name="layer">
+        ///     Either <see cref="GLUT_NORMAL" /> or <see cref="GLUT_OVERLAY" />, selecting
+        ///     the normal plane or overlay respectively.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutUseLayer</b> changes the per-window layer in use for the current
+        ///         window, selecting either the normal plane or overlay.  The overlay should only
+        ///         be specified if an overlay exists, however windows without an overlay may
+        ///         still call <c>Glut.glutUseLayer(Glut.GLUT_NORMAL)</c>.  OpenGL commands for
+        ///         the window are directed to the current layer in use.
+        ///     </para>
+        ///     <para>
+        ///         To query the layer in use for a window, call
+        ///         <c>Glut.glutLayerGet(Glut.GLUT_LAYER_IN_USE)</c>.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutEstablishOverlay" />
+        /// <seealso cref="glutSetWindow" />
+        // GLUTAPI void APIENTRY glutUseLayer(GLenum layer);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutUseLayer(int layer);
+        #endregion glutUseLayer(int layer)
+
+        #region glutPostOverlayRedisplay()
+        /// <summary>
+        ///     Marks the overlay of the current window as needing to be redisplayed.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutPostOverlayRedisplay</b> marks the overlay of current window as needing
+        ///         to be redisplayed.  The next iteration through <see cref="glutMainLoop" />,
+        ///         the window's overlay display callback (or simply the display callback if no
+        ///         overlay display callback is registered) will be called to redisplay the
+        ///         window's overlay plane.  Multiple calls to <b>glutPostOverlayRedisplay</b>
+        ///         before the next display callback opportunity (or overlay display callback
+        ///         opportunity if one is registered) generate only a single redisplay.
+        ///         <b>glutPostOverlayRedisplay</b> may be called within a window's display or
+        ///         overlay display callback to re-mark that window for redisplay.
+        ///     </para>
+        ///     <para>
+        ///         Logically, overlay damage notification for a window is treated as a
+        ///         <b>glutPostOverlayRedisplay</b> on the damaged window.  Unlike damage reported
+        ///         by the window system, <b>glutPostOverlayRedisplay</b> will not set to
+        ///         <c>true</c> the overlay's damaged status (returned by
+        ///         <c>Glut.glutLayerGet(Glut.GLUT_OVERLAY_DAMAGED)</c>.
+        ///     </para>
+        ///     <para>
+        ///         If the window you want to post an overlay redisplay on is not already current
+        ///         (and you do not require it to be immediately made current), using
+        ///         <see cref="glutPostWindowOverlayRedisplay" /> is more efficient than calling
+        ///         <see cref="glutSetWindow" /> to the desired window and then calling
+        ///         <b>glutPostOverlayRedisplay</b>.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         If you are doing an interactive effect like rubberbanding in the overlay, it
+        ///         is a good idea to structure your rendering to minimize flicker (most overlays
+        ///         are single-buffered).  Only clear the overlay if you know that the window has
+        ///         been damaged.  Otherwise, try to simply erase what you last drew and redraw
+        ///         it in an updated position.  Here is an example overlay display callback used
+        ///         to implement overlay rubberbanding:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             private void redrawOverlay() {
+        ///                 static int prevStretchX, prevStretchY;
+        ///             
+        ///                 if(Glut.glutLayerGet(Glut.GLUT_OVERLAY_DAMAGED)) {
+        ///                     // Damage means we need a full clear.
+        ///                     Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
+        ///                 }
+        ///                 else {
+        ///                     // Undraw last rubber-band.
+        ///                     Gl.glBegin(Gl.GL_LINE_LOOP);
+        ///                         Gl.glVertex2i(anchorX, anchorY);
+        ///                         Gl.glVertex2i(anchorX, prevStretchY);
+        ///                         Gl.glVertex2i(prevStretchX, anchorY);
+        ///                     Gl.glEnd();
+        ///                 }
+        ///             
+        ///                 Gl.glIndexi(red);
+        ///                 Gl.glBegin(Gl.GL_LINE_LOOP);
+        ///                     Gl.glVertex2i(anchorX, anchorY);
+        ///                     Gl.glVertex2i(anchorX, stretchY);
+        ///                     Gl.glVertex2i(stretchX, stretchY);
+        ///                     Gl.glVertex2i(stretchX, anchorY);
+        ///                 Gl.glEnd();
+        ///             
+        ///                 prevStretchX = stretchX;
+        ///                 prevStretchY = stretchY;
+        ///             }
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         Notice how <c>Glut.glutLayerGet(Glut.GLUT_OVERLAY_DAMAGED)</c> is used to
+        ///         determine if a clear needs to take place because of damage; if a clear is
+        ///         unnecessary, it is faster to just draw the last rubberband using the
+        ///         transparent pixel.
+        ///     </para>
+        ///     <para>
+        ///         When the application is through with the rubberbanding effect, the best way to
+        ///         get rid of the rubberband is to simply hide the overlay by calling
+        ///         <see cref="glutHideOverlay" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutEstablishOverlay" />
+        /// <seealso cref="glutHideOverlay" />
+        /// <seealso cref="glutLayerGet" />
+        /// <seealso cref="glutMainLoop" />
+        /// <seealso cref="glutPostRedisplay" />
+        /// <seealso cref="glutPostWindowOverlayRedisplay" />
+        // GLUTAPI void APIENTRY glutPostOverlayRedisplay(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutPostOverlayRedisplay();
+        #endregion glutPostOverlayRedisplay()
+
+        #region glutPostWindowOverlayRedisplay(int win)
+        /// <summary>
+        ///     Marks the overlay of the specified window as needing to be redisplayed.
+        /// </summary>
+        /// <param name="win">
+        ///     Identifier of GLUT window for which to post the overlay redisplay.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutPostWindowOverlayRedisplay</b> marks the overlay of specified window as
+        ///         needing to be redisplayed.  The next iteration through
+        ///         <see cref="glutMainLoop" />, the window's overlay display callback (or simply
+        ///         the display callback if no overlay display callback is registered) will be
+        ///         called to redisplay the window's overlay plane.  Multiple calls to
+        ///         <b>glutPostWindowOverlayRedisplay</b> before the next display callback
+        ///         opportunity (or overlay display callback opportunity if one is registered)
+        ///         generate only a single redisplay.  <b>glutPostWindowOverlayRedisplay</b> may
+        ///         be called within a window's display or overlay display callback to re-mark
+        ///         that window for redisplay.
+        ///     </para>
+        ///     <para>
+        ///         Logically, overlay damage notification for a window is treated as a
+        ///         <b>glutPostWindowOverlayRedisplay</b> on the damaged window.  Unlike damage
+        ///         reported by the window system, <b>glutPostWindowOverlayRedisplay</b> will not
+        ///         set to <c>true</c> the overlay's damaged status (returned by
+        ///         <c>Glut.glutLayerGet(Glut.GLUT_OVERLAY_DAMAGED)</c>.
+        ///     </para>
+        ///     <para>
+        ///         If the window you want to post an overlay redisplay on is not already current
+        ///         (and you do not require it to be immediately made current), using
+        ///         <b>glutPostWindowOverlayRedisplay</b> is more efficient than calling
+        ///         <see cref="glutSetWindow" /> to the desired window and then calling
+        ///         <see cref="glutPostOverlayRedisplay" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutEstablishOverlay" />
+        /// <seealso cref="glutHideOverlay" />
+        /// <seealso cref="glutLayerGet" />
+        /// <seealso cref="glutMainLoop" />
+        /// <seealso cref="glutPostOverlayRedisplay" />
+        /// <seealso cref="glutPostRedisplay" />
+        // GLUTAPI void APIENTRY glutPostWindowOverlayRedisplay(int win);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutPostWindowOverlayRedisplay(int win);
+        #endregion glutPostWindowOverlayRedisplay(int win)
+
+        #region glutShowOverlay()
+        /// <summary>
+        ///     Shows the overlay of the current window.
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutShowOverlay</b> shows the overlay of the current window.  The effect of
+        ///     showing an overlay takes place immediately.  Note that <b>glutShowOverlay</b>
+        ///     will not actually display the overlay unless the window is also shown (and
+        ///     even a shown window may be obscured by other windows, thereby obscuring the
+        ///     overlay).  It is typically faster and less resource intensive to use these
+        ///     routines to control the display status of an overlay as opposed to removing
+        ///     and re-establishing the overlay.
+        /// </remarks>
+        /// <seealso cref="glutEstablishOverlay" />
+        /// <seealso cref="glutHideOverlay" />
+        /// <seealso cref="glutShowWindow" />
+        // GLUTAPI void APIENTRY glutShowOverlay(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutShowOverlay();
+        #endregion glutShowOverlay()
+
+        #region glutHideOverlay()
+        /// <summary>
+        ///     Hides the overlay of the current window.
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutHideOverlay</b> hides the overlay of the current window.  The effect of
+        ///     hiding an overlay takes place immediately.  It is typically faster and less
+        ///     resource intensive to use these routines to control the display status of an
+        ///     overlay as opposed to removing and re-establishing the overlay.
+        /// </remarks>
+        /// <seealso cref="glutEstablishOverlay" />
+        /// <seealso cref="glutShowOverlay" />
+        /// <seealso cref="glutShowWindow" />
+        // GLUTAPI void APIENTRY glutHideOverlay(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutHideOverlay();
+        #endregion glutHideOverlay()
+        #endregion Overlay Sub-API
+
+        #region Menu Sub-API
+        #region glutDestroyMenu(int menu)
+        /// <summary>
+        ///     Destroys the specified menu.
+        /// </summary>
+        /// <param name="menu">
+        ///     The identifier of the menu to destroy.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutDestroyMenu</b> destroys the specified menu by <i>menu</i>.  If
+        ///     <i>menu</i> was the current menu, the current menu becomes invalid and
+        ///     <see cref="glutGetMenu" /> will return zero.
+        /// </remarks>
+        /// <seealso cref="glutCreateMenu" />
+        /// <seealso cref="glutGetMenu" />
+        // GLUTAPI void APIENTRY glutDestroyMenu(int menu);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutDestroyMenu(int menu);
+        #endregion glutDestroyMenu(int menu)
+
+        #region int glutGetMenu()
+        /// <summary>
+        ///     Returns the identifier of the current menu.
+        /// </summary>
+        /// <returns>
+        ///     Returns the identifier of the current menu.  If no menus exist or the previous
+        ///     current menu was destroyed, <b>glutGetMenu</b> returns zero.
+        /// </returns>
+        /// <remarks>
+        ///     Returns the identifier of the current menu.  If no menus exist or the previous
+        ///     current menu was destroyed, <b>glutGetMenu</b> returns zero.
+        /// </remarks>
+        /// <seealso cref="glutSetMenu" />
+        // GLUTAPI int APIENTRY glutGetMenu(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutGetMenu();
+        #endregion int glutGetMenu()
+
+        #region glutSetMenu(int menu)
+        /// <summary>
+        ///     Sets the current menu.
+        /// </summary>
+        /// <param name="menu">
+        ///     The identifier of the menu to make the current menu.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutSetMenu</b> sets the current menu.
+        /// </remarks>
+        /// <seealso cref="glutGetMenu" />
+        // GLUTAPI void APIENTRY glutSetMenu(int menu);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetMenu(int menu);
+        #endregion glutSetMenu(int menu)
+
+        #region glutAddMenuEntry(string name, int val)
+        /// <summary>
+        ///     Adds a menu entry to the bottom of the current menu.
+        /// </summary>
+        /// <param name="name">
+        ///     string to display in the menu entry.
+        /// </param>
+        /// <param name="val">
+        ///     Value to return to the menu's callback function if the menu entry is selected.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutAddMenuEntry</b> adds a menu entry to the bottom of the current menu.
+        ///     The string <i>name</i> will be displayed for the newly added menu entry.  If
+        ///     the menu entry is selected by the user, the menu's callback will be called
+        ///     passing <i>val</i> as the callback's parameter.
+        /// </remarks>
+        /// <seealso cref="glutAddSubMenu" />
+        /// <seealso cref="glutChangeToMenuEntry" />
+        /// <seealso cref="glutCreateMenu" />
+        /// <seealso cref="glutRemoveMenuItem" />
+        // GLUTAPI void APIENTRY glutAddMenuEntry(const char *label, int val);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutAddMenuEntry(string name, int val);
+        #endregion glutAddMenuEntry(string name, int val)
+
+        #region glutAddSubMenu(string name, int menu)
+        /// <summary>
+        ///     Adds a sub-menu trigger to the bottom of the current menu.
+        /// </summary>
+        /// <param name="name">
+        ///     string to display in the menu item from which to cascade the sub-menu.
+        /// </param>
+        /// <param name="menu">
+        ///     Identifier of the menu to cascade from this sub-menu menu item.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutAddSubMenu</b> adds a sub-menu trigger to the bottom of the current
+        ///     menu.  The string <i>name</i> will be displayed for the newly added sub-menu
+        ///     trigger.  If the sub-menu trigger is entered, the sub-menu numbered
+        ///     <i>menu</i> will be cascaded, allowing sub-menu menu items to be selected.
+        /// </remarks>
+        /// <seealso cref="glutAddMenuEntry" />
+        /// <seealso cref="glutChangeToSubMenu" />
+        /// <seealso cref="glutRemoveMenuItem" />
+        // GLUTAPI void APIENTRY glutAddSubMenu(const char *label, int menu);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutAddSubMenu(string name, int menu);
+        #endregion glutAddSubMenu(string name, int menu)
+
+        #region glutChangeToMenuEntry(int entry, string name, int val)
+        /// <summary>
+        ///     Changes the specified menu item in the current menu into a menu entry.
+        /// </summary>
+        /// <param name="entry">
+        ///     Index into the menu items of the current menu (1 is the topmost menu item).
+        /// </param>
+        /// <param name="name">
+        ///     string to display in the menu entry.
+        /// </param>
+        /// <param name="val">
+        ///     Value to return to the menu's callback function if the menu entry is selected.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutChangeToMenuEntry</b> changes the specified menu entry in the current
+        ///     menu into a menu entry.  The <i>entry</i> parameter determines which menu item
+        ///     should be changed, with one being the topmost item.  <i>entry</i> must be
+        ///     between 1 and <c>Glut.glutGet(Glut.GLUT_MENU_NUM_ITEMS)</c> inclusive.  The
+        ///     menu item to change does not have to be a menu entry already.  The string
+        ///     <i>name</i> will be displayed for the newly changed menu entry.  The
+        ///     <i>val</i> will be returned to the menu's callback if this menu entry is
+        ///     selected.
+        /// </remarks>
+        /// <seealso cref="glutAddMenuEntry" />
+        /// <seealso cref="glutChangeToSubMenu" />
+        /// <seealso cref="glutRemoveMenuItem" />
+        // GLUTAPI void APIENTRY glutChangeToMenuEntry(int item, const char *label, int val);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutChangeToMenuEntry(int entry, string name, int val);
+        #endregion glutChangeToMenuEntry(int entry, string name, int val)
+
+        #region glutChangeToSubMenu(int entry, string name, int menu)
+        /// <summary>
+        ///     Changes the specified menu item in the current menu into a sub-menu trigger.
+        /// </summary>
+        /// <param name="entry">
+        ///     Index into the menu items of the current menu (1 is the topmost menu item).
+        /// </param>
+        /// <param name="name">
+        ///     string to display in the menu item to cascade the sub-menu from.
+        /// </param>
+        /// <param name="menu">
+        ///     Identifier of the menu to cascade from this sub-menu menu item.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutChangeToSubMenu</b> changes the specified menu item in the current menu
+        ///     into a sub-menu trigger.  The <i>entry</i> parameter determines which menu
+        ///     item should be changed, with one being the topmost item.  <i>entry</i> must be
+        ///     between 1 and <c>Glut.glutGet(Glut.GLUT_MENU_NUM_ITEMS)</c> inclusive.  The
+        ///     menu item to change does not have to be a sub-menu trigger already.  The
+        ///     string <i>name</i> will be displayed for the newly changed sub-menu trigger.
+        ///     The <i>menu</i> identifier names the sub-menu to cascade from the newly added
+        ///     sub-menu trigger.
+        /// </remarks>
+        /// <seealso cref="glutAddSubMenu" />
+        /// <seealso cref="glutChangeToMenuEntry" />
+        /// <seealso cref="glutRemoveMenuItem" />
+        // GLUTAPI void APIENTRY glutChangeToSubMenu(int item, const char *label, int menu);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutChangeToSubMenu(int entry, string name, int menu);
+        #endregion glutChangeToSubMenu(int entry, string name, int menu)
+
+        #region glutRemoveMenuItem(int entry)
+        /// <summary>
+        ///     Removes the specified menu item.
+        /// </summary>
+        /// <param name="entry">
+        ///     Index into the menu items of the current menu (1 is the topmost menu item).
+        /// </param>
+        /// <remarks>
+        ///     <b>glutRemoveMenuItem</b> remove the entry menu item regardless of whether it
+        ///     is a menu entry or sub-menu trigger.  <i>entry</i> must be between 1 and
+        ///     <c>Glut.glutGet(Glut.GLUT_MENU_NUM_ITEMS)</c> inclusive.  Menu items below
+        ///     the removed menu item are renumbered.
+        /// </remarks>
+        /// <seealso cref="glutAddMenuEntry" />
+        /// <seealso cref="glutAddSubMenu" />
+        /// <seealso cref="glutChangeToMenuEntry" />
+        /// <seealso cref="glutChangeToSubMenu" />
+        // GLUTAPI void APIENTRY glutRemoveMenuItem(int item);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutRemoveMenuItem(int entry);
+        #endregion glutRemoveMenuItem(int entry)
+
+        #region glutAttachMenu(int button)
+        /// <summary>
+        ///     Attaches a mouse button for the current window to the identifier of the current
+        ///     menu.
+        /// </summary>
+        /// <param name="button">
+        ///     The button to attach a menu.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutAttachMenu</b> attaches a mouse button for the current window to the
+        ///     identifier of the current menu.  By attaching a menu identifier to a button,
+        ///     the named menu will be popped up when the user presses the specified button.
+        ///     <i>button</i> should be one of <see cref="GLUT_LEFT_BUTTON" />,
+        ///     <see cref="GLUT_MIDDLE_BUTTON" />, and <see cref="GLUT_RIGHT_BUTTON" />.
+        ///     Note that the menu is attached to the button by identifier, not by reference.
+        /// </remarks>
+        /// <seealso cref="glutCreateMenu" />
+        /// <seealso cref="glutDetachMenu" />
+        /// <seealso cref="glutMenuStatusFunc" />
+        /// <seealso cref="glutMouseFunc" />
+        // GLUTAPI void APIENTRY glutAttachMenu(int button);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutAttachMenu(int button);
+        #endregion glutAttachMenu(int button)
+
+        #region glutDetachMenu(int button)
+        /// <summary>
+        ///     Detaches an attached mouse button from the current window.
+        /// </summary>
+        /// <param name="button">
+        ///     The button to detach a menu.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutDetachMenu</b> detaches an attached mouse button from the current
+        ///     window.  <i>button</i> should be one of <see cref="GLUT_LEFT_BUTTON" />,
+        ///     <see cref="GLUT_MIDDLE_BUTTON" />, and <see cref="GLUT_RIGHT_BUTTON" />.  Note
+        ///     that the menu is attached to the button by identifier, not by reference.
+        /// </remarks>
+        /// <seealso cref="glutAttachMenu" />
+        /// <seealso cref="glutCreateMenu" />
+        /// <seealso cref="glutDetachMenu" />
+        /// <seealso cref="glutMenuStatusFunc" />
+        /// <seealso cref="glutMouseFunc" />
+        // GLUTAPI void APIENTRY glutDetachMenu(int button);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutDetachMenu(int button);
+        #endregion glutDetachMenu(int button)
+        #endregion Menu Sub-API
+
+        #region Callback Sub-API
+        #region int glutCreateMenu([In] CreateMenuCallback func)
+        /// <summary>
+        ///     Creates a new pop-up menu.
+        /// </summary>
+        /// <param name="func">
+        ///     The callback function for the menu that is called when a menu entry from the
+        ///     menu is selected.  The value passed to the callback is determined by the value
+        ///     for the selected menu entry.  See <see cref="CreateMenuCallback" />.
+        /// </param>
+        /// <returns>
+        ///     Returns a unique small integer identifier.  The range of allocated identifiers
+        ///     starts at one.  The menu identifier range is separate from the window
+        ///     identifier range.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutCreateMenu</b> creates a new pop-up menu and returns a unique small
+        ///         integer identifier.  The range of allocated identifiers starts at one.  The
+        ///         menu identifier range is separate from the window identifier range.
+        ///         Implicitly, the current menu is set to the newly created menu.  This menu
+        ///         identifier can be used when calling <see cref="glutSetMenu" />.
+        ///     </para>
+        ///     <para>
+        ///         When the menu callback is called because a menu entry is selected for the
+        ///         menu, the current menu will be implicitly set to the menu with the selected
+        ///         entry before the callback is made.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         Here is a quick example of how to create a GLUT popup menu with two submenus
+        ///         and attach it to the right button of the current window:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             int submenu1, submenu2;
+        ///
+        ///             submenu1 = Glut.glutCreateMenu(selectMessage);
+        ///             Glut.glutAddMenuEntry("abc", 1);
+        ///             Glut.glutAddMenuEntry("ABC", 2);
+        ///
+        ///             submenu2 = Glut.glutCreateMenu(selectColor);
+        ///             Glut.glutAddMenuEntry("Green", 1);
+        ///             Glut.glutAddMenuEntry("Red", 2);
+        ///             Glut.glutAddMenuEntry("White", 3);
+        ///
+        ///             Glut.glutCreateMenu(selectFont);
+        ///             Glut.glutAddMenuEntry("9 by 15", 0);
+        ///             Glut.glutAddMenuEntry("Times Roman 10", 1);
+        ///             Glut.glutAddMenuEntry("Times Roman 24", 2);
+        ///             Glut.glutAddSubMenu("Messages", submenu1);
+        ///             Glut.glutAddSubMenu("Color", submenu2);
+        ///             Glut.glutAttachMenu(Glut.GLUT_RIGHT_BUTTON);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         If available, GLUT for X will take advantage of overlay planes for
+        ///         implementing pop-up menus.  The use of overlay planes can eliminate display
+        ///         callbacks when pop-up menus are deactivated.  The SERVER_OVERLAY_VISUALS
+        ///         convention is used to determine if overlay visuals are available.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="CreateMenuCallback" />
+        /// <seealso cref="glutAttachMenu" />
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutDestroyMenu" />
+        /// <seealso cref="glutSetMenu" />
+        // GLUTAPI int APIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int));
+        public static int glutCreateMenu([In] CreateMenuCallback func) {
+            createMenuCallback = func;
+            return __glutCreateMenu(createMenuCallback);
+        }
+        #endregion int glutCreateMenu([In] CreateMenuCallback func)
+
+        #region glutDisplayFunc([In] DisplayCallback func)
+        /// <summary>
+        ///     Sets the display callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new display callback function.  See <see cref="DisplayCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutDisplayFunc</b> sets the display callback for the current window.  When
+        ///         GLUT determines that the normal plane for the window needs to be redisplayed,
+        ///         the display callback for the window is called.  Before the callback, the
+        ///         current window is set to the window needing to be redisplayed and (if no
+        ///         overlay display callback is registered) the layer in use is set to the normal
+        ///         plane.  The display callback is called with no parameters.  The entire normal
+        ///         plane region should be redisplayed in response to the callback (this includes
+        ///         ancillary buffers if your program depends on their state).
+        ///     </para>
+        ///     <para>
+        ///         GLUT determines when the display callback should be triggered based on the
+        ///         window's redisplay state.  The redisplay state for a window can be either set
+        ///         explicitly by calling <see cref="glutPostRedisplay" /> or implicitly as the
+        ///         result of window damage reported by the window system.  Multiple posted
+        ///         redisplays for a window are coalesced by GLUT to minimize the number of
+        ///         display callbacks called.
+        ///     </para>
+        ///     <para>
+        ///         When an overlay is established for a window, but there is no overlay display
+        ///         callback registered, the display callback is used for redisplaying both the
+        ///         overlay and normal plane (that is, it will be called if either the redisplay
+        ///         state or overlay redisplay state is set).  In this case, the layer in use is
+        ///         not implicitly changed on entry to the display callback.
+        ///     </para>
+        ///     <para>
+        ///         See <see cref="glutOverlayDisplayFunc" /> to understand how distinct callbacks
+        ///         for the overlay and normal plane of a window may be established.
+        ///     </para>
+        ///     <para>
+        ///         When a window is created, no display callback exists for the window.  It is
+        ///         the responsibility of the programmer to install a display callback for the
+        ///         window before the window is shown.  A display callback must be registered for
+        ///         any window that is shown.  If a window becomes displayed without a display
+        ///         callback being registered, a fatal error occurs.  Passing <c>null</c> to
+        ///         <b>glutDisplayFunc</b> is illegal as of GLUT 3.0; there is no way to
+        ///         "deregister" a display callback (though another callback routine can always be
+        ///         registered).
+        ///     </para>
+        ///     <para>
+        ///         Upon return from the display callback, the normal damaged state of the window
+        ///         (returned by calling <c>Glut.glutLayerGet(Glut.GLUT_NORMAL_DAMAGED)</c> is
+        ///         cleared.  If there is no overlay display callback registered the overlay
+        ///         damaged state of the window (returned by calling
+        ///         <c>Glut.glutLayerGet(Glut.GLUT_OVERLAY_DAMAGED)</c> is also cleared.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="DisplayCallback" />
+        /// <seealso cref="glutLayerGet" />
+        /// <seealso cref="glutOverlayDisplayFunc" />
+        // GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));
+        public static void glutDisplayFunc([In] DisplayCallback func) {
+            displayCallback = func;
+            __glutDisplayFunc(displayCallback);
+        }
+        #endregion glutDisplayFunc([In] DisplayCallback func)
+
+        #region glutReshapeFunc([In] ReshapeCallback func)
+        /// <summary>
+        ///     Sets the reshape callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new reshape callback function.  See <see cref="ReshapeCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutReshapeFunc</b> sets the reshape callback for the current window.  The
+        ///         reshape callback is triggered when a window is reshaped.  A reshape callback
+        ///         is also triggered immediately before a window's first display callback after a
+        ///         window is created or whenever an overlay for the window is established.  The
+        ///         <i>width</i> and <i>height</i> parameters of the callback specify the new
+        ///         window size in pixels.  Before the callback, the current window is set to the
+        ///         window that has been reshaped.
+        ///     </para>
+        ///     <para>
+        ///         If a reshape callback is not registered for a window or <c>null</c> is passed
+        ///         to <b>glutReshapeFunc</b> (to deregister a previously registered callback),
+        ///         the default reshape callback is used.  This default callback will simply call
+        ///         <c>Gl.glViewport(0, 0, width, height)</c> on the normal plane (and on the
+        ///         overlay if one exists).
+        ///     </para>
+        ///     <para>
+        ///         If an overlay is established for the window, a single reshape callback is
+        ///         generated.  It is the callback's responsibility to update both the normal
+        ///         plane and overlay for the window (changing the layer in use as necessary).
+        ///     </para>
+        ///     <para>
+        ///         When a top-level window is reshaped, subwindows are not reshaped.  It is up to
+        ///         the GLUT program to manage the size and positions of subwindows within a
+        ///         top-level window.  Still, reshape callbacks will be triggered for subwindows
+        ///         when their size is changed using <see cref="glutReshapeWindow" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="ReshapeCallback" />
+        /// <seealso cref="glutReshapeWindow" />
+        // GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height));
+        public static void glutReshapeFunc([In] ReshapeCallback func) {
+            reshapeCallback = func;
+            __glutReshapeFunc(reshapeCallback);
+        }
+        #endregion glutReshapeFunc([In] ReshapeCallback func)
+
+        #region glutKeyboardFunc([In] KeyboardCallback func)
+        /// <summary>
+        ///     Sets the keyboard callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new keyboard callback function.  See <see cref="KeyboardCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutKeyboardFunc</b> sets the keyboard callback for the current window.
+        ///         When a user types into the window, each key press generating an ASCII
+        ///         character will generate a keyboard callback.  The <i>key</i> callback
+        ///         parameter is the generated ASCII character.  The state of modifier keys such
+        ///         as Shift cannot be determined directly; their only effect will be on the
+        ///         returned ASCII data.  The <i>x</i> and <i>y</i> callback parameters indicate
+        ///         the mouse location in window relative coordinates when the key was pressed.
+        ///         When a new window is created, no keyboard callback is initially registered,
+        ///         and ASCII key strokes in the window are ignored.  Passing <c>null</c> to
+        ///         <b>glutKeyboardFunc</b> disables the generation of keyboard callbacks.
+        ///     </para>
+        ///     <para>
+        ///         During a keyboard callback, <see cref="glutGetModifiers" /> may be called to
+        ///         determine the state of modifier keys when the keystroke generating the
+        ///         callback occurred.
+        ///     </para>
+        ///     <para>
+        ///         Also, see <see cref="glutSpecialFunc" /> for a means to detect non-ASCII key
+        ///         strokes.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="KeyboardCallback" />
+        /// <seealso cref="glutGetModifiers" />
+        /// <seealso cref="glutSpecialFunc" />
+        // GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
+        public static void glutKeyboardFunc([In] KeyboardCallback func) {
+            keyboardCallback = func;
+            __glutKeyboardFunc(keyboardCallback);
+        }
+        #endregion glutKeyboardFunc([In] KeyboardCallback func)
+
+        #region glutMouseFunc([In] MouseCallback func)
+        /// <summary>
+        ///     Sets the mouse callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new mouse callback function.  See <see cref="MouseCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutMouseFunc</b> sets the mouse callback for the current window.  When a
+        ///         user presses and releases mouse buttons in the window, each press and each
+        ///         release generates a mouse callback.  The <i>button</i> parameter is one of
+        ///         <see cref="GLUT_LEFT_BUTTON" />, <see cref="GLUT_MIDDLE_BUTTON" />, or
+        ///         <see cref="GLUT_RIGHT_BUTTON" />.  For systems with only two mouse buttons, it
+        ///         may not be possible to generate the <i>GLUT_MIDDLE_BUTTON</i> callback.  For
+        ///         systems with a single mouse button, it may be possible to generate only a
+        ///         <i>GLUT_LEFT_BUTTON</i> callback.  The <i>state</i> parameter is either
+        ///         <see cref="GLUT_UP" /> or <see cref="GLUT_DOWN" /> indicating whether the
+        ///         callback was due to a release or press respectively.  The <i>x</i> and
+        ///         <i>y</i> callback parameters indicate the window relative coordinates when the
+        ///         mouse button state changed.  If a <i>GLUT_DOWN</i> callback for a specific
+        ///         button is triggered, the program can assume a <i>GLUT_UP</i> callback for the
+        ///         same button will be generated (assuming the window still has a mouse callback
+        ///         registered) when the mouse button is released even if the mouse has moved
+        ///         outside the window.
+        ///     </para>
+        ///     <para>
+        ///         If a menu is attached to a button for a window, mouse callbacks will not be
+        ///         generated for that button.
+        ///     </para>
+        ///     <para>
+        ///         During a mouse callback, <see cref="glutGetModifiers" /> may be called to
+        ///         determine the state of modifier keys when the mouse event generating the
+        ///         callback occurred.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutMouseFunc</b> disables the generation of mouse
+        ///         callbacks.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="MouseCallback" />
+        /// <seealso cref="glutGetModifiers" />
+        // GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
+        public static void glutMouseFunc([In] MouseCallback func) {
+            mouseCallback = func;
+            __glutMouseFunc(mouseCallback);
+        }
+        #endregion glutMouseFunc([In] MouseCallback func)
+
+        #region glutMotionFunc([In] MotionCallback func)
+        /// <summary>
+        ///     Sets the motion callbacks for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new motion callback function.  See <see cref="MotionCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutMotionFunc</b> sets the motion callback for the current window.  The
+        ///         motion callback for a window is called when the mouse moves within the window
+        ///         while one or more mouse buttons are pressed.
+        ///     </para>
+        ///     <para>
+        ///         The <i>x</i> and <i>y</i> callback parameters indicate the mouse location in
+        ///         window relative coordinates.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutMotionFunc</b> disables the generation of the
+        ///         motion callback.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="MotionCallback" />
+        /// <seealso cref="glutPassiveMotionFunc" />
+        // GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+        public static void glutMotionFunc([In] MotionCallback func) {
+            motionCallback = func;
+            __glutMotionFunc(motionCallback);
+        }
+        #endregion glutMotionFunc([In] MotionCallback func)
+
+        #region glutPassiveMotionFunc([In] PassiveMotionCallback func)
+        /// <summary>
+        ///     Sets the passive motion callbacks for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new passive motion callback function.  See
+        ///     <see cref="PassiveMotionCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutPassiveMotionFunc</b> sets the passive motion callback for the current
+        ///         window.  The passive motion callback for a window is called when the mouse
+        ///         moves within the window while no mouse buttons are pressed.
+        ///     </para>
+        ///     <para>
+        ///         The <i>x</i> and <i>y</i> callback parameters indicate the mouse location in
+        ///         window relative coordinates.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutPassiveMotionFunc</b> disables the generation of
+        ///         the passive motion callback.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="PassiveMotionCallback" />
+        /// <seealso cref="glutMotionFunc" />
+        // GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+        public static void glutPassiveMotionFunc([In] PassiveMotionCallback func) {
+            passiveMotionCallback = func;
+            __glutPassiveMotionFunc(passiveMotionCallback);
+        }
+        #endregion glutPassiveMotionFunc([In] PassiveMotionCallback func)
+
+        #region glutEntryFunc([In] EntryCallback func)
+        /// <summary>
+        ///     Sets the mouse enter/leave callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new entry callback function.  See <see cref="EntryCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutEntryFunc</b> sets the mouse enter/leave callback for the current
+        ///         window.  The state callback parameter is either <see cref="GLUT_LEFT" /> or
+        ///         <see cref="GLUT_ENTERED" /> depending on if the mouse pointer has last left or
+        ///         entered the window.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutEntryFunc</b> disables the generation of the
+        ///         mouse enter/leave callback.
+        ///     </para>
+        ///     <para>
+        ///         Some window systems may not generate accurate enter/leave callbacks.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="EntryCallback" />
+        // GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state));
+        public static void glutEntryFunc([In] EntryCallback func) {
+            entryCallback = func;
+            __glutEntryFunc(entryCallback);
+        }
+        #endregion glutEntryFunc([In] EntryCallback func)
+
+        #region glutVisibilityFunc([In] VisibilityCallback func)
+        /// <summary>
+        ///     Sets the visibility callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new visibility callback function.  See <see cref="VisibilityCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutVisibilityFunc</b> sets the visibility callback for the current window.
+        ///         The visibility callback for a window is called when the visibility of a
+        ///         window changes.  The state callback parameter is either
+        ///         <see cref="GLUT_NOT_VISIBLE" /> or <see cref="GLUT_VISIBLE" /> depending on
+        ///         the current visibility of the window.  <i>GLUT_VISIBLE</i> does not
+        ///         distinguish a window being totally versus partially visible.
+        ///         <i>GLUT_NOT_VISIBLE</i> means no part of the window is visible, i.e., until
+        ///         the window's visibility changes, all further rendering to the window is
+        ///         discarded.
+        ///     </para>
+        ///     <para>
+        ///         GLUT considers a window visible if any pixel of the window is visible or any
+        ///         pixel of any descendant window is visible on the screen.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutVisibilityFunc</b> disables the generation of
+        ///         the visibility callback.
+        ///     </para>
+        ///     <para>
+        ///         If the visibility callback for a window is disabled and later re-enabled, the
+        ///         visibility status of the window is undefined; any change in window visibility
+        ///         will be reported, that is if you disable a visibility callback and re-enable
+        ///         the callback, you are guaranteed the next visibility change will be reported.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="VisibilityCallback" />
+        // GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state));
+        public static void glutVisibilityFunc([In] VisibilityCallback func) {
+            visibilityCallback = func;
+            __glutVisibilityFunc(visibilityCallback);
+        }
+        #endregion glutVisibilityFunc([In] VisibilityCallback func)
+
+        #region glutIdleFunc([In] IdleCallback func)
+        /// <summary>
+        ///     Sets the global idle callback.
+        /// </summary>
+        /// <param name="func">
+        ///     The new idle callback function.  See <see cref="IdleCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutIdleFunc</b> sets the global idle callback to be func so a GLUT program
+        ///         can perform background processing tasks or continuous animation when window
+        ///         system events are not being received.  If enabled, the idle callback is
+        ///         continuously called when events are not being received.  The callback routine
+        ///         has no parameters.  The current window and current menu will not be changed
+        ///         before the idle callback.  Programs with multiple windows and/or menus should
+        ///         explicitly set the current window and/or current menu and not rely on its
+        ///         current setting.
+        ///     </para>
+        ///     <para>
+        ///         The amount of computation and rendering done in an idle callback should be
+        ///         minimized to avoid affecting the program's interactive response.  In general,
+        ///         not more than a single frame of rendering should be done in an idle callback.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutIdleFunc</b> disables the generation of the idle
+        ///         callback.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="IdleCallback" />
+        // GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void));
+        public static void glutIdleFunc([In] IdleCallback func) {
+            idleCallback = func;
+            __glutIdleFunc(idleCallback);
+        }
+        #endregion glutIdleFunc([In] IdleCallback func)
+
+        #region glutTimerFunc(int msecs, [In] TimerCallback func, int val)
+        /// <summary>
+        ///     Registers a timer callback to be triggered in a specified number of milliseconds.
+        /// </summary>
+        /// <param name="msecs">
+        ///     The number of milliseconds between calls to the timer callback.
+        /// </param>
+        /// <param name="func">
+        ///     The new timer callback function.  See <see cref="TimerCallback" />.
+        /// </param>
+        /// <param name="val">
+        ///     The value to be passed to the timer callback.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutTimerFunc</b> registers the timer callback <i>func</i> to be triggered
+        ///         in at least <i>msecs</i> milliseconds.  The <i>val</i> parameter to the timer
+        ///         callback will be the value of the <i>val</i> parameter to
+        ///         <b>glutTimerFunc</b>.  Multiple timer callbacks at same or differing times may
+        ///         be registered simultaneously.
+        ///     </para>
+        ///     <para>
+        ///         The number of milliseconds is a lower bound on the time before the callback is
+        ///         generated.  GLUT attempts to deliver the timer callback as soon as possible
+        ///         after the expiration of the callback's time interval.
+        ///     </para>
+        ///     <para>
+        ///         There is no support for canceling a registered callback.  Instead, ignore a
+        ///         callback based on its <i>val</i> parameter when it is triggered.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TimerCallback" />
+        // GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value);
+        public static void glutTimerFunc(int msecs, [In] TimerCallback func, int val) {
+            timerCallback = func;
+            __glutTimerFunc(msecs, timerCallback, val);
+        }
+        #endregion glutTimerFunc(int msecs, [In] TimerCallback func, int val)
+
+        #region glutMenuStateFunc([In] MenuStateCallback func)
+        /// <summary>
+        ///     A deprecated version of the <see cref="glutMenuStatusFunc" /> routine.
+        /// </summary>
+        /// <param name="func">
+        ///     The new menu state callback function.  <see cref="MenuStateCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     The only difference is <b>glutMenuStateFunc</b> callback prototype does not
+        ///     deliver the two additional <i>x</i> and <i>y</i> coordinates.
+        /// </remarks>
+        /// <seealso cref="MenuStateCallback" />
+        /// <seealso cref="MenuStatusCallback" />
+        /// <seealso cref="glutMenuStatusFunc" />
+        // GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state));
+        public static void glutMenuStateFunc([In] MenuStateCallback func) {
+            menuStateCallback = func;
+            __glutMenuStateFunc(menuStateCallback);
+        }
+        #endregion glutMenuStateFunc([In] MenuStateCallback func)
+
+        #region glutSpecialFunc([In] SpecialCallback func)
+        /// <summary>
+        ///     Sets the special keyboard callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new special callback function.  See <see cref="SpecialCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutSpecialFunc</b> sets the special keyboard callback for the current
+        ///         window.  The special keyboard callback is triggered when keyboard function or
+        ///         directional keys are pressed.  The <i>key</i> callback parameter is a
+        ///         GLUT_KEY_* constant for the special key pressed.  The <i>x</i> and <i>y</i>
+        ///         callback parameters indicate the mouse in window relative coordinates when the
+        ///         key was pressed.  When a new window is created, no special callback is
+        ///         initially registered and special key strokes in the window are ignored.
+        ///         Passing <c>null</c> to <b>glutSpecialFunc</b> disables the generation of
+        ///         special callbacks.
+        ///     </para>
+        ///     <para>
+        ///         During a special callback, <see cref="glutGetModifiers" /> may be called to
+        ///         determine the state of modifier keys when the keystroke generating the
+        ///         callback occurred.
+        ///     </para>
+        ///     <para>
+        ///         An implementation should do its best to provide ways to generate all the
+        ///         GLUT_KEY_* special keys.  The available GLUT_KEY_* values are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F1" /></term>
+        ///                 <description>F1 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F2" /></term>
+        ///                 <description>F2 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F3" /></term>
+        ///                 <description>F3 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F4" /></term>
+        ///                 <description>F4 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F5" /></term>
+        ///                 <description>F5 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F6" /></term>
+        ///                 <description>F6 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F7" /></term>
+        ///                 <description>F7 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F8" /></term>
+        ///                 <description>F8 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F9" /></term>
+        ///                 <description>F9 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F10" /></term>
+        ///                 <description>F10 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F11" /></term>
+        ///                 <description>F11 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F12" /></term>
+        ///                 <description>F12 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_LEFT" /></term>
+        ///                 <description>Left directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_UP" /></term>
+        ///                 <description>Up directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_RIGHT" /></term>
+        ///                 <description>Right directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_DOWN" /></term>
+        ///                 <description>Down directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_PAGE_UP" /></term>
+        ///                 <description>Page up directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_PAGE_DOWN" /></term>
+        ///                 <description>Page down directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_HOME" /></term>
+        ///                 <description>Home directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_END" /></term>
+        ///                 <description>End directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_INSERT" /></term>
+        ///                 <description>Insert directional key.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         Note that the escape, backspace, and delete keys are generated as an ASCII
+        ///         character.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="SpecialCallback" />
+        /// <seealso cref="glutGetModifiers" />
+        // GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
+        public static void glutSpecialFunc([In] SpecialCallback func) {
+            specialCallback = func;
+            __glutSpecialFunc(specialCallback);
+        }
+        #endregion glutSpecialFunc([In] SpecialCallback func)
+
+        #region glutSpaceballMotionFunc([In] SpaceballMotionCallback func)
+        /// <summary>
+        ///     Sets the Spaceball motion callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new Spaceball motion callback function.  See
+        ///     <see cref="SpaceballMotionCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutSpaceballMotionFunc</b> sets the Spaceball motion callback for the
+        ///         current window.  The Spaceball motion callback for a window is called when the
+        ///         window has Spaceball input focus (normally, when the mouse is in the window)
+        ///         and the user generates Spaceball translations.  The <i>x</i>, <i>y</i>, and
+        ///         <i>z</i> callback parameters indicate the translations along the X, Y, and Z
+        ///         axes.  The callback parameters are normalized to be within the range of -1000
+        ///         to 1000 inclusive.
+        ///     </para>
+        ///     <para>
+        ///         Registering a Spaceball motion callback when a Spaceball device is not
+        ///         available has no effect and is not an error.  In this case, no Spaceball
+        ///         motion callbacks will be generated.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutSpaceballMotionFunc</b> disables the generation
+        ///         of Spaceball motion callbacks.  When a new window is created, no Spaceball
+        ///         motion callback is initially registered.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="SpaceballMotionCallback" />
+        // GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
+        public static void glutSpaceballMotionFunc([In] SpaceballMotionCallback func) {
+            spaceballMotionCallback = func;
+            __glutSpaceballMotionFunc(spaceballMotionCallback);
+        }
+        #endregion glutSpaceballMotionFunc([In] SpaceballMotionCallback func)
+
+        #region glutSpaceballRotateFunc([In] SpaceballRotateCallback func)
+        /// <summary>
+        ///     Sets the Spaceball rotation callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new Spaceball rotate callback function.  See
+        ///     <see cref="SpaceballRotateCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutSpaceballRotateFunc</b> sets the Spaceball rotate callback for the
+        ///         current window.  The Spaceball rotate callback for a window is called when the
+        ///         window has Spaceball input focus (normally, when the mouse is in the window)
+        ///         and the user generates Spaceball rotations.  The <i>x</i>, <i>y</i>, and
+        ///         <i>z</i> callback parameters indicate the rotation along the X, Y, and Z
+        ///         axes.  The callback parameters are normalized to be within the range of -1800
+        ///         to 1800 inclusive.
+        ///     </para>
+        ///     <para>
+        ///         Registering a Spaceball rotate callback when a Spaceball device is not
+        ///         available is ineffectual and not an error.  In this case, no Spaceball rotate
+        ///         callbacks will be generated.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutSpaceballRotateFunc</b> disables the generation
+        ///         of Spaceball rotate callbacks.  When a new window is created, no Spaceball
+        ///         rotate callback is initially registered.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="SpaceballRotateCallback" />
+        // GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
+        public static void glutSpaceballRotateFunc([In] SpaceballRotateCallback func) {
+            spaceballRotateCallback = func;
+            __glutSpaceballRotateFunc(spaceballRotateCallback);
+        }
+        #endregion glutSpaceballRotateFunc([In] SpaceballRotateCallback func)
+
+        #region glutSpaceballButtonFunc([In] SpaceballButtonCallback func)
+        /// <summary>
+        ///     Sets the Spaceball button callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new Spaceball button callback function.  See
+        ///     <see cref="SpaceballButtonCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutSpaceballButtonFunc</b> sets the Spaceball button callback for the
+        ///         current window.  The Spaceball button callback for a window is called when the
+        ///         window has Spaceball input focus (normally, when the mouse is in the window)
+        ///         and the user generates Spaceball button presses.  The <i>button</i> parameter
+        ///         will be the button number (starting at one).  The number of available
+        ///         Spaceball buttons can be determined with
+        ///         <c>glutDeviceGet(GLUT_NUM_SPACEBALL_BUTTONS)</c>.  The <i>state</i> is either
+        ///         <see cref="GLUT_UP" /> or <see cref="GLUT_DOWN" /> indicating whether the
+        ///         callback was due to a release or press respectively.
+        ///     </para>
+        ///     <para>
+        ///         Registering a Spaceball button callback when a Spaceball device is not
+        ///         available is ineffectual and not an error.  In this case, no Spaceball button
+        ///         callbacks will be generated.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutSpaceballButtonFunc</b> disables the generation
+        ///         of Spaceball button callbacks.  When a new window is created, no Spaceball
+        ///         button callback is initially registered.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="SpaceballButtonCallback" />
+        /// <seealso cref="glutDeviceGet" />
+        // GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state));
+        public static void glutSpaceballButtonFunc([In] SpaceballButtonCallback func) {
+            spaceballButtonCallback = func;
+            __glutSpaceballButtonFunc(spaceballButtonCallback);
+        }
+        #endregion glutSpaceballButtonFunc([In] SpaceballButtonCallback func)
+
+        #region glutButtonBoxFunc([In] ButtonBoxCallback func)
+        /// <summary>
+        ///     Sets the dial and button box button callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new button box callback function.  See <see cref="ButtonBoxCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutButtonBoxFunc</b> sets the dial and button box button callback for the
+        ///         current window.  The dial and button box button callback for a window is
+        ///         called when the window has dial and button box input focus (normally, when the
+        ///         mouse is in the window) and the user generates dial and button box button
+        ///         presses.  The <i>button</i> parameter will be the button number (starting at
+        ///         one).  The number of available dial and button box buttons can be determined
+        ///         with <c>Glut.glutDeviceGet(Glut.GLUT_NUM_BUTTON_BOX_BUTTONS)</c>.  The
+        ///         <i>state</i> is either <see cref="GLUT_UP" /> or <see cref="GLUT_DOWN" />
+        ///         indicating whether the callback was due to a release or press respectively.
+        ///     </para>
+        ///     <para>
+        ///         Registering a dial and button box button callback when a dial and button box
+        ///         device is not available is ineffectual and not an error.  In this case, no
+        ///         dial and button box button callbacks will be generated.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutButtonBoxFunc</b> disables the generation of
+        ///         dial and button box button callbacks.  When a new window is created, no dial
+        ///         and button box button callback is initially registered.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="ButtonBoxCallback" />
+        /// <seealso cref="glutDeviceGet" />
+        // GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state));
+        public static void glutButtonBoxFunc([In] ButtonBoxCallback func) {
+            buttonBoxCallback = func;
+            __glutButtonBoxFunc(buttonBoxCallback);
+        }
+        #endregion glutButtonBoxFunc([In] ButtonBoxCallback func)
+
+        #region glutDialsFunc([In] DialsCallback func)
+        /// <summary>
+        ///     Sets the dial and button box dials callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new dials callback function.  See <see cref="DialsCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutDialsFunc</b> sets the dial and button box dials callback for the
+        ///         current window.  The dial and button box dials callback for a window is called
+        ///         when the window has dial and button box input focus (normally, when the mouse
+        ///         is in the window) and the user generates dial and button box dial changes.
+        ///         The <i>dial</i> parameter will be the dial number (starting at one).  The
+        ///         number of available dial and button box dials can be determined with
+        ///         <c>Glut.glutDeviceGet(Glut.GLUT_NUM_DIALS)</c>.  The <i>val</i> measures the
+        ///         absolute rotation in degrees.  Dial values do not "roll over" with each
+        ///         complete rotation but continue to accumulate degrees (until the <c>int</c>
+        ///         dial value overflows).
+        ///     </para>
+        ///     <para>
+        ///         Registering a dial and button box dials callback when a dial and button box
+        ///         device is not available is ineffectual and not an error.  In this case, no
+        ///         dial and button box dials callbacks will be generated.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutDialsFunc</b> disables the generation of dial
+        ///         and button box dials callbacks.  When a new window is created, no dial and
+        ///         button box dials callback is initially registered.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="DialsCallback" />
+        /// <seealso cref="glutDeviceGet" />
+        // GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value));
+        public static void glutDialsFunc([In] DialsCallback func) {
+            dialsCallback = func;
+            __glutDialsFunc(dialsCallback);
+        }
+        #endregion glutDialsFunc([In] DialsCallback func)
+
+        #region glutTabletMotionFunc([In] TabletMotionCallback func)
+        /// <summary>
+        ///     Sets the tablet motion callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new tablet motion callback function.  See
+        ///     <see cref="TabletMotionCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutTabletMotionFunc</b> sets the tablet motion callback for the current
+        ///         window.  The tablet motion callback for a window is called when the window has
+        ///         tablet input focus (normally, when the mouse is in the window) and the user
+        ///         generates tablet motion.  The <i>x</i> and <i>y</i> callback parameters
+        ///         indicate the absolute position of the tablet "puck" on the tablet.  The
+        ///         callback parameters are normalized to be within the range of 0 to 2000
+        ///         inclusive.
+        ///     </para>
+        ///     <para>
+        ///         Registering a tablet motion callback when a tablet device is not available is
+        ///         ineffectual and not an error.  In this case, no tablet motion callbacks will
+        ///         be generated.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutTabletMotionFunc</b> disables the generation of
+        ///         tablet motion callbacks.  When a new window is created, no tablet motion
+        ///         callback is initially registered.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TabletMotionCallback" />
+        // GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+        public static void glutTabletMotionFunc([In] TabletMotionCallback func) {
+            tabletMotionCallback = func;
+            __glutTabletMotionFunc(tabletMotionCallback);
+        }
+        #endregion glutTabletMotionFunc([In] TabletMotionCallback func)
+
+        #region glutTabletButtonFunc([In] TabletButtonCallback func)
+        /// <summary>
+        ///     Sets the tablet button callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new tablet button callback function.  See
+        ///     <see cref="TabletButtonCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutTabletButtonFunc</b> sets the tablet button callback for the current
+        ///         window.  The tablet button callback for a window is called when the window has
+        ///         tablet input focus (normally, when the mouse is in the window) and the user
+        ///         generates tablet button presses.  The <i>button</i> parameter will be the
+        ///         button number (starting at one).  The number of available tablet buttons can
+        ///         be determined with <c>Glut.glutDeviceGet(Glut.GLUT_NUM_TABLET_BUTTONS)</c>.
+        ///         The <i>state</i> is either <see cref="GLUT_UP" /> or <see cref="GLUT_DOWN" />
+        ///         indicating whether the callback was due to a release or press respectively.
+        ///         The <i>x</i> and <i>y</i> callback parameters indicate the window relative
+        ///         coordinates when the tablet button state changed.
+        ///     </para>
+        ///     <para>
+        ///         Registering a tablet button callback when a tablet device is not available is
+        ///         ineffectual and not an error.  In this case, no tablet button callbacks will
+        ///         be generated.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutTabletButtonFunc</b> disables the generation of
+        ///         tablet button callbacks.  When a new window is created, no tablet button
+        ///         callback is initially registered.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TabletButtonCallback" />
+        /// <seealso cref="glutDeviceGet" />
+        // GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
+        public static void glutTabletButtonFunc([In] TabletButtonCallback func) {
+            tabletButtonCallback = func;
+            __glutTabletButtonFunc(tabletButtonCallback);
+        }
+        #endregion glutTabletButtonFunc([In] TabletButtonCallback func)
+
+        #region glutMenuStatusFunc([In] MenuStatusCallback func)
+        /// <summary>
+        ///     Sets the global menu status callback.
+        /// </summary>
+        /// <param name="func">
+        ///     The new menu status button callback function.  See
+        ///     <see cref="MenuStatusCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutMenuStatusFunc</b> sets the global menu status callback so a GLUT
+        ///         program can determine when a menu is in use or not.  When a menu status
+        ///         callback is registered, it will be called with the value
+        ///         <see cref="GLUT_MENU_IN_USE" /> for its <i>val</i> parameter when pop-up menus
+        ///         are in use by the user; and the callback will be called with the value
+        ///         <see cref="GLUT_MENU_NOT_IN_USE" /> for its <i>status</i> parameter when
+        ///         pop-up menus are no longer in use.  The <i>x</i> and <i>y</i> parameters
+        ///         indicate the location in window coordinates of the button press that caused
+        ///         the menu to go into use, or the location where the menu was released (may be
+        ///         outside the window).  The <i>func</i> parameter names the callback function.
+        ///         Other callbacks continue to operate (except mouse motion callbacks) when
+        ///         pop-up menus are in use so the menu status callback allows a program to
+        ///         suspend animation or other tasks when menus are in use.  The cascading and
+        ///         unmapping of sub-menus from an initial pop-up menu does not generate menu
+        ///         status callbacks.  There is a single menu status callback for GLUT.
+        ///     </para>
+        ///     <para>
+        ///         When the menu status callback is called, the current menu will be set to the
+        ///         initial pop-up menu in both the <i>GLUT_MENU_IN_USE</i> and
+        ///         <i>GLUT_MENU_NOT_IN_USE</i> cases.  The current window will be set to the
+        ///         window from which the initial menu was popped up from, also in both cases.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutMenuStatusFunc</b> disables the generation of
+        ///         the menu status callback.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="glutMenuStateFunc" /> is a deprecated version of the
+        ///         <b>glutMenuStatusFunc</b> routine.  The only difference is
+        ///         <b>glutMenuStateFunc</b> callback prototype does not deliver the two
+        ///         additional <i>x</i> and <i>y</i> coordinates.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="MenuStateCallback" />
+        /// <seealso cref="MenuStatusCallback" />
+        /// <seealso cref="glutMenuStateFunc" />
+        // GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y));
+        public static void glutMenuStatusFunc([In] MenuStatusCallback func) {
+            menuStatusCallback = func;
+            __glutMenuStatusFunc(menuStatusCallback);
+        }
+        #endregion glutMenuStatusFunc([In] MenuStatusCallback func)
+
+        #region glutOverlayDisplayFunc([In] OverlayDisplayCallback func)
+        /// <summary>
+        ///     Sets the overlay display callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new overlay display callback function.  See
+        ///     <see cref="OverlayDisplayCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutDisplayFunc</b> sets the overlay display callback for the current
+        ///         window.  The overlay display callback is functionally the same as the window's
+        ///         display callback except that the overlay display callback is used to redisplay
+        ///         the window's overlay.
+        ///     </para>
+        ///     <para>
+        ///         When GLUT determines that the overlay display for the window needs to be
+        ///         redisplayed, the overlay display callback for the window is called.  Before
+        ///         the callback, the current window is set to the window needing to be
+        ///         redisplayed and the layer in use is set to the overlay.  The overlay display
+        ///         callback is called with no parameters.  The entire overlay region should be
+        ///         redisplayed in response to the callback (this includes ancillary buffers if
+        ///         your program depends on their state).
+        ///     </para>
+        ///     <para>
+        ///         GLUT determines when the overlay display callback should be triggered based on
+        ///         the window's overlay redisplay state.  The overlay redisplay state for a
+        ///         window can be either set explicitly by calling
+        ///         <see cref="glutPostOverlayRedisplay" /> or implicitly as the result of window
+        ///         damage reported by the window system.  Multiple posted overlay redisplays for
+        ///         a window are coalesced by GLUT to minimize the number of overlay display
+        ///         callbacks called.
+        ///     </para>
+        ///     <para>
+        ///         Upon return from the overlay display callback, the overlay damaged state of
+        ///         the window (returned by calling
+        ///         <c>Glut.glutLayerGet(Glut.GLUT_OVERLAY_DAMAMGED)</c> is cleared.
+        ///     </para>
+        ///     <para>
+        ///         The overlay display callback can be deregistered by passing <c>null</c> to
+        ///         <see cref="glutOverlayDisplayFunc" />.  The overlay display callback is
+        ///         initially <c>null</c> when an overlay is established.  See
+        ///         <see cref="glutDisplayFunc" /> to understand how the display callback alone is
+        ///         used if an overlay display callback is not registered.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="DisplayCallback" />
+        /// <seealso cref="OverlayDisplayCallback" />
+        /// <seealso cref="glutDisplayFunc" />
+        /// <seealso cref="glutPostOverlayRedisplay" />
+        // GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void));
+        public static void glutOverlayDisplayFunc([In] OverlayDisplayCallback func) {
+            overlayDisplayCallback = func;
+            __glutOverlayDisplayFunc(overlayDisplayCallback);
+        }
+        #endregion glutOverlayDisplayFunc([In] OverlayDisplayCallback func)
+
+        #region glutWindowStatusFunc([In] WindowStatusCallback func)
+        /// <summary>
+        ///     Sets the window status callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new window status callback function.  See
+        ///     <see cref="WindowStatusCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutWindowStatusFunc</b> sets the window status callback for the current
+        ///         window.  The window status callback for a window is called when the window
+        ///         status (visibility) of a window changes.  The state callback parameter is one
+        ///         of <see cref="GLUT_HIDDEN" />, <see cref="GLUT_FULLY_RETAINED" />,
+        ///         <see cref="GLUT_PARTIALLY_RETAINED" />, or <see cref="GLUT_FULLY_COVERED" />
+        ///         depending on the current window status of the window.  <i>GLUT_HIDDEN</i>
+        ///         means that the window is either not shown (often meaning that the window is
+        ///         iconified).  <i>GLUT_FULLY_RETAINED</i> means that the window is fully
+        ///         retained (no pixels belonging to the window are covered by other windows).
+        ///         <i>GLUT_PARTIALLY_RETAINED</i> means that the window is partially retained
+        ///         (some but not all pixels belonging to the window are covered by other
+        ///         windows).  <i>GLUT_FULLY_COVERED</i> means the window is shown but no part of
+        ///         the window is visible, i.e., until the window's status changes, all further
+        ///         rendering to the window is discarded.
+        ///     </para>
+        ///     <para>
+        ///         GLUT considers a window visible if any pixel of the window is visible or any
+        ///         pixel of any descendant window is visible on the screen.
+        ///     </para>
+        ///     <para>
+        ///         GLUT applications are encouraged to disable rendering and/or animation when
+        ///         windows have a status of either <i>GLUT_HIDDEN</i> or
+        ///         <i>GLUT_FULLY_COVERED</i>.
+        ///     </para>
+        ///     <para>
+        ///         Passing <c>null</c> to <b>glutWindowStatusFunc</b> disables the generation of
+        ///         the window status callback.
+        ///     </para>
+        ///     <para>
+        ///         If the window status callback for a window is disabled and later re-enabled,
+        ///         the window status of the window is undefined; any change in window window
+        ///         status will be reported, that is if you disable a window status callback and
+        ///         re-enable the callback, you are guaranteed the next window status change will
+        ///         be reported.
+        ///     </para>
+        ///     <para>
+        ///         Setting the window status callback for a window disables the visibility
+        ///         callback set for the window (and vice versa).  The visibility callback is set
+        ///         with <see cref="glutVisibilityFunc" />.  <b>glutVisibilityFunc</b> is
+        ///         deprecated in favor of the more informative <b>glutWindowStatusFunc</b>.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="WindowStatusCallback" />
+        /// <seealso cref="VisibilityCallback" />
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutPopWindow" />
+        /// <seealso cref="glutVisibilityFunc" />
+        // GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state));
+        public static void glutWindowStatusFunc([In] WindowStatusCallback func) {
+            windowStatusCallback = func;
+            __glutWindowStatusFunc(windowStatusCallback);
+        }
+        #endregion glutWindowStatusFunc([In] WindowStatusCallback func)
+
+        #region glutKeyboardUpFunc([In] KeyboardUpCallback func)
+        /// <summary>
+        ///     Sets the keyboard up (key release) callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new keyboard up callback function.  See <see cref="KeyboardUpCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutKeyboardUpFunc</b> sets the keyboard up (key release) callback for the
+        ///         current window.  When a user types into the window, each key release matching
+        ///         an ASCII character will generate a keyboard up callback.  The <i>key</i>
+        ///         callback parameter is the generated ASCII character.  The state of modifier
+        ///         keys such as Shift cannot be determined directly; their only effect will be on
+        ///         the returned ASCII data.  The <i>x</i> and <i>y</i> callback parameters
+        ///         indicate the mouse location in window relative coordinates when the key was
+        ///         pressed.  When a new window is created, no keyboard callback is initially
+        ///         registered, and ASCII key strokes in the window are ignored.  Passing
+        ///         <c>null</c> to <b>glutKeyboardUpFunc</b> disables the generation of
+        ///         keyboard up callbacks.
+        ///     </para>
+        ///     <para>
+        ///         During a keyboard up callback, <see cref="glutGetModifiers" /> may be called
+        ///         to determine the state of modifier keys when the keystroke generating the
+        ///         callback occurred.
+        ///     </para>
+        ///     <para>
+        ///         To avoid the reporting of key release/press pairs due to auto repeat, use
+        ///         <see cref="glutIgnoreKeyRepeat" /> to ignore auto repeated keystrokes.
+        ///     </para>
+        ///     <para>
+        ///         There is no guarantee that the keyboard press callback will match the exact
+        ///         ASCII character as the keyboard up callback.  For example, the key down may
+        ///         be for a lowercase b, but the key release may report an uppercase B if the
+        ///         shift state has changed.  The same applies to symbols and control characters.
+        ///         The precise behavior is window system dependent.
+        ///     </para>
+        ///     <para>
+        ///         Use <see cref="glutSpecialUpFunc" /> for a means to detect non-ASCII key
+        ///         release.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="KeyboardUpCallback" />
+        /// <seealso cref="glutButtonBoxFunc" />
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutGetModifiers" />
+        /// <seealso cref="glutIgnoreKeyRepeat" />
+        /// <seealso cref="glutKeyboardFunc" />
+        /// <seealso cref="glutMouseFunc" />
+        /// <seealso cref="glutSpaceballButtonFunc" />
+        /// <seealso cref="glutSpecialFunc" />
+        /// <seealso cref="glutSpecialUpFunc" />
+        /// <seealso cref="glutTabletButtonFunc" />
+        // GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
+        public static void glutKeyboardUpFunc([In] KeyboardUpCallback func) {
+            keyboardUpCallback = func;
+            __glutKeyboardUpFunc(keyboardUpCallback);
+        }
+        #endregion glutKeyboardUpFunc([In] KeyboardUpCallback func)
+
+        #region glutSpecialUpFunc([In] SpecialUpCallback func)
+        /// <summary>
+        ///     Sets the special keyboard up (key release) callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new special keyboard up callback function.
+        ///     <see cref="SpecialUpCallback" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutSpecialUpFunc</b> sets the special keyboard up (key release) callback
+        ///         for the current window.  The special keyboard up callback is triggered when
+        ///         keyboard function or directional keys are released.  The <i>key</i> callback
+        ///         parameter is a GLUT_KEY_* constant for the special key pressed.  The <i>x</i>
+        ///         and <i>y</i> callback parameters indicate the mouse in window relative
+        ///         coordinates when the key was pressed.  When a new window is created, no
+        ///         special up callback is initially registered and special key releases in the
+        ///         window are ignored.  Passing <c>null</c> to <b>glutSpecialUpFunc</b> disables
+        ///         the generation of special up callbacks.
+        ///     </para>
+        ///     <para>
+        ///         During a special up callback, <see cref="glutGetModifiers" /> may be called to
+        ///         determine the state of modifier keys when the key release generating the
+        ///         callback occurred.
+        ///     </para>
+        ///     <para>
+        ///         To avoid the reporting of key release/press pairs due to auto repeat, use
+        ///         <see cref="glutIgnoreKeyRepeat" /> to ignore auto repeated keystrokes.
+        ///     </para>
+        ///     <para>
+        ///         An implementation should do its best to provide ways to generate all the
+        ///         GLUT_KEY_* special keys.  The available GLUT_KEY_* values are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F1" /></term>
+        ///                 <description>F1 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F2" /></term>
+        ///                 <description>F2 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F3" /></term>
+        ///                 <description>F3 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F4" /></term>
+        ///                 <description>F4 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F5" /></term>
+        ///                 <description>F5 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F6" /></term>
+        ///                 <description>F6 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F7" /></term>
+        ///                 <description>F7 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F8" /></term>
+        ///                 <description>F8 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F9" /></term>
+        ///                 <description>F9 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F10" /></term>
+        ///                 <description>F10 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F11" /></term>
+        ///                 <description>F11 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_F12" /></term>
+        ///                 <description>F12 function key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_LEFT" /></term>
+        ///                 <description>Left directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_UP" /></term>
+        ///                 <description>Up directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_RIGHT" /></term>
+        ///                 <description>Right directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_DOWN" /></term>
+        ///                 <description>Down directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_PAGE_UP" /></term>
+        ///                 <description>Page up directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_PAGE_DOWN" /></term>
+        ///                 <description>Page down directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_HOME" /></term>
+        ///                 <description>Home directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_END" /></term>
+        ///                 <description>End directional key.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_INSERT" /></term>
+        ///                 <description>Insert directional key.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         Note that the escape, backspace, and delete keys are generated as an ASCII
+        ///         character.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="SpecialUpCallback" />
+        /// <seealso cref="glutButtonBoxFunc" />
+        /// <seealso cref="glutGetModifiers" />
+        /// <seealso cref="glutIgnoreKeyRepeat" />
+        /// <seealso cref="glutKeyboardFunc" />
+        /// <seealso cref="glutKeyboardUpFunc" />
+        /// <seealso cref="glutMouseFunc" />
+        /// <seealso cref="glutSpaceballButtonFunc" />
+        /// <seealso cref="glutSpecialFunc" />
+        /// <seealso cref="glutTabletButtonFunc" />
+        // GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
+        public static void glutSpecialUpFunc([In] SpecialUpCallback func) {
+            specialUpCallback = func;
+            __glutSpecialUpFunc(specialUpCallback);
+        }
+        #endregion glutSpecialUpFunc([In] SpecialUpCallback func)
+
+        #region glutJoystickFunc([In] JoystickCallback func, int pollInterval)
+        /// <summary>
+        ///     Sets the joystick callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new joystick callback function.  See <see cref="JoystickCallback" />.
+        /// </param>
+        /// <param name="pollInterval">
+        ///     Joystick polling interval in milliseconds.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutJoystickFunc</b> sets the joystick callback for the current window.
+        ///     </para>
+        ///     <para>
+        ///         The joystick callback is called either due to polling of the joystick at the
+        ///         uniform timer interval specified by <i>pollInterval</i> (in milliseconds) or
+        ///         in response to calling <see cref="glutForceJoystickFunc" />.  If the
+        ///         <i>pollInterval</i> is non-positive, no joystick polling is performed and the
+        ///         GLUT application must frequently (usually from an idle callback) call
+        ///         <b>glutForceJoystickFunc</b>.
+        ///     </para>
+        ///     <para>
+        ///         The joystick buttons are reported by the callback's <i>buttonMask</i>
+        ///         parameter.  The constants <see cref="GLUT_JOYSTICK_BUTTON_A" /> (0x1),
+        ///         <see cref="GLUT_JOYSTICK_BUTTON_B" /> (0x2),
+        ///         <see cref="GLUT_JOYSTICK_BUTTON_C" /> (0x4), and
+        ///         <see cref="GLUT_JOYSTICK_BUTTON_D" /> (0x8) are provided for programming
+        ///         convience.
+        ///     </para>
+        ///     <para>
+        ///         The <i>x</i>, <i>y</i>, and <i>z</i> callback parameters report the X, Y, and
+        ///         Z axes of the joystick.  The joystick is centered at (0, 0, 0).  X, Y, and Z
+        ///         are scaled to range between -1000 and 1000.  Moving the joystick left reports
+        ///         negative X; right reports positive X.  Pulling the stick towards you reports
+        ///         negative Y; push the stick away from you reports positive Y.  If the joystick
+        ///         has a third axis (rudder or up/down), down reports negative Z; up reports
+        ///         positive Z.
+        ///     </para>
+        ///     <para>
+        ///         Passing a <c>null</c> to <b>glutJoystickFunc</b> disables the generation of
+        ///         joystick callbacks.  Without a joystick callback registered,
+        ///         <b>glutForceJoystickFunc</b> does nothing.
+        ///     </para>
+        ///     <para>
+        ///         When a new window is created, no joystick callback is initially registered.
+        ///     </para>
+        ///     <para>
+        ///         <b>LIMITATIONS</b>
+        ///     </para>
+        ///     <para>
+        ///         The GLUT joystick callback only reports the first 3 axes and 32 buttons.
+        ///         GLUT supports only a single joystick.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The GLUT 3.7 implementation of GLUT for X11 supports the joystick API, but not
+        ///         joystick input.  A future implementation of GLUT for X11 may add joystick
+        ///         support.
+        ///     </para>
+        ///     <para>
+        ///         <b>WIN32 IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The GLUT 3.7 implementation of GLUT for Win32 supports the joystick API and
+        ///         joystick input, but does so through the dated <c>joySetCapture</c> and
+        ///         <c>joyGetPosEx</c> Win32 Multimedia API.  The GLUT 3.7 joystick support for
+        ///         Win32 has all the limitations of the Win32 Multimedia API joystick support.
+        ///         A future implementation of GLUT for Win32 may use DirectInput.
+        ///     </para>
+        ///     <para>
+        ///         <b>GLUT IMPLEMENTATION NOTES FOR NON-ANALOG JOYSTICKS</b>
+        ///     </para>
+        ///     <para>
+        ///         If the connected joystick does not return (x, y, z) as a continuous range (for
+        ///         example, an 8 position Atari 2600 joystick), the implementation should report
+        ///         the most extreme (x, y, z) location.  That is, if a 2D joystick is pushed to
+        ///         the upper left, report (-1000, 1000, 0).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="JoystickCallback" />
+        /// <seealso cref="glutButtonBoxFunc" />
+        /// <seealso cref="glutDeviceGet" />
+        /// <seealso cref="glutForceJoystickFunc" />
+        /// <seealso cref="glutMotionFunc" />
+        /// <seealso cref="glutMouseFunc" />
+        /// <seealso cref="glutSpaceballButtonFunc" />
+        /// <seealso cref="glutSpaceballMotionFunc" />
+        /// <seealso cref="glutTabletButtonFunc" />
+        // GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);
+        public static void glutJoystickFunc([In] JoystickCallback func, int pollInterval) {
+            joystickCallback = func;
+            __glutJoystickFunc(joystickCallback, pollInterval);
+        }
+        #endregion glutJoystickFunc([In] JoystickCallback func, int pollInterval)
+        #endregion Callback Sub-API
+
+        #region Color Index Sub-API
+        #region glutSetColor(int cell, float red, float green, float blue)
+        /// <summary>
+        ///     Sets the color of a colormap entry in the layer of use for the current window.
+        /// </summary>
+        /// <param name="cell">
+        ///     Color cell index (starting at zero).
+        /// </param>
+        /// <param name="red">
+        ///     Red intensity (clamped between 0.0 and 1.0 inclusive).
+        /// </param>
+        /// <param name="green">
+        ///     Green intensity (clamped between 0.0 and 1.0 inclusive).
+        /// </param>
+        /// <param name="blue">
+        ///     Blue intensity (clamped between 0.0 and 1.0 inclusive).
+        /// </param>
+        /// <remarks>
+        ///     Sets the <i>cell</i> color index colormap entry of the current window's
+        ///     logical colormap for the layer in use with the color specified by <i>red</i>,
+        ///     <i>green</i>, and <i>blue</i>.  The layer in use of the current window should
+        ///     be a color index window.  <i>cell</i> should be zero or greater and less than
+        ///     the total number of colormap entries for the window.  If the layer in use's
+        ///     colormap was copied by reference, a <b>glutSetColor</b> call will force the
+        ///     duplication of the colormap.  Do not attempt to set the color of an overlay's
+        ///     transparent index.
+        /// </remarks>
+        /// <seealso cref="glutCopyColormap" />
+        /// <seealso cref="glutGetColor" />
+        /// <seealso cref="glutInitDisplayMode" />
+        // GLUTAPI void APIENTRY glutSetColor(int cell, GLfloat red, GLfloat green, GLfloat blue);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetColor(int cell, float red, float green, float blue);
+        #endregion glutSetColor(int cell, float red, float green, float blue)
+
+        #region float glutGetColor(int cell, int component)
+        /// <summary>
+        ///     Retrieves a red, green, or blue component for a given color index colormap entry
+        ///     for the layer in use's logical colormap for the current window.
+        /// </summary>
+        /// <param name="cell">
+        ///     Color cell index (starting at zero).
+        /// </param>
+        /// <param name="component">
+        ///     One of <see cref="GLUT_RED" />, <see cref="GLUT_GREEN" />, or
+        ///     <see cref="GLUT_BLUE"/>.
+        /// </param>
+        /// <returns>
+        ///     For valid color indices, the value returned is a floating point value between
+        ///     0.0 and 1.0 inclusive.  <b>glutGetColor</b> will return -1.0 if the color
+        ///     index specified is an overlay's transparent index, less than zero, or greater
+        ///     or equal to the value returned by
+        ///     <c>Glut.glutGet(Glut.GLUT_WINDOW_COLORMAP_SIZE)</c>, that is if the color
+        ///     index is transparent or outside the valid range of color indices.
+        /// </returns>
+        /// <remarks>
+        ///     <b>glutGetColor</b> retrieves a red, green, or blue component for a given
+        ///     color index colormap entry for the current window's logical colormap.  The
+        ///     current window should be a color index window.  <i>cell</i> should be zero or
+        ///     greater and less than the total number of colormap entries for the window.
+        /// </remarks>
+        /// <seealso cref="glutCopyColormap" />
+        /// <seealso cref="glutGet" />
+        /// <seealso cref="glutSetColor" />
+        // GLUTAPI GLfloat APIENTRY glutGetColor(int cell, int component);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern float glutGetColor(int cell, int component);
+        #endregion float glutGetColor(int cell, int component)
+
+        #region glutCopyColormap(int win)
+        /// <summary>
+        ///     Copies the logical colormap for the layer in use from a specified window to the
+        ///     current window.
+        /// </summary>
+        /// <param name="win">
+        ///     The identifier of the window to copy the logical colormap from.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutCopyColormap</b> copies (lazily if possible to promote sharing) the
+        ///         logical colormap from a specified window to the current window's layer in use.
+        ///         The copy will be from the normal plane to the normal plane; or from the
+        ///         overlay to the overlay (never across different layers).  Once a colormap has
+        ///         been copied, avoid setting cells in the colormap with
+        ///         <see cref="glutSetColor" /> since that will force an actual copy of the
+        ///         colormap if it was previously copied by reference.  <b>glutCopyColormap</b>
+        ///         should only be called when both the current window and the <i>win</i> window
+        ///         are color index windows.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         Here is an example of how to create two color index GLUT windows with their
+        ///         colormaps loaded identically and so that the windows are likely to share the
+        ///         same colormap:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             int win1, win2;
+        ///         
+        ///             Glut.glutInitDisplayMode(Glut.GLUT_INDEX);
+        ///             win1 = Glut.glutCreateWindow("First color index window");
+        ///             Glut.glutSetColor(0, 0.0f, 0.0f, 0.0f); // black
+        ///             Glut.glutSetColor(1, 0.5f, 0.5f, 0.5f); // gray
+        ///             Glut.glutSetColor(2, 1.0f, 1.0f, 1.0f); // white
+        ///             Glut.glutSetColor(3, 1.0f, 0.0f, 0.0f); // red
+        ///
+        ///             win2 = Glut.glutCreateWindow("Second color index window");
+        ///             Glut.glutCopyColormap(win1);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutGetColor" />
+        /// <seealso cref="glutSetColor" />
+        // GLUTAPI void APIENTRY glutCopyColormap(int win);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutCopyColormap(int win);
+        #endregion glutCopyColormap(int win)
+        #endregion Color Index Sub-API
+
+        #region State Retrieval Sub-API
+        #region int glutGet(int state)
+        /// <summary>
+        ///     Retrieves simple GLUT state represented by integers.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         Name of state to retrieve.  Valid values are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_X" /></term>
+        ///                 <description>
+        ///                     X location in pixels (relative to the screen origin) of the
+        ///                     current window.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_Y" /></term>
+        ///                 <description>
+        ///                     Y location in pixels (relative to the screen origin) of the
+        ///                     current window.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_WIDTH" /></term>
+        ///                 <description>
+        ///                     Width in pixels of the current window.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_HEIGHT" /></term>
+        ///                 <description>
+        ///                     Height in pixels of the current window.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_BUFFER_SIZE" /></term>
+        ///                 <description>
+        ///                     Total number of bits for current window's color buffer.  For an
+        ///                     RGBA window, this is the sum of
+        ///                     <see cref="GLUT_WINDOW_RED_SIZE" />,
+        ///                     <see cref="GLUT_WINDOW_GREEN_SIZE" />,
+        ///                     <see cref="GLUT_WINDOW_BLUE_SIZE" />, and
+        ///                     <see cref="GLUT_WINDOW_ALPHA_SIZE" />.  For color index windows,
+        ///                     this is the size of the color indexes.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_STENCIL_SIZE" /></term>
+        ///                 <description>
+        ///                     Number of bits in the current window's stencil buffer.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_DEPTH_SIZE" /></term>
+        ///                 <description>
+        ///                     Number of bits in the current window's depth buffer.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_RED_SIZE" /></term>
+        ///                 <description>
+        ///                     Number of bits of red stored the current window's color buffer.
+        ///                     Zero if the window is color index.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_GREEN_SIZE" /></term>
+        ///                 <description>
+        ///                     Number of bits of green stored the current window's color buffer.
+        ///                     Zero if the window is color index.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_BLUE_SIZE" /></term>
+        ///                 <description>
+        ///                     Number of bits of blue stored the current window's color buffer.
+        ///                     Zero if the window is color index.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_ALPHA_SIZE" /></term>
+        ///                 <description>
+        ///                     Number of bits of alpha stored the current window's color buffer.
+        ///                     Zero if the window is color index.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_ACCUM_RED_SIZE" /></term>
+        ///                 <description>
+        ///                     Number of bits of red stored in the current window's accumulation
+        ///                     buffer.  Zero if the window is color index.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_ACCUM_GREEN_SIZE" /></term>
+        ///                 <description>
+        ///                     Number of bits of green stored in the current window's
+        ///                     accumulation buffer.  Zero if the window is color index.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_ACCUM_BLUE_SIZE" /></term>
+        ///                 <description>
+        ///                     Number of bits of blue stored in the current window's
+        ///                     accumulation buffer.  Zero if the window is color index.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_ACCUM_ALPHA_SIZE" /></term>
+        ///                 <description>
+        ///                     Number of bits of alpha stored in the current window's
+        ///                     accumulation buffer.  Zero if the window is color index.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_DOUBLEBUFFER" /></term>
+        ///                 <description>
+        ///                     One if the current window is double buffered, zero otherwise.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_RGBA" /></term>
+        ///                 <description>
+        ///                     One if the current window is RGBA mode, zero otherwise (i.e.,
+        ///                     color index).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_PARENT" /></term>
+        ///                 <description>
+        ///                     The window number of the current window's parent; zero if the
+        ///                     window is a top-level window.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_NUM_CHILDREN" /></term>
+        ///                 <description>
+        ///                     The number of subwindows the current window has (not counting
+        ///                     children of children).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_COLORMAP_SIZE" /></term>
+        ///                 <description>
+        ///                     Size of current window's color index colormap; zero for RGBA
+        ///                     color model windows.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_NUM_SAMPLES" /></term>
+        ///                 <description>
+        ///                     Number of samples for multisampling for the current window.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_STEREO" /></term>
+        ///                 <description>
+        ///                     One if the current window is stereo, zero otherwise.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_WINDOW_CURSOR" /></term>
+        ///                 <description>
+        ///                     Current cursor for the current window.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_SCREEN_WIDTH" /></term>
+        ///                 <description>
+        ///                     Width of the screen in pixels.  Zero indicates the width is
+        ///                     unknown or not available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_SCREEN_HEIGHT" /></term>
+        ///                 <description>
+        ///                     Height of the screen in pixels.  Zero indicates the height is
+        ///                     unknown or not available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_SCREEN_WIDTH_MM" /></term>
+        ///                 <description>
+        ///                     Width of the screen in millimeters.  Zero indicates the width is
+        ///                     unknown or not available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_SCREEN_HEIGHT_MM" /></term>
+        ///                 <description>
+        ///                     Height of the screen in millimeters.  Zero indicates the height
+        ///                     is unknown or not available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_MENU_NUM_ITEMS" /></term>
+        ///                 <description>
+        ///                     Number of menu items in the current menu.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_DISPLAY_MODE_POSSIBLE" /></term>
+        ///                 <description>
+        ///                     Whether the current display mode is supported or not.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_INIT_DISPLAY_MODE" /></term>
+        ///                 <description>
+        ///                     The initial display mode bit mask.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_INIT_WINDOW_X" /></term>
+        ///                 <description>
+        ///                     The X value of the initial window position.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_INIT_WINDOW_Y" /></term>
+        ///                 <description>
+        ///                     The Y value of the initial window position.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_INIT_WINDOW_WIDTH" /></term>
+        ///                 <description>
+        ///                     The width value of the initial window size.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_INIT_WINDOW_HEIGHT" /></term>
+        ///                 <description>
+        ///                     The height value of the initial window size.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_ELAPSED_TIME" /></term>
+        ///                 <description>
+        ///                     Number of milliseconds since <see cref="glutInit()" /> called (or
+        ///                     first call to <c>Glut.glutGet(Glut.GLUT_ELAPSED_TIME)</c>).
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     GLUT state represented by integers.
+        /// </returns>
+        /// <remarks>
+        ///     <b>glutGet</b> retrieves simple GLUT state represented by integers.  The
+        ///     <i>state</i> parameter determines what type of state to return.  Window
+        ///     capability state is returned for the layer in use.  GLUT state names
+        ///     beginning with GLUT_WINDOW_ return state for the current window.  GLUT state
+        ///     names beginning with GLUT_MENU_ return state for the current menu.  Other
+        ///     GLUT state names return global state.  Requesting state for an invalid GLUT
+        ///     state name returns negative one.
+        /// </remarks>
+        /// <seealso cref="glutDeviceGet" />
+        /// <seealso cref="glutExtensionSupported" />
+        /// <seealso cref="glutGetColor" />
+        /// <seealso cref="glutGetMenu" />
+        /// <seealso cref="glutGetModifiers" />
+        /// <seealso cref="glutGetWindow" />
+        /// <seealso cref="glutLayerGet" />
+        // GLUTAPI int APIENTRY glutGet(GLenum type);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutGet(int state);
+        #endregion int glutGet(int state)
+
+        #region int glutDeviceGet(int info)
+        /// <summary>
+        ///     Retrieves GLUT device information represented by integers.
+        /// </summary>
+        /// <param name="info">
+        ///     <para>
+        ///         Name of device information to retrieve.  Valid values are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_HAS_KEYBOARD" /></term>
+        ///                 <description>
+        ///                     Non-zero if a keyboard is available; zero if not available.  For
+        ///                     most GLUT implementations, a keyboard can be assumed.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_HAS_MOUSE" /></term>
+        ///                 <description>
+        ///                     Non-zero if a mouse is available; zero if not available.  For
+        ///                     most GLUT implementations, a keyboard can be assumed.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_HAS_SPACEBALL" /></term>
+        ///                 <description>
+        ///                     Non-zero if a Spaceball is available; zero if not available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_HAS_DIAL_AND_BUTTON_BOX" /></term>
+        ///                 <description>
+        ///                     Non-zero if a dial and button box is available; zero if not
+        ///                     available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_HAS_TABLET" /></term>
+        ///                 <description>
+        ///                     Non-zero if a tablet is available; zero if not available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_NUM_MOUSE_BUTTONS" /></term>
+        ///                 <description>
+        ///                     Number of buttons supported by the mouse.  If no mouse is
+        ///                     supported, zero is returned.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_NUM_SPACEBALL_BUTTONS" /></term>
+        ///                 <description>
+        ///                     Number of buttons supported by the Spaceball.  If no Spaceball is
+        ///                     supported, zero is returned.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_NUM_BUTTON_BOX_BUTTONS" /></term>
+        ///                 <description>
+        ///                     Number of buttons supported by the dial and button box device.
+        ///                     If no dials and button box device is supported, zero is returned.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_NUM_DIALS" /></term>
+        ///                 <description>
+        ///                     Number of dials supported by the dial and button box device.  If
+        ///                     no dials and button box device is supported, zero is returned.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_NUM_TABLET_BUTTONS" /></term>
+        ///                 <description>
+        ///                     Number of buttons supported by the tablet.  If no tablet is
+        ///                     supported, zero is returned.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     <b>glutDeviceGet</b> retrieves GLUT device information represented by
+        ///     integers.  The <i>info</i> parameter determines what type of device
+        ///     information to return.  Requesting device information for an invalid GLUT
+        ///     device information name returns negative one.
+        /// </returns>
+        /// <remarks>
+        ///     <b>glutDeviceGet</b> retrieves GLUT device information represented by
+        ///     integers.  The <i>info</i> parameter determines what type of device
+        ///     information to return.  Requesting device information for an invalid GLUT
+        ///     device information name returns negative one.
+        /// </remarks>
+        /// <seealso cref="glutButtonBoxFunc" />
+        /// <seealso cref="glutDialsFunc" />
+        /// <seealso cref="glutGet" />
+        /// <seealso cref="glutIgnoreKeyRepeat" />
+        /// <seealso cref="glutJoystickFunc" />
+        /// <seealso cref="glutKeyboardFunc" />
+        /// <seealso cref="glutMouseFunc" />
+        /// <seealso cref="glutSetKeyRepeat" />
+        /// <seealso cref="glutSpaceballMotionFunc" />
+        /// <seealso cref="glutTabletButtonFunc" />
+        /// <seealso cref="glutTabletMotionFunc" />
+        // GLUTAPI int APIENTRY glutDeviceGet(GLenum type);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutDeviceGet(int info);
+        #endregion int glutDeviceGet(int info)
+
+        #region int glutExtensionSupported(string extension)
+        /// <summary>
+        ///     Helps to easily determine whether a given OpenGL extension is supported.
+        /// </summary>
+        /// <param name="extension">
+        ///     Name of OpenGL extension to query.
+        /// </param>
+        /// <returns>
+        ///     Returns non-zero if the extension is supported, zero if not supported.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutExtensionSupported</b> helps to easily determine whether a given
+        ///         OpenGL extension is supported or not.  The <i>extension</i> parameter names
+        ///         the extension to query.  The supported extensions can also be determined with
+        ///         <c>Gl.glGetString(Gl.GL_EXTENSIONS)</c>, but <b>glutExtensionSupported</b>
+        ///         does the correct parsing of the returned string.
+        ///     </para>
+        ///     <para>
+        ///         There must be a valid current window to call <b>glutExtensionSupported</b>.
+        ///     </para>
+        ///     <para>
+        ///         <b>glutExtensionSupported</b> only returns information about OpenGL
+        ///         extensions only.  This means window system dependent extensions (for example,
+        ///         GLX extensions) are not reported by <b>glutExtensionSupported</b>.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             if(!Glut.glutExtensionSupported("GL_EXT_texture")) {
+        ///                 System.Console.WriteLine("Missing the texture extension!");
+        ///                 System.Environment.Exit(1);
+        ///             }
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         Notice that the name argument includes both the GL prefix and the extension
+        ///         family prefix (EXT).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutGet" />
+        /// <seealso cref="Gl.glGetString" />
+        // GLUTAPI int APIENTRY glutExtensionSupported(const char *name);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutExtensionSupported(string extension);
+        #endregion int glutExtensionSupported(string extension)
+
+        #region int glutGetModifiers()
+        /// <summary>
+        ///     Returns the modifier key state when certain callbacks were generated.
+        /// </summary>
+        /// <returns>
+        ///     <para>
+        ///         Returns the modifier key state at the time the input event for a keyboard,
+        ///         special, or mouse callback is generated.  Valid values are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_ACTIVE_SHIFT" /></term>
+        ///                 <description>
+        ///                     Set if the Shift modifier or Caps Lock is active.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_ACTIVE_CTRL" /></term>
+        ///                 <description>
+        ///                     Set if the Ctrl modifier is active.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_ACTIVE_ALT" /></term>
+        ///                 <description>
+        ///                     Set if the Alt modifier is active.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <b>glutGetModifiers</b> returns the modifier key state at the time the input
+        ///     event for a keyboard, special, or mouse callback is generated.  This routine
+        ///     may only be called while a keyboard, special, or mouse callback is being
+        ///     handled.  The window system is permitted to intercept window system defined
+        ///     modifier key strokes or mouse buttons, in which case, no GLUT callback will
+        ///     be generated.  This interception will be independent of use of
+        ///     <b>glutGetModifiers</b>.
+        /// </remarks>
+        /// <seealso cref="glutKeyboardFunc" />
+        /// <seealso cref="glutMouseFunc" />
+        /// <seealso cref="glutSpecialFunc" />
+        // GLUTAPI int APIENTRY glutGetModifiers(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutGetModifiers();
+        #endregion int glutGetModifiers()
+
+        #region int glutLayerGet(int info)
+        /// <summary>
+        ///     Retrieves GLUT state pertaining to the layers of the current window.
+        /// </summary>
+        /// <param name="info">
+        ///     <para>
+        ///         Name of device information to retrieve.  Valid values are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_OVERLAY_POSSIBLE" /></term>
+        ///                 <description>
+        ///                     Whether an overlay could be established for the current window
+        ///                     given the current initial display mode.  If false,
+        ///                     <see cref="glutEstablishOverlay" /> will fail with a fatal error
+        ///                     if called.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_LAYER_IN_USE" /></term>
+        ///                 <description>
+        ///                     Either <see cref="GLUT_NORMAL" /> or <see cref="GLUT_OVERLAY" />
+        ///                     depending on whether the normal plane or overlay is the layer in
+        ///                     use.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_HAS_OVERLAY" /></term>
+        ///                 <description>
+        ///                     If the current window has an overlay established.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_TRANSPARENT_INDEX" /></term>
+        ///                 <description>
+        ///                     The transparent color index of the overlay of the current window;
+        ///                     negative one is returned if no overlay is in use.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_NORMAL_DAMAGED" /></term>
+        ///                 <description>
+        ///                     True if the normal plane of the current window has damaged (by
+        ///                     window system activity) since the last display callback was
+        ///                     triggered.  Calling <see cref="glutPostRedisplay" /> will not set
+        ///                     this true.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_OVERLAY_DAMAGED" /></term>
+        ///                 <description>
+        ///                     True if the overlay plane of the current window has damaged (by
+        ///                     window system activity) since the last display callback was
+        ///                     triggered.  Calling <see cref="glutPostRedisplay" /> or
+        ///                     <see cref="glutPostOverlayRedisplay" /> will not set this true.
+        ///                     Negative one is returned if no overlay is in use.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Retrieves GLUT layer information for the current window represented by
+        ///     integers.  The <i>info</i> parameter determines what type of layer
+        ///     information to return.
+        /// </returns>
+        /// <seealso cref="glutCreateWindow" />
+        /// <seealso cref="glutEstablishOverlay" />
+        /// <seealso cref="glutSetColor" />
+        // GLUTAPI int APIENTRY glutLayerGet(GLenum type);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutLayerGet(int info);
+        #endregion int glutLayerGet(int info)
+        #endregion State Retrieval Sub-API
+
+        #region Font Sub-API
+        #region glutBitmapCharacter([In] IntPtr font, int character)
+        /// <summary>
+        ///     Renders a bitmap character using OpenGL.
+        /// </summary>
+        /// <param name="font">
+        ///     <para>
+        ///         Bitmap font to use.  Without using any display lists,
+        ///         <b>glutBitmapCharacter</b> renders the character in the named bitmap font.
+        ///         The available fonts are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_BITMAP_8_BY_13" /></term>
+        ///                 <description>
+        ///                     A fixed width font with every character fitting in an 8 by 13
+        ///                     pixel rectangle.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_BITMAP_9_BY_15" /></term>
+        ///                 <description>
+        ///                     A fixed width font with every character fitting in an 9 by 15
+        ///                     pixel rectangle.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_BITMAP_TIMES_ROMAN_10" /></term>
+        ///                 <description>
+        ///                     A 10-point proportional spaced Times Roman font.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_BITMAP_TIMES_ROMAN_24" /></term>
+        ///                 <description>
+        ///                     A 24-point proportional spaced Times Roman font.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_BITMAP_HELVETICA_10" /></term>
+        ///                 <description>
+        ///                     A 10-point proportional spaced Helvetica font.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_BITMAP_HELVETICA_12" /></term>
+        ///                 <description>
+        ///                     A 12-point proportional spaced Helvetica font.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_BITMAP_HELVETICA_18" /></term>
+        ///                 <description>
+        ///                     A 18-point proportional spaced Helvetica font.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="character">
+        ///     Character to render (not confined to 8 bits).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Rendering a nonexistent character has no effect.  <b>glutBitmapCharacter</b>
+        ///         automatically sets the OpenGL unpack pixel storage modes it needs
+        ///         appropriately and saves and restores the previous modes before returning.
+        ///         The generated call to <c>Gl.glBitmap</c> will adjust the current raster
+        ///         position based on the width of the character.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         Here is a routine that shows how to render a string of text with
+        ///         <b>glutBitmapCharacter</b>:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             private void PrintText(float x, float y, string text) {
+        ///                 Gl.glRasterPos2f(x, y);
+        ///                 foreach(char c in text) {
+        ///                     Glut.glutBitmapCharacter(Glut.GLUT_BITMAP_HELVETICA_18, c);
+        ///                 }
+        ///             }
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutBitmapWidth" />
+        /// <seealso cref="glutStrokeCharacter" />
+        // GLUTAPI void APIENTRY glutBitmapCharacter(void *font, int character);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutBitmapCharacter([In] IntPtr font, int character);
+        #endregion glutBitmapCharacter([In] IntPtr font, int character)
+
+        #region int glutBitmapWidth([In] IntPtr font, int character)
+        /// <summary>
+        ///     Returns the width of a bitmap character.
+        /// </summary>
+        /// <param name="font">
+        ///     Bitmap font to use.  For valid values see the
+        ///     <see cref="glutBitmapCharacter" /> description.
+        /// </param>
+        /// <param name="character">
+        ///     Character to return width of (not confined to 8 bits).
+        /// </param>
+        /// <returns>
+        ///     Returns the width in pixels of a bitmap character in a supported bitmap font.
+        /// </returns>
+        /// <remarks>
+        ///     <b>glutBitmapWidth</b> returns the width in pixels of a bitmap character in a
+        ///     supported bitmap font.  While the width of characters in a font may vary
+        ///     (though fixed width fonts do not vary), the maximum height characteristics of
+        ///     a particular font are fixed.
+        /// </remarks>
+        /// <seealso cref="glutBitmapCharacter" />
+        /// <seealso cref="glutStrokeWidth" />
+        // GLUTAPI int APIENTRY glutBitmapWidth(void *font, int character);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutBitmapWidth([In] IntPtr font, int character);
+        #endregion int glutBitmapWidth([In] IntPtr font, int character)
+
+        #region glutStrokeCharacter([In] IntPtr font, int character)
+        /// <summary>
+        ///     Renders a stroke character using OpenGL.
+        /// </summary>
+        /// <param name="font">
+        ///     <para>
+        ///         Stroke font to use.  Without using any display lists,
+        ///         <b>glutStrokeCharacter</b> renders the character in the named stroke font.
+        ///         The available fonts are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_STROKE_ROMAN" /></term>
+        ///                 <description>
+        ///                     A proportionally spaced Roman Simplex font for ASCII characters
+        ///                     32 through 127.  The maximum top character in the font is 119.05
+        ///                     units; the bottom descends 33.33 units.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_STROKE_MONO_ROMAN" /></term>
+        ///                 <description>
+        ///                     A mono-spaced spaced Roman Simplex font (same characters as
+        ///                     <see cref="GLUT_STROKE_ROMAN" />) for ASCII characters 32 through
+        ///                     127.  The maximum top character in the font is 119.05 units; the
+        ///                     bottom descends 33.33 units. Each character is 104.76 units wide.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="character">
+        ///     Character to render (not confined to 8 bits).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Rendering a nonexistent character has no effect.  A <c>Gl.glTranslatef</c> is
+        ///         used to translate the current model view matrix to advance the width of the
+        ///         character.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         Here is a routine that shows how to render a text string with
+        ///         <b>glutStrokeCharacter</b>:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             private void PrintText(float x, float y, string text) {
+        ///                 GL.glPushMatrix();
+        ///                     Gl.glTranslatef(x, y, 0);
+        ///                     foreach(char c in text) {
+        ///                         Glut.glutStrokeCharacter(Glut.GLUT_STROKE_ROMAN, c);
+        ///                     }
+        ///                 Gl.glPopMatrix();
+        ///             }
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         If you want to draw stroke font text using wide, antialiased lines, use:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
+        ///             Gl.glEnable(Gl.GL_BLEND);
+        ///             Gl.glEnable(Gl.GL_LINE_SMOOTH);
+        ///             Gl.glLineWidth(2.0f);
+        ///             PrintText(200, 225, "This is antialiased.");
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutBitmapCharacter" />
+        /// <seealso cref="glutStrokeWidth" />
+        // GLUTAPI void APIENTRY glutStrokeCharacter(void *font, int character);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutStrokeCharacter([In] IntPtr font, int character);
+        #endregion glutStrokeCharacter([In] IntPtr font, int character)
+
+        #region int glutStrokeWidth([In] IntPtr font, int character)
+        /// <summary>
+        ///     Returns the width of a stroke character.
+        /// </summary>
+        /// <param name="font">
+        ///     Stroke font to use.  For valid values see the
+        ///     <see cref="glutStrokeCharacter" /> description.
+        /// </param>
+        /// <param name="character">
+        ///     Character to return width of (not confined to 8 bits).
+        /// </param>
+        /// <returns>
+        ///     Returns the width in pixels of a stroke character in a supported stroke font.
+        /// </returns>
+        /// <remarks>
+        ///     <b>glutStrokeWidth</b> returns the width in pixels of a stroke character in a
+        ///     supported stroke font.  While the width of characters in a font may vary
+        ///     (though fixed width fonts do not vary), the maximum height characteristics of
+        ///     a particular font are fixed.
+        /// </remarks>
+        /// <seealso cref="glutBitmapWidth" />
+        /// <seealso cref="glutStrokeCharacter" />
+        // GLUTAPI int APIENTRY glutStrokeWidth(void *font, int character);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutStrokeWidth([In] IntPtr font, int character);
+        #endregion int glutStrokeWidth([In] IntPtr font, int character)
+
+        #region int glutBitmapLength([In] IntPtr font, string text)
+        /// <summary>
+        ///     Returns the length of a bitmap font string.
+        /// </summary>
+        /// <param name="font">
+        ///     Bitmap font to use.  For valid values, see the
+        ///     <see cref="glutBitmapCharacter" /> description.
+        /// </param>
+        /// <param name="text">
+        ///     Text string.
+        /// </param>
+        /// <returns>
+        ///     Length of string in pixels.
+        /// </returns>
+        /// <remarks>
+        ///     <b>glutBitmapLength</b> returns the length in pixels of a string (8-bit
+        ///     characters).  This length is equivalent to summing all the widths returned by
+        ///     <see cref="glutBitmapWidth" /> for each character in the string.
+        /// </remarks>
+        /// <seealso cref="glutBitmapCharacter" />
+        /// <seealso cref="glutStrokeWidth" />
+        // GLUTAPI int APIENTRY glutBitmapLength(void *font, const unsigned char *string);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutBitmapLength([In] IntPtr font, string text);
+        #endregion int glutBitmapLength([In] IntPtr font, string text)
+
+        #region int glutStrokeLength([In] IntPtr font, string text)
+        /// <summary>
+        ///     Returns the length of a stroke font string.
+        /// </summary>
+        /// <param name="font">
+        ///     Stroke font to use.  For valid values see the
+        ///     <see cref="glutStrokeCharacter" /> description.
+        /// </param>
+        /// <param name="text">
+        ///     Text string.
+        /// </param>
+        /// <returns>
+        ///     The length in modeling units of a string.
+        /// </returns>
+        /// <remarks>
+        ///     <b>glutStrokeLength</b> returns the length in modeling units of a string
+        ///     (8-bit characters).  This length is equivalent to summing all the widths
+        ///     returned by <see cref="glutStrokeWidth" /> for each character in the string.
+        /// </remarks>
+        /// <seealso cref="glutBitmapWidth" />
+        /// <seealso cref="glutStrokeCharacter" />
+        // GLUTAPI int APIENTRY glutStrokeLength(void *font, const unsigned char *string);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutStrokeLength(IntPtr font, string text);
+        #endregion int glutStrokeLength(IntPtr font, string text)
+        #endregion Font Sub-API
+
+        #region Pre-Built Models Sub-API
+        #region glutWireSphere(double radius, int slices, int stacks)
+        /// <summary>
+        ///     Renders a wireframe sphere.
+        /// </summary>
+        /// <param name="radius">
+        ///     The radius of the sphere.
+        /// </param>
+        /// <param name="slices">
+        ///     The number of subdivisions around the Z axis (similar to lines of longitude).
+        /// </param>
+        /// <param name="stacks">
+        ///     The number of subdivisions along the Z axis (similar to lines of latitude).
+        /// </param>
+        /// <remarks>
+        ///     <b>glutWireSphere</b> renders a wireframe sphere centered at the modeling
+        ///     coordinates origin of the specified <i>radius</i>.  The sphere is subdivided
+        ///     around the Z axis into <i>slices</i> and along the Z axis into <i>stacks</i>.
+        /// </remarks>
+        /// <seealso cref="glutSolidSphere" />
+        // GLUTAPI void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireSphere(double radius, int slices, int stacks);
+        #endregion glutWireSphere(double radius, int slices, int stacks)
+
+        #region glutSolidSphere(double radius, int slices, int stacks)
+        /// <summary>
+        ///     Renders a solid sphere.
+        /// </summary>
+        /// <param name="radius">
+        ///     The radius of the sphere.
+        /// </param>
+        /// <param name="slices">
+        ///     The number of subdivisions around the Z axis (similar to lines of longitude).
+        /// </param>
+        /// <param name="stacks">
+        ///     The number of subdivisions along the Z axis (similar to lines of latitude).
+        /// </param>
+        /// <remarks>
+        ///     <b>glutSolidSphere</b> renders a solid sphere centered at the modeling
+        ///     coordinates origin of the specified <i>radius</i>.  The sphere is subdivided
+        ///     around the Z axis into <i>slices</i> and along the Z axis into <i>stacks</i>.
+        /// </remarks>
+        /// <seealso cref="glutWireSphere" />
+        // GLUTAPI void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidSphere(double radius, int slices, int stacks);
+        #endregion glutSolidSphere(double radius, int slices, int stacks)
+
+        #region glutWireCone(double baseRadius, double height, int slices, int stacks)
+        /// <summary>
+        ///     Renders a wireframe cone.
+        /// </summary>
+        /// <param name="baseRadius">
+        ///     The radius of the base of the cone.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the cone.
+        /// </param>
+        /// <param name="slices">
+        ///     The number of subdivisions around the Z axis.
+        /// </param>
+        /// <param name="stacks">
+        ///     The number of subdivisions along the Z axis.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutWireCone</b> renders a wireframe cone oriented along the Z axis.  The
+        ///     <i>baseRadius</i> of the cone is placed at Z = 0, and the top at
+        ///     Z = <i>height</i>.  The cone is subdivided around the Z axis into
+        ///     <i>slices</i>, and along the Z axis into <i>stacks</i>.
+        /// </remarks>
+        /// <seealso cref="glutSolidCone" />
+        // GLUTAPI void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireCone(double baseRadius, double height, int slices, int stacks);
+        #endregion glutWireCone(double baseRadius, double height, int slices, int stacks)
+
+        #region glutSolidCone(double baseRadius, double height, int slices, int stacks)
+        /// <summary>
+        ///     Renders a solid cone.
+        /// </summary>
+        /// <param name="baseRadius">
+        ///     The radius of the base of the cone.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the cone.
+        /// </param>
+        /// <param name="slices">
+        ///     The number of subdivisions around the Z axis.
+        /// </param>
+        /// <param name="stacks">
+        ///     The number of subdivisions along the Z axis.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutSolidCone</b> renders a solid cone oriented along the Z axis.  The
+        ///     <i>baseRadius</i> of the cone is placed at Z = 0, and the top at
+        ///     Z = <i>height</i>.  The cone is subdivided around the Z axis into
+        ///     <i>slices</i>, and along the Z axis into <i>stacks</i>.
+        /// </remarks>
+        /// <seealso cref="glutWireCone" />
+        // GLUTAPI void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidCone(double baseRadius, double height, int slices, int stacks);
+        #endregion glutSolidCone(double baseRadius, double height, int slices, int stacks)
+
+        #region glutWireCube(double size)
+        /// <summary>
+        ///     Renders a wireframe cube.
+        /// </summary>
+        /// <param name="size">
+        ///     Length of the sides of the cube.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutWireCube</b> renders a wireframe cube.  The cube is centered at the
+        ///     modeling coordinates origin with sides of length <i>size</i>.
+        /// </remarks>
+        /// <seealso cref="glutSolidCube" />
+        // GLUTAPI void APIENTRY glutWireCube(GLdouble size);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireCube(double size);
+        #endregion glutWireCube(double size)
+
+        #region glutSolidCube(double size)
+        /// <summary>
+        ///     Renders a solid cube.
+        /// </summary>
+        /// <param name="size">
+        ///     Length of the sides of the cube.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutSolidCube</b> renders a solid cube.  The cube is centered at the
+        ///     modeling coordinates origin with sides of length <i>size</i>.
+        /// </remarks>
+        /// <seealso cref="glutWireCube" />
+        // GLUTAPI void APIENTRY glutSolidCube(GLdouble size);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidCube(double size);
+        #endregion glutSolidCube(double size)
+
+        #region glutWireTorus(double innerRadius, double outerRadius, int sides, int rings)
+        /// <summary>
+        ///     Renders a wireframe torus (doughnut).
+        /// </summary>
+        /// <param name="innerRadius">
+        ///     Inner radius of the torus.
+        /// </param>
+        /// <param name="outerRadius">
+        ///     Outer radius of the torus.
+        /// </param>
+        /// <param name="sides">
+        ///     Number of sides for each radial section.
+        /// </param>
+        /// <param name="rings">
+        ///     Number of radial divisions for the torus.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutWireTorus</b> renders a wireframe torus (doughnut) centered at the
+        ///     modeling coordinates origin whose axis is aligned with the Z axis.
+        /// </remarks>
+        /// <seealso cref="glutSolidTorus" />
+        // GLUTAPI void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireTorus(double innerRadius, double outerRadius, int sides, int rings);
+        #endregion glutWireTorus(double innerRadius, double outerRadius, int sides, int rings)
+
+        #region glutSolidTorus(double innerRadius, double outerRadius, int sides, int rings)
+        /// <summary>
+        ///     Renders a solid torus (doughnut).
+        /// </summary>
+        /// <param name="innerRadius">
+        ///     Inner radius of the torus.
+        /// </param>
+        /// <param name="outerRadius">
+        ///     Outer radius of the torus.
+        /// </param>
+        /// <param name="sides">
+        ///     Number of sides for each radial section.
+        /// </param>
+        /// <param name="rings">
+        ///     Number of radial divisions for the torus.
+        /// </param>
+        /// <remarks>
+        ///     <b>glutSolidTorus</b> renders a solid torus (doughnut) centered at the
+        ///     modeling coordinates origin whose axis is aligned with the Z axis.
+        /// </remarks>
+        /// <seealso cref="glutWireTorus" />
+        // GLUTAPI void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidTorus(double innerRadius, double outerRadius, int sides, int rings);
+        #endregion glutSolidTorus(double innerRadius, double outerRadius, int sides, int rings)
+
+        #region glutWireDodecahedron()
+        /// <summary>
+        ///     Renders a wireframe dodecahedron (12-sided regular solid).
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutWireDodecahedron</b> renders a wireframe dodecahedron centered at the
+        ///     modeling coordinates origin with a radius of <c>Sqrt(3)</c>.
+        /// </remarks>
+        /// <seealso cref="glutSolidDodecahedron" />
+        // GLUTAPI void APIENTRY glutWireDodecahedron(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireDodecahedron();
+        #endregion glutWireDodecahedron()
+
+        #region glutSolidDodecahedron()
+        /// <summary>
+        ///     Renders a solid dodecahedron (12-sided regular solid).
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutSolidDodecahedron</b> renders a solid dodecahedron centered at the
+        ///     modeling coordinates origin with a radius of <c>Sqrt(3)</c>.
+        /// </remarks>
+        /// <seealso cref="glutWireDodecahedron" />
+        // GLUTAPI void APIENTRY glutSolidDodecahedron(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidDodecahedron();
+        #endregion glutSolidDodecahedron()
+
+        #region glutWireTeapot(double size)
+        /// <summary>
+        ///     Renders a wireframe teapot.
+        /// </summary>
+        /// <param name="size">
+        ///     Relative size of the teapot.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutWireTeapot</b> renders a wireframe teapot.  Both surface normals and
+        ///         texture coordinates for the teapot are generated.  The teapot is generated
+        ///         with OpenGL evaluators.
+        ///     </para>
+        ///     <para>
+        ///         <b>Footnote</b>
+        ///     </para>
+        ///     <para>
+        ///         Yes, the classic computer graphics teapot modeled by Martin Newell in 1975.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutSolidTeapot" />
+        // GLUTAPI void APIENTRY glutWireTeapot(GLdouble size);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireTeapot(double size);
+        #endregion glutWireTeapot(double size)
+
+        #region glutSolidTeapot(double size)
+        /// <summary>
+        ///     Renders a solid teapot.
+        /// </summary>
+        /// <param name="size">
+        ///     Relative size of the teapot.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutSolidTeapot</b> renders a solid teapot.  Both surface normals and
+        ///         texture coordinates for the teapot are generated.  The teapot is generated
+        ///         with OpenGL evaluators.
+        ///     </para>
+        ///     <para>
+        ///         <b>Footnote</b>
+        ///     </para>
+        ///     <para>
+        ///         Yes, the classic computer graphics teapot modeled by Martin Newell in 1975.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutWireTeapot" />
+        // GLUTAPI void APIENTRY glutSolidTeapot(GLdouble size);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidTeapot(double size);
+        #endregion glutSolidTeapot(double size)
+
+        #region glutWireOctahedron()
+        /// <summary>
+        ///     Renders wireframe octahedron (8-sided regular solid).
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutWireOctahedron</b> renders a wireframe octahedron centered at the
+        ///     modeling coordinates origin with a radius of 1.0.
+        /// </remarks>
+        /// <seealso cref="glutSolidOctahedron" />
+        // GLUTAPI void APIENTRY glutWireOctahedron(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireOctahedron();
+        #endregion glutWireOctahedron()
+
+        #region glutSolidOctahedron()
+        /// <summary>
+        ///     Renders solid octahedron (8-sided regular solid).
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutSolidOctahedron</b> renders a solid octahedron centered at the
+        ///     modeling coordinates origin with a radius of 1.0.
+        /// </remarks>
+        /// <seealso cref="glutWireOctahedron" />
+        // GLUTAPI void APIENTRY glutSolidOctahedron(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidOctahedron();
+        #endregion glutSolidOctahedron()
+
+        #region glutWireTetrahedron()
+        /// <summary>
+        ///     Renders a wireframe tetrahedron (4-sided regular solid).
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutWireTetrahedron</b> renders a wireframe tetrahedron centered at the
+        ///     modeling coordinates origin with a radius of <c>Sqrt(3)</c>.
+        /// </remarks>
+        /// <seealso cref="glutSolidTetrahedron" />
+        // GLUTAPI void APIENTRY glutWireTetrahedron(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireTetrahedron();
+        #endregion glutWireTetrahedron()
+
+        #region glutSolidTetrahedron()
+        /// <summary>
+        ///     Renders a solid tetrahedron (4-sided regular solid).
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutSolidTetrahedron</b> renders a solid tetrahedron centered at the
+        ///     modeling coordinates origin with a radius of <c>Sqrt(3)</c>.
+        /// </remarks>
+        /// <seealso cref="glutWireTetrahedron" />
+        // GLUTAPI void APIENTRY glutSolidTetrahedron(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidTetrahedron();
+        #endregion glutSolidTetrahedron()
+
+        #region glutWireIcosahedron()
+        /// <summary>
+        ///     Renders a wireframe icosahedron (20-sided regular solid).
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutWireIcosahedron</b> renders a wireframe icosahedron.  The icosahedron
+        ///     is centered at the modeling coordinates origin and has a radius of 1.0.
+        /// </remarks>
+        /// <seealso cref="glutSolidIcosahedron" />
+        // GLUTAPI void APIENTRY glutWireIcosahedron(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireIcosahedron();
+        #endregion glutWireIcosahedron()
+
+        #region glutSolidIcosahedron()
+        /// <summary>
+        ///     Renders a solid icosahedron (20-sided regular solid).
+        /// </summary>
+        /// <remarks>
+        ///     <b>glutSolidIcosahedron</b> renders a solid icosahedron.  The icosahedron is
+        ///     centered at the modeling coordinates origin and has a radius of 1.0.
+        /// </remarks>
+        /// <seealso cref="glutWireIcosahedron" />
+        // GLUTAPI void APIENTRY glutSolidIcosahedron(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidIcosahedron();
+        #endregion glutSolidIcosahedron()
+        #endregion Pre-built Models Sub-API
+
+        #region Video Resize Sub-API
+        #region int glutVideoResizeGet(int param)
+        /// <summary>
+        ///     Retrieves GLUT video resize information represented by integers.
+        /// </summary>
+        /// <param name="param">
+        ///     <para>
+        ///         Name of video resize information to retrieve.  Available values are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_VIDEO_RESIZE_POSSIBLE" /></term>
+        ///                 <description>
+        ///                     Non-zero if video resizing is supported by the underlying system;
+        ///                     zero if not supported.  If this is zero, the other video resize
+        ///                     GLUT calls do nothing when called.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_VIDEO_RESIZE_X_DELTA" /></term>
+        ///                 <description>Unknown</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_VIDEO_RESIZE_Y_DELTA" /></term>
+        ///                 <description>Unknown</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_VIDEO_RESIZE_WIDTH_DELTA" /></term>
+        ///                 <description>Unknown</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_VIDEO_RESIZE_HEIGHT_DELTA" /></term>
+        ///                 <description>Unknown</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_VIDEO_RESIZE_X" /></term>
+        ///                 <description>Unknown</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_VIDEO_RESIZE_Y" /></term>
+        ///                 <description>Unknown</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_VIDEO_RESIZE_WIDTH" /></term>
+        ///                 <description>Unknown</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_VIDEO_RESIZE_HEIGHT" /></term>
+        ///                 <description>Unknown</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_VIDEO_RESIZE_IN_USE" /></term>
+        ///                 <description>Unknown</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutVideoResizeGet</b> retrieves GLUT video resizing information
+        ///         represented by integers.  The <i>param</i> parameter determines what type of
+        ///         video resize information to return.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The current implementation uses the <c>SGIX_video_resize</c> GLX extension.
+        ///         This extension is currently supported on SGI's InfiniteReality-based systems.
+        ///     </para>
+        ///     <para>
+        ///         <b>WIN32 IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The current implementation never reports that video resizing is possible.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutGet" />
+        /// <seealso cref="glutSetupVideoResizing" />
+        /// <seealso cref="glutStopVideoResizing" />
+        /// <seealso cref="glutVideoPan" />
+        /// <seealso cref="glutVideoResize" />
+        // GLUTAPI int APIENTRY glutVideoResizeGet(GLenum param);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutVideoResizeGet(int param);
+        #endregion int glutVideoResizeGet(int param)
+
+        #region glutSetupVideoResizing()
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </summary>
+        /// <remarks>
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutSetupVideoResizing(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetupVideoResizing();
+        #endregion glutSetupVideoResizing()
+
+        #region glutStopVideoResizing()
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </summary>
+        /// <remarks>
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutStopVideoResizing(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutStopVideoResizing();
+        #endregion glutStopVideoResizing()
+
+        #region glutVideoResize(int x, int y, int width, int height)
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </summary>
+        /// <param name="x">
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </param>
+        /// <param name="y">
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </param>
+        /// <param name="width">
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </param>
+        /// <param name="height">
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </param>
+        /// <remarks>
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutVideoResize(int x, int y, int width, int height);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutVideoResize(int x, int y, int width, int height);
+        #endregion glutVideoResize(int x, int y, int width, int height)
+
+        #region glutVideoPan(int x, int y, int width, int height)
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </summary>
+        /// <param name="x">
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </param>
+        /// <param name="y">
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </param>
+        /// <param name="width">
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </param>
+        /// <param name="height">
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </param>
+        /// <remarks>
+        ///     Unknown.  Unable to locate definitive documentation on this method.
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutVideoPan(int x, int y, int width, int height);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutVideoPan(int x, int y, int width, int height);
+        #endregion glutVideoPan(int x, int y, int width, int height)
+        #endregion Video Resize Sub-API
+
+        #region Debugging Sub-API
+        #region glutReportErrors()
+        /// <summary>
+        ///     Prints out OpenGL run-time errors.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutReportErrors</b> prints out any OpenGL run-time errors pending and
+        ///         clears the errors.  This routine typically should only be used for debugging
+        ///         purposes since calling it will slow OpenGL programs.  It is provided as a
+        ///         convenience; all the routine does is call <see cref="Gl.glGetError" /> until
+        ///         no more errors are reported.  Any errors detected are reported with a GLUT
+        ///         warning and the corresponding text message generated by
+        ///         /*see cref="Glu.gluErrorString" />*/.
+        ///     </para>
+        ///     <para>
+        ///         Calling <b>glutReportErrors</b> repeatedly in your program can help isolate
+        ///         OpenGL errors to the offending OpenGL command.  Remember that you can use the
+        ///         <c>-gldebug</c> option to detect OpenGL errors in any GLUT program.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutCreateWindow" />
+        /// /*seealso cref="Glu.gluErrorString" />*/
+        /// <seealso cref="Gl.glGetError" />
+        /// <seealso cref="glutInit()" />
+        /// <seealso cref="glutInitDisplayMode" />
+        // GLUTAPI void APIENTRY glutReportErrors(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutReportErrors();
+        #endregion glutReportErrors()
+        #endregion Debugging Sub-API
+
+        #region Device Control Sub-API
+        #region glutIgnoreKeyRepeat(int ignore)
+        /// <summary>
+        ///     Determines if auto repeat keystrokes are reported to the current window.
+        /// </summary>
+        /// <param name="ignore">
+        ///     Non-zero indicates auto repeat keystrokes should not be reported by the
+        ///     keyboard and special callbacks; zero indicates that auto repeat keystrokes
+        ///     will be reported.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutIgnoreKeyRepeat</b> determines if auto repeat keystrokes are reported
+        ///         to the current window.  The ignore auto repeat state of a window can be
+        ///         queried with <c>Glut.glutDeviceGet(Glut.GLUT_DEVICE_IGNORE_KEY_REPEAT)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Ignoring auto repeated keystrokes is generally done in conjunction with using
+        ///         the <see cref="glutKeyboardUpFunc" /> and <see cref="glutSpecialUpFunc" />
+        ///         callbacks to repeat key releases.  If you do not ignore auto repeated
+        ///         keystrokes, your GLUT application will experience repeated release/press
+        ///         callbacks.  Games using the keyboard will typically want to ignore key
+        ///         repeat.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         X11 sends <c>KeyPress</c> events repeatedly when the window system's global
+        ///         auto repeat is enabled.  <b>glutIgnoreKeyRepeat</b> can prevent these auto
+        ///         repeated keystrokes from being reported as keyboard or special callbacks, but
+        ///         there is still some minimal overhead by the X server to continually stream
+        ///         <c>KeyPress</c> events to the GLUT application.  The
+        ///         <see cref="glutSetKeyRepeat" /> routine can be used to actually disable the
+        ///         global sending of auto repeated <c>KeyPress</c> events.  Note that
+        ///         <see cref="glutSetKeyRepeat" /> affects the global window system auto repeat
+        ///         state so other applications will not auto repeat if you disable auto repeat
+        ///         globally through <see cref="glutSetKeyRepeat" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutDeviceGet" />
+        /// <seealso cref="glutKeyboardFunc" />
+        /// <seealso cref="glutKeyboardUpFunc" />
+        /// <seealso cref="glutSetKeyRepeat" />
+        /// <seealso cref="glutSpecialFunc" />
+        /// <seealso cref="glutSpecialUpFunc" />
+        // GLUTAPI void APIENTRY glutIgnoreKeyRepeat(int ignore);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutIgnoreKeyRepeat(int ignore);
+        #endregion glutIgnoreKeyRepeat(int ignore)
+
+        #region glutSetKeyRepeat(int repeatMode)
+        /// <summary>
+        ///     Sets the key repeat mode for the window system.
+        /// </summary>
+        /// <param name="repeatMode">
+        ///     <para>
+        ///         Mode for setting key repeat to.  Available modes are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_REPEAT_OFF" /></term>
+        ///                 <description>
+        ///                     Disable key repeat for the window system on a global basis if
+        ///                     possible.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_REPEAT_ON" /></term>
+        ///                 <description>
+        ///                     Enable key repeat for the window system on a global basis if
+        ///                     possible.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_KEY_REPEAT_DEFAULT" /></term>
+        ///                 <description>
+        ///                     Reset the key repeat mode for the window system to its default
+        ///                     state if possible.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutSetKeyRepeat</b> sets the key repeat mode for the window system on a
+        ///         global basis if possible.  If supported by the window system, the key repeat
+        ///         can either be enabled, disabled, or set to the window system's default key
+        ///         repeat state.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         X11 sends <c>KeyPress</c> events repeatedly when the window system's global
+        ///         auto repeat is enabled.  <see cref="glutIgnoreKeyRepeat" /> can prevent these
+        ///         auto repeated keystrokes from being reported as keyboard or special
+        ///         callbacks, but there is still some minimal overhead by the X server to
+        ///         continually stream <c>KeyPress</c> events to the GLUT application.  The
+        ///         <b>glutSetKeyRepeat</b> routine can be used to actually disable the global
+        ///         sending of auto repeated <c>KeyPress</c> events.  Note that
+        ///         <b>glutSetKeyRepeat</b> affects the global window system auto repeat state so
+        ///         other applications will not auto repeat if you disable auto repeat globally
+        ///         through <b>glutSetKeyRepeat</b>.
+        ///     </para>
+        ///     <para>
+        ///         GLUT applications using the X11 GLUT implemenation should disable key repeat
+        ///         with <b>glutSetKeyRepeat</b> to disable key repeats most efficiently.
+        ///     </para>
+        ///     <para>
+        ///         <b>WIN32 IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The Win32 implementation of <b>glutSetKeyRepeat</b> does nothing.  The
+        ///         <see cref="glutIgnoreKeyRepeat" /> routine can be used in the Win32 GLUT
+        ///         implementation to ignore repeated keys on a per-window basis without changing
+        ///         the global window system key repeat. 
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutDeviceGet" />
+        /// <seealso cref="glutIgnoreKeyRepeat" />
+        /// <seealso cref="glutKeyboardFunc" />
+        /// <seealso cref="glutKeyboardUpFunc" />
+        /// <seealso cref="glutSpecialFunc" />
+        /// <seealso cref="glutSpecialUpFunc" />
+        // GLUTAPI void APIENTRY glutSetKeyRepeat(int repeatMode);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetKeyRepeat(int repeatMode);
+        #endregion glutSetKeyRepeat(int repeatMode)
+
+        #region glutForceJoystickFunc()
+        /// <summary>
+        ///     Forces current window's joystick callback to be called.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutForceJoystickFunc</b> forces the current window's joystick callback to
+        ///         be called, reporting the latest joystick state.
+        ///     </para>
+        ///     <para>
+        ///         The joystick callback is called either due to polling of the joystick at the
+        ///         uniform timer interval set by <see cref="glutJoystickFunc" />'s
+        ///         <i>pollInterval</i> (specified in milliseconds) or in response to calling
+        ///         <b>glutForceJoystickFunc</b>.  If the <i>pollInterval</i> is non-positive, no
+        ///         joystick polling is performed and the GLUT application must frequently
+        ///         (usually from an idle callback) call <b>glutForceJoystickFunc</b>.
+        ///     </para>
+        ///     <para>
+        ///         The joystick callback will be called once (if one exists) for each time
+        ///         <b>glutForceJoystickFunc</b> is called.  The callback is called from
+        ///         <see cref="glutJoystickFunc" />.  That is, when
+        ///         <see cref="glutJoystickFunc" /> returns, the callback will have already
+        ///         happened.
+        ///     </para>
+        ///     <para>
+        ///         <b>X IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The GLUT 3.7 implementation of GLUT for X11 supports the joystick API, but
+        ///         not actual joystick input.  A future implementation of GLUT for X11 may add
+        ///         joystick support.
+        ///     </para>
+        ///     <para>
+        ///         <b>WIN32 IMPLEMENTATION NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The GLUT 3.7 implementation of GLUT for Win32 supports the joystick API and
+        ///         joystick input, but does so through the dated <c>joySetCapture</c> and
+        ///         <c>joyGetPosEx</c> Win32 Multimedia API.  The GLUT 3.7 joystick support for
+        ///         Win32 has all the limitations of the Win32 Multimedia API joystick support.
+        ///         A future implementation of GLUT for Win32 may use DirectInput.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutJoystickFunc" />
+        // GLUTAPI void APIENTRY glutForceJoystickFunc(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutForceJoystickFunc();
+        #endregion glutForceJoystickFunc()
+        #endregion Device Control Sub-API
+
+        #region Game Mode Sub-API
+        #region glutGameModeString(string str)
+        /// <summary>
+        ///     Sets the game mode configuration via a string.
+        /// </summary>
+        /// <param name="str">
+        ///     string for selecting a game mode configuration.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutGameModeString</b> sets the game mode configuration via a string.  The
+        ///         game mode configuration string for GLUT's fullscreen game mode describes the
+        ///         suitable screen width and height in pixels, the pixel depth in bits, and the
+        ///         video refresh frequency in hertz.  The game mode configuration string can
+        ///         also specify a window system dependent display mode.
+        ///     </para>
+        ///     <para>
+        ///         The string is a list of zero or more capability descriptions seperated by
+        ///         spaces and tabs.  Each capability description is a capability name that is
+        ///         followed by a comparator and a numeric value.  (Unlike the display mode
+        ///         string specified using <see cref="glutInitDisplayString" />, the comparator
+        ///         and numeric value are <i>not</i> optional.)  For example, <c>"width>=640"</c>
+        ///         and <c>"bpp=32"</c> are both valid criteria.
+        ///     </para>
+        ///     <para>
+        ///         The capability descriptions are translated into a set of criteria used to
+        ///         select the appropriate game mode configuration.
+        ///     </para>
+        ///     <para>
+        ///         The criteria are matched in strict left to right order of precdence.  That
+        ///         is, the first specified criteria (leftmost) takes precedence over the later
+        ///         criteria for non-exact criteria (greater than, less than, etc. comparators).
+        ///         Exact criteria (equal, not equal compartors) must match exactly so precedence
+        ///         is not relevant.
+        ///     </para>
+        ///     <para>
+        ///         The numeric value is an integer that is parsed according to ANSI C's
+        ///         <c>strtol(str, strptr, 0)</c> behavior.  This means that decimal, octal
+        ///         (leading 0), and hexidecimal values (leading 0x) are accepeted.
+        ///     </para>
+        ///     <para>
+        ///         The valid compartors are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>=</term>
+        ///                 <description>Equal.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>!=</term>
+        ///                 <description>Not equal.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><</term>
+        ///                 <description>
+        ///                     Less than and preferring larger difference (the least is best).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>></term>
+        ///                 <description>
+        ///                     Greater than and preferring larger differences (the most is
+        ///                     best).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><=</term>
+        ///                 <description>
+        ///                     Less than or equal and preferring larger difference (the least is
+        ///                     best).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>>=</term>
+        ///                 <description>
+        ///                     Greater than or equal and preferring more instead of less.  This
+        ///                     comparator is useful for allocating resources like color precsion
+        ///                     or depth buffer precision where the maximum precison is generally
+        ///                     preferred.  Contrast with the tilde (~) comprator.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>~</term>
+        ///                 <description>
+        ///                     Greater than or equal but preferring less instead of more.  This
+        ///                     compartor is useful for allocating resources such as stencil bits
+        ///                     or auxillary color buffers where you would rather not over
+        ///                     allocate.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         The valid capability names are:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>bpp</term>
+        ///                 <description>Bits per pixel for the frame buffer.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>height</term>
+        ///                 <description>Height of the screen in pixels.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>hertz</term>
+        ///                 <description>Video refresh rate of the screen in hertz.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>num</term>
+        ///                 <description>
+        ///                     Number of the window system depenedent display mode
+        ///                     configuration.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>width</term>
+        ///                 <description>Width of the screen in pixels.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         An additional compact screen resolution description format is supported.
+        ///         This compact description convienently encodes the screen resolution
+        ///         description in a single phrase.  For example, <c>"640x480:16 at 60"</c>
+        ///         requests a 640 by 480 pixel screen with 16 bits per pixel at a 60 hertz video
+        ///         refresh rate.  A compact screen resolution description can be mixed with
+        ///         conventional capability descriptions.
+        ///     </para>
+        ///     <para>
+        ///         The compact screen resolution description format is as follows:
+        ///     </para>
+        ///     <para>
+        ///         <c>[width "x" height][":" bitsPerPixel]["@" videoRate]</c>
+        ///     </para>
+        ///     <para>
+        ///         Unspecifed capability descriptions will result in unspecified criteria being
+        ///         generated.  These unspecified criteria help <b>glutGameModeString</b> behave
+        ///         sensibly with terse game mode description strings.
+        ///     </para>
+        /// </remarks>
+        // GLUTAPI void APIENTRY glutGameModeString(const char *string);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutGameModeString(string str);
+        #endregion glutGameModeString(string str)
+
+        #region int glutEnterGameMode()
+        /// <summary>
+        ///     Enters GLUT's game mode.
+        /// </summary>
+        /// <returns>
+        ///     This is defined in the header as an <c>int</c>, however, from the
+        ///     documentation that I've seen, I believe it should be a <c>void</c>.  You
+        ///     should check your game mode state after entering game mode with:
+        ///     <see cref="glutGameModeGet"/> passing appropriate parameters.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutEnterGameMode</b> is designed to enable high-performance fullscreen
+        ///         GLUT rendering, possibly at a different screen display format.  Calling
+        ///         <b>glutEnterGameMode</b> creates a special fullscreen GLUT window (with its
+        ///         own callbacks and OpenGL rendering context state).  If the game mode string
+        ///         describes a possible screen display format, GLUT also changes the screen
+        ///         display format to the one described by the game mode string.
+        ///     </para>
+        ///     <para>
+        ///         When game mode is entered, certain GLUT functionality is disable to
+        ///         facilitate high-performance fullscreen rendering.  GLUT pop-up menus are not
+        ///         available while in game mode.  Other created windows and subwindows are not
+        ///         displayed in GLUT game mode.  Game mode will also hide all other applications
+        ///         running on the computer's display screen.  The intent of these restrictions
+        ///         is to eliminate window clipping issues, permit screen display format changes,
+        ///         and permit fullscreen rendering optimization such as page flipping for
+        ///         fullscreen buffer swaps.
+        ///     </para>
+        ///     <para>
+        ///         The following GLUT routines are ignored in game mode:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="glutFullScreen" /></item>
+        ///             <item><see cref="glutHideWindow" /></item>
+        ///             <item><see cref="glutIconifyWindow" /></item>
+        ///             <item><see cref="glutPopWindow" /></item>
+        ///             <item><see cref="glutPositionWindow" /></item>
+        ///             <item><see cref="glutPushWindow" /></item>
+        ///             <item><see cref="glutReshapeWindow" /></item>
+        ///             <item><see cref="glutSetIconTitle" /></item>
+        ///             <item><see cref="glutSetWindowTitle" /></item>
+        ///             <item><see cref="glutShowWindow" /></item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         <b>glutEnterGameMode</b> can be called when already in game mode.  This will
+        ///         destroy the previous game mode window (including any OpenGL rendering state)
+        ///         and create a new game mode window with a new OpenGL rendering context.  Also
+        ///         if <b>glutEnterGameMode</b> is called when already in game mode and if the
+        ///         game mode string has changed and describes a possible screen display format,
+        ///         the new screen display format takes effect.  A reshape callback is generated
+        ///         if the game mode window changes size due to a screen display format change.
+        ///     </para>
+        ///     <para>
+        ///         Re-entering game mode provides a mechanism for changing the screen display
+        ///         format while already in game mode.  Note though that the game mode window's
+        ///         OpenGL state is lost in this process and the application is responsible for
+        ///         re-initializing the newly created game mode window OpenGL state when
+        ///         re-entering game mode.
+        ///     </para>
+        ///     <para>
+        ///         Game mode cannot be entered while pop-up menus are in use.
+        ///     </para>
+        ///     <para>
+        ///         Note that the <b>glutEnterGameMode</b> and <see cref="glutFullScreen" />
+        ///         routines operate differently.  <see cref="glutFullScreen" /> simply makes the
+        ///         current window match the size of the screen.  <see cref="glutFullScreen" />
+        ///         does not change the screen display format and does not disable any GLUT
+        ///         features such as pop-up menus; <see cref="glutFullScreen" /> continues to
+        ///         operate in a "windowed" mode of operation.  <b>glutEnterGameMode</b>
+        ///         creates a new window style, possibly changes the screen display mode, limits
+        ///         GLUT functionality, and hides other applications.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutGameModeGet" />
+        /// <seealso cref="glutGameModeString" />
+        /// <seealso cref="glutInitDisplayString" />
+        /// <seealso cref="glutLeaveGameMode" />
+        // GLUTAPI int APIENTRY glutEnterGameMode(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutEnterGameMode();
+        #endregion int glutEnterGameMode()
+
+        #region glutLeaveGameMode()
+        /// <summary>
+        ///     Leaves GLUT's game mode.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>glutLeaveGameMode</b> leaves the GLUT game mode and returns the screen
+        ///         display format to its default format.
+        ///     </para>
+        ///     <para>
+        ///         After leaving game mode, the GLUT functionality disabled in game mode is
+        ///         available again.  The game mode window (and its OpenGL rendering state) is
+        ///         destroyed when leaving game mode.  Any windows and subwindows created before
+        ///         entering the game mode are displayed in their previous locations.  The OpenGL
+        ///         state of normal GLUT windows and subwindows is not disturbed by entering
+        ///         and/or leaving game mode.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="glutEnterGameMode" />
+        /// <seealso cref="glutGameModeGet" />
+        /// <seealso cref="glutGameModeString" />
+        /// <seealso cref="glutInitDisplayString" />
+        // GLUTAPI void APIENTRY glutLeaveGameMode(void);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutLeaveGameMode();
+        #endregion glutLeaveGameMode()
+
+        #region int glutGameModeGet(int mode)
+        /// <summary>
+        ///     Retrieves GLUT device information represented by integers.
+        /// </summary>
+        /// <param name="mode">
+        ///     Name of game mode information to retrieve.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLUT_GAME_MODE_ACTIVE" /></term>
+        ///                 <description>
+        ///                     Non-zero if GLUT's game mode is active; zero if not active.  Game
+        ///                     mode is not active initially.  Game mode becomes active when
+        ///                     <see cref="glutEnterGameMode" /> is called.  Game mode becomes
+        ///                     inactive when <see cref="glutLeaveGameMode" /> is called.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_GAME_MODE_POSSIBLE" /></term>
+        ///                 <description>
+        ///                     Non-zero if the game mode string last specified to
+        ///                     <see cref="glutGameModeString" /> is a possible game mode
+        ///                     configuration; zero otherwise.  Being "possible" does not
+        ///                     guarantee that if game mode is entered with
+        ///                     <see cref="glutEnterGameMode" /> that the display settings will
+        ///                     actually changed.  <see cref="GLUT_GAME_MODE_DISPLAY_CHANGED" />
+        ///                     should be called once game mode is entered to determine if the
+        ///                     display mode is actually changed.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_GAME_MODE_WIDTH" /></term>
+        ///                 <description>
+        ///                     Width in pixels of the screen when game mode is activated.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_GAME_MODE_HEIGHT" /></term>
+        ///                 <description>
+        ///                     Height in pixels of the screen when game mode is activated.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_GAME_MODE_PIXEL_DEPTH" /></term>
+        ///                 <description>
+        ///                     Pixel depth of the screen when game mode is activiated.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_GAME_MODE_REFRESH_RATE" /></term>
+        ///                 <description>
+        ///                     Screen refresh rate in cyles per second (hertz) when game mode is
+        ///                     activated.  Zero is returned if the refresh rate is unknown or
+        ///                     cannot be queried.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLUT_GAME_MODE_DISPLAY_CHANGED" /></term>
+        ///                 <description>
+        ///                     Non-zero if entering game mode actually changed the display
+        ///                     settings.  If the game mode string is not possible or the display
+        ///                     mode could not be changed for any other reason, zero is returned.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <b>glutGameModeGet</b> retrieves GLUT game mode information represented by
+        ///     integers.  The <i>mode</i> parameter determines what type of game mode
+        ///     information to return.  Requesting game mode information for an invalid GLUT
+        ///     game mode information name returns negative one.
+        /// </remarks>
+        /// <seealso cref="glutDeviceGet" />
+        /// <seealso cref="glutEnterGameMode" />
+        /// <seealso cref="glutGameModeString" />
+        /// <seealso cref="glutGet" />
+        /// <seealso cref="glutLayerGet" />
+        /// <seealso cref="glutLeaveGameMode" />
+        // GLUTAPI int APIENTRY glutGameModeGet(GLenum mode);
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutGameModeGet(int mode);
+        #endregion int glutGameModeGet(int mode)
+        #endregion Game Mode Sub-API
+
+        #region FreeGLUT Additions
+        #region Process Loop
+        #region glutMainLoopEvent()
+        /// <summary>
+        ///     Performs the main loop event and returns control.
+        /// </summary>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutMainLoopEvent();
+        #endregion glutMainLoopEvent()
+
+        #region glutLeaveMainLoop()
+        /// <summary>
+        ///     Leaves the main loop.
+        /// </summary>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutLeaveMainLoop();
+        #endregion glutLeaveMainLoop()
+        #endregion Process Loop
+
+        #region Window Callbacks
+        #region glutMouseWheelFunc([In] MouseWheelCallback func)
+        /// <summary>
+        ///     Sets the mouse wheel callback.
+        /// </summary>
+        /// <param name="func">
+        ///     The new mouse wheel callback function.  See <see cref="MouseWheelCallback" />.
+        /// </param>
+        public static void glutMouseWheelFunc([In] MouseWheelCallback func) {
+            mouseWheelCallback = func;
+            __glutMouseWheelFunc(mouseWheelCallback);
+        }
+        #endregion glutMouseWheelFunc([In] MouseWheelCallback func)
+
+        #region glutCloseFunc([In] CloseCallback func)
+        /// <summary>
+        ///     Sets the close callback.
+        /// </summary>
+        /// <param name="func">
+        ///     The new close callback function.  See <see cref="CloseCallback" />.
+        /// </param>
+        public static void glutCloseFunc([In] CloseCallback func) {
+            closeCallback = func;
+            __glutCloseFunc(closeCallback);
+        }
+        #endregion glutCloseFunc([In] CloseCallback func)
+
+        #region glutWMCloseFunc([In] WindowCloseCallback func)
+        /// <summary>
+        ///     Sets the window close callback for the current window.
+        /// </summary>
+        /// <param name="func">
+        ///     The new window close callback function.  See <see cref="WindowCloseCallback" />.
+        /// </param>
+        public static void glutWMCloseFunc([In] WindowCloseCallback func) {
+            windowCloseCallback = func;
+            __glutWMCloseFunc(windowCloseCallback);
+        }
+        #endregion glutWMCloseFunc([In] WindowCloseCallback func)
+
+        #region glutMenuDestroyFunc([In] MenuDestroyCallback func)
+        /// <summary>
+        ///     Sets the menu destroy callback.
+        /// </summary>
+        /// <param name="func">
+        ///     The new menu destroy callback function.  See <see cref="MenuDestroyCallback" />.
+        /// </param>
+        public static void glutMenuDestroyFunc([In] MenuDestroyCallback func) {
+            menuDestroyCallback = func;
+            __glutMenuDestroyFunc(menuDestroyCallback);
+        }
+        #endregion glutMenuDestroyFunc([In] MenuDestroyCallback func)
+        #endregion Window Callbacks
+
+        #region State
+        #region glutSetOption(int optionFlag, int value)
+        /// <summary>
+        ///     Sets simple GLUT state represented by integers.
+        /// </summary>
+        /// <param name="optionFlag">
+        ///     The option to set.
+        /// </param>
+        /// <param name="value">
+        ///     The value to set for the option.
+        /// </param>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetOption(int optionFlag, int value);
+        #endregion glutSetOption(int optionFlag, int value)
+
+        #region IntPtr glutGetWindowData()
+        /// <summary>
+        ///     Get the user data for the current window.
+        /// </summary>
+        /// <returns>
+        ///     An <see cref="IntPtr" /> associated with the current window as set with <see cref="glutSetupWindowData" />.
+        /// </returns>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr glutGetWindowData();
+        #endregion IntPtr glutGetWindowData()
+
+        #region glutSetupWindowData(IntPtr data)
+        /// <summary>
+        ///     Set the user data for the current window.
+        /// </summary>
+        /// <param name="data">
+        ///     Arbitrary client-supplied <see cref="IntPtr" />.
+        /// </param>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetupWindowData(IntPtr data);
+        #endregion glutSetupWindowData(IntPtr data)
+
+        #region IntPtr glutGetMenuData()
+        /// <summary>
+        ///     Rerieves user data from a menu.
+        /// </summary>
+        /// <returns>
+        ///     A previously stored arbitrary user data <see cref="IntPtr" /> from the current menu.
+        /// </returns>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr glutGetMenuData();
+        #endregion IntPtr glutGetMenuData()
+
+        #region glutSetMenuData(IntPtr data)
+        /// <summary>
+        ///     Stores user data in a menu.
+        /// </summary>
+        /// <param name="data">
+        ///     An arbitrary client <see cref="IntPtr" />.
+        /// </param>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSetMenuData(IntPtr data);
+        #endregion glutSetMenuData(IntPtr data)
+        #endregion State
+
+        #region Font
+        #region int glutBitmapHeight(IntPtr font)
+        /// <summary>
+        ///     Returns the height of a given font, in pixels.
+        /// </summary>
+        /// <param name="font">
+        ///     A bitmapped font identifier.
+        /// </param>
+        /// <returns>
+        ///     Returns 0 if font is invalid, otherwise, the font's height, in pixels.
+        /// </returns>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int glutBitmapHeight(IntPtr font);
+        #endregion int glutBitmapHeight(IntPtr font)
+
+        #region float glutStrokeHeight(IntPtr font)
+        /// <summary>
+        ///     Returns the height of a given font.
+        /// </summary>
+        /// <param name="font">
+        ///     A GLUT stroked font identifier.
+        /// </param>
+        /// <returns>
+        ///     Returns 0 if fontID is invalid, otherwise, the height of the font in pixels.
+        /// </returns>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern float glutStrokeHeight(IntPtr font);
+        #endregion float glutStrokeHeight(IntPtr font)
+
+        #region glutBitmapString(IntPtr font, string str)
+        /// <summary>
+        ///     Draw a string of bitmapped characters.
+        /// </summary>
+        /// <param name="font">
+        ///     A bitmapped font identifier.
+        /// </param>
+        /// <param name="str">
+        ///     The string to draw.
+        /// </param>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutBitmapString(IntPtr font, string str);
+        #endregion glutBitmapString(IntPtr font, string str)
+
+        #region glutStrokeString(IntPtr font, string str)
+        /// <summary>
+        ///     Draw a string of stroked characters.
+        /// </summary>
+        /// <param name="font">
+        ///     A GLUT stroked font identifier.
+        /// </param>
+        /// <param name="str">
+        ///     The string to draw.
+        /// </param>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutStrokeString(IntPtr font, string str);
+        #endregion glutStrokeString(IntPtr font, string str)
+        #endregion Font
+
+        #region Geometry
+        #region glutWireRhombicDodecahedron()
+        /// <summary>
+        ///     Draw a wireframe rhombic dodecahedron.
+        /// </summary>
+        /// <remarks>
+        ///     This function draws a wireframe dodecahedron whose facets are rhombic and whose vertices are at unit radius.
+        ///     No facet lies normal to any coordinate axes. The polyhedron is centered at the origin.
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireRhombicDodecahedron();
+        #endregion glutWireRhombicDodecahedron()
+
+        #region glutSolidRhombicDodecahedron()
+        /// <summary>
+        ///     Draw a solid rhombic dodecahedron.
+        /// </summary>
+        /// <remarks>
+        ///     This function draws a solid-shaded dodecahedron whose facets are rhombic and whose vertices are at unit radius.
+        ///     No facet lies normal to any coordinate axes. The polyhedron is centered at the origin.
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidRhombicDodecahedron();
+        #endregion glutSolidRhombicDodecahedron()
+
+        #region glutWireSierpinskiSponge(int levels, double[] offset, double scale)
+        /// <summary>
+        ///     Draw a wireframe Spierspinski's sponge
+        /// </summary>
+        /// <param name="levels">
+        ///     Recursive depth.
+        /// </param>
+        /// <param name="offset">
+        ///     Location vector.
+        /// </param>
+        /// <param name="scale">
+        ///     Relative size.
+        /// </param>
+        /// <remarks>
+        ///     This function recursively draws a few levels of Sierpinski's Sponge in wireframe.
+        ///     If <paramref name="levels" /> is 0, draws 1 tetrahedron. The <paramref name="offset" /> is a translation.
+        ///     The z axis is normal to the base. The sponge is centered at the origin.
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireSierpinskiSponge(int levels, double[] offset, double scale);
+        #endregion glutWireSierpinskiSponge(int levels, double[] offset, double scale)
+
+        #region glutSolidSierpinskiSponge(int levels, double[] offset, double scale)
+        /// <summary>
+        ///     Draw a solid Spierspinski's sponge.
+        /// </summary>
+        /// <param name="levels">
+        ///     Recursive depth.
+        /// </param>
+        /// <param name="offset">
+        ///     Location vector.
+        /// </param>
+        /// <param name="scale">
+        ///     Relative size.
+        /// </param>
+        /// <remarks>
+        ///     This function recursively draws a few levels of a solid-shaded Sierpinski's Sponge. If <paramref name="levels" /> is 0,
+        ///     draws 1 tetrahedron. The <paramref name="offset" /> is a translation. The z axis is normal to the base. The sponge is
+        ///     centered at the origin.
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidSierpinskiSponge(int levels, double[] offset, double scale);
+        #endregion glutSolidSierpinskiSponge(int levels, double[] offset, double scale)
+
+        #region glutWireCylinder(double radius, double height, int slices, int stacks)
+        /// <summary>
+        ///     Draw a wireframe cylinder.
+        /// </summary>
+        /// <param name="radius">
+        ///     Radius of cylinder.
+        /// </param>
+        /// <param name="height">
+        ///     Z height.
+        /// </param>
+        /// <param name="slices">
+        ///     Number of divisions around the z axis.
+        /// </param>
+        /// <param name="stacks">
+        ///     Number of divisions along the z axis.
+        /// </param>
+        /// <remarks>
+        ///     Draws a wireframe of a cylinder, the center of whose base is at the origin, and whose axis parallels the z axis.
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutWireCylinder(double radius, double height, int slices, int stacks);
+        #endregion glutWireCylinder(double radius, double height, int slices, int stacks)
+
+        #region glutSolidCylinder(double radius, double height, int slices, int stacks)
+        /// <summary>
+        ///     Draw a solid cylinder.
+        /// </summary>
+        /// <param name="radius">
+        ///     Radius of cylinder.
+        /// </param>
+        /// <param name="height">
+        ///     Z height.
+        /// </param>
+        /// <param name="slices">
+        ///     Number of divisions around the z axis.
+        /// </param>
+        /// <param name="stacks">
+        ///     Number of divisions along the z axis.
+        /// </param>
+        /// <remarks>
+        ///     Draws a solid of a cylinder, the center of whose base is at the origin, and whose axis parallels the z axis.
+        /// </remarks>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void glutSolidCylinder(double radius, double height, int slices, int stacks);
+        #endregion glutSolidCylinder(double radius, double height, int slices, int stacks)
+        #endregion Geometry
+
+        #region Extension
+        #region IntPtr glutGetProcAddress(string procName)
+        /// <summary>
+        ///     Determine if an procedure or extension is available.
+        /// </summary>
+        /// <param name="procName">
+        ///     Procedure name.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         Given a function name, searches for the function (or "procedure", hence "Proc") in internal tables.
+        ///         If the function is found, a pointer to the function is returned. If the function is not found,
+        ///         <see cref="IntPtr.Zero" /> is returned.
+        ///     </para>
+        ///     <para>
+        ///         In addition to an internal freeglut table, this function will also consult glX (on X systems) or
+        ///         wgl (on WIN32 and WINCE), if the freeglut tables do not have the requested function. It should
+        ///         return any OpenGL, glX, or wgl function if those functions are available.
+        ///     </para>
+        /// </returns>
+        [DllImport(FREEGLUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr glutGetProcAddress(string procName);
+        #endregion IntPtr glutGetProcAddress(string procName)
+        
+	#region void GLUTprocDelegate()
+	// typedef void (*GLUTproc)();
+        /// <summary>
+	///
+        /// </summary>
+	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+	public delegate void GLUTprocDelegate();
+        #endregion void GLUTprocDelegate()
+        #endregion Extension
+        #endregion FreeGLUT Additions
+    }
+}
diff --git a/src/Tao.FreeGlut/INSTALL b/src/Tao.FreeGlut/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FreeGlut/Makefile.am b/src/Tao.FreeGlut/Makefile.am
new file mode 100644
index 0000000..60b49b8
--- /dev/null
+++ b/src/Tao.FreeGlut/Makefile.am
@@ -0,0 +1,18 @@
+
+ASSEMBLY = Tao.FreeGlut
+SHORTNAME = tao-freeglut
+VERSION = @TAOFREEGLUT_VERSION@
+MAJOR = @TAOFREEGLUT_MAJOR@
+
+PACKAGES =
+BINARY_LIBS = ../Tao.OpenGl/Tao.OpenGl.dll
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        Glut.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.FreeGlut/Makefile.in b/src/Tao.FreeGlut/Makefile.in
new file mode 100644
index 0000000..bf74998
--- /dev/null
+++ b/src/Tao.FreeGlut/Makefile.in
@@ -0,0 +1,414 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-freeglut.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.FreeGlut
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-freeglut.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOFREEGLUT_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.FreeGlut
+SHORTNAME = tao-freeglut
+MAJOR = @TAOFREEGLUT_MAJOR@
+PACKAGES = 
+BINARY_LIBS = ../Tao.OpenGl/Tao.OpenGl.dll
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        Glut.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.FreeGlut/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.FreeGlut/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-freeglut.pc: $(top_builddir)/config.status $(srcdir)/tao-freeglut.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.FreeGlut/NEWS b/src/Tao.FreeGlut/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FreeGlut/Properties/AssemblyInfo.cs b/src/Tao.FreeGlut/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..572f351
--- /dev/null
+++ b/src/Tao.FreeGlut/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.FreeGlut")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework FreeGLUT Binding For .NET")]
+[assembly: AssemblyFileVersion("2.4.0.2")]
+[assembly: AssemblyInformationalVersion("2.4.0.2")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.FreeGlut.dll")]
+[assembly: AssemblyTitle("Tao Framework FreeGLUT Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("2.4.0.2")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.FreeGlut/README b/src/Tao.FreeGlut/README
new file mode 100644
index 0000000..9e4392a
--- /dev/null
+++ b/src/Tao.FreeGlut/README
@@ -0,0 +1,14 @@
+Tao.FreeGlut 2.4.0.0
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.FreeGlut is a FreeGLUT API binding for .NET, implementing FreeGLUT 2.4.0.
+
+
+Change Log:
+2.4.0.0 - June 15, 2006:
+    Updated to freeglut 2.4.0 by David Hudson
+
+2.2.0.0 - November 28, 2004:
+    Initial release.
diff --git a/src/Tao.FreeGlut/Tao.FreeGlut.csproj b/src/Tao.FreeGlut/Tao.FreeGlut.csproj
new file mode 100644
index 0000000..14ae454
--- /dev/null
+++ b/src/Tao.FreeGlut/Tao.FreeGlut.csproj
@@ -0,0 +1,103 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{87C95364-7158-4D81-83B8-97B649E27ABA}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.FreeGlut</AssemblyName>
+    <AssemblyOriginatorKeyFile>../Tao.FreeGlut/Tao.FreeGlut.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.FreeGlut</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.FreeGlut.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.FreeGlut.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Glut.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.FreeGlut.dll.config" />
+    <None Include="Tao.FreeGlut.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.FreeGlut/Tao.FreeGlut.dll.config b/src/Tao.FreeGlut/Tao.FreeGlut.dll.config
new file mode 100644
index 0000000..d92b212
--- /dev/null
+++ b/src/Tao.FreeGlut/Tao.FreeGlut.dll.config
@@ -0,0 +1,5 @@
+<configuration>
+    <dllmap dll="freeglut.dll" os="windows" target="freeglut.dll" />
+    <dllmap dll="freeglut.dll" os="osx" target="/System/Library/Frameworks/GLUT.framework/GLUT" />
+    <dllmap dll="freeglut.dll" os="!windows,osx" target="libglut.so.3" />
+</configuration>
diff --git a/src/Tao.FreeGlut/Tao.FreeGlut.snk b/src/Tao.FreeGlut/Tao.FreeGlut.snk
new file mode 100644
index 0000000..e33d36d
Binary files /dev/null and b/src/Tao.FreeGlut/Tao.FreeGlut.snk differ
diff --git a/src/Tao.FreeGlut/tao-freeglut.pc.in b/src/Tao.FreeGlut/tao-freeglut.pc.in
new file mode 100644
index 0000000..01de47f
--- /dev/null
+++ b/src/Tao.FreeGlut/tao-freeglut.pc.in
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.FreeGlut
+Description: FreeGlut portion of the Tao framework
+Version: @TAOFREEGLUT_VERSION@
+Requires: tao-opengl- at TAOOPENGL_MAJOR@
+Libs: -r:${libdir}/mono/tao-freeglut- at TAOFREEGLUT_MAJOR@/Tao.FreeGlut.dll
diff --git a/src/Tao.FreeType/AUTHORS b/src/Tao.FreeType/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FreeType/COPYING b/src/Tao.FreeType/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.FreeType/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.FreeType/ChangeLog b/src/Tao.FreeType/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FreeType/FreeType.cs b/src/Tao.FreeType/FreeType.cs
new file mode 100644
index 0000000..bb56313
--- /dev/null
+++ b/src/Tao.FreeType/FreeType.cs
@@ -0,0 +1,2484 @@
+#region License
+/*
+MIT License
+Copyright �2003-2007 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#region Version
+// based on http://www.koders.com/csharp/fid840ED1F892217853EE1DD8692B953A84E1D5C2AE.aspx
+//
+// Applicable to Freetype 2.1.9 or later
+//
+// 2007-Nov-18 - Euan D MacInnes
+//         Repaired FT_Library_Version
+//
+// 2007-Nov-12 - Jendave. 
+//         Added FT_NATIVE_LIBRARY and CALLING CONVENTION
+//         Added Summary tags for all fields in structs/classes
+//
+// 2007-Nov-9- Euan D MacInnes. 
+//         Converted names to official FreeType names
+//         Added help text from FreeType website
+//
+// 2007-Nov-01 Euan D MacInnes. Amendments are to:
+// Init_FreeType, to make the libptr "out"
+// New_Face, to make the aface "out"
+// NOTE: Some FreeType variables do not start with FT.
+
+// Some structures exist here ***Rec_, that are currently unused.
+// These were originally intended as typed pointer references.
+// However IntPtr's have been used for now. 
+#endregion
+
+using System;
+using System.Collections;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.FreeType
+{
+    #region Class Documentation
+    /// <summary>
+    ///     FreeType 2 Binding for .NET
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Binds functions and definitions in 
+    ///         freetype6.dll (Windows)
+    ///         /usr/lib/libfreetype.so.6 (Linux - specifically Fedora Core freetype install location)
+    ///         /Library/Frameworks/Mono.framework/Libraries/libfreetype.6.dylib (MacOSX)
+    ///     </para>
+    ///     <para>
+    ///         The FreeType library includes the base data types and function calls to FreeType 2
+    ///         to allow access to TrueType and OpenType fonts across platforms.
+    ///     </para>
+    ///     <para>
+    ///         This is not a rendering utility and will not render fonts to the screen. It is an interface
+    ///         to the various font formats, and can provide either outline or bitmapped versions
+    ///         of font glyphs.
+    ///     </para>    
+    /// </remarks>
+    #endregion Class Documentation
+
+    [StructLayout(LayoutKind.Sequential)]
+    public struct MemoryRec_
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*void*/ user;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ alloc;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ free;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ realloc;
+    }
+
+    /// <summary>
+    /// A structure used to describe an input stream.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_StreamRec
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*byte*/ _base;
+        /// <summary>
+        /// 
+        /// </summary>
+        public uint size;
+        /// <summary>
+        /// 
+        /// </summary>
+        public uint pos;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_StreamDesc descriptor;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_StreamDesc pathname;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ read;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ close;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*MemoryRec_*/ memory;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*byte*/ cursor;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*byte*/ limit;
+    }
+
+    /// <summary>
+    /// A union type used to store either a long or a pointer. This is used to store a file descriptor or a �FILE*� in an input stream
+    /// </summary>
+    [StructLayout(LayoutKind.Explicit)]
+    public struct FT_StreamDesc
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        [FieldOffset(0)]
+        public int _value;
+        /// <summary>
+        /// 
+        /// </summary>
+        [FieldOffset(0)]
+        public IntPtr /*void*/ pointer;
+    }
+
+    /// <summary>
+    /// A simple structure used to store a 2D vector; coordinates are of the FT_Pos type.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Vector
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public int x;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int y;
+    }
+
+    /// <summary>
+    /// A structure used to hold an outline's bounding box, i.e., the coordinates of its extrema in the horizontal and vertical directions.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_BBox
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public int xMin;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int yMin;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int xMax;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int yMax;
+    }
+
+    /// <summary>
+    /// A structure used to describe a bitmap or pixmap to the raster. Note that we now manage pixmaps of various depths through the �pixel_mode� field.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Bitmap
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public int rows;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int width;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int pitch;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*byte*/ buffer;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short num_grays;
+        /// <summary>
+        /// 
+        /// </summary>
+        public sbyte pixel_mode;
+        /// <summary>
+        /// 
+        /// </summary>
+        public sbyte palette_mode;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*void*/ palette;
+    }
+
+    /// <summary>
+    /// This structure is used to describe an outline to the scan-line converter.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Outline
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public short n_contours;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short n_points;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*Vector*/ points;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*sbyte*/ tags;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*short*/ contours;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int flags;
+    }
+
+    /// <summary>
+    /// A structure to hold various function pointers used during outline decomposition in order to emit segments, conic, and cubic B�ziers, as well as �move to� and �close to� operations.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Outline_Funcs
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ move_to;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ line_to;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ conic_to;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ cubic_to;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int shift;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int delta;
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct RasterRec_
+    {
+    }
+
+    /// <summary>
+    /// A structure used to model a single span of gray (or black) pixels when rendering a monochrome or anti-aliased bitmap
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Span
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public short x;
+        /// <summary>
+        /// 
+        /// </summary>
+        public ushort len;
+        /// <summary>
+        /// 
+        /// </summary>
+        public byte coverage;
+    }
+
+    /// <summary>
+    /// A structure to hold the arguments used by a raster's render functions
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Raster_Params
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*Bitmap*/ target;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*void*/ source;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int flags;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ gray_spans;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ black_spans;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ bit_test;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ bit_set;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*void*/ user;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_BBox clip_box;
+    }
+
+    /// <summary>
+    /// A structure used to describe a given raster class to the library.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Raster_Funcs
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Glyph_Format glyph_format;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ raster_new;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ raster_reset;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ raster_set_mode;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ raster_render;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ raster_done;
+    }
+
+    /// <summary>
+    /// A simple structure used to store a 2D vector unit vector.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_UnitVector
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public short x;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short y;
+    }
+
+    /// <summary>
+    /// A simple structure used to store a 2x2 matrix. Coefficients are in 16.16 fixed float format. The computation performed is:
+    /// x' = x*xx + y*xy                                             
+    /// y' = x*yx + y*yy   
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Matrix
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public int xx;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int xy;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int yx;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int yy;
+    }
+
+    /// <summary>
+    /// Read-only binary data represented as a pointer and a length.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Data
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*byte*/ pointer;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int length;
+    }
+
+    /// <summary>
+    /// Client applications often need to associate their own data to a variety of FreeType core objects. For example, a text layout API might want to associate a glyph cache to a given size object.
+    /// Most FreeType object contains a �generic� field, of type FT_Generic, which usage is left to client applications and font servers.
+    /// It can be used to store a pointer to client-specific data, as well as the address of a �finalizer� function, which will be called by FreeType when the object is destroyed (for example, the previous client example would put the address of the glyph cache destructor in the �finalizer� field).
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Generic
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*void*/ data;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /* funcptr */ finalizer;
+    }
+
+    /// <summary>
+    /// A structure used to hold a single list element.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_ListNodeRec
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*ListNodeRec*/ prev;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*ListNodeRec*/ next;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*void*/ data;
+    }
+
+    /// <summary>
+    /// A structure used to hold a simple double-linked list. These are used in many parts of FreeType.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_ListRec
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*ListNodeRec*/ head;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*ListNodeRec*/ tail;
+    }
+
+    /// <summary>
+    /// A structure used to model the metrics of a single glyph. The values are expressed in 26.6 fractional pixel format; if the flag FT_LOAD_NO_SCALE has been used while loading the glyph, values are expressed in font units instead.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Glyph_Metrics
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public int width;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int height;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int horiBearingX;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int horiBearingY;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int horiAdvance;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int vertBearingX;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int vertBearingY;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int vertAdvance;
+    }
+
+    /// <summary>
+    /// This structure models the metrics of a bitmap strike (i.e., a set of glyphs for a given point size and resolution) in a bitmap font. It is used for the �available_sizes� field of FT_Face.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Bitmap_Size
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public short height;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short width;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int size;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int x_ppem;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int y_ppem;
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct LibraryRec_
+    {
+    }
+
+    /// <summary>
+    /// /
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct ModuleRec_
+    {
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct DriverRec_
+    {
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct RendererRec_
+    {
+    }
+
+    /// <summary>
+    /// FreeType root face class structure. A face object models a typeface in a font file.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_FaceRec
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public int num_faces;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int face_index;
+        /// <summary>
+        /// /
+        /// </summary>
+        public int face_flags;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int style_flags;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int num_glyphs;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*sbyte*/ family_name;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*sbyte*/ style_name;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int num_fixed_sizes;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*Bitmap_Size*/ available_sizes;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int num_charmaps;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*IntPtr CharMapRec*/ charmaps;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Generic generic;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_BBox bbox;
+        /// <summary>
+        /// 
+        /// </summary>
+        public ushort units_per_EM;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short ascender;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short descender;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short height;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short max_advance_width;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short max_advance_height;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short underline_position;
+        /// <summary>
+        /// 
+        /// </summary>
+        public short underline_thickness;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*GlyphSlotRec*/ glyph;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*SizeRec*/ size;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*CharMapRec*/ charmap;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*DriverRec_*/ driver;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*MemoryRec_*/ memory;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*StreamRec*/ stream;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_ListRec sizes_list;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Generic autohint;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*void*/ extensions;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*Face_InternalRec_*/ _internal;
+    }
+
+    /// <summary>
+    /// FreeType root size class structure. A size object models a face object at a given size.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_SizeRec
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*FaceRec*/ face;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Generic generic;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Size_Metrics metrics;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*Size_InternalRec_*/ _internal;
+    }
+
+    /// <summary>
+    /// FreeType root glyph slot class structure. A glyph slot is a container where individual glyphs can be loaded, be they in outline or bitmap format.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_GlyphSlotRec
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*LibraryRec_*/ library;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*FaceRec*/ face;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*GlyphSlotRec*/ next;
+        /// <summary>
+        /// 
+        /// </summary>
+        public uint reserved;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Generic generic;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Glyph_Metrics metrics;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int linearHoriAdvance;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int linearVertAdvance;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Vector advance;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Glyph_Format format;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Bitmap bitmap;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int bitmap_left;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int bitmap_top;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Outline outline;
+        /// <summary>
+        /// 
+        /// </summary>
+        public uint num_subglyphs;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*SubGlyphRec_*/ subglyphs;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*void*/ control_data;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int control_len;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int lsb_delta;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int rsb_delta;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*void*/ other;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*Slot_InternalRec_*/ _internal;
+    }
+
+    /// <summary>
+    /// The base charmap structure.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_CharMapRec
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*FaceRec*/ face;
+        /// <summary>
+        /// 
+        /// </summary>
+        public FT_Encoding encoding;
+        /// <summary>
+        /// 
+        /// </summary>
+        public ushort platform_id;
+        /// <summary>
+        /// 
+        /// </summary>
+        public ushort encoding_id;
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct Face_InternalRec_
+    {
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct Size_InternalRec_
+    {
+    }
+
+    /// <summary>
+    /// The size metrics structure gives the metrics of a size object.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Size_Metrics
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public ushort x_ppem;
+        /// <summary>
+        /// 
+        /// </summary>
+        public ushort y_ppem;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int x_scale;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int y_scale;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int ascender;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int descender;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int height;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int max_advance;
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct SubGlyphRec_
+    {
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct Slot_InternalRec_
+    {
+    }
+
+    /// <summary>
+    /// A simple structure used to pass more or less generic parameters to FT_Open_Face.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Parameter
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public uint tag;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*void*/ data;
+    }
+
+    /// <summary>
+    /// A structure used to indicate how to open a new font file or stream. A pointer to such a structure can be used as a parameter for the functions FT_Open_Face and FT_Attach_Stream.
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public struct FT_Open_Args
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public uint flags;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*byte*/ memory_base;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int memory_size;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*sbyte*/ pathname;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*StreamRec*/ stream;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*ModuleRec_*/ driver;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int num_params;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr /*Parameter*/ _params;
+    }
+
+    /// <summary>
+    /// An enumeration type used to describe the format of pixels in a given bitmap. Note that additional formats may be added in the future.
+    /// </summary>
+    public enum FT_Pixel_Mode
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_PIXEL_MODE_NONE = 0,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_PIXEL_MODE_MONO,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_PIXEL_MODE_GRAY,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_PIXEL_MODE_GRAY2,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_PIXEL_MODE_GRAY4,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_PIXEL_MODE_LCD,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_PIXEL_MODE_LCD_V,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_PIXEL_MODE_MAX,
+    }
+
+    /// <summary>
+    /// An enumeration type used to describe the format of a given glyph image. Note that this version of FreeType only supports two image formats, even though future font drivers will be able to register their own format.
+    /// </summary>
+    public enum FT_Glyph_Format
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_GLYPH_FORMAT_NONE = (int)((uint)0 << 24 | (uint)0 << 16 | (uint)0 << 8 | (uint)0),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_GLYPH_FORMAT_COMPOSITE = (int)((uint)'c' << 24 | (uint)'o' << 16 | (uint)'m' << 8 | (uint)'p'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_GLYPH_FORMAT_BITMAP = (int)((uint)'b' << 24 | (uint)'i' << 16 | (uint)'t' << 8 | (uint)'s'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_GLYPH_FORMAT_OUTLINE = (int)((uint)'o' << 24 | (uint)'u' << 16 | (uint)'t' << 8 | (uint)'l'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_GLYPH_FORMAT_PLOTTER = (int)((uint)'p' << 24 | (uint)'l' << 16 | (uint)'o' << 8 | (uint)'t'),
+    }
+
+    /// <summary>
+    /// An enumeration used to specify character sets supported by charmaps. Used in the FT_Select_Charmap API function.
+    /// note:
+    /// Despite the name, this enumeration lists specific character repertories (i.e., charsets), and not text encoding methods (e.g., UTF-8, UTF-16, GB2312_EUC, etc.).
+    /// Because of 32-bit charcodes defined in Unicode (i.e., surrogates), all character codes must be expressed as FT_Longs.
+    /// Other encodings might be defined in the future.
+    /// </summary>
+    public enum FT_Encoding
+    {
+        /// <summary>
+        /// /
+        /// </summary>
+        FT_ENCODING_NONE = (int)((uint)0 << 24 | (uint)0 << 16 | (uint)0 << 8 | (uint)0),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_MS_SYMBOL = (int)((uint)'s' << 24 | (uint)'y' << 16 | (uint)'m' << 8 | (uint)'b'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_UNICODE = (int)((uint)'u' << 24 | (uint)'n' << 16 | (uint)'i' << 8 | (uint)'c'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_SJIS = (int)((uint)'s' << 24 | (uint)'j' << 16 | (uint)'i' << 8 | (uint)'s'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_GB2312 = (int)((uint)'g' << 24 | (uint)'b' << 16 | (uint)' ' << 8 | (uint)' '),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_BIG5 = (int)((uint)'b' << 24 | (uint)'i' << 16 | (uint)'g' << 8 | (uint)'5'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_WANSUNG = (int)((uint)'w' << 24 | (uint)'a' << 16 | (uint)'n' << 8 | (uint)'s'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_JOHAB = (int)((uint)'j' << 24 | (uint)'o' << 16 | (uint)'h' << 8 | (uint)'a'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_MS_SJIS = (int)(FT_Encoding.FT_ENCODING_SJIS),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_MS_GB2312 = (int)(FT_Encoding.FT_ENCODING_GB2312),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_MS_BIG5 = (int)(FT_Encoding.FT_ENCODING_BIG5),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_MS_WANSUNG = (int)(FT_Encoding.FT_ENCODING_WANSUNG),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_MS_JOHAB = (int)(FT_Encoding.FT_ENCODING_JOHAB),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_ADOBE_STANDARD = (int)((uint)'A' << 24 | (uint)'D' << 16 | (uint)'O' << 8 | (uint)'B'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_ADOBE_EXPERT = (int)((uint)'A' << 24 | (uint)'D' << 16 | (uint)'B' << 8 | (uint)'E'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_ADOBE_CUSTOM = (int)((uint)'A' << 24 | (uint)'D' << 16 | (uint)'B' << 8 | (uint)'C'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_ADOBE_LATIN_1 = (int)((uint)'l' << 24 | (uint)'a' << 16 | (uint)'t' << 8 | (uint)'1'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_OLD_LATIN_2 = (int)((uint)'l' << 24 | (uint)'a' << 16 | (uint)'t' << 8 | (uint)'2'),
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_ENCODING_APPLE_ROMAN = (int)((uint)'a' << 24 | (uint)'r' << 16 | (uint)'m' << 8 | (uint)'n'),
+    }
+
+    /// <summary>
+    /// An enumeration type that lists the render modes supported by FreeType 2. Each mode corresponds to a specific type of scanline conversion performed on the outline.
+    /// For bitmap fonts the �bitmap->pixel_mode� field in the FT_GlyphSlotRec structure gives the format of the returned bitmap.
+    /// </summary>
+    public enum FT_Render_Mode
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_RENDER_MODE_NORMAL = 0,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_RENDER_MODE_LIGHT,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_RENDER_MODE_MONO,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_RENDER_MODE_LCD,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_RENDER_MODE_LCD_V,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_RENDER_MODE_MAX,
+    }
+
+    /// <summary>
+    /// An enumeration used to specify which kerning values to return in FT_Get_Kerning.
+    /// </summary>
+    public enum FT_Kerning_Mode
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_KERNING_DEFAULT = 0,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_KERNING_UNFITTED,
+        /// <summary>
+        /// 
+        /// </summary>
+        FT_KERNING_UNSCALED,
+    }
+
+    /// <summary>
+    /// Main FreeType method class. Call FT_Init_FreeType to initialise
+    /// </summary>
+    public class FT
+    {
+        #region Private Constants
+        #region string FT_NATIVE_LIBRARY
+        /// <summary>
+        /// Specifies the FT native library used in the bindings
+        /// </summary>
+        /// <remarks>
+        /// The Windows dll is specified here universally - note that
+        /// under Mono the non-windows native library can be mapped using
+        /// the ".config" file mechanism.  Kudos to the Mono team for this
+        /// simple yet elegant solution.
+        /// </remarks>
+        private const string FT_NATIVE_LIBRARY = "freetype6.dll";
+        #endregion string FT_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention used for the binding.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Cdecl" />
+        ///     for the bindings.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+        /// <summary>
+        /// 
+        /// </summary>
+        public static Hashtable ErrorStrings;
+        static FT()
+        {
+            ErrorStrings = new Hashtable();
+            ErrorStrings[0x00] = "no error";
+
+
+            ErrorStrings[0x01] = "cannot open resource";
+
+            ErrorStrings[0x02] = "unknown file format";
+
+            ErrorStrings[0x03] = "broken file";
+
+            ErrorStrings[0x04] = "invalid FreeType version";
+
+            ErrorStrings[0x05] = "module version is too low";
+
+            ErrorStrings[0x06] = "invalid argument";
+
+            ErrorStrings[0x07] = "unimplemented feature";
+
+            ErrorStrings[0x08] = "broken table";
+
+            ErrorStrings[0x09] = "broken offset within table";
+
+
+
+
+            ErrorStrings[0x10] = "invalid glyph index";
+
+            ErrorStrings[0x11] = "invalid character code";
+
+            ErrorStrings[0x12] = "unsupported glyph image format";
+
+            ErrorStrings[0x13] = "cannot render this glyph format";
+
+            ErrorStrings[0x14] = "invalid outline";
+
+            ErrorStrings[0x15] = "invalid composite glyph";
+
+            ErrorStrings[0x16] = "too many hints";
+
+            ErrorStrings[0x17] = "invalid pixel size";
+
+
+
+
+            ErrorStrings[0x20] = "invalid object handle";
+
+            ErrorStrings[0x21] = "invalid library handle";
+
+            ErrorStrings[0x22] = "invalid module handle";
+
+            ErrorStrings[0x23] = "invalid face handle";
+
+            ErrorStrings[0x24] = "invalid size handle";
+
+            ErrorStrings[0x25] = "invalid glyph slot handle";
+
+            ErrorStrings[0x26] = "invalid charmap handle";
+
+            ErrorStrings[0x27] = "invalid cache manager handle";
+
+            ErrorStrings[0x28] = "invalid stream handle";
+
+
+
+
+            ErrorStrings[0x30] = "too many modules";
+
+            ErrorStrings[0x31] = "too many extensions";
+
+
+
+
+            ErrorStrings[0x40] = "out of memory";
+
+            ErrorStrings[0x41] = "unlisted object";
+
+
+
+
+            ErrorStrings[0x51] = "cannot open stream";
+
+            ErrorStrings[0x52] = "invalid stream seek";
+
+            ErrorStrings[0x53] = "invalid stream skip";
+
+            ErrorStrings[0x54] = "invalid stream read";
+
+            ErrorStrings[0x55] = "invalid stream operation";
+
+            ErrorStrings[0x56] = "invalid frame operation";
+
+            ErrorStrings[0x57] = "nested frame access";
+
+            ErrorStrings[0x58] = "invalid frame read";
+
+
+
+
+            ErrorStrings[0x60] = "raster uninitialized";
+
+            ErrorStrings[0x61] = "raster corrupted";
+
+            ErrorStrings[0x62] = "raster overflow";
+
+            ErrorStrings[0x63] = "negative height while rastering";
+
+
+
+
+            ErrorStrings[0x70] = "too many registered caches";
+
+
+
+
+            ErrorStrings[0x80] = "invalid opcode";
+
+            ErrorStrings[0x81] = "too few arguments";
+
+            ErrorStrings[0x82] = "stack overflow";
+
+            ErrorStrings[0x83] = "code overflow";
+
+            ErrorStrings[0x84] = "bad argument";
+
+            ErrorStrings[0x85] = "division by zero";
+
+            ErrorStrings[0x86] = "invalid reference";
+
+            ErrorStrings[0x87] = "found debug opcode";
+
+            ErrorStrings[0x88] = "found ENDF opcode in execution stream";
+
+            ErrorStrings[0x89] = "nested DEFS";
+
+            ErrorStrings[0x8A] = "invalid code range";
+
+            ErrorStrings[0x8B] = "execution context too long";
+
+            ErrorStrings[0x8C] = "too many function definitions";
+
+            ErrorStrings[0x8D] = "too many instruction definitions";
+
+            ErrorStrings[0x8E] = "SFNT font table missing";
+
+            ErrorStrings[0x8F] = "horizontal header (hhea) table missing";
+
+            ErrorStrings[0x90] = "locations (loca) table missing";
+
+            ErrorStrings[0x91] = "name table missing";
+
+            ErrorStrings[0x92] = "character map (cmap) table missing";
+
+            ErrorStrings[0x93] = "horizontal metrics (hmtx) table missing";
+
+            ErrorStrings[0x94] = "PostScript (post) table missing";
+
+            ErrorStrings[0x95] = "invalid horizontal metrics";
+
+            ErrorStrings[0x96] = "invalid character map (cmap) format";
+
+            ErrorStrings[0x97] = "invalid ppem value";
+
+            ErrorStrings[0x98] = "invalid vertical metrics";
+
+            ErrorStrings[0x99] = "could not find context";
+
+            ErrorStrings[0x9A] = "invalid PostScript (post) table format";
+
+            ErrorStrings[0x9B] = "invalid PostScript (post) table";
+
+
+
+
+            ErrorStrings[0xA0] = "opcode syntax error";
+
+            ErrorStrings[0xA1] = "argument stack underflow";
+
+            ErrorStrings[0xA2] = "ignore";
+
+
+
+
+            ErrorStrings[0xB0] = "`STARTFONT' field missing";
+
+            ErrorStrings[0xB1] = "`FONT' field missing";
+
+            ErrorStrings[0xB2] = "`SIZE' field missing";
+
+            ErrorStrings[0xB3] = "`CHARS' field missing";
+
+            ErrorStrings[0xB4] = "`STARTCHAR' field missing";
+
+            ErrorStrings[0xB5] = "`ENCODING' field missing";
+
+            ErrorStrings[0xB6] = "`BBX' field missing";
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_open_driver = 0x8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_open_memory = 0x1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_open_params = 0x10;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_open_pathname = 0x4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_open_stream = 0x2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_outline_even_odd_fill = 0x2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_outline_high_precision = 0x100;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_outline_ignore_dropouts = 0x8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_outline_none = 0x0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_outline_owner = 0x1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_outline_reverse_fill = 0x4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_outline_single_pass = 0x200;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_raster_flag_aa = 0x1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_raster_flag_clip = 0x4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_raster_flag_default = 0x0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint ft_raster_flag_direct = 0x2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FREETYPE_MAJOR = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FREETYPE_MINOR = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FREETYPE_PATCH = 9;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int ALIGNMENT = 8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Curve_Tag_Conic = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Curve_Tag_Cubic = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Curve_Tag_On = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Curve_Tag_Touch_X = 8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Curve_Tag_Touch_Y = 16;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CURVE_TAG_CONIC = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CURVE_TAG_CUBIC = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CURVE_TAG_ON = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CURVE_TAG_TOUCH_X = 8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int CURVE_TAG_TOUCH_Y = 16;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_CROP_BITMAP = 0x40;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_DEFAULT = 0x0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_FORCE_AUTOHINT = 0x20;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH = 0x200;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_IGNORE_TRANSFORM = 0x800;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_LINEAR_DESIGN = 0x2000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_MONOCHROME = 0x1000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_NO_BITMAP = 0x8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_NO_HINTING = 0x2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_NO_RECURSE = 0x400;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_NO_SCALE = 0x1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_PEDANTIC = 0x80;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_RENDER = 0x4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_SBITS_ONLY = 0x4000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int FT_LOAD_VERTICAL_LAYOUT = 0x10;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int MAX_MODULES = 32;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OPEN_DRIVER = 0x8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OPEN_MEMORY = 0x1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OPEN_PARAMS = 0x10;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OPEN_PATHNAME = 0x4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OPEN_STREAM = 0x2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OUTLINE_EVEN_ODD_FILL = 0x2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OUTLINE_HIGH_PRECISION = 0x100;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OUTLINE_IGNORE_DROPOUTS = 0x8;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OUTLINE_NONE = 0x0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OUTLINE_OWNER = 0x1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OUTLINE_REVERSE_FILL = 0x4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_OUTLINE_SINGLE_PASS = 0x200;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_RASTER_FLAG_AA = 0x1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_RASTER_FLAG_CLIP = 0x4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_RASTER_FLAG_DEFAULT = 0x0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const uint FT_RASTER_FLAG_DIRECT = 0x2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int HAVE_FCNTL_H = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int HAVE_UNISTD_H = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int T1_MAX_CHARSTRINGS_OPERANDS = 256;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int T1_MAX_DICT_DEPTH = 5;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int T1_MAX_SUBRS_CALLS = 16;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_Base = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_Autohint = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_BDF = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_Cache = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_CFF = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_CID = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_Gzip = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_LZW = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_PCF = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_PFR = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_PSaux = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_PShinter = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_PSnames = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_Raster = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_SFNT = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_Smooth = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_TrueType = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_Type1 = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_Type42 = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_Winfonts = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Mod_Err_Max = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Ok = 0x00;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Cannot_Open_Resource = (int)(0x01 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Unknown_File_Format = (int)(0x02 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_File_Format = (int)(0x03 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Version = (int)(0x04 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Lower_Module_Version = (int)(0x05 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Argument = (int)(0x06 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Unimplemented_Feature = (int)(0x07 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Table = (int)(0x08 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Offset = (int)(0x09 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Glyph_Index = (int)(0x10 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Character_Code = (int)(0x11 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Glyph_Format = (int)(0x12 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Cannot_Render_Glyph = (int)(0x13 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Outline = (int)(0x14 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Composite = (int)(0x15 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Too_Many_Hints = (int)(0x16 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Pixel_Size = (int)(0x17 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Handle = (int)(0x20 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Library_Handle = (int)(0x21 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Driver_Handle = (int)(0x22 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Face_Handle = (int)(0x23 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Size_Handle = (int)(0x24 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Slot_Handle = (int)(0x25 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_CharMap_Handle = (int)(0x26 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Cache_Handle = (int)(0x27 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Stream_Handle = (int)(0x28 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Too_Many_Drivers = (int)(0x30 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Too_Many_Extensions = (int)(0x31 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Out_Of_Memory = (int)(0x40 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Unlisted_Object = (int)(0x41 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Cannot_Open_Stream = (int)(0x51 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Stream_Seek = (int)(0x52 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Stream_Skip = (int)(0x53 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Stream_Read = (int)(0x54 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Stream_Operation = (int)(0x55 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Frame_Operation = (int)(0x56 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Nested_Frame_Access = (int)(0x57 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Frame_Read = (int)(0x58 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Raster_Uninitialized = (int)(0x60 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Raster_Corrupted = (int)(0x61 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Raster_Overflow = (int)(0x62 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Raster_Negative_Height = (int)(0x63 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Too_Many_Caches = (int)(0x70 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Opcode = (int)(0x80 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Too_Few_Arguments = (int)(0x81 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Stack_Overflow = (int)(0x82 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Code_Overflow = (int)(0x83 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Bad_Argument = (int)(0x84 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Divide_By_Zero = (int)(0x85 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Reference = (int)(0x86 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Debug_OpCode = (int)(0x87 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_ENDF_In_Exec_Stream = (int)(0x88 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Nested_DEFS = (int)(0x89 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_CodeRange = (int)(0x8A + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Execution_Too_Long = (int)(0x8B + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Too_Many_Function_Defs = (int)(0x8C + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Too_Many_Instruction_Defs = (int)(0x8D + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Table_Missing = (int)(0x8E + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Horiz_Header_Missing = (int)(0x8F + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Locations_Missing = (int)(0x90 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Name_Table_Missing = (int)(0x91 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_CMap_Table_Missing = (int)(0x92 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Hmtx_Table_Missing = (int)(0x93 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Post_Table_Missing = (int)(0x94 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Horiz_Metrics = (int)(0x95 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_CharMap_Format = (int)(0x96 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_PPem = (int)(0x97 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Vert_Metrics = (int)(0x98 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Could_Not_Find_Context = (int)(0x99 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Post_Table_Format = (int)(0x9A + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Invalid_Post_Table = (int)(0x9B + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Syntax_Error = (int)(0xA0 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Stack_Underflow = (int)(0xA1 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Ignore = (int)(0xA2 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Missing_Startfont_Field = (int)(0xB0 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Missing_Font_Field = (int)(0xB1 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Missing_Size_Field = (int)(0xB2 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Missing_Chars_Field = (int)(0xB3 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Missing_Startchar_Field = (int)(0xB4 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Missing_Encoding_Field = (int)(0xB5 + 0);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int Err_Missing_Bbx_Field = (int)(0xB6 + 0);
+
+        /// <summary>
+        /// Initialize a new FreeType library object. The set of modules that are registered by this function is determined at build time.
+        /// </summary>
+        /// <param name="alibrary">A handle to a new library object.</param>
+        /// <returns>FreeType error code. 0 means success.</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Init_FreeType(out IntPtr /*IntPtr LibraryRec_*/ alibrary);
+
+        /// <summary>
+        /// Return the version of the FreeType library being used. This is useful when dynamically linking to the library, since one cannot use the macros FREETYPE_MAJOR, FREETYPE_MINOR, and FREETYPE_PATCH.
+        /// </summary>
+        /// <param name="library">A source library handle.</param>
+        /// <param name="amajor">The major version number.</param>
+        /// <param name="aminor">The minor version number</param>
+        /// <param name="apatch">The patch version number</param>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void FT_Library_Version(IntPtr /*LibraryRec_*/ library, ref int amajor, ref int aminor, ref int apatch);
+
+        /// <summary>
+        /// Destroy a given FreeType library object and all of its children, including resources, drivers, faces, sizes, etc.
+        /// </summary>
+        /// <param name="library">A handle to the target library object</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Done_FreeType(IntPtr /*LibraryRec_*/ library);
+
+        /// <summary>
+        /// This function calls FT_Open_Face to open a font by its pathname.
+        /// </summary>
+        /// <param name="library">A handle to the library resource.</param>
+        /// <param name="filepathname">A path to the font file</param>
+        /// <param name="face_index">The index of the face within the font. The first face has index 0</param>
+        /// <param name="aface"> A handle to a new face object. If �face_index� is greater than or equal to zero, it must be non-NULL. See FT_Open_Face for more details.</param>
+        /// <returns>FreeType error code. 0 means success.</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_New_Face(IntPtr /*LibraryRec_*/ library, string filepathname, int face_index, out IntPtr /*IntPtr FaceRec*/ aface);
+
+        /// <summary>
+        /// This function calls FT_Open_Face to open a font which has been loaded into memory.
+        /// You must not deallocate the memory before calling FT_Done_Face.
+        /// </summary>
+        /// <param name="library">A handle to the library resource</param>
+        /// <param name="file_base">A pointer to the beginning of the font data</param>
+        /// <param name="file_size">The size of the memory chunk used by the font data</param>
+        /// <param name="face_index">The index of the face within the font. The first face has index 0</param>
+        /// <param name="aface">A handle to a new face object. If �face_index� is greater than or equal to zero, it must be non-NULL. See FT_Open_Face for more details.</param>
+        /// <returns>FreeType error code. 0 means success.</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_New_Memory_Face(IntPtr /*LibraryRec_*/ library, [In] byte[] file_base, int file_size, int face_index, IntPtr /*IntPtr FaceRec*/ aface);
+
+        /// <summary>
+        /// Create a face object from a given resource described by FT_Open_Args.
+        /// Unlike FreeType 1.x, this function automatically creates a glyph slot for the face object which can be accessed directly through �face->glyph�.
+        /// FT_Open_Face can be used to quickly check whether the font format of a given font resource is supported by FreeType. If the �face_index� field is negative, the function's return value is 0 if the font format is recognized, or non-zero otherwise; the function returns a more or less empty face handle in �*aface� (if �aface� isn't NULL). The only useful field in this special case is �face->num_faces� which gives the number of faces within the font file. After examination, the re [...]
+        /// Each new face object created with this function also owns a default FT_Size object, accessible as �face->size�.
+        /// </summary>
+        /// <param name="library">A handle to the library resource</param>
+        /// <param name="args">A pointer to an �FT_Open_Args� structure which must be filled by the caller.</param>
+        /// <param name="face_index">The index of the face within the font. The first face has index 0</param>
+        /// <param name="aface">A handle to a new face object. If �face_index� is greater than or equal to zero, it must be non-NULL. See note below</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Open_Face(IntPtr /*LibraryRec_*/ library, FT_Open_Args args, int face_index, IntPtr /*IntPtr FaceRec*/ aface);
+
+        /// <summary>
+        /// This function calls FT_Attach_Stream to attach a file.
+        /// </summary>
+        /// <param name="face">The target face object.</param>
+        /// <param name="filepathname">The pathname</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Attach_File(IntPtr /*FaceRec*/ face, string filepathname);
+
+        /// <summary>
+        /// �Attach� data to a face object. Normally, this is used to read additional information for the face object. For example, you can attach an AFM file that comes with a Type 1 font to get the kerning values and other metrics
+        /// </summary>
+        /// <param name="face">The target face object</param>
+        /// <param name="parameters">A pointer to FT_Open_Args which must be filled by the caller</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Attach_Stream(IntPtr /*FaceRec*/ face, ref FT_Open_Args parameters);
+
+        /// <summary>
+        /// Discard a given face object, as well as all of its child slots and sizes.
+        /// </summary>
+        /// <param name="face">A handle to a target face object.</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Done_Face(IntPtr /*FaceRec*/ face);
+
+        /// <summary>
+        /// This function calls FT_Request_Size to request the nominal size (in points).
+        /// If either the character width or height is zero, it is set equal to the other value.
+        /// If either the horizontal or vertical resolution is zero, it is set equal to the other value.
+        /// A character width or height smaller than 1pt is set to 1pt; if both resolution values are zero, they are set to 72dpi.
+        /// </summary>
+        /// <param name="face">A handle to a target face object</param>
+        /// <param name="char_width">The nominal width, in 26.6 fractional points</param>
+        /// <param name="char_height">The nominal height, in 26.6 fractional points</param>
+        /// <param name="horz_resolution">The horizontal resolution in dpi</param>
+        /// <param name="vert_resolution">The vertical resolution in dpi</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Set_Char_Size(IntPtr /*FaceRec*/ face, int char_width, int char_height, uint horz_resolution, uint vert_resolution);
+
+        /// <summary>
+        /// This function calls FT_Request_Size to request the nominal size (in pixels).
+        /// </summary>
+        /// <param name="face">A handle to the target face object.</param>
+        /// <param name="pixel_width">The nominal width, in pixels.</param>
+        /// <param name="pixel_height">The nominal height, in pixels</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Set_Pixel_Sizes(IntPtr /*FaceRec*/ face, uint pixel_width, uint pixel_height);
+
+        /// <summary>
+        /// A function used to load a single glyph into the glyph slot of a face object.
+        /// The loaded glyph may be transformed. See FT_Set_Transform for the details.
+        /// </summary>
+        /// <param name="face">A handle to the target face object where the glyph is loaded.</param>
+        /// <param name="glyph_index">The index of the glyph in the font file. For CID-keyed fonts (either in PS or in CFF format) this argument specifies the CID value.</param>
+        /// <param name="load_flags">A flag indicating what to load for this glyph. The FT_LOAD_XXX constants can be used to control the glyph loading process (e.g., whether the outline should be scaled, whether to load bitmaps or not, whether to hint the outline, etc).</param>
+        /// <returns>FreeType error code. 0 means success.</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Load_Glyph(IntPtr /*FaceRec*/ face, uint glyph_index, int load_flags);
+
+        /// <summary>
+        /// A function used to load a single glyph into the glyph slot of a face object, according to its character code.
+        /// This function simply calls FT_Get_Char_Index and FT_Load_Glyph.
+        /// </summary>
+        /// <param name="face">A handle to a target face object where the glyph is loaded.</param>
+        /// <param name="char_code">The glyph's character code, according to the current charmap used in the face</param>
+        /// <param name="load_flags">A flag indicating what to load for this glyph. The FT_LOAD_XXX constants can be used to control the glyph loading process (e.g., whether the outline should be scaled, whether to load bitmaps or not, whether to hint the outline, etc).</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Load_Char(IntPtr /*FaceRec*/ face, uint char_code, int load_flags);
+
+        /// <summary>
+        /// A function used to set the transformation that is applied to glyph images when they are loaded into a glyph slot through FT_Load_Glyph.
+        /// The transformation is only applied to scalable image formats after the glyph has been loaded. It means that hinting is unaltered by the transformation and is performed on the character size given in the last call to FT_Set_Char_Size or FT_Set_Pixel_Sizes.
+        /// Note that this also transforms the �face.glyph.advance� field, but not the values in �face.glyph.metrics�
+        /// </summary>
+        /// <param name="face">A handle to the source face object</param>
+        /// <param name="matrix">A pointer to the transformation's 2x2 matrix. Use 0 for the identity matrix</param>
+        /// <param name="delta">A pointer to the translation vector. Use 0 for the null vector</param>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void FT_Set_Transform(IntPtr /*FaceRec*/ face, ref FT_Matrix matrix, ref FT_Vector delta);
+
+        /// <summary>
+        /// Convert a given glyph image to a bitmap. It does so by inspecting the glyph image format, finding the relevant renderer, and invoking it
+        /// </summary>
+        /// <param name="slot">A handle to the glyph slot containing the image to convert</param>
+        /// <param name="render_mode">This is the render mode used to render the glyph image into a bitmap. See FT_Render_Mode for a list of possible values</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Render_Glyph(ref FT_GlyphSlotRec slot, FT_Render_Mode render_mode);
+
+        /// <summary>
+        /// Return the kerning vector between two glyphs of a same face
+        /// </summary>
+        /// <param name="face">A handle to a source face object</param>
+        /// <param name="left_glyph">The index of the left glyph in the kern pair</param>
+        /// <param name="right_glyph">The index of the right glyph in the kern pair</param>
+        /// <param name="kern_mode">See FT_Kerning_Mode for more information. Determines the scale and dimension of the returned kerning vector</param>
+        /// <param name="akerning">The kerning vector. This is either in font units or in pixels (26.6 format) for scalable formats, and in pixels for fixed-sizes formats</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Get_Kerning(IntPtr /*FaceRec*/ face, uint left_glyph, uint right_glyph, uint kern_mode, out FT_Vector akerning);
+
+        /// <summary>
+        /// Retrieve the ASCII name of a given glyph in a face. This only works for those faces where FT_HAS_GLYPH_NAMES(face) returns 1
+        /// An error is returned if the face doesn't provide glyph names or if the glyph index is invalid. In all cases of failure, the first byte of �buffer� is set to 0 to indicate an empty name.
+        /// The glyph name is truncated to fit within the buffer if it is too long. The returned string is always zero-terminated.
+        /// This function is not compiled within the library if the config macro �FT_CONFIG_OPTION_NO_GLYPH_NAMES� is defined in �include/freetype/config/ftoptions.h�
+        /// </summary>
+        /// <param name="face">A handle to a source face object</param>
+        /// <param name="glyph_index">The glyph index</param>
+        /// <param name="buffer">A pointer to a target buffer where the name is copied to</param>
+        /// <param name="buffer_max">The maximal number of bytes available in the buffer</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Get_Glyph_Name(IntPtr /*FaceRec*/ face, uint glyph_index, IntPtr buffer, uint buffer_max);
+
+        /// <summary>
+        /// Retrieve the ASCII Postscript name of a given face, if available. This only works with Postscript and TrueType fonts
+        /// The returned pointer is owned by the face and is destroyed with it
+        /// </summary>
+        /// <param name="face">A handle to the source face object</param>
+        /// <returns>A pointer to the face's Postscript name. NULL if unavailable</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr /*sbyte*/ FT_Get_Postscript_Name(IntPtr /*FaceRec*/ face);
+
+        /// <summary>
+        /// Select a given charmap by its encoding tag (as listed in �freetype.h�).
+        /// This function returns an error if no charmap in the face corresponds to the encoding queried here.
+        /// Because many fonts contain more than a single cmap for Unicode encoding, this function has some special code to select the one which covers Unicode best. It is thus preferable to FT_Set_Charmap in this case
+        /// </summary>
+        /// <param name="face">A handle to the source face object</param>
+        /// <param name="encoding">A handle to the selected encoding</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Select_Charmap(IntPtr /*FaceRec*/ face, FT_Encoding encoding);
+
+        /// <summary>
+        /// Select a given charmap for character code to glyph index mapping
+        /// This function returns an error if the charmap is not part of the face (i.e., if it is not listed in the �face->charmaps� table)
+        /// </summary>
+        /// <param name="face">A handle to the source face object</param>
+        /// <param name="charmap">A handle to the selected charmap</param>
+        /// <returns>FreeType error code. 0 means success</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Set_Charmap(IntPtr /*FaceRec*/ face, ref FT_CharMapRec charmap);
+
+        /// <summary>
+        /// Retrieve index of a given charmap
+        /// </summary>
+        /// <param name="charmap">A handle to a charmap</param>
+        /// <returns>The index into the array of character maps within the face to which �charmap� belongs</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_Get_Charmap_Index(ref FT_CharMapRec charmap);
+
+        /// <summary>
+        /// Return the glyph index of a given character code. This function uses a charmap object to do the mapping
+        /// If you use FreeType to manipulate the contents of font files directly, be aware that the glyph index returned by this function doesn't always correspond to the internal indices used within the file. This is done to ensure that value 0 always corresponds to the �missing glyph�.
+        /// </summary>
+        /// <param name="face">A handle to the source face object</param>
+        /// <param name="charcode">The character code</param>
+        /// <returns>The glyph index. 0 means �undefined character code�</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern uint FT_Get_Char_Index(IntPtr /*FaceRec*/ face, uint charcode);
+
+        /// <summary>
+        /// This function is used to return the first character code in the current charmap of a given face. It also returns the corresponding glyph index.
+        /// You should use this function with FT_Get_Next_Char to be able to parse all character codes available in a given charmap.
+        /// Note that �agindex� is set to 0 if the charmap is empty. The result itself can be 0 in two cases: if the charmap is empty or when the value 0 is the first valid character code
+        /// </summary>
+        /// <param name="face">A handle to the source face object</param>
+        /// <param name="agindex">Glyph index of first character code. 0 if charmap is empty</param>
+        /// <returns>The charmap's first character code</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern uint FT_Get_First_Char(IntPtr /*FaceRec*/ face, [In, Out] uint[] agindex);
+
+        /// <summary>
+        /// This function is used to return the next character code in the current charmap of a given face following the value �char_code�, as well as the corresponding glyph index.
+        /// You should use this function with FT_Get_First_Char to walk over all character codes available in a given charmap. See the note for this function for a simple code example.
+        /// Note that �*agindex� is set to 0 when there are no more codes in the charmap.
+        /// </summary>
+        /// <param name="face">A handle to the source face object</param>
+        /// <param name="char_code">The starting character code</param>
+        /// <param name="agindex">Glyph index of first character code. 0 if charmap is empty</param>
+        /// <returns>The charmap's next character code</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern uint FT_Get_Next_Char(IntPtr /*FaceRec*/ face, uint char_code, [In, Out] uint[] agindex);
+
+        /// <summary>
+        /// Return the glyph index of a given glyph name. This function uses driver specific objects to do the translation
+        /// </summary>
+        /// <param name="face">A handle to the source face object</param>
+        /// <param name="glyph_name">The glyph name</param>
+        /// <returns>The glyph index. 0 means �undefined character code�</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern uint FT_Get_Name_Index(IntPtr /*FaceRec*/ face, [In, Out] sbyte[] glyph_name);
+
+        /// <summary>
+        /// A very simple function used to perform the computation �(a*b)/c� with maximal accuracy (it uses a 64-bit intermediate integer whenever necessary).
+        /// This function isn't necessarily as fast as some processor specific operations, but is at least completely portable.
+        /// </summary>
+        /// <param name="a">The first multiplier</param>
+        /// <param name="b">The second multiplier</param>
+        /// <param name="c">The divisor</param>
+        /// <returns>The result of �(a*b)/c�. This function never traps when trying to divide by zero; it simply returns �MaxInt� or �MinInt� depending on the signs of �a� and �b�</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_MulDiv(int a, int b, int c);
+
+        /// <summary>
+        /// A very simple function used to perform the computation �(a*b)/0x10000� with maximal accuracy. Most of the time this is used to multiply a given value by a 16.16 fixed float factor
+        /// This function has been optimized for the case where the absolute value of �a� is less than 2048, and �b� is a 16.16 scaling factor. As this happens mainly when scaling from notional units to fractional pixels in FreeType, it resulted in noticeable speed improvements between versions 2.x and 1.x.
+        /// As a conclusion, always try to place a 16.16 factor as the second argument of this function; this can make a great difference
+        /// </summary>
+        /// <param name="a">The first multiplier</param>
+        /// <param name="b">The second multiplier. Use a 16.16 factor here whenever possible</param>
+        /// <returns>The result of �(a*b)/0x10000�</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_MulFix(int a, int b);
+
+        /// <summary>
+        /// A very simple function used to perform the computation �(a*0x10000)/b� with maximal accuracy. Most of the time, this is used to divide a given value by a 16.16 fixed float factor
+        /// The optimization for FT_DivFix() is simple: If (a << 16) fits in 32 bits, then the division is computed directly. Otherwise, we use a specialized version of FT_MulDiv
+        /// </summary>
+        /// <param name="a">The first multiplier</param>
+        /// <param name="b">The second multiplier. Use a 16.16 factor here whenever possible</param>
+        /// <returns>The result of �(a*0x10000)/b�</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_DivFix(int a, int b);
+
+        /// <summary>
+        /// A very simple function used to round a 16.16 fixed number
+        /// </summary>
+        /// <param name="a">The number to be rounded</param>
+        /// <returns>The result of �(a + 0x8000) & -0x10000�</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_RoundFix(int a);
+
+        /// <summary>
+        /// A very simple function used to compute the ceiling function of a 16.16 fixed number
+        /// </summary>
+        /// <param name="a">The number for which the ceiling function is to be computed</param>
+        /// <returns>The result of �(a + 0x10000 - 1) &-0x10000�</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_CeilFix(int a);
+
+        /// <summary>
+        /// A very simple function used to compute the floor function of a 16.16 fixed number
+        /// </summary>
+        /// <param name="a">The number for which the floor function is to be computed</param>
+        /// <returns>The result of �a & -0x10000�</returns>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int FT_FloorFix(int a);
+
+        /// <summary>
+        /// Transform a single vector through a 2x2 matrix.  
+        /// The result is undefined if either �vector� or �matrix� is invalid 
+        /// </summary>
+        /// <param name="vec">The target vector to transform</param>
+        /// <param name="matrix">A pointer to the source 2x2 matrix</param>
+        [DllImport(FT_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void FT_Vector_Transform(ref FT_Vector vec, ref FT_Matrix matrix);
+
+
+    }
+}
diff --git a/src/Tao.FreeType/INSTALL b/src/Tao.FreeType/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FreeType/Makefile.am b/src/Tao.FreeType/Makefile.am
new file mode 100644
index 0000000..e66315e
--- /dev/null
+++ b/src/Tao.FreeType/Makefile.am
@@ -0,0 +1,18 @@
+
+ASSEMBLY = Tao.FreeType
+SHORTNAME = tao-freetype
+VERSION = @TAOFREETYPE_VERSION@
+MAJOR = @TAOFREETYPE_MAJOR@
+
+PACKAGES =
+BINARY_LIBS =
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        FreeType.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.FreeType/Makefile.in b/src/Tao.FreeType/Makefile.in
new file mode 100644
index 0000000..67cbec8
--- /dev/null
+++ b/src/Tao.FreeType/Makefile.in
@@ -0,0 +1,414 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-freetype.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS TODO
+subdir = src/Tao.FreeType
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-freetype.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOFREETYPE_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.FreeType
+SHORTNAME = tao-freetype
+MAJOR = @TAOFREETYPE_MAJOR@
+PACKAGES = 
+BINARY_LIBS = 
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        FreeType.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.FreeType/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.FreeType/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-freetype.pc: $(top_builddir)/config.status $(srcdir)/tao-freetype.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.FreeType/NEWS b/src/Tao.FreeType/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FreeType/Properties/AssemblyInfo.cs b/src/Tao.FreeType/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..f5221fa
--- /dev/null
+++ b/src/Tao.FreeType/Properties/AssemblyInfo.cs
@@ -0,0 +1,62 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Tao.Freetype")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Tao.Freetype")]
+[assembly: AssemblyCopyright("Copyright ©  2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("594c9ae6-de8b-465c-8d84-75851d04ebbd")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("2.3.5.0")]
+[assembly: AssemblyFileVersion("2.3.5.0")]
diff --git a/src/Tao.FreeType/README b/src/Tao.FreeType/README
new file mode 100644
index 0000000..6449142
--- /dev/null
+++ b/src/Tao.FreeType/README
@@ -0,0 +1,11 @@
+Tao.FreeType 2.3.5.0
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.FreeType is an FreeType API binding for .NET, implementing FreeType 2.
+
+
+Change Log:
+2.3.5.0 - November 8, 2007:
+    Initial release.
diff --git a/src/Tao.FreeType/TODO b/src/Tao.FreeType/TODO
new file mode 100644
index 0000000..86ff451
--- /dev/null
+++ b/src/Tao.FreeType/TODO
@@ -0,0 +1,4 @@
+Issues
+------
+
+
diff --git a/src/Tao.FreeType/Tao.FreeType.csproj b/src/Tao.FreeType/Tao.FreeType.csproj
new file mode 100644
index 0000000..f623f1e
--- /dev/null
+++ b/src/Tao.FreeType/Tao.FreeType.csproj
@@ -0,0 +1,98 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C04A3F9B-E8C5-42F2-9E15-1B2E71264881}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.FreeType</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.FreeType.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.FreeType</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.FreeType.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.FreeType.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="FreeType.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.FreeType.dll.config" />
+    <None Include="Tao.FreeType.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.FreeType/Tao.FreeType.dll.config b/src/Tao.FreeType/Tao.FreeType.dll.config
new file mode 100644
index 0000000..b93584c
--- /dev/null
+++ b/src/Tao.FreeType/Tao.FreeType.dll.config
@@ -0,0 +1,5 @@
+<configuration>
+    <dllmap dll="freetype6.dll" os="windows" target="freetype6.dll" />
+    <dllmap dll="freetype6.dll" os="osx" target="/Library/Frameworks/Mono.framework/Libraries/libfreetype.6.dylib" />
+    <dllmap dll="freetype6.dll" os="!windows,osx" target="libfreetype.so.6" />
+</configuration>
diff --git a/src/Tao.FreeType/Tao.FreeType.snk b/src/Tao.FreeType/Tao.FreeType.snk
new file mode 100644
index 0000000..886acc0
Binary files /dev/null and b/src/Tao.FreeType/Tao.FreeType.snk differ
diff --git a/src/Tao.FreeType/tao-freetype.pc.in b/src/Tao.FreeType/tao-freetype.pc.in
new file mode 100644
index 0000000..bda813e
--- /dev/null
+++ b/src/Tao.FreeType/tao-freetype.pc.in
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.FreeType
+Description: FreeType portion of the Tao framework
+Version: @TAOFREETYPE_VERSION@
+Requires: 
+Libs: -r:${libdir}/mono/tao-freetype- at TAOFREETYPE_MAJOR@/Tao.FreeType.dll
diff --git a/src/Tao.FtGl/AUTHORS b/src/Tao.FtGl/AUTHORS
new file mode 100644
index 0000000..66665f3
--- /dev/null
+++ b/src/Tao.FtGl/AUTHORS
@@ -0,0 +1,2 @@
+Bindings written by Eric Beets <ericbeets at free.fr> and
+    Sam Hocevar <sam at zoy.org>.
diff --git a/src/Tao.FtGl/COPYING b/src/Tao.FtGl/COPYING
new file mode 100644
index 0000000..8cce3b5
--- /dev/null
+++ b/src/Tao.FtGl/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.FtGl/ChangeLog b/src/Tao.FtGl/ChangeLog
new file mode 100644
index 0000000..a9068a2
--- /dev/null
+++ b/src/Tao.FtGl/ChangeLog
@@ -0,0 +1,2 @@
+2008-01-11T17:19  Sam Hocevar <sam at zoy.org>
+	* Initial checkin.
diff --git a/src/Tao.FtGl/FtGl.cs b/src/Tao.FtGl/FtGl.cs
new file mode 100644
index 0000000..7853237
--- /dev/null
+++ b/src/Tao.FtGl/FtGl.cs
@@ -0,0 +1,903 @@
+#region License
+/*
+ MIT License
+ Copyright 2008 Tao Framework Team
+ http://www.taoframework.com
+ All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Collections.Generic;
+using Tao.FreeType;
+
+namespace Tao.FtGl
+{
+    /// #region Class Documentation
+    /// <summary>
+    ///     FTGL bindings for .NET, implementing FTGL 2.1.3.0
+    /// </summary>
+    /// <remarks>
+    /// </remarks>
+    /// #endregion Class Documentation
+    public static class FtGl
+    {
+        #region Private Constants
+
+        private const string FTGL_NATIVE_LIBRARY = "ftgl.dll";
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+
+        #endregion Private Constants
+
+        /// <summary>
+        ///
+        /// </summary>
+        public class FTGLBitmapFont : FTFont
+        {
+            /// <summary>
+            /// Open and read a font file. Create a Bitmap font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreateBitmapFont(string namefont);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="namefont"></param>
+            public FTGLBitmapFont(string namefont)
+            {
+                _ptr = ftglCreateBitmapFont(namefont);
+            }
+
+            /// <summary>
+            /// Open and read a font from memory. Create a Bitmap font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreateBitmapFontFromMem(IntPtr bytes, int len);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="data"></param>
+            public FTGLBitmapFont(byte[] data)
+            {
+                _data = data;
+                _gch = GCHandle.Alloc(data, GCHandleType.Pinned);
+                _ptr = ftglCreateBitmapFontFromMem(_gch.AddrOfPinnedObject(),
+                                                   data.Length);
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public class FTGLPixmapFont : FTFont
+        {
+            /// <summary>
+            /// Open and read a font file. Create a Pixmap font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreatePixmapFont(string namefont);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="namefont"></param>
+            public FTGLPixmapFont(string namefont)
+            {
+                _ptr = ftglCreatePixmapFont(namefont);
+            }
+
+            /// <summary>
+            /// Open and read a font from memory. Create a Pixmap font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreatePixmapFontFromMem(IntPtr bytes, int len);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="data"></param>
+            public FTGLPixmapFont(byte[] data)
+            {
+                _data = data;
+                _gch = GCHandle.Alloc(data, GCHandleType.Pinned);
+                _ptr = ftglCreatePixmapFontFromMem(_gch.AddrOfPinnedObject(),
+                                                   data.Length);
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public class FTGLOutlineFont : FTFont
+        {
+            /// <summary>
+            /// Open and read a font file. Create a Outline font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreateOutlineFont(string namefont);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="namefont"></param>
+            public FTGLOutlineFont(string namefont)
+            {
+                _ptr = ftglCreateOutlineFont(namefont);
+            }
+
+            /// <summary>
+            /// Open and read a font from memory. Create a Outline font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreateOutlineFontFromMem(IntPtr bytes, int len);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="data"></param>
+            public FTGLOutlineFont(byte[] data)
+            {
+                _data = data;
+                _gch = GCHandle.Alloc(data, GCHandleType.Pinned);
+                _ptr = ftglCreateOutlineFontFromMem(_gch.AddrOfPinnedObject(),
+                                                    data.Length);
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public class FTGLPolygonFont : FTFont
+        {
+            /// <summary>
+            /// Open and read a font file. Create a Polygon font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreatePolygonFont(string namefont);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="namefont"></param>
+            public FTGLPolygonFont(string namefont)
+            {
+                _ptr = ftglCreatePolygonFont(namefont);
+            }
+
+            /// <summary>
+            /// Open and read a font from memory. Create a Polygon font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreatePolygonFontFromMem(IntPtr bytes, int len);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="data"></param>
+            public FTGLPolygonFont(byte[] data)
+            {
+                _data = data;
+                _gch = GCHandle.Alloc(data, GCHandleType.Pinned);
+                _ptr = ftglCreatePolygonFontFromMem(_gch.AddrOfPinnedObject(),
+                                                    data.Length);
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public class FTGLExtrudeFont : FTFont
+        {
+            /// <summary>
+            /// Open and read a font file. Create a Extrud font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreateExtrudeFont(string namefont);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="namefont"></param>
+            public FTGLExtrudeFont(string namefont)
+            {
+                _ptr = ftglCreateExtrudeFont(namefont);
+            }
+
+            /// <summary>
+            /// Open and read a font from memory. Create a Extrude font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreateExtrudeFontFromMem(IntPtr bytes, int len);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="data"></param>
+            public FTGLExtrudeFont(byte[] data)
+            {
+                _data = data;
+                _gch = GCHandle.Alloc(data, GCHandleType.Pinned);
+                _ptr = ftglCreateExtrudeFontFromMem(_gch.AddrOfPinnedObject(),
+                                                    data.Length);
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public class FTGLTextureFont : FTFont
+        {
+            /// <summary>
+            /// Open and read a font file. Create a Texture font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreateTextureFont(string namefont);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="namefont"></param>
+            public FTGLTextureFont(string namefont)
+            {
+                _ptr = ftglCreateTextureFont(namefont);
+            }
+
+            /// <summary>
+            /// Open and read a font from memory. Create a Texture font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreateTextureFontFromMem(IntPtr bytes, int len);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="data"></param>
+            public FTGLTextureFont(byte[] data)
+            {
+                _data = data;
+                _gch = GCHandle.Alloc(data, GCHandleType.Pinned);
+                _ptr = ftglCreateTextureFontFromMem(_gch.AddrOfPinnedObject(),
+                                                    data.Length);
+            }
+        }
+
+        /// <summary>
+        /// Generic Font abstract class
+        /// </summary>
+        abstract public class FTFont
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [CLSCompliant(false)]
+            protected IntPtr _ptr = IntPtr.Zero;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [CLSCompliant(false)]
+            protected byte[] _data = null;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            [CLSCompliant(false)]
+            protected GCHandle _gch;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr Pointer { get{ return _ptr;} }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public FTFont()
+            {
+            }
+
+            /// <summary>
+            /// Close a font file.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static void ftglDestroyFont(IntPtr font);
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public void Destroy()
+            {
+                // We destroy the font in case the GL context disappears
+                // before the GC calls the destructor.
+                if(_ptr != IntPtr.Zero)
+                    ftglDestroyFont(_ptr);
+                _ptr = IntPtr.Zero;
+            }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            ~FTFont()
+            {
+                // XXX: We purposedly don’t call Destroy() here!
+
+                if(_data != null)
+                    _gch.Free();
+                _data = null;
+            }
+
+            /// <summary>
+            /// Gets the line spacing for the font.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern float ftglGetFontLineHeight(IntPtr font);
+
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public float LineHeight()
+            {
+                return ftglGetFontLineHeight(_ptr);
+            }
+
+            /// <summary>
+            /// Set the character map for the face.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern int ftglSetFontCharMap(IntPtr font, FT_Encoding encoding);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="encoding"></param>
+            /// <returns></returns>
+            [CLSCompliant(false)]
+            public int CharMap(FT_Encoding encoding)
+            {
+                return ftglSetFontCharMap(_ptr, encoding);
+            }
+
+            /// <summary>
+            /// Get the bounding box for a string.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglGetFontBBox(IntPtr font, string str, int len, float[] coord);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="str"></param>
+            /// <param name="x1"></param>
+            /// <param name="y1"></param>
+            /// <param name="z1"></param>
+            /// <param name="x2"></param>
+            /// <param name="y2"></param>
+            /// <param name="z2"></param>
+            public void BBox(string str,
+                             out float x1, out float y1, out float z1,
+                             out float x2, out float y2, out float z2)
+            {
+                BBox(str, -1, out x1, out y1, out z1, out x2, out y2, out z2);
+            }
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="str"></param>
+            /// <param name="start"></param>
+            /// <param name="end"></param>
+            /// <param name="x1"></param>
+            /// <param name="y1"></param>
+            /// <param name="z1"></param>
+            /// <param name="x2"></param>
+            /// <param name="y2"></param>
+            /// <param name="z2"></param>
+            public void BBox(string str, int len,
+                             out float x1, out float y1, out float z1,
+                             out float x2, out float y2, out float z2)
+            {
+                x1 = y1 = z1 = x2 = y2 = z2 = 0;
+                float[]coord  = new float[6];
+                ftglGetFontBBox(_ptr, str, len, coord);
+                x1 = coord[0]; y1 = coord[1]; z1 = coord[2];
+                x2 = coord[3]; y2 = coord[4]; z2 = coord[5];
+            }
+
+            /// <summary>
+            /// Get the current face size in points.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern uint ftglGetFontFaceSize(IntPtr font);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public int FaceSize()
+            {
+                return (int)ftglGetFontFaceSize(_ptr);
+            }
+
+            /// <summary>
+            /// Set the char size for the current face.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern int ftglSetFontFaceSize(IntPtr font, uint size, uint res);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="size"></param>
+            /// <param name="res"></param>
+            /// <returns></returns>
+            public int FaceSize(int size, int res)
+            {
+                return ftglSetFontFaceSize(_ptr, (uint)size, (uint)res);
+            }
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="size"></param>
+            /// <returns></returns>
+            public int FaceSize(int size)
+            {
+                return ftglSetFontFaceSize(_ptr, (uint)size, 72);
+            }
+
+            /// <summary>
+            /// Gets the global descender height for the face.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern float ftglGetFontDescender(IntPtr font);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public float Descender()
+            {
+                return ftglGetFontDescender(_ptr);
+            }
+
+            /// <summary>
+            /// Get the global ascender height for the face.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern float ftglGetFontAscender(IntPtr font);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public float Ascender()
+            {
+                return ftglGetFontAscender(_ptr);
+            }
+
+            /// <summary>
+            /// Get the advance width for a string.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern float ftglGetFontAdvance(IntPtr font, string str);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="str"></param>
+            /// <returns></returns>
+            public float Advance(string str)
+            {
+                return ftglGetFontAdvance(_ptr, str);
+            }
+
+            /// <summary>
+            /// Set the extrusion distance for the font. Only implemented by FTGLExtrudeFont
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglSetFontDepth(IntPtr font, float depth);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="depth"></param>
+            public void Depth(float depth)
+            {
+                ftglSetFontDepth(_ptr, depth);
+            }
+
+            /// <summary>
+            /// Set the outset distance for the font. Only implemented by FTGLOutlineFont,
+            /// FTGLPolygonFont and FTGLExtrudeFont
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglSetFontOutset(IntPtr font, float front, float back);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="front"></param>
+            /// <param name="back"></param>
+            public void Outset(float front, float back)
+            {
+                ftglSetFontOutset(_ptr, front, back);
+            }
+
+            /// <summary>
+            /// Render a string of characters.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglRenderFont(IntPtr font, string str);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="str"></param>
+            public void Render(string str)
+            {
+                ftglRenderFont(_ptr, str);
+            }
+
+            /// <summary>
+            /// Queries the Font for errors.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern int ftglGetFontError(IntPtr font);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public int Error()
+            {
+                return ftglGetFontError(_ptr);
+            }
+
+            /// <summary>
+            /// Attach auxilliary file to font e.g font metrics.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern int ftglAttachFile(IntPtr font, string path);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="pathFont"></param>
+            /// <returns></returns>
+            public bool Attach(string pathFont)
+            {
+                int rtn = ftglAttachFile(_ptr, pathFont);
+                if(rtn == 1)
+                    return true;
+                return false;
+            }
+
+            /// <summary>
+            /// Attach auxilliary data to font e.g font metrics, from memory
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern int ftglAttachData(IntPtr font, string p, int size);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="p"></param>
+            /// <param name="size"></param>
+            /// <returns></returns>
+            public bool Attach(string p, int size)
+            {
+                int rtn = ftglAttachData(_ptr, p, size);
+                if(rtn == 1)
+                    return true;
+                return false;
+            }
+
+            /// <summary>
+            /// Get the number of character maps in this face.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern int ftglGetFontCharMapCount(IntPtr font);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public int CharMapCount()
+            {
+                return ftglGetFontCharMapCount(_ptr);
+            }
+
+            /// <summary>
+            /// Get a list of character maps in this face.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern List<FT_Encoding> ftglGetFontCharMapList(IntPtr font);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            [CLSCompliant(false)]
+            public List<FT_Encoding> CharMapList()
+            {
+                return ftglGetFontCharMapList(_ptr);
+            }
+
+            /// <summary>
+            /// Enable or disable the use of Display Lists inside FTGL.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglSetFontDisplayList(IntPtr font, int use);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="use"></param>
+            public void SetDisplayList(bool use)
+            {
+                if(!use)
+                    ftglSetFontDisplayList(_ptr, 0);
+                else
+                    ftglSetFontDisplayList(_ptr, 1);
+            }
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public enum RenderMode : int
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            RENDER_FRONT = 0x01,
+            /// <summary>
+            /// 
+            /// </summary>
+            RENDER_BACK = 0x02,
+            /// <summary>
+            /// 
+            /// </summary>
+            RENDER_SIDE = 0x04,
+        }
+        /// <summary>
+        ///
+        /// </summary>
+        public enum TextAlignment : int
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            ALIGN_LEFT = 0,
+            /// <summary>
+            /// 
+            /// </summary>
+            ALIGN_CENTER = 1,
+            /// <summary>
+            /// 
+            /// </summary>
+            ALIGN_RIGHT = 2,
+            /// <summary>
+            /// 
+            /// </summary>
+            ALIGN_JUSTIFY = 3,
+        }
+
+
+        /// <summary>
+        ///
+        /// </summary>
+        public class FTSimpleLayout: FTLayout
+        {
+
+            /// <summary>
+            ///
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static IntPtr ftglCreateSimpleLayout();
+            /// <summary>
+            /// 
+            /// </summary>
+            public FTSimpleLayout()
+            {
+                _ptr = ftglCreateSimpleLayout();
+            }
+
+            /// <summary>
+            /// Render a string of characters with a specific render mode
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglRenderLayout(IntPtr layout, string str, int mode);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="str"></param>
+            /// <param name="mode"></param>
+            public void RenderMode(string str, RenderMode mode)
+            {
+                ftglRenderLayout(_ptr, str, (int)mode);
+            }
+
+            /// <summary>
+            /// Render a string of characters and distribute extra space amongst the whitespace
+            /// regions of the string.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglRenderLayoutSpace(IntPtr layout, string str, float ExtraSpace);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="str"></param>
+            /// <param name="extraSpace"></param>
+            public void RenderSpace(string str, float extraSpace)
+            {
+                ftglRenderLayoutSpace(_ptr, str, extraSpace);
+            }
+
+            /// <summary>
+            /// The maximum line length for formatting text.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglSetLayoutLineLength(IntPtr layout, float lenght);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="length"></param>
+            public void SetLineLength(float length)
+            {
+                ftglSetLayoutLineLength(_ptr, length);
+            }
+
+            /// <summary>
+            /// Get the current line length.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern float ftglGetLayoutLineLength(IntPtr layout);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public float GetLineLength()
+            {
+                return ftglGetLayoutLineLength(_ptr);
+            }
+
+            /// <summary>
+            /// The text alignment mode used to distribute space within a line or rendered text.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglSetLayoutAlignment(IntPtr layout, int align);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="align"></param>
+            public void SetAlignment(TextAlignment align)
+            {
+                ftglSetLayoutAlignment(_ptr, (int)align);
+            }
+
+            /// <summary>
+            /// Get the text alignment mode.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern int ftglGetLayoutAlignement(IntPtr layout);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public TextAlignment GetAlignment()
+            {
+                return (TextAlignment)ftglGetLayoutAlignement(_ptr);
+            }
+
+            /// <summary>
+            /// Sets the line height.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglSetLayoutLineSpacing(IntPtr layout, float space);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="space"></param>
+            public void SetLineSpacing(float space)
+            {
+                ftglSetLayoutLineSpacing(_ptr, space);
+            }
+
+            /// <summary>
+            /// Get the line spacing.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern float ftglGetLayoutLineSpacing(IntPtr layout);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public float GetLineSpacing()
+            {
+                return ftglGetLayoutLineSpacing(_ptr);
+            }
+        }
+
+        /// <summary>
+        /// Generic Layout abstract class
+        /// </summary>
+        abstract public class FTLayout
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [CLSCompliant(false)]
+            protected IntPtr _ptr = IntPtr.Zero;
+            /// <summary>
+            /// 
+            /// </summary>
+            public FTLayout() {}
+
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private extern static void ftglDestroyLayout(IntPtr layout);
+            /// <summary>
+            /// 
+            /// </summary>
+            public void Destroy()
+            {
+                if(_ptr != IntPtr.Zero)
+                    ftglDestroyLayout(_ptr);
+                _ptr = IntPtr.Zero;
+            }
+            /// <summary>
+            /// 
+            /// </summary>
+            ~FTLayout()
+            {
+                Destroy();
+            }
+
+            /// <summary>
+            /// Get the bounding box for a formatted string.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglGetLayoutBBox(IntPtr layout, string str, float[] coord);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="str"></param>
+            /// <param name="x1"></param>
+            /// <param name="y1"></param>
+            /// <param name="z1"></param>
+            /// <param name="x2"></param>
+            /// <param name="y2"></param>
+            /// <param name="z2"></param>
+            public void BBox(string str, out float x1, out float y1, out float z1,
+                                         out float x2, out float y2, out float z2)
+            {
+                x1 = y1 = z1 = x2 = y2 = z2 = 0;
+                float[]coord  = new float[6];
+                ftglGetLayoutBBox(_ptr, str, coord);
+                x1 = coord[0]; y1 = coord[1]; z1 = coord[2];
+                x2 = coord[3]; y2 = coord[4]; z2 = coord[5];
+            }
+
+            /// <summary>
+            /// Set the font to use for rendering the text.
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern void ftglSetLayoutFont(IntPtr layout, IntPtr fontToAdd);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="font"></param>
+            public void SetFont(FTFont font)
+            {
+                ftglSetLayoutFont(_ptr, font.Pointer);
+            }
+
+            /// <summary>
+            /// Get the current font
+            /// </summary>
+            [DllImport(FTGL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+            private static extern FTFont ftglGetLayoutFont(IntPtr layout);
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public FTFont GetFont()
+            {
+                return ftglGetLayoutFont(_ptr);
+            }
+        }
+    }
+}
diff --git a/src/Tao.FtGl/INSTALL b/src/Tao.FtGl/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FtGl/Makefile.am b/src/Tao.FtGl/Makefile.am
new file mode 100644
index 0000000..601e576
--- /dev/null
+++ b/src/Tao.FtGl/Makefile.am
@@ -0,0 +1,18 @@
+
+ASSEMBLY = Tao.FtGl
+SHORTNAME = tao-ftgl
+VERSION = @TAOFTGL_VERSION@
+MAJOR = @TAOFTGL_MAJOR@
+
+PACKAGES =
+BINARY_LIBS = ../Tao.FreeType/Tao.FreeType.dll
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        FtGl.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.FtGl/Makefile.in b/src/Tao.FtGl/Makefile.in
new file mode 100644
index 0000000..af9ebaa
--- /dev/null
+++ b/src/Tao.FtGl/Makefile.in
@@ -0,0 +1,414 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-ftgl.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.FtGl
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-ftgl.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOFTGL_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.FtGl
+SHORTNAME = tao-ftgl
+MAJOR = @TAOFTGL_MAJOR@
+PACKAGES = 
+BINARY_LIBS = ../Tao.FreeType/Tao.FreeType.dll
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        FtGl.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.FtGl/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.FtGl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-ftgl.pc: $(top_builddir)/config.status $(srcdir)/tao-ftgl.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.FtGl/NEWS b/src/Tao.FtGl/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.FtGl/Properties/AssemblyInfo.cs b/src/Tao.FtGl/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0cb9e70
--- /dev/null
+++ b/src/Tao.FtGl/Properties/AssemblyInfo.cs
@@ -0,0 +1,57 @@
+#region License
+/*
+MIT License
+Copyright ©2008 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright ©2008 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.FtGl")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework FtGl Binding For .NET")]
+[assembly: AssemblyFileVersion("2.1.3.0")]
+[assembly: AssemblyInformationalVersion("2.1.3.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.FtGl.dll")]
+[assembly: AssemblyTitle("Tao Framework FtGl Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("2.1.3.0")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.FtGl/README b/src/Tao.FtGl/README
new file mode 100644
index 0000000..11ad8f8
--- /dev/null
+++ b/src/Tao.FtGl/README
@@ -0,0 +1,10 @@
+Tao.FtGl 1.2.12.0
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.FtGl is an FtGl API binding for .NET.
+
+Change Log:
+2.1.3.0 - May 2008:
+	Initial checkin.
diff --git a/src/Tao.FtGl/Tao.FtGl.csproj b/src/Tao.FtGl/Tao.FtGl.csproj
new file mode 100644
index 0000000..8853108
--- /dev/null
+++ b/src/Tao.FtGl/Tao.FtGl.csproj
@@ -0,0 +1,104 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{AB1A37A9-854C-4C38-BE80-0D2A0502C7A6}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.FtGl</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.FtGl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.FtGl</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.FtGl.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.FtGl.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="FtGl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.FtGl.dll.config" />
+    <None Include="Tao.FtGl.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Tao.FreeType\Tao.FreeType.csproj">
+      <Project>{C04A3F9B-E8C5-42F2-9E15-1B2E71264881}</Project>
+      <Name>Tao.FreeType</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.FtGl/Tao.FtGl.dll.config b/src/Tao.FtGl/Tao.FtGl.dll.config
new file mode 100644
index 0000000..f834a93
--- /dev/null
+++ b/src/Tao.FtGl/Tao.FtGl.dll.config
@@ -0,0 +1,5 @@
+<configuration>
+    <dllmap dll="ftgl.dll" os="windows" target="ftgl.dll"/>
+    <dllmap dll="ftgl.dll" os="osx" target="libftgl.so.2" />
+    <dllmap dll="ftgl.dll" os="!windows,osx" target="libftgl.so.2"/>
+</configuration>
diff --git a/src/Tao.FtGl/Tao.FtGl.snk b/src/Tao.FtGl/Tao.FtGl.snk
new file mode 100644
index 0000000..de97c12
Binary files /dev/null and b/src/Tao.FtGl/Tao.FtGl.snk differ
diff --git a/src/Tao.FtGl/tao-ftgl.pc.in b/src/Tao.FtGl/tao-ftgl.pc.in
new file mode 100644
index 0000000..f01ff6f
--- /dev/null
+++ b/src/Tao.FtGl/tao-ftgl.pc.in
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.FtGl
+Description: FTGL portion of the Tao framework
+Version: @TAOFTGL_VERSION@
+Requires:
+Libs: -r:${libdir}/mono/tao-ftgl- at TAOFTGL_MAJOR@/Tao.FtGl.dll
diff --git a/src/Tao.GlBindGen/AUTHORS b/src/Tao.GlBindGen/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.GlBindGen/COPYING b/src/Tao.GlBindGen/COPYING
new file mode 100644
index 0000000..45645b4
--- /dev/null
+++ b/src/Tao.GlBindGen/COPYING
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+

+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+

+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+

+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+

+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+

+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/src/Tao.GlBindGen/ChangeLog b/src/Tao.GlBindGen/ChangeLog
new file mode 100644
index 0000000..067ff1a
--- /dev/null
+++ b/src/Tao.GlBindGen/ChangeLog
@@ -0,0 +1,63 @@
+2.1.0.0 -> 2.1.0.2
++ Version numbers changed. Now they correspond to the OpenGL version that is translated.
++ All delegate signatures and delegate declarations now reside in the static internal Delegates class.
+	+ Added an empty static constructor to the Delegates class to ensure proper initialization.
+	+ This means we no longer have expose functions with trailing underscores in the public API.
+	+ It also simplifies the translation code (less "gl" and trailing underscores prefixes to work with).
++ All import signatures now reside in the static internal Imports class.
+	+ Added an empty static constructor to the Imports class to ensure proper initialization.
++ Added wrapper functions for all OpenGL functions.
+	+ This provides a homogenous API to the user (only functions are exposed, not delegates mixed with functions).
+	+ It also allows to produce proper inline documentation blocks (though they are empty for the time being).
+	+ Most wrappers just call the underlying Delegate, but some need to do additional work.
++ Removed several functions that are not used by the SpecWriter anymore.
+	+ Beautified SpecWriter output.
+	+ Updated the static constructor - now it will correctly identify all statically exported functions and use the corresponding Import. This works for all platforms.
++ Removed the Typemap.txt document from the Data folder as it was not used, and corrected several typemap definitions.
++ Added a new special case to the SpecReaders. Now both charPointerARB and CharPointer types are correctly mapped. This fixes some reported problems with function wrappers.
++ The function class now contains a Body property. This contains the function definition and is used by Wrappers.
++ Added a solution folder for typemaps to prebuild.xml.
++ Added a newline before printing "Press any key to continue..."
+
+
+0.7.5 -> 0.7.6
++ Changed the name of cs_types.txt and gl_types.txt to cstypes.tm and gl.tm.
++ Updated to the latest opengl specs (2.1, were 2.0 before) - needed some new types in cstypes.tm.
++ Added NeedWrapper and WrapperType properties to each parameter (needed for more fince grained control on wrapper generation).
++ Added Function, Parameter, ParameterCollection (deep) copy constructors. This allows simpler code in many places (since we can now create new Functions without fear of affecting the old ones, for example).
++ Merged the ParameterCollection.cs with Parameter.cs
++ Added the FunctionBody class which contains the contents of a function as a list of strings. It is mainly intended for wrappers (allows cleaner code, too).
++ The wrapper generation now happens in TranlateSpecs.cs instead of WriteSpecs.cs. (Translations and generations should only happen during the translation phase, not while reading or writing. Allow for cleaner code).
++ Revamped the wrapper generator code. Now it handles correctly the cases where a function has more than one parameter that needs wrapping (i.e. it generates all permutations correctly). This is handled by recursively generating the needed permutations (it was a hell to implement).
++ Started documenting internals.
++ Added several new regions.
++ Removed several commented-out regions and some obsolete functions.
++ Reverted the addition of empty XML docs to each and every function and constant. These made the doc generation to take too long (and the docs would be empty, so there is no point, yet).
++ Added #pragma warning disable / restore 1591 to supress warnings about the missing XML docs (see above item).
++ Some other minor changes.
+
+0.7.5.1 -> 0.7.5.2
++ Added translation for out char[] parameters (they are treated as StringBuilders, as specified in MSDN).
++ Added System.Text using directive.
+
+0.7.5 -> 0.7.5.1
++ Documentation updates
+
+0.7.4 -> 0.7.5
++ All Tao examples compile now!
++ Added wrappers for all functions that accept arrays. Permitted parameters for these are: an array of the original type (e.g. float[]), an IntPtr (if you manage memory yourself), or any blittable type (e.g. float[,,]). No type checking is done in the last case, so be careful!
++ Updated the wrappers for all functions that accept or return void pointers. Permitted parameters for these are: an IntPtr or any blittable type (type checking is turned off, so be extra careful!)
++ Aliased the GLbool type to int. It is hacky, but the examples bundled with Tao rely on this...
++ Added a wrapper for glLineStipple. Now you can pass an int to it, but only the last 16 bits will be used for the stipple (as per the function specification). This was the only way to avoid aliasing the parameter to ushort (non-CLS compatible) or having the user write unchecked((short)0x....) every time he used the function.
++ Added the WrapperType enum. Every function has a Property that indicates the wrapper it will need. This cleans up the WriteWrappers function somewhat.
++ Added the PreviousType property to the Function class. This is used when generating wrappers for functions with type-checked arrays (e.g. float[] arrays etc).
++ Corrected some type aliases in cs_types.txt
++ Added the missing wrappers for glReadPixels! (this falls in the out void array).
+
+0.7.3 -> 0.7.4
++ Added the new typemap code, which allows opengl types to be aliased to the equivalent CLS types.
++ Used the above to change uint constants to CLS compliant ints.
++ Merged GlWrappers.cs and Gl.cs. Maybe the assembly compilation can be be done as a postprocess step to bind.
++ Some minor bugfixes.
++ Added the GLSL example (depends on GLFW and GLU).
++ Updated NeHe.Lesson06 to use ints instead of uints.
diff --git a/src/Tao.GlBindGen/INSTALL b/src/Tao.GlBindGen/INSTALL
new file mode 100644
index 0000000..1d12c75
--- /dev/null
+++ b/src/Tao.GlBindGen/INSTALL
@@ -0,0 +1 @@
+link /usr/share/automake-1.9/INSTALL
\ No newline at end of file
diff --git a/src/Tao.GlBindGen/Makefile.am b/src/Tao.GlBindGen/Makefile.am
new file mode 100644
index 0000000..4640904
--- /dev/null
+++ b/src/Tao.GlBindGen/Makefile.am
@@ -0,0 +1 @@
+# TODO
diff --git a/src/Tao.GlBindGen/Makefile.in b/src/Tao.GlBindGen/Makefile.in
new file mode 100644
index 0000000..ff81759
--- /dev/null
+++ b/src/Tao.GlBindGen/Makefile.in
@@ -0,0 +1,327 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = src/Tao.GlBindGen
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	AUTHORS COPYING ChangeLog INSTALL NEWS TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.GlBindGen/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.GlBindGen/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am
+
+
+# TODO
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.GlBindGen/NEWS b/src/Tao.GlBindGen/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.GlBindGen/README b/src/Tao.GlBindGen/README
new file mode 100644
index 0000000..d6b3cfb
--- /dev/null
+++ b/src/Tao.GlBindGen/README
@@ -0,0 +1,38 @@
+The Tao.GlBindGen project is responsible for interpreting the OpenGL
+specification files (http://opengl.org/registry) and generating the
+respective C# bindings. The current version creates bindings for the
+.Net 2.0 or Mono 1.2 runtime.
+
+Tao.GlBindGen started as an internal project for the OpenTK
+library but was adapted and cleaned-up for use with Tao. The current
+version (2.1.x.x) can interpret the v2.1 specs (x.y denote the
+minor and bugfix releases, respectively).
+
+Please, report bugs and problems to the Tao Framework team!
+
+- Stephen Apostolopoulos (stapostol at gmail.com), April 2007
+
+========================= Original Readme =============================
+
+This file holds the tools used to generate Tao's Gl.cs OpenGL
+bindings.  The .spec files come from the SGI OpenGL sample
+implementation, hosted at http://oss.sgi.com/projects/ogl-sample/.
+
+There will eventually be tools here to do some XSLT/XPath-y goodness
+on the resulting XML files, which the binding generator can use to
+annotate the resulting .cs file with docs and other bits; however,
+that's not really necessary to get a first functional release.
+
+Right now, generation requires an installed python and a
+C# compiler/runtime.  The simplistic Makefile is set up for generating
+on linux, though it should work on windows with only minor
+modifications.
+
+    -- Vladimir Vukicevic <vladimir at pobox.com>, Aug 2004
+------------------------------------------------------------------------
+
+Usage:
+"Tao.GlBindGen.exe -mode:gl2 -in:../../Specifications -out:. -o:tao"
+
+Pretty self-explanatory, "-o:tao" sets the generator to Tao compatibillity mode, "-in","-out" set the input and output directory, "-mode:gl2" for OpenGL 2.1 bindings. Available parameters to "-mode:gl2,wgl,glu,glx,gl3". Gl2 and wgl work, glu,glx,gl3 are not ready yet.
+
diff --git a/src/Tao.GlBindGen/TODO b/src/Tao.GlBindGen/TODO
new file mode 100644
index 0000000..fe5b988
--- /dev/null
+++ b/src/Tao.GlBindGen/TODO
@@ -0,0 +1,4 @@
+Todo:
++ Clean up the code. Almost there!
++ Add comments and documentation (faqs, pitfalls, best practices).
++ Add the license to the generated Gl.cs class.
diff --git a/src/Tao.Glfw/AUTHORS b/src/Tao.Glfw/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Glfw/COPYING b/src/Tao.Glfw/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.Glfw/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.Glfw/ChangeLog b/src/Tao.Glfw/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Glfw/Glfw.cs b/src/Tao.Glfw/Glfw.cs
new file mode 100644
index 0000000..e3b1b30
--- /dev/null
+++ b/src/Tao.Glfw/Glfw.cs
@@ -0,0 +1,2213 @@
+#region License
+/*
+MIT License
+Copyright �2003-2004 Randy Ridge
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+using Tao.OpenGl;
+
+namespace Tao.Glfw {
+    #region Class Documentation
+    /// <summary>
+    ///     GLFW (OpenGL Framework) binding for .NET, implementing GLFW 2.6.0.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Marcus Geelnard is the author of GLFW, more information can be found on the
+    ///         GLFW homepage, http://glfw.sourceforge.net.
+    ///     </para>
+    ///     <para>
+    ///         GLFW is a portable API (Application Program Interface) that handles operating
+    ///         system specific tasks related to OpenGL programming.  While OpenGL in general
+    ///         is portable, easy to use and often results in tidy and compact code, the
+    ///         operating system specific mechanisms that are required to set up and manage an
+    ///         OpenGL window are quite the opposite.  GLFW tries to remedy this by providing
+    ///         the following functionality:
+    ///     </para>
+    ///     <para>
+    ///         <list type="bullet">
+    ///             <item>Opening and managing an OpenGL window.</item>
+    ///             <item>Keyboard, mouse and joystick input.</item>
+    ///             <item>A high precision timer.</item>
+    ///             <item>Multi threading support.</item>
+    ///             <item>Support for querying and using OpenGL extensions.</item>
+    ///             <item>Image file loading support.</item>
+    ///         </list>
+    ///     </para>
+    ///     <para>
+    ///         All this functionality is implemented as a set of easy-to-use functions, which
+    ///         makes it possible to write an OpenGL application framework in just a few lines
+    ///         of code.  The GLFW API is completely operating system and platform independent,
+    ///         which makes it very simple to port GLFW based OpenGL applications to a variety
+    ///         of platforms.  Currently supported platforms are:
+    ///     </para>
+    ///     <para>
+    ///         <list type="bullet">
+    ///             <item>Microsoft Windows 95/98/ME/NT/2000/XP/2003 Server.</item>
+    ///             <item>
+    ///                 Unix or Unix-like systems running the X Window System, e.g. Linux,
+    ///                 IRIX, FreeBSD, Solaris, QNX, and Mac OSX.
+    ///             </item>
+    ///             <item>
+    ///                 Mac OSX (Carbon), only a subset of GLFW is available at this time.
+    ///             </item>
+    ///             <item>
+    ///                 AmigaOS, only a subset of GLFW is available at this time.
+    ///             </item>
+    ///         </list>
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public static class Glfw
+    {
+
+		#region Private Constants
+
+		#region string GLFW_NATIVE_LIBRARY
+		/// <summary>
+		/// Specifies the GLFW native library used in the bindings
+		/// </summary>
+		/// <remarks>
+		/// The Windows dll is specified here universally - note that
+		/// under Mono the non-windows native library can be mapped using
+		/// the ".config" file mechanism.  Kudos to the Mono team for this
+		/// simple yet elegant solution.
+		/// </remarks>
+		private const string GLFW_NATIVE_LIBRARY = "glfw.dll";
+		#endregion string GLFW_NATIVE_LIBRARY
+
+		#endregion Private Constants
+
+        // --- Fields ---
+        #region Public Constants
+
+        #region Version
+        #region GLFW_VERSION_MAJOR
+        /// <summary>
+        ///     Major version number.
+        /// </summary>
+        // #define GLFW_VERSION_MAJOR 2
+        public const int GLFW_VERSION_MAJOR = 2;
+        #endregion GLFW_VERSION_MAJOR
+
+        #region GLFW_VERSION_MINOR
+        /// <summary>
+        ///     Minor version number.
+        /// </summary>
+        // #define GLFW_VERSION_MINOR 5
+        public const int GLFW_VERSION_MINOR = 6;
+        #endregion GLFW_VERSION_MINOR
+
+        #region GLFW_VERSION_REVISION
+        /// <summary>
+        ///     Revision version number.
+        /// </summary>
+        // #define GLFW_VERSION_REVISION 0
+        public const int GLFW_VERSION_REVISION = 0;
+        #endregion GLFW_VERSION_REVISION
+        #endregion Version
+
+        #region Input State
+        #region GLFW_RELEASE
+        /// <summary>
+        ///     Button or key is not pressed.
+        /// </summary>
+        // #define GLFW_RELEASE 0
+        public const int GLFW_RELEASE = 0;
+        #endregion GLFW_RELEASE
+
+        #region GLFW_PRESS
+        /// <summary>
+        ///     Button or key is pressed.
+        /// </summary>
+        // #define GLFW_PRESS 1
+        public const int GLFW_PRESS = 1;
+        #endregion GLFW_PRESS
+        #endregion Input States
+
+        #region Keyboard Keys
+        #region GLFW_KEY_UNKNOWN
+        /// <summary>
+        ///     Unknown key.
+        /// </summary>
+        // #define GLFW_KEY_UNKNOWN -1
+        public const int GLFW_KEY_UNKNOWN = -1;
+        #endregion GLFW_KEY_UNKNOWN
+
+        #region GLFW_KEY_SPACE
+        /// <summary>
+        ///     Space bar.
+        /// </summary>
+        // #define GLFW_KEY_SPACE 32
+        public const int GLFW_KEY_SPACE = 32;
+        #endregion GLFW_KEY_SPACE
+
+        #region GLFW_KEY_SPECIAL
+        /// <summary>
+        ///     Delineates start of 'special' keys.
+        /// </summary>
+        // #define GLFW_KEY_SPECIAL 256
+        public const int GLFW_KEY_SPECIAL = 256;
+        #endregion GLFW_KEY_SPECIAL
+
+        #region GLFW_KEY_ESC
+        /// <summary>
+        ///     Escape.
+        /// </summary>
+        // #define GLFW_KEY_ESC (GLFW_KEY_SPECIAL+1)
+        public const int GLFW_KEY_ESC = GLFW_KEY_SPECIAL + 1;
+        #endregion GLFW_KEY_ESC
+
+        #region GLFW_KEY_F1
+        /// <summary>
+        ///     Function key 1.
+        /// </summary>
+        // #define GLFW_KEY_F1 (GLFW_KEY_SPECIAL+2)
+        public const int GLFW_KEY_F1 = GLFW_KEY_SPECIAL + 2;
+        #endregion GLFW_KEY_F1
+
+        #region GLFW_KEY_F2
+        /// <summary>
+        ///     Function key 2.
+        /// </summary>
+        // #define GLFW_KEY_F2 (GLFW_KEY_SPECIAL+3)
+        public const int GLFW_KEY_F2 = GLFW_KEY_SPECIAL + 3;
+        #endregion GLFW_KEY_F2
+
+        #region GLFW_KEY_F3
+        /// <summary>
+        ///     Function key 3.
+        /// </summary>
+        // #define GLFW_KEY_F3 (GLFW_KEY_SPECIAL+4)
+        public const int GLFW_KEY_F3 = GLFW_KEY_SPECIAL + 4;
+        #endregion GLFW_KEY_F3
+
+        #region GLFW_KEY_F4
+        /// <summary>
+        ///     Function key 4.
+        /// </summary>
+        // #define GLFW_KEY_F4 (GLFW_KEY_SPECIAL+5)
+        public const int GLFW_KEY_F4 = GLFW_KEY_SPECIAL + 5;
+        #endregion GLFW_KEY_F4
+
+        #region GLFW_KEY_F5
+        /// <summary>
+        ///     Function key 5.
+        /// </summary>
+        // #define GLFW_KEY_F5 (GLFW_KEY_SPECIAL+6)
+        public const int GLFW_KEY_F5 = GLFW_KEY_SPECIAL + 6;
+        #endregion GLFW_KEY_F5
+
+        #region GLFW_KEY_F6
+        /// <summary>
+        ///     Function key 6.
+        /// </summary>
+        // #define GLFW_KEY_F6 (GLFW_KEY_SPECIAL+7)
+        public const int GLFW_KEY_F6 = GLFW_KEY_SPECIAL + 7;
+        #endregion GLFW_KEY_F6
+
+        #region GLFW_KEY_F7
+        /// <summary>
+        ///     Function key 7.
+        /// </summary>
+        // #define GLFW_KEY_F7 (GLFW_KEY_SPECIAL+8)
+        public const int GLFW_KEY_F7 = GLFW_KEY_SPECIAL + 8;
+        #endregion GLFW_KEY_F7
+
+        #region GLFW_KEY_F8
+        /// <summary>
+        ///     Function key 8.
+        /// </summary>
+        // #define GLFW_KEY_F8 (GLFW_KEY_SPECIAL+9)
+        public const int GLFW_KEY_F8 = GLFW_KEY_SPECIAL + 9;
+        #endregion GLFW_KEY_F8
+
+        #region GLFW_KEY_F9
+        /// <summary>
+        ///     Function key 9.
+        /// </summary>
+        // #define GLFW_KEY_F9 (GLFW_KEY_SPECIAL+10)
+        public const int GLFW_KEY_F9 = GLFW_KEY_SPECIAL + 10;
+        #endregion GLFW_KEY_F9
+
+        #region GLFW_KEY_F10
+        /// <summary>
+        ///     Function key 10.
+        /// </summary>
+        // #define GLFW_KEY_F10 (GLFW_KEY_SPECIAL+11)
+        public const int GLFW_KEY_F10 = GLFW_KEY_SPECIAL + 11;
+        #endregion GLFW_KEY_F10
+
+        #region GLFW_KEY_F11
+        /// <summary>
+        ///     Function key 11.
+        /// </summary>
+        // #define GLFW_KEY_F11 (GLFW_KEY_SPECIAL+12)
+        public const int GLFW_KEY_F11 = GLFW_KEY_SPECIAL + 12;
+        #endregion GLFW_KEY_F11
+
+        #region GLFW_KEY_F12
+        /// <summary>
+        ///     Function key 12.
+        /// </summary>
+        // #define GLFW_KEY_F12 (GLFW_KEY_SPECIAL+13)
+        public const int GLFW_KEY_F12 = GLFW_KEY_SPECIAL + 13;
+        #endregion GLFW_KEY_F12
+
+        #region GLFW_KEY_F13
+        /// <summary>
+        ///     Function key 13.
+        /// </summary>
+        // #define GLFW_KEY_F13 (GLFW_KEY_SPECIAL+14)
+        public const int GLFW_KEY_F13 = GLFW_KEY_SPECIAL + 14;
+        #endregion GLFW_KEY_F13
+
+        #region GLFW_KEY_F14
+        /// <summary>
+        ///     Function key 14.
+        /// </summary>
+        // #define GLFW_KEY_F14 (GLFW_KEY_SPECIAL+15)
+        public const int GLFW_KEY_F14 = GLFW_KEY_SPECIAL + 15;
+        #endregion GLFW_KEY_F14
+
+        #region GLFW_KEY_F15
+        /// <summary>
+        ///     Function key 15.
+        /// </summary>
+        // #define GLFW_KEY_F15 (GLFW_KEY_SPECIAL+16)
+        public const int GLFW_KEY_F15 = GLFW_KEY_SPECIAL + 16;
+        #endregion GLFW_KEY_F15
+
+        #region GLFW_KEY_F16
+        /// <summary>
+        ///     Function key 16.
+        /// </summary>
+        // #define GLFW_KEY_F16 (GLFW_KEY_SPECIAL+17)
+        public const int GLFW_KEY_F16 = GLFW_KEY_SPECIAL + 17;
+        #endregion GLFW_KEY_F16
+
+        #region GLFW_KEY_F17
+        /// <summary>
+        ///     Function key 17.
+        /// </summary>
+        // #define GLFW_KEY_F17 (GLFW_KEY_SPECIAL+18)
+        public const int GLFW_KEY_F17 = GLFW_KEY_SPECIAL + 18;
+        #endregion GLFW_KEY_F17
+
+        #region GLFW_KEY_F18
+        /// <summary>
+        ///     Function key 18.
+        /// </summary>
+        // #define GLFW_KEY_F18 (GLFW_KEY_SPECIAL+19)
+        public const int GLFW_KEY_F18 = GLFW_KEY_SPECIAL + 19;
+        #endregion GLFW_KEY_F18
+
+        #region GLFW_KEY_F19
+        /// <summary>
+        ///     Function key 19.
+        /// </summary>
+        // #define GLFW_KEY_F19 (GLFW_KEY_SPECIAL+20)
+        public const int GLFW_KEY_F19 = GLFW_KEY_SPECIAL + 20;
+        #endregion GLFW_KEY_F19
+
+        #region GLFW_KEY_F20
+        /// <summary>
+        ///     Function key 20.
+        /// </summary>
+        // #define GLFW_KEY_F20 (GLFW_KEY_SPECIAL+21)
+        public const int GLFW_KEY_F20 = GLFW_KEY_SPECIAL + 21;
+        #endregion GLFW_KEY_F20
+
+        #region GLFW_KEY_F21
+        /// <summary>
+        ///     Function key 21.
+        /// </summary>
+        // #define GLFW_KEY_F21 (GLFW_KEY_SPECIAL+22)
+        public const int GLFW_KEY_F21 = GLFW_KEY_SPECIAL + 22;
+        #endregion GLFW_KEY_F21
+
+        #region GLFW_KEY_F22
+        /// <summary>
+        ///     Function key 22.
+        /// </summary>
+        // #define GLFW_KEY_F22 (GLFW_KEY_SPECIAL+23)
+        public const int GLFW_KEY_F22 = GLFW_KEY_SPECIAL + 23;
+        #endregion GLFW_KEY_F22
+
+        #region GLFW_KEY_F23
+        /// <summary>
+        ///     Function key 23.
+        /// </summary>
+        // #define GLFW_KEY_F23 (GLFW_KEY_SPECIAL+24)
+        public const int GLFW_KEY_F23 = GLFW_KEY_SPECIAL + 24;
+        #endregion GLFW_KEY_F23
+
+        #region GLFW_KEY_F24
+        /// <summary>
+        ///     Function key 24.
+        /// </summary>
+        // #define GLFW_KEY_F24 (GLFW_KEY_SPECIAL+25)
+        public const int GLFW_KEY_F24 = GLFW_KEY_SPECIAL + 25;
+        #endregion GLFW_KEY_F24
+
+        #region GLFW_KEY_F25
+        /// <summary>
+        ///     Function key 25.
+        /// </summary>
+        // #define GLFW_KEY_F25 (GLFW_KEY_SPECIAL+26)
+        public const int GLFW_KEY_F25 = GLFW_KEY_SPECIAL + 26;
+        #endregion GLFW_KEY_F25
+
+        #region GLFW_KEY_UP
+        /// <summary>
+        ///     Cursor up.
+        /// </summary>
+        // #define GLFW_KEY_UP (GLFW_KEY_SPECIAL+27)
+        public const int GLFW_KEY_UP = GLFW_KEY_SPECIAL + 27;
+        #endregion GLFW_KEY_UP
+
+        #region GLFW_KEY_DOWN
+        /// <summary>
+        ///     Cursor down.
+        /// </summary>
+        // #define GLFW_KEY_DOWN (GLFW_KEY_SPECIAL+28)
+        public const int GLFW_KEY_DOWN = GLFW_KEY_SPECIAL + 28;
+        #endregion GLFW_KEY_DOWN
+
+        #region GLFW_KEY_LEFT
+        /// <summary>
+        ///     Cursor left.
+        /// </summary>
+        // #define GLFW_KEY_LEFT (GLFW_KEY_SPECIAL+29)
+        public const int GLFW_KEY_LEFT = GLFW_KEY_SPECIAL + 29;
+        #endregion GLFW_KEY_LEFT
+
+        #region GLFW_KEY_RIGHT
+        /// <summary>
+        ///     Cursor right.
+        /// </summary>
+        // #define GLFW_KEY_RIGHT (GLFW_KEY_SPECIAL+30)
+        public const int GLFW_KEY_RIGHT = GLFW_KEY_SPECIAL + 30;
+        #endregion GLFW_KEY_RIGHT
+
+        #region GLFW_KEY_LSHIFT
+        /// <summary>
+        ///     Left shift key.
+        /// </summary>
+        // #define GLFW_KEY_LSHIFT (GLFW_KEY_SPECIAL+31)
+        public const int GLFW_KEY_LSHIFT = GLFW_KEY_SPECIAL + 31;
+        #endregion GLFW_KEY_LSHIFT
+
+        #region GLFW_KEY_RSHIFT
+        /// <summary>
+        ///     Right shift key.
+        /// </summary>
+        // #define GLFW_KEY_RSHIFT (GLFW_KEY_SPECIAL+32)
+        public const int GLFW_KEY_RSHIFT = GLFW_KEY_SPECIAL + 32;
+        #endregion GLFW_KEY_RSHIFT
+
+        #region GLFW_KEY_LCTRL
+        /// <summary>
+        ///     Left control key.
+        /// </summary>
+        // #define GLFW_KEY_LCTRL (GLFW_KEY_SPECIAL+33)
+        public const int GLFW_KEY_LCTRL = GLFW_KEY_SPECIAL + 33;
+        #endregion GLFW_KEY_LCTRL
+
+        #region GLFW_KEY_RCTRL
+        /// <summary>
+        ///     Right control key.
+        /// </summary>
+        // #define GLFW_KEY_RCTRL (GLFW_KEY_SPECIAL+34)
+        public const int GLFW_KEY_RCTRL = GLFW_KEY_SPECIAL + 34;
+        #endregion GLFW_KEY_RCTRL
+
+        #region GLFW_KEY_LALT
+        /// <summary>
+        ///     Left alternate function key.
+        /// </summary>
+        // #define GLFW_KEY_LALT (GLFW_KEY_SPECIAL+35)
+        public const int GLFW_KEY_LALT = GLFW_KEY_SPECIAL + 35;
+        #endregion GLFW_KEY_LALT
+
+        #region GLFW_KEY_RALT
+        /// <summary>
+        ///     Right alternate function key.
+        /// </summary>
+        // #define GLFW_KEY_RALT (GLFW_KEY_SPECIAL+36)
+        public const int GLFW_KEY_RALT = GLFW_KEY_SPECIAL + 36;
+        #endregion GLFW_KEY_RALT
+
+        #region GLFW_KEY_TAB
+        /// <summary>
+        ///     Tabulator.
+        /// </summary>
+        // #define GLFW_KEY_TAB (GLFW_KEY_SPECIAL+37)
+        public const int GLFW_KEY_TAB = GLFW_KEY_SPECIAL + 37;
+        #endregion GLFW_KEY_TAB
+
+        #region GLFW_KEY_ENTER
+        /// <summary>
+        ///     Enter.
+        /// </summary>
+        // #define GLFW_KEY_ENTER (GLFW_KEY_SPECIAL+38)
+        public const int GLFW_KEY_ENTER = GLFW_KEY_SPECIAL + 38;
+        #endregion GLFW_KEY_ENTER
+
+        #region GLFW_KEY_BACKSPACE
+        /// <summary>
+        ///     Backspace.
+        /// </summary>
+        // #define GLFW_KEY_BACKSPACE (GLFW_KEY_SPECIAL+39)
+        public const int GLFW_KEY_BACKSPACE = GLFW_KEY_SPECIAL + 39;
+        #endregion GLFW_KEY_BACKSPACE
+
+        #region GLFW_KEY_INSERT
+        /// <summary>
+        ///     Insert.
+        /// </summary>
+        // #define GLFW_KEY_INSERT (GLFW_KEY_SPECIAL+40)
+        public const int GLFW_KEY_INSERT = GLFW_KEY_SPECIAL + 40;
+        #endregion GLFW_KEY_INSERT
+
+        #region GLFW_KEY_DEL
+        /// <summary>
+        ///     Delete.
+        /// </summary>
+        // #define GLFW_KEY_DEL (GLFW_KEY_SPECIAL+41)
+        public const int GLFW_KEY_DEL = GLFW_KEY_SPECIAL + 41;
+        #endregion GLFW_KEY_DEL
+
+        #region GLFW_KEY_PAGEUP
+        /// <summary>
+        ///     Page up.
+        /// </summary>
+        // #define GLFW_KEY_PAGEUP (GLFW_KEY_SPECIAL+42)
+        public const int GLFW_KEY_PAGEUP = GLFW_KEY_SPECIAL + 42;
+        #endregion GLFW_KEY_PAGEUP
+
+        #region GLFW_KEY_PAGEDOWN
+        /// <summary>
+        ///     Page down.
+        /// </summary>
+        // #define GLFW_KEY_PAGEDOWN (GLFW_KEY_SPECIAL+43)
+        public const int GLFW_KEY_PAGEDOWN = GLFW_KEY_SPECIAL + 43;
+        #endregion GLFW_KEY_PAGEDOWN
+
+        #region GLFW_KEY_HOME
+        /// <summary>
+        ///     Home.
+        /// </summary>
+        // #define GLFW_KEY_HOME (GLFW_KEY_SPECIAL+44)
+        public const int GLFW_KEY_HOME = GLFW_KEY_SPECIAL + 44;
+        #endregion GLFW_KEY_HOME
+
+        #region GLFW_KEY_END
+        /// <summary>
+        ///     End.
+        /// </summary>
+        // #define GLFW_KEY_END (GLFW_KEY_SPECIAL+45)
+        public const int GLFW_KEY_END = GLFW_KEY_SPECIAL + 45;
+        #endregion GLFW_KEY_END
+
+        #region GLFW_KEY_KP_0
+        /// <summary>
+        ///     Keypad numeric key 0.
+        /// </summary>
+        // #define GLFW_KEY_KP_0 (GLFW_KEY_SPECIAL+46)
+        public const int GLFW_KEY_KP_0 = GLFW_KEY_SPECIAL + 46;
+        #endregion GLFW_KEY_KP_0
+
+        #region GLFW_KEY_KP_1
+        /// <summary>
+        ///     Keypad numeric key 1.
+        /// </summary>
+        // #define GLFW_KEY_KP_1 (GLFW_KEY_SPECIAL+47)
+        public const int GLFW_KEY_KP_1 = GLFW_KEY_SPECIAL + 47;
+        #endregion GLFW_KEY_KP_1
+
+        #region GLFW_KEY_KP_2
+        /// <summary>
+        ///     Keypad numeric key 2.
+        /// </summary>
+        // #define GLFW_KEY_KP_2 (GLFW_KEY_SPECIAL+48)
+        public const int GLFW_KEY_KP_2 = GLFW_KEY_SPECIAL + 48;
+        #endregion GLFW_KEY_KP_2
+
+        #region GLFW_KEY_KP_3
+        /// <summary>
+        ///     Keypad numeric key 3.
+        /// </summary>
+        // #define GLFW_KEY_KP_3 (GLFW_KEY_SPECIAL+49)
+        public const int GLFW_KEY_KP_3 = GLFW_KEY_SPECIAL + 49;
+        #endregion GLFW_KEY_KP_3
+
+        #region GLFW_KEY_KP_4
+        /// <summary>
+        ///     Keypad numeric key 4.
+        /// </summary>
+        // #define GLFW_KEY_KP_4 (GLFW_KEY_SPECIAL+50)
+        public const int GLFW_KEY_KP_4 = GLFW_KEY_SPECIAL + 50;
+        #endregion GLFW_KEY_KP_4
+
+        #region GLFW_KEY_KP_5
+        /// <summary>
+        ///     Keypad numeric key 5.
+        /// </summary>
+        // #define GLFW_KEY_KP_5 (GLFW_KEY_SPECIAL+51)
+        public const int GLFW_KEY_KP_5 = GLFW_KEY_SPECIAL + 51;
+        #endregion GLFW_KEY_KP_5
+
+        #region GLFW_KEY_KP_6
+        /// <summary>
+        ///     Keypad numeric key 6.
+        /// </summary>
+        // #define GLFW_KEY_KP_6 (GLFW_KEY_SPECIAL+52)
+        public const int GLFW_KEY_KP_6 = GLFW_KEY_SPECIAL + 52;
+        #endregion GLFW_KEY_KP_6
+
+        #region GLFW_KEY_KP_7
+        /// <summary>
+        ///     Keypad numeric key 7.
+        /// </summary>
+        // #define GLFW_KEY_KP_7 (GLFW_KEY_SPECIAL+53)
+        public const int GLFW_KEY_KP_7 = GLFW_KEY_SPECIAL + 53;
+        #endregion GLFW_KEY_KP_7
+
+        #region GLFW_KEY_KP_8
+        /// <summary>
+        ///     Keypad numeric key 8.
+        /// </summary>
+        // #define GLFW_KEY_KP_8 (GLFW_KEY_SPECIAL+54)
+        public const int GLFW_KEY_KP_8 = GLFW_KEY_SPECIAL + 54;
+        #endregion GLFW_KEY_KP_8
+
+        #region GLFW_KEY_KP_9
+        /// <summary>
+        ///     Keypad numeric key 9.
+        /// </summary>
+        // #define GLFW_KEY_KP_9 (GLFW_KEY_SPECIAL+55)
+        public const int GLFW_KEY_KP_9 = GLFW_KEY_SPECIAL + 55;
+        #endregion GLFW_KEY_KP_9
+
+        #region GLFW_KEY_KP_DIVIDE
+        /// <summary>
+        ///     Keypad divide.
+        /// </summary>
+        // #define GLFW_KEY_KP_DIVIDE (GLFW_KEY_SPECIAL+56)
+        public const int GLFW_KEY_KP_DIVIDE = GLFW_KEY_SPECIAL + 56;
+        #endregion GLFW_KEY_KP_DIVIDE
+
+        #region GLFW_KEY_KP_MULTIPLY
+        /// <summary>
+        ///     Keypad multiply.
+        /// </summary>
+        // #define GLFW_KEY_KP_MULTIPLY (GLFW_KEY_SPECIAL+57)
+        public const int GLFW_KEY_KP_MULTIPLY = GLFW_KEY_SPECIAL + 57;
+        #endregion GLFW_KEY_KP_MULTIPLY
+
+        #region GLFW_KEY_KP_SUBTRACT
+        /// <summary>
+        ///     Keypad subtract.
+        /// </summary>
+        // #define GLFW_KEY_KP_SUBTRACT (GLFW_KEY_SPECIAL+58)
+        public const int GLFW_KEY_KP_SUBTRACT = GLFW_KEY_SPECIAL + 58;
+        #endregion GLFW_KEY_KP_SUBTRACT
+
+        #region GLFW_KEY_KP_ADD
+        /// <summary>
+        ///     Keypad add.
+        /// </summary>
+        // #define GLFW_KEY_KP_ADD (GLFW_KEY_SPECIAL+59)
+        public const int GLFW_KEY_KP_ADD = GLFW_KEY_SPECIAL + 59;
+        #endregion GLFW_KEY_KP_ADD
+
+        #region GLFW_KEY_KP_DECIMAL
+        /// <summary>
+        ///     Keypad decimal.
+        /// </summary>
+        // #define GLFW_KEY_KP_DECIMAL (GLFW_KEY_SPECIAL+60)
+        public const int GLFW_KEY_KP_DECIMAL = GLFW_KEY_SPECIAL + 60;
+        #endregion GLFW_KEY_KP_DECIMAL
+
+        #region GLFW_KEY_KP_EQUAL
+        /// <summary>
+        ///     Keypad equal.
+        /// </summary>
+        // #define GLFW_KEY_KP_EQUAL (GLFW_KEY_SPECIAL+61)
+        public const int GLFW_KEY_KP_EQUAL = GLFW_KEY_SPECIAL + 61;
+        #endregion GLFW_KEY_KP_EQUAL
+
+        #region GLFW_KEY_KP_ENTER
+        /// <summary>
+        ///     Keypad enter.
+        /// </summary>
+        // #define GLFW_KEY_KP_ENTER (GLFW_KEY_SPECIAL+62)
+        public const int GLFW_KEY_KP_ENTER = GLFW_KEY_SPECIAL + 62;
+        #endregion GLFW_KEY_KP_ENTER
+
+        #region GLFW_KEY_LAST
+        /// <summary>
+        ///     Delinates end of 'special' keys.
+        /// </summary>
+        // #define GLFW_KEY_LAST GLFW_KEY_KP_ENTER
+        public const int GLFW_KEY_LAST = GLFW_KEY_KP_ENTER;
+        #endregion GLFW_KEY_LAST
+        #endregion Keyboard Keys
+
+        #region Mouse Buttons
+
+		#region GLFW_MOUSE_BUTTON_1
+		/// <summary>
+		///		Mouse identifier 1.
+		/// </summary>
+		// #define GLFW_MOUSE_BUTTON_1 0
+		public const int GLFW_MOUSE_BUTTON_1 = 0;
+		#endregion GLFW_MOUSE_BUTTON_1
+
+		#region GLFW_MOUSE_BUTTON_2
+		/// <summary>
+		/// 	Mouse identifier 2.
+		/// </summary>
+		// #define GLFW_MOUSE_BUTTON_2 1
+		public const int GLFW_MOUSE_BUTTON_2 = 1;
+		#endregion GLFW_MOUSE_BUTTON_2
+
+		#region GLFW_MOUSE_BUTTON_3
+		/// <summary>
+		/// 	Mouse identifier 3.
+		/// </summary>
+		// #define GLFW_MOUSE_BUTTON_3 2
+		public const int GLFW_MOUSE_BUTTON_3 = 2;
+		#endregion GLFW_MOUSE_BUTTON_3
+
+		#region GLFW_MOUSE_BUTTON_4
+		/// <summary>
+		/// 	Mouse identifier 4.
+		/// </summary>
+		// #define GLFW_MOUSE_BUTTON_4 3
+		public const int GLFW_MOUSE_BUTTON_4 = 3;
+		#endregion GLFW_MOUSE_BUTTON_4
+
+		#region GLFW_MOUSE_BUTTON_5
+		/// <summary>
+		/// 	Mouse identifier 5.
+		/// </summary>
+		// #define GLFW_MOUSE_BUTTON_5 4
+		public const int GLFW_MOUSE_BUTTON_5 = 4;
+		#endregion GLFW_MOUSE_BUTTON_5
+
+		#region GLFW_MOUSE_BUTTON_6
+		/// <summary>
+		/// 	Mouse identifier 6.
+		/// </summary>
+		// #define GLFW_MOUSE_BUTTON_6 5
+		public const int GLFW_MOUSE_BUTTON_6 = 5;
+		#endregion GLFW_MOUSE_BUTTON_6
+
+		#region GLFW_MOUSE_BUTTON_7
+		/// <summary>
+		/// 	Mouse identifier 7.
+		/// </summary>
+		// #define GLFW_MOUSE_BUTTON_7 6
+		public const int GLFW_MOUSE_BUTTON_7 = 6;
+		#endregion GLFW_MOUSE_BUTTON_7
+
+		#region GLFW_MOUSE_BUTTON_8
+		/// <summary>
+		/// 	Mouse identifier 8.
+		/// </summary>
+		// #define GLFW_MOUSE_BUTTON_8 7
+		public const int GLFW_MOUSE_BUTTON_8 = 7;
+		#endregion GLFW_MOUSE_BUTTON_8
+
+        #region GLFW_MOUSE_BUTTON_LEFT
+        /// <summary>
+        ///     Left mouse button.
+        /// </summary>
+        // #define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1
+        public const int GLFW_MOUSE_BUTTON_LEFT = GLFW_MOUSE_BUTTON_1;
+        #endregion GLFW_MOUSE_BUTTON_LEFT
+
+        #region GLFW_MOUSE_BUTTON_RIGHT
+        /// <summary>
+        ///     Right mouse button.
+        /// </summary>
+        // #define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2
+        public const int GLFW_MOUSE_BUTTON_RIGHT = GLFW_MOUSE_BUTTON_2;
+        #endregion GLFW_MOUSE_BUTTON_RIGHT
+
+        #region GLFW_MOUSE_BUTTON_MIDDLE
+        /// <summary>
+        ///     Middle mouse button.
+        /// </summary>
+        // #define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3
+        public const int GLFW_MOUSE_BUTTON_MIDDLE = GLFW_MOUSE_BUTTON_3;
+        #endregion GLFW_MOUSE_BUTTON_MIDDLE
+
+        #region GLFW_MOUSE_BUTTON_LAST
+        /// <summary>
+        ///     Delineates the last mouse button.
+        /// </summary>
+        // #define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8
+        public const int GLFW_MOUSE_BUTTON_LAST = GLFW_MOUSE_BUTTON_8;
+        #endregion GLFW_MOUSE_BUTTON_LAST
+        #endregion Mouse Buttons
+
+        #region Joystick Identifiers
+        #region GLFW_JOYSTICK_1
+        /// <summary>
+        ///     Joystick identifier 1.
+        /// </summary>
+        // #define GLFW_JOYSTICK_1 0
+        public const int GLFW_JOYSTICK_1 = 0;
+        #endregion GLFW_JOYSTICK_1
+
+        #region GLFW_JOYSTICK_2
+        /// <summary>
+        ///     Joystick identifier 2.
+        /// </summary>
+        // #define GLFW_JOYSTICK_2 1
+        public const int GLFW_JOYSTICK_2 = 1;
+        #endregion GLFW_JOYSTICK_2
+
+        #region GLFW_JOYSTICK_3
+        /// <summary>
+        ///     Joystick identifier 3.
+        /// </summary>
+        // #define GLFW_JOYSTICK_3 2
+        public const int GLFW_JOYSTICK_3 = 2;
+        #endregion GLFW_JOYSTICK_3
+
+        #region GLFW_JOYSTICK_4
+        /// <summary>
+        ///     Joystick identifier 4.
+        /// </summary>
+        // #define GLFW_JOYSTICK_4 3
+        public const int GLFW_JOYSTICK_4 = 3;
+        #endregion GLFW_JOYSTICK_4
+
+        #region GLFW_JOYSTICK_5
+        /// <summary>
+        ///     Joystick identifier 5.
+        /// </summary>
+        // #define GLFW_JOYSTICK_5 4
+        public const int GLFW_JOYSTICK_5 = 4;
+        #endregion GLFW_JOYSTICK_5
+
+        #region GLFW_JOYSTICK_6
+        /// <summary>
+        ///     Joystick identifier 6.
+        /// </summary>
+        // #define GLFW_JOYSTICK_6 5
+        public const int GLFW_JOYSTICK_6 = 5;
+        #endregion GLFW_JOYSTICK_6
+
+        #region GLFW_JOYSTICK_7
+        /// <summary>
+        ///     Joystick identifier 7.
+        /// </summary>
+        // #define GLFW_JOYSTICK_7 6
+        public const int GLFW_JOYSTICK_7 = 6;
+        #endregion GLFW_JOYSTICK_7
+
+        #region GLFW_JOYSTICK_8
+        /// <summary>
+        ///     Joystick identifier 8.
+        /// </summary>
+        // #define GLFW_JOYSTICK_8 7
+        public const int GLFW_JOYSTICK_8 = 7;
+        #endregion GLFW_JOYSTICK_8
+
+        #region GLFW_JOYSTICK_9
+        /// <summary>
+        ///     Joystick identifier 9.
+        /// </summary>
+        // #define GLFW_JOYSTICK_9 8
+        public const int GLFW_JOYSTICK_9 = 8;
+        #endregion GLFW_JOYSTICK_9
+
+        #region GLFW_JOYSTICK_10
+        /// <summary>
+        ///     Joystick identifier 10.
+        /// </summary>
+        // #define GLFW_JOYSTICK_10 9
+        public const int GLFW_JOYSTICK_10 = 9;
+        #endregion GLFW_JOYSTICK_10
+
+        #region GLFW_JOYSTICK_11
+        /// <summary>
+        ///     Joystick identifier 11.
+        /// </summary>
+        // #define GLFW_JOYSTICK_11 10
+        public const int GLFW_JOYSTICK_11 = 10;
+        #endregion GLFW_JOYSTICK_11
+
+        #region GLFW_JOYSTICK_12
+        /// <summary>
+        ///     Joystick identifier 12.
+        /// </summary>
+        // #define GLFW_JOYSTICK_12 11
+        public const int GLFW_JOYSTICK_12 = 11;
+        #endregion GLFW_JOYSTICK_12
+
+        #region GLFW_JOYSTICK_13
+        /// <summary>
+        ///     Joystick identifier 13.
+        /// </summary>
+        // #define GLFW_JOYSTICK_13 12
+        public const int GLFW_JOYSTICK_13 = 12;
+        #endregion GLFW_JOYSTICK_13
+
+        #region GLFW_JOYSTICK_14
+        /// <summary>
+        ///     Joystick identifier 14.
+        /// </summary>
+        // #define GLFW_JOYSTICK_14 13
+        public const int GLFW_JOYSTICK_14 = 13;
+        #endregion GLFW_JOYSTICK_14
+
+        #region GLFW_JOYSTICK_15
+        /// <summary>
+        ///     Joystick identifier 15.
+        /// </summary>
+        // #define GLFW_JOYSTICK_15 14
+        public const int GLFW_JOYSTICK_15 = 14;
+        #endregion GLFW_JOYSTICK_15
+
+        #region GLFW_JOYSTICK_16
+        /// <summary>
+        ///     Joystick identifier 16.
+        /// </summary>
+        // #define GLFW_JOYSTICK_16 15
+        public const int GLFW_JOYSTICK_16 = 15;
+        #endregion GLFW_JOYSTICK_16
+
+        #region GLFW_JOYSTICK_LAST
+        /// <summary>
+        ///     Delineates the last joystick identifier.
+        /// </summary>
+        // #define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16
+        public const int GLFW_JOYSTICK_LAST = GLFW_JOYSTICK_16;
+        #endregion GLFW_JOYSTICK_LAST
+        #endregion Joystick Identifiers
+
+        #region glfwOpenWindow Modes
+        #region GLFW_WINDOW
+        /// <summary>
+        ///     Normal desktop window.
+        /// </summary>
+        // #define GLFW_WINDOW 0x00010001
+        public const int GLFW_WINDOW = 0x00010001;
+        #endregion GLFW_WINDOW
+
+        #region GLFW_FULLSCREEN
+        /// <summary>
+        ///     Fullscreen window.
+        /// </summary>
+        // #define GLFW_FULLSCREEN 0x00010002
+        public const int GLFW_FULLSCREEN = 0x00010002;
+        #endregion GLFW_FULLSCREEN
+        #endregion glfwOpenWindow Modes
+
+        #region glfwGetWindowParam Tokens
+        #region GLFW_OPENED
+        /// <summary>
+        ///     <see cref="Gl.GL_TRUE" /> if window is opened, else <see cref="Gl.GL_FALSE" />.
+        /// </summary>
+        // #define GLFW_OPENED 0x00020001
+        public const int GLFW_OPENED = 0x00020001;
+        #endregion GLFW_OPENED
+
+        #region GLFW_ACTIVE
+        /// <summary>
+        ///     <see cref="Gl.GL_TRUE" /> if window has focus, else <see cref="Gl.GL_FALSE" />.
+        /// </summary>
+        // #define GLFW_ACTIVE 0x00020002
+        public const int GLFW_ACTIVE = 0x00020002;
+        #endregion GLFW_ACTIVE
+
+        #region GLFW_ICONIFIED
+        /// <summary>
+        ///     <see cref="Gl.GL_TRUE" /> if window is iconified, else <see cref="Gl.GL_FALSE" />.
+        /// </summary>
+        // #define GLFW_ICONIFIED 0x00020003
+        public const int GLFW_ICONIFIED = 0x00020003;
+        #endregion GLFW_ICONIFIED
+
+        #region GLFW_ACCELERATED
+        /// <summary>
+        ///     <see cref="Gl.GL_TRUE" /> if window is hardware accelerated, else
+        ///     <see cref="Gl.GL_FALSE" />.
+        /// </summary>
+        // #define GLFW_ACCELERATED 0x00020004
+        public const int GLFW_ACCELERATED = 0x00020004;
+        #endregion GLFW_ACCELERATED
+
+        #region GLFW_RED_BITS
+        /// <summary>
+        ///     Number of bits for the red color component.
+        /// </summary>
+        // #define GLFW_RED_BITS 0x00020005
+        public const int GLFW_RED_BITS = 0x00020005;
+        #endregion GLFW_RED_BITS
+
+        #region GLFW_GREEN_BITS
+        /// <summary>
+        ///     Number of bits for the green color component.
+        /// </summary>
+        // #define GLFW_GREEN_BITS 0x00020006
+        public const int GLFW_GREEN_BITS = 0x00020006;
+        #endregion GLFW_GREEN_BITS
+
+        #region GLFW_BLUE_BITS
+        /// <summary>
+        ///     Number of bits for the blue color component.
+        /// </summary>
+        // #define GLFW_BLUE_BITS 0x00020007
+        public const int GLFW_BLUE_BITS = 0x00020007;
+        #endregion GLFW_BLUE_BITS
+
+        #region GLFW_ALPHA_BITS
+        /// <summary>
+        ///     Number of bits for the alpha buffer.
+        /// </summary>
+        // #define GLFW_ALPHA_BITS 0x00020008
+        public const int GLFW_ALPHA_BITS = 0x00020008;
+        #endregion GLFW_ALPHA_BITS
+
+        #region GLFW_DEPTH_BITS
+        /// <summary>
+        ///     Number of bits for the depth buffer.
+        /// </summary>
+        // #define GLFW_DEPTH_BITS 0x00020009
+        public const int GLFW_DEPTH_BITS = 0x00020009;
+        #endregion GLFW_DEPTH_BITS
+
+        #region GLFW_STENCIL_BITS
+        /// <summary>
+        ///     Number of bits for the stencil buffer.
+        /// </summary>
+        // #define GLFW_STENCIL_BITS 0x0002000A
+        public const int GLFW_STENCIL_BITS = 0x0002000A;
+        #endregion GLFW_STENCIL_BITS
+        #endregion glfwGetWindowParam Tokens
+
+        #region glfwGetWindowParam/glfwOpenWindowHint Tokens
+        #region GLFW_REFRESH_RATE
+        /// <summary>
+        ///     Vertical monitor refresh rate in Hz (only used for fullscreen windows).  Zero
+        ///     means system default.
+        /// </summary>
+        // #define GLFW_REFRESH_RATE 0x0002000B
+        public const int GLFW_REFRESH_RATE = 0x0002000B;
+        #endregion GLFW_REFRESH_RATE
+
+        #region GLFW_ACCUM_RED_BITS
+        /// <summary>
+        ///     Number of bits for the red channel of the accumulator buffer.
+        /// </summary>
+        // #define GLFW_ACCUM_RED_BITS 0x0002000C
+        public const int GLFW_ACCUM_RED_BITS = 0x0002000C;
+        #endregion GLFW_ACCUM_RED_BITS
+
+        #region GLFW_ACCUM_GREEN_BITS
+        /// <summary>
+        ///     Number of bits for the green channel of the accumulator buffer.
+        /// </summary>
+        // #define GLFW_ACCUM_GREEN_BITS 0x0002000D
+        public const int GLFW_ACCUM_GREEN_BITS = 0x0002000D;
+        #endregion GLFW_ACCUM_GREEN_BITS
+
+        #region GLFW_ACCUM_BLUE_BITS
+        /// <summary>
+        ///     Number of bits for the blue channel of the accumulator buffer.
+        /// </summary>
+        // #define GLFW_ACCUM_BLUE_BITS 0x0002000E
+        public const int GLFW_ACCUM_BLUE_BITS = 0x0002000E;
+        #endregion GLFW_ACCUM_BLUE_BITS
+
+        #region GLFW_ACCUM_ALPHA_BITS
+        /// <summary>
+        ///     Number of bits for the alpha channel of the accumulator buffer.
+        /// </summary>
+        // #define GLFW_ACCUM_ALPHA_BITS 0x0002000F
+        public const int GLFW_ACCUM_ALPHA_BITS = 0x0002000F;
+        #endregion GLFW_ACCUM_ALPHA_BITS
+
+        #region GLFW_AUX_BUFFERS
+        /// <summary>
+        ///     Number of auxiliary buffers.
+        /// </summary>
+        // #define GLFW_AUX_BUFFERS 0x00020010
+        public const int GLFW_AUX_BUFFERS = 0x00020010;
+        #endregion GLFW_AUX_BUFFERS
+
+        #region GLFW_STEREO
+        /// <summary>
+        ///     Specify if stereo rendering should be supported (can be <see cref="Gl.GL_TRUE" />
+        ///     or <see cref="Gl.GL_FALSE" />).
+        /// </summary>
+        // #define GLFW_STEREO 0x00020011
+        public const int GLFW_STEREO = 0x00020011;
+        #endregion GLFW_STEREO
+
+        #region GLFW_WINDOW_NO_RESIZE
+        /// <summary>
+        ///     Specify whether the window can be resized (can be <see cref="Gl.GL_TRUE" />
+        ///     or <see cref="Gl.GL_FALSE" />).
+        /// </summary>
+        // #define GLFW_WINDOW_NO_RESIZE 0x00020012
+        public const int GLFW_WINDOW_NO_RESIZE = 0x00020012;
+        #endregion GLFW_WINDOW_NO_RESIZE
+
+        #region GLFW_FSAA_SAMPLES
+        /// <summary>
+        ///     Specify if full screen antialiasing should be supported. Zero disabless multisampling, greater
+        ///     values define the number of samples.
+        /// </summary>
+        // #define GLFW_FSAA_SAMPLES 0x00020013
+        public const int GLFW_FSAA_SAMPLES = 0x00020013;
+        #endregion GLFW_FSAA_SAMPLES
+
+        #endregion glfwGetWindowParam/glfwOpenWindowHint Tokens
+
+        #region glfwEnable/glfwDisable Tokens
+        #region  GLFW_MOUSE_CURSOR
+        /// <summary>
+        ///     Mouse cursor visibility.
+        /// </summary>
+        // #define GLFW_MOUSE_CURSOR 0x00030001
+        public const int GLFW_MOUSE_CURSOR = 0x00030001;
+        #endregion  GLFW_MOUSE_CURSOR
+
+        #region  GLFW_STICKY_KEYS
+        /// <summary>
+        ///     Keyboard key �stickiness".
+        /// </summary>
+        // #define GLFW_STICKY_KEYS 0x00030002
+        public const int GLFW_STICKY_KEYS = 0x00030002;
+        #endregion  GLFW_STICKY_KEYS
+
+        #region  GLFW_STICKY_MOUSE_BUTTONS
+        /// <summary>
+        ///     Mouse button �stickiness�.
+        /// </summary>
+        // #define GLFW_STICKY_MOUSE_BUTTONS 0x00030003
+        public const int GLFW_STICKY_MOUSE_BUTTONS = 0x00030003;
+        #endregion  GLFW_STICKY_MOUSE_BUTTONS
+
+        #region  GLFW_SYSTEM_KEYS
+        /// <summary>
+        ///     Special system key actions.
+        /// </summary>
+        // #define GLFW_SYSTEM_KEYS 0x00030004
+        public const int GLFW_SYSTEM_KEYS = 0x00030004;
+        #endregion  GLFW_SYSTEM_KEYS
+
+        #region  GLFW_KEY_REPEAT
+        /// <summary>
+        ///     Keyboard key repeat.
+        /// </summary>
+        // #define GLFW_KEY_REPEAT 0x00030005
+        public const int GLFW_KEY_REPEAT = 0x00030005;
+        #endregion  GLFW_KEY_REPEAT
+
+        #region  GLFW_AUTO_POLL_EVENTS
+        /// <summary>
+        ///     Automatic event polling when <see cref="glfwSwapBuffers" /> is called.
+        /// </summary>
+        // #define GLFW_AUTO_POLL_EVENTS 0x00030006
+        public const int GLFW_AUTO_POLL_EVENTS = 0x00030006;
+        #endregion  GLFW_AUTO_POLL_EVENTS
+        #endregion glfwEnable/glfwDisable Tokens
+
+        #region glfwWaitThread Wait Modes
+        #region GLFW_WAIT
+        /// <summary>
+        ///     Waiting.
+        /// </summary>
+        // #define GLFW_WAIT 0x00040001
+        public const int GLFW_WAIT = 0x00040001;
+        #endregion GLFW_WAIT
+
+        #region GLFW_NOWAIT
+        /// <summary>
+        ///     No waiting.
+        /// </summary>
+        // #define GLFW_NOWAIT 0x00040002
+        public const int GLFW_NOWAIT = 0x00040002;
+        #endregion GLFW_NOWAIT
+        #endregion glfwWaitThread Wait Modes
+
+        #region glfwGetJoystickParam Tokens
+        #region GLFW_PRESENT
+        /// <summary>
+        ///     <see cref="Gl.GL_TRUE" /> if the joystick is connected, else
+        ///     <see cref="Gl.GL_FALSE" />.
+        /// </summary>
+        // #define GLFW_PRESENT 0x00050001
+        public const int GLFW_PRESENT = 0x00050001;
+        #endregion GLFW_PRESENT
+
+        #region GLFW_AXES
+        /// <summary>
+        ///     Number of axes supported by the joystick.
+        /// </summary>
+        // #define GLFW_AXES 0x00050002
+        public const int GLFW_AXES = 0x00050002;
+        #endregion GLFW_AXES
+
+        #region GLFW_BUTTONS
+        /// <summary>
+        ///     Number of buttons supported by the joystick.
+        /// </summary>
+        // #define GLFW_BUTTONS 0x00050003
+        public const int GLFW_BUTTONS = 0x00050003;
+        #endregion GLFW_BUTTONS
+        #endregion glfwGetJoystickParam Tokens
+
+        #region glfwReadImage/glfwLoadTexture2D Flags
+        #region GLFW_NO_RESCALE_BIT
+        /// <summary>
+        ///     Do not rescale image to closest 2^m * 2^n resolution.
+        /// </summary>
+        // #define GLFW_NO_RESCALE_BIT 0x00000001
+        public const int GLFW_NO_RESCALE_BIT = 0x00000001;
+        #endregion GLFW_NO_RESCALE_BIT
+
+        #region GLFW_ORIGIN_UL_BIT
+        /// <summary>
+        ///     Specifies that the origin of the loaded image should be in the upper left corner
+        ///     (default is the lower left corner).
+        /// </summary>
+        // #define GLFW_ORIGIN_UL_BIT 0x00000002
+        public const int GLFW_ORIGIN_UL_BIT = 0x00000002;
+        #endregion GLFW_ORIGIN_UL_BIT
+
+        #region GLFW_BUILD_MIPMAPS_BIT
+        /// <summary>
+        ///     Automatically build and upload all mipmap levels.
+        /// </summary>
+        // #define GLFW_BUILD_MIPMAPS_BIT 0x00000004
+        public const int GLFW_BUILD_MIPMAPS_BIT = 0x00000004;
+        #endregion GLFW_BUILD_MIPMAPS_BIT
+
+        #region GLFW_ALPHA_MAP_BIT
+        /// <summary>
+        ///     Single component alpha maps.
+        /// </summary>
+        // #define GLFW_ALPHA_MAP_BIT 0x00000008
+        public const int GLFW_ALPHA_MAP_BIT = 0x00000008;
+        #endregion GLFW_ALPHA_MAP_BIT
+        #endregion glfwReadImage/glfwLoadTexture2D Flags
+
+        #region Time
+        /// <summary>
+        ///     Infinite amount of time.
+        /// </summary>
+        // #define GLFW_INFINITY 100000.0
+        public const double GLFW_INFINITY = 100000;
+        #endregion Time
+
+        #endregion Public Constants
+
+        #region Public Structs
+
+        #region GLFWvidmode
+        /// <summary>
+        ///     Video mode.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct GLFWvidmode {
+            #region int Width
+            /// <summary>
+            ///     Video width resolution.
+            /// </summary>
+            // int Width;
+            public int Width;
+            #endregion int Width
+
+            #region int Height
+            /// <summary>
+            ///     Video height resolution.
+            /// </summary>
+            // int Height;
+            public int Height;
+            #endregion int Height
+
+            #region int RedBits
+            /// <summary>
+            ///     Number of red bits.
+            /// </summary>
+            // int RedBits;
+            public int RedBits;
+            #endregion int RedBits
+
+            #region int BlueBits
+            /// <summary>
+            ///     Number of blue bits.
+            /// </summary>
+            // int BlueBits;
+            public int BlueBits;
+            #endregion int BlueBits
+
+            #region int GreenBits
+            /// <summary>
+            ///     Number of green bits.
+            /// </summary>
+            // int GreenBits;
+            public int GreenBits;
+            #endregion int GreenBits
+        }
+        #endregion GLFWvidmode
+
+        #region GLFWimage
+        /// <summary>
+        ///     Image information.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct GLFWimage {
+            #region int Width
+            /// <summary>
+            ///     Image width resolution.
+            /// </summary>
+            // int Width;
+            public int Width;
+            #endregion int Width
+
+            #region int Height
+            /// <summary>
+            ///     Image height resolution.
+            /// </summary>
+            // int Height;
+            public int Height;
+            #endregion int Height
+
+            #region int Format
+            /// <summary>
+            ///     OpenGL pixel format.
+            /// </summary>
+            // int Format;
+            public int Format;
+            #endregion int Format
+
+            #region int BytesPerPixel
+            /// <summary>
+            ///     Number of bytes per pixel.
+            /// </summary>
+            // int BytesPerPixel;
+            public int BytesPerPixel;
+            #endregion int BytesPerPixel
+
+            #region byte[] Data
+            /// <summary>
+            ///     Image pixel data.
+            /// </summary>
+            // unsigned char *Data;
+            public byte[] Data;
+            #endregion byte[] Data
+        }
+        #endregion GLFWimage
+
+        #endregion Public Structs
+
+        #region Public Delegates
+
+        #region GLFWwindowsizefun(int width, int height)
+        /// <summary>
+        ///     Callback function that will be called every time the window size changes.
+        /// </summary>
+        // typedef void (GLFWCALL * GLFWwindowsizefun)(int,int);
+        public delegate void GLFWwindowsizefun(int width, int height);
+        #endregion GLFWwindowsizefun(int width, int height)
+
+		#region GLFWwindowclosefun()
+		/// <summary>
+		///     Callback function that will be called every time the window closes.
+		/// </summary>
+		// typedef int  (GLFWCALL * GLFWwindowclosefun)(void);
+		public delegate int GLFWwindowclosefun();
+		#endregion GLFWwindowclosefun()
+
+		#region GLFWwindowrefreshfun()
+		/// <summary>
+		///     Callback function that will be called every time the window refreshes.
+		/// </summary>
+		// typedef void (GLFWCALL * GLFWwindowrefreshfun)(void);
+		public delegate void GLFWwindowrefreshfun();
+		#endregion GLFWwindowrefreshfun()
+
+        #region GLFWmousebuttonfun(int button, int action)
+        /// <summary>
+        ///     Callback function that will be called every time a mouse button is pressed
+        ///     or released.
+        /// </summary>
+        // typedef void (GLFWCALL * GLFWmousebuttonfun)(int,int);
+        public delegate void GLFWmousebuttonfun(int button, int action);
+        #endregion GLFWmousebuttonfun(int button, int action)
+
+        #region GLFWmouseposfun(int x, int y)
+        /// <summary>
+        ///     Callback function that will be called every time the mouse is moved.
+        /// </summary>
+        // typedef void (GLFWCALL * GLFWmouseposfun)(int,int);
+        public delegate void GLFWmouseposfun(int x, int y);
+        #endregion GLFWmouseposfun(int x, int y)
+
+        #region GLFWmousewheelfun(int position)
+        /// <summary>
+        ///     Callback function that will be called every time the mouse wheel is moved.
+        /// </summary>
+        // typedef void (GLFWCALL * GLFWmousewheelfun)(int);
+        public delegate void GLFWmousewheelfun(int position);
+        #endregion GLFWmousewheelfun(int position)
+
+        #region GLFWkeyfun(int key, int action)
+        /// <summary>
+        ///     Callback function that will be called every time a key is pressed or released.
+        /// </summary>
+        // typedef void (GLFWCALL * GLFWkeyfun)(int,int);
+        public delegate void GLFWkeyfun(int key, int action);
+        #endregion GLFWkeyfun(int key, int action)
+
+        #region GLFWcharfun(int character, int action)
+        /// <summary>
+        ///     Callback function that will be called every time a printable character is
+        ///     generated by the keyboard.
+        /// </summary>
+        // typedef void (GLFWCALL * GLFWcharfun)(int,int);
+        public delegate void GLFWcharfun(int character, int action);
+        #endregion GLFWcharfun(int character, int action)
+
+		#region void GLFWthreadfun(IntPtr arg)
+        // TODO: Test the damn void* delegate!
+        /// <summary>
+        ///     Callback function that acts as the entry point for the new thread.
+        /// </summary>
+        // typedef void (GLFWCALL * GLFWthreadfun)(void *);
+        public delegate void GLFWthreadfun(IntPtr arg);
+		#endregion void GLFWthreadfun(IntPtr arg)
+
+        #endregion Public Delegates
+
+        // --- Public Externs ---
+        #region Initialization, Termination, and Version Querying
+
+        #region int glfwInit()
+        /// <summary>
+        ///     Initializes GLFW.
+        /// </summary>
+        /// <returns>
+        ///     On success <see cref="Gl.GL_TRUE" /> is returned; otherwise <see cref="Gl.GL_FALSE" />.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         No other GLFW functions may be used before this function has been called.
+        ///     </para>
+        ///     <para>
+        ///         This function may take several seconds to complete on some systems, while
+        ///         on other systems it may take only a fraction of a second to complete.
+        ///     </para>
+        /// </remarks>
+        // GLFWAPI int GLFWAPIENTRY glfwInit(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwInit();
+        #endregion int glfwInit()
+
+        #region glfwTerminate()
+        /// <summary>
+        ///     Terminates GLFW.
+        /// </summary>
+        /// <remarks>
+        ///     Among other things it closes the window, if it is opened, and kills any running
+        ///     threads.  This function must be called before a program exits.
+        /// </remarks>
+        // GLFWAPI void GLFWAPIENTRY glfwTerminate(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwTerminate();
+        #endregion glfwTerminate()
+
+        #region glfwGetVersion(out int major, out int minor, out int revision)
+        /// <summary>
+        ///     Returns the GLFW library version.
+        /// </summary>
+        /// <param name="major">
+        ///     Pointer to an integer that will hold the major version number.
+        /// </param>
+        /// <param name="minor">
+        ///     Pointer to an integer that will hold the minor version number.
+        /// </param>
+        /// <param name="revision">
+        ///     Pointer to an integer that will hold the revision.
+        /// </param>
+        // GLFWAPI void GLFWAPIENTRY glfwGetVersion(int *major, int *minor, int *rev);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwGetVersion(out int major, out int minor, out int revision);
+        #endregion glfwGetVersion(out int major, out int minor, out int revision)
+
+        #endregion Initialization, Termination, and Version Querying
+
+        #region Window Handling
+        #region int glfwOpenWindow(int width, int height, int redBits, int greenBits, int blueBits, int alphaBits, int depthBits, int stencilBits, int mode)
+        /// <summary>
+        ///     Opens a window that best matches the parameters given to the function.
+        /// </summary>
+        /// <param name="width">
+        ///     The width of the window.  If <paramref name="width" /> is zero, it will be
+        ///     calculated as width = <c>(4 / 3) * height</c>, if <paramref name="height" /> is
+        ///     not zero.  If both <paramref name="width" /> and <paramref name="height" /> are
+        ///     zero, then <paramref name="width" /> will be set to 640.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the window.  If <paramref name="height" /> is zero, it will be
+        ///     calculated as <c>height = (3 / 4) * width</c>, if <paramref name="width" /> is
+        ///     not zero.  If both <paramref name="width" /> and <paramref name="height" /> are
+        ///     zero, then <paramref name="height" /> will be set to 480.
+        /// </param>
+        /// <param name="redBits">
+        ///     The number of bits to use for the red color component of the color buffer
+        ///     (0 means default color depth).  For instance, setting redbits = 5, greenbits = 6,
+        ///     and bluebits = 5 will generate a 16-bit color buffer, if possible.
+        /// </param>
+        /// <param name="greenBits">
+        ///     The number of bits to use for the green color component of the color buffer
+        ///     (0 means default color depth).  For instance, setting redbits = 5, greenbits = 6,
+        ///     and bluebits = 5 will generate a 16-bit color buffer, if possible.
+        /// </param>
+        /// <param name="blueBits">
+        ///     The number of bits to use for the blue color component of the color buffer
+        ///     (0 means default color depth).  For instance, setting redbits = 5, greenbits = 6,
+        ///     and bluebits = 5 will generate a 16-bit color buffer, if possible.
+        /// </param>
+        /// <param name="alphaBits">
+        ///     The number of bits to use for the alpha buffer (0 means no alpha buffer).
+        /// </param>
+        /// <param name="depthBits">
+        ///     The number of bits to use for the depth buffer (0 means no depth buffer).
+        /// </param>
+        /// <param name="stencilBits">
+        ///     The number of bits to use for the stencil buffer (0 means no stencil buffer).
+        /// </param>
+        /// <param name="mode">
+        ///     Selects which type of OpenGL window to use. mode can be either
+        ///     <see cref="GLFW_WINDOW" />, which will generate a normal desktop window, or
+        ///     <see cref="GLFW_FULLSCREEN" />, which will generate a window which covers the
+        ///     entire screen.  When <see cref="GLFW_FULLSCREEN" /> is selected, the video mode
+        ///     will be changed to the resolution that closest matches the
+        ///     <paramref name="width" /> and <paramref name="height" /> parameters.
+        /// </param>
+        /// <returns>
+        ///     On success <see cref="Gl.GL_TRUE" /> is returned; otherwise <see cref="Gl.GL_FALSE" />.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         How well the resulting window matches the desired window depends mostly
+        ///         on the available hardware and OpenGL drivers.  In general, selecting a
+        ///         fullscreen mode has better chances of generating a close match than does
+        ///         a normal desktop window, since GLFW can freely select from all the available
+        ///         video modes.  A desktop window is normally restricted to the video mode of
+        ///         the desktop.
+        ///     </para>
+        ///     <para>
+        ///         For additional control of window properties, see
+        ///         <see cref="glfwOpenWindowHint" />.
+        ///     </para>
+        ///     <para>
+        ///         In fullscreen mode the mouse cursor is hidden by default, and any system
+        ///         screensavers are prohibited from starting.  In windowed mode the mouse cursor
+        ///         is visible, and screensavers are allowed to start.  To change the visibility
+        ///         of the mouse cursor, use <see cref="glfwEnable" /> or
+        ///         <see cref="glfwDisable" /> with the argument <see cref="GLFW_MOUSE_CURSOR" />.
+        ///     </para>
+        ///     <para>
+        ///         In order to determine the actual properties of an opened window, use
+        ///         <see cref="glfwGetWindowParam" /> and <see cref="glfwGetWindowSize" />
+        ///         (or <see cref="glfwSetWindowSizeCallback" />).
+        ///     </para>
+        /// </remarks>
+        // GLFWAPI int GLFWAPIENTRY glfwOpenWindow(int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwOpenWindow(int width, int height, int redBits, int greenBits, int blueBits, int alphaBits, int depthBits, int stencilBits, int mode);
+        #endregion int glfwOpenWindow(int width, int height, int redBits, int greenBits, int blueBits, int alphaBits, int depthBits, int stencilBits, int mode)
+
+        // TODO: Fill in documentation starting here ****************
+
+        #region glfwOpenWindowHint(int target, int hint)
+        /// <summary>
+        ///     Sets additional properties for a window that is to be opened.
+        /// </summary>
+        /// <param name="target">
+        /// 
+        /// </param>
+        /// <param name="hint">
+        /// 
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         For a hint to be registered, the function must be called before calling
+        ///         <see cref="glfwOpenWindow" />.  When the <see cref="glfwOpenWindow" />
+        ///         function is called, any hints that were registered with the
+        ///         <b>glfwOpenWindowHint</b> function are used for setting the
+        ///         corresponding window properties, and then all hints are reset to their
+        ///         default values.
+        ///     </para>
+        /// </remarks>
+        // GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint(int target, int hint);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwOpenWindowHint(int target, int hint);
+        #endregion glfwOpenWindowHint(int target, int hint)
+
+        #region glfwCloseWindow()
+        /// <summary>
+        ///		The function closes an opened window and destroys the associated OpenGL context.
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwCloseWindow(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwCloseWindow();
+        #endregion glfwCloseWindow()
+
+		#region glfwSetWindowTitle(string title)
+		/// <summary>
+		///		Changes the title of the opened window.
+		/// </summary>
+		/// <param name="title">
+		///		Pointer to a null terminated ISO 8859-1 (8-bit Latin 1) string that holds the title of the window.
+		///	</param>
+		/// <remarks>
+		///		<para>
+		///			The title property of a window is often used in situations other than for the window title, such as the title of an application icon when it is in iconified state.
+		///		</para>
+		///	</remarks>
+        // GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle(const char *title);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSetWindowTitle(string title);
+		#endregion glfwSetWindowTitle(string title)
+
+		#region glfwGetWindowSize(out int width, out int height)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwGetWindowSize(int *width, int *height);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwGetWindowSize(out int width, out int height);
+		#endregion glfwGetWindowSize(out int width, out int height)
+
+		#region glfwSetWindowSize(int width, int height)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetWindowSize(int width, int height);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwSetWindowSize(int width, int height);
+		#endregion glfwSetWindowSize(int width, int height)
+
+		#region glfwSetWindowPos(int x, int y)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetWindowPos(int x, int y);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSetWindowPos(int x, int y);
+		#endregion glfwSetWindowPos(int x, int y)
+
+		#region glfwIconifyWindow()
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwIconifyWindow(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwIconifyWindow();
+		#endregion glfwIconifyWindow()
+
+		#region glfwRestoreWindow()
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwRestoreWindow(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwRestoreWindow();
+		#endregion glfwRestoreWindow()
+
+		#region glfwSwapBuffers()
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSwapBuffers(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwSwapBuffers();
+		#endregion glfwSwapBuffers()
+
+		#region glfwSwapInterval(int interval)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSwapInterval(int interval);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSwapInterval(int interval);
+		#endregion glfwSwapInterval(int interval)
+
+		#region int glfwGetWindowParam(int param)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwGetWindowParam(int param);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern int glfwGetWindowParam(int param);
+		#endregion int glfwGetWindowParam(int param)
+
+		#region glfwSetWindowSizeCallback(GLFWwindowsizefun cbfun)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback(GLFWwindowsizefun cbfun);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwSetWindowSizeCallback(GLFWwindowsizefun cbfun);
+		#endregion glfwSetWindowSizeCallback(GLFWwindowsizefun cbfun)
+
+		#region glfwSetWindowCloseCallback(GLFWwindowclosefun cbfun)
+		/// <summary>
+		///		Selects which function to be called upon a window close event.
+		/// </summary>
+		/// <remarks>
+		///		<para>
+		///			A window has to be opened for this function to have any effect.
+		///		</para>
+		///		<para>
+		///			Window close events are recorded continuously, but only reported when glfwPollEvents, glfwWaitEvents or glfwSwapBuffers is called.
+		///		</para>
+		///		<para>
+		///			The OpenGLTM context is still valid when this function is called.
+		///		</para>
+		///		<para>
+		///			Note that the window close callback function is not called when glfwCloseWindow is called, but only when the close request comes from the window manager.
+		///		</para>
+		///		<para>
+		///			Do not call glfwCloseWindow from a window close callback function. Close the window by returning GL_TRUE from the function.
+		///		</para>
+		///	</remarks>
+		/// <param name="cbfun">
+		///		Pointer to a callback function that will be called when a user requests that the window should be closed.
+		///	</param>
+		// GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun );
+		[DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSetWindowCloseCallback(GLFWwindowclosefun cbfun);
+		#endregion glfwSetWindowCloseCallback(GLFWwindowclosefun cbfun)
+
+		#region glfwSetWindowRefreshCallback(GLFWwindowrefreshfun cbfun)
+		/// <summary>
+		///		The function selects which function to be called upon a window refresh event, which occurs when any part of the window client area has been damaged, and needs to be repainted (for instance, if a part of the window that was previously occluded by another window has become visible).
+		/// </summary>
+		/// <remarks>
+		///		<para>
+		///			A window has to be opened for this function to have any effect.
+		///		</para>
+		///		<para>
+		///			Window refresh events are recorded continuously, but only reported when glfwPollEvents, glfwWaitEvents or glfwSwapBuffers is called.
+		///		</para>
+		///	</remarks>
+		/// <param name="cbfun">
+		///		Pointer to a callback function that will be called when the window client area needs to be refreshed.
+		///	</param>
+		// GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun );
+		[DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSetWindowRefreshCallback(GLFWwindowrefreshfun cbfun);
+		#endregion glfwSetWindowRefreshCallback(GLFWwindowrefreshfun cbfun)
+
+        #endregion Window Handling
+
+        #region Video Mode
+
+		#region int glfwGetVideoModes([Out] GLFWvidmode[] list, int maxcount)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwGetVideoModes(GLFWvidmode *list, int maxcount);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwGetVideoModes([Out] GLFWvidmode[] list, int maxcount);
+		#endregion int glfwGetVideoModes([Out] GLFWvidmode[] list, int maxcount)
+
+		#region glfwGetDesktopMode(out GLFWvidmode mode)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode(GLFWvidmode *mode);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwGetDesktopMode(out GLFWvidmode mode);
+		#endregion glfwGetDesktopMode(out GLFWvidmode mode)
+
+        #endregion Video Mode
+
+        #region Input Handling
+
+		#region void glfwPollEvents()
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwPollEvents(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwPollEvents();
+		#endregion void glfwPollEvents()
+
+		#region void glfwWaitEvents()
+		/// <summary>
+		/// 
+		/// </summary>
+		// GLFWAPI void GLFWAPIENTRY glfwWaitEvents(void);
+		[DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwWaitEvents();
+		#endregion void glfwWaitEvents()
+
+		#region int glfwGetKey(int key)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwGetKey(int key);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern int glfwGetKey(int key);
+		#endregion int glfwGetKey(int key)
+
+		#region int glfwGetMouseButton(int button)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwGetMouseButton(int button);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern int glfwGetMouseButton(int button);
+		#endregion int glfwGetMouseButton(int button)
+
+		#region void glfwGetMousePos(out int xPosition, out int yPosition)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwGetMousePos(int *xpos, int *ypos);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwGetMousePos(out int xPosition, out int yPosition);
+		#endregion void glfwGetMousePos(out int xPosition, out int yPosition)
+
+		#region void glfwSetMousePos(int xPosition, int yPosition)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetMousePos(int xpos, int ypos);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwSetMousePos(int xPosition, int yPosition);
+		#endregion void glfwSetMousePos(int xPosition, int yPosition)
+
+		#region int glfwGetMouseWheel()
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwGetMouseWheel();
+		#endregion int glfwGetMouseWheel()
+
+		#region void glfwSetMouseWheel(int position)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel(int pos);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwSetMouseWheel(int position);
+		#endregion void glfwSetMouseWheel(int position)
+
+		#region void glfwSetKeyCallback(GLFWkeyfun cbfun)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback(GLFWkeyfun cbfun);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSetKeyCallback(GLFWkeyfun cbfun);
+		#endregion void glfwSetKeyCallback(GLFWkeyfun cbfun)
+
+		#region void glfwSetCharCallback(GLFWcharfun cbfun)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetCharCallback(GLFWcharfun cbfun);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSetCharCallback(GLFWcharfun cbfun);
+		#endregion void glfwSetCharCallback(GLFWcharfun cbfun)
+
+		#region void glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun);
+		#endregion void glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun)
+
+		#region void glfwSetMousePosCallback(GLFWmouseposfun cbfun)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback(GLFWmouseposfun cbfun);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSetMousePosCallback(GLFWmouseposfun cbfun);
+		#endregion void glfwSetMousePosCallback(GLFWmouseposfun cbfun)
+
+		#region void glfwSetMouseWheelCallback(GLFWmousewheelfun cbfun)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback(GLFWmousewheelfun cbfun);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwSetMouseWheelCallback(GLFWmousewheelfun cbfun);
+		#endregion void glfwSetMouseWheelCallback(GLFWmousewheelfun cbfun)
+
+		#region int glfwGetJoystickParam(int joystick, int parameter)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam(int joy, int param);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwGetJoystickParam(int joystick, int parameter);
+		#endregion int glfwGetJoystickParam(int joystick, int parameter)
+
+		#region int glfwGetJoystickPos(int joy, [Out] float[] position, int numberOfAxes)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos(int joy, float *pos, int numaxes);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern int glfwGetJoystickPos(int joy, [Out] float[] position, int numberOfAxes);
+		#endregion int glfwGetJoystickPos(int joy, [Out] float[] position, int numberOfAxes)
+
+		#region int glfwGetJoystickButtons(int joystick, [Out] byte[] buttons, int numberOfButtons)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons(int joy, unsigned char *buttons, int numbuttons);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwGetJoystickButtons(int joystick, [Out] byte[] buttons, int numberOfButtons);
+		#endregion int glfwGetJoystickButtons(int joystick, [Out] byte[] buttons, int numberOfButtons)
+
+        #endregion Input Handling
+
+        #region Time
+
+		#region extern double glfwGetTime()
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI double GLFWAPIENTRY glfwGetTime(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern double glfwGetTime();
+		#endregion extern double glfwGetTime()
+
+		#region void glfwSetTime(double time)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSetTime(double time);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSetTime(double time);
+		#endregion void glfwSetTime(double time)
+
+		#region void glfwSleep(double time)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSleep(double time);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSleep(double time);
+		#endregion void glfwSleep(double time)
+
+        #endregion Time
+
+        #region Extension Support
+
+		#region int glfwExtensionSupported(string extension)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwExtensionSupported(const char *extension);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern int glfwExtensionSupported(string extension);
+		#endregion int glfwExtensionSupported(string extension)
+
+		#region IntPtr glfwGetProcAddress(string procName)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void* GLFWAPIENTRY glfwGetProcAddress(const char *procname);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glfwGetProcAddress(string procName);
+		#endregion IntPtr glfwGetProcAddress(string procName)
+
+		#region void glfwGetGLVersion(out int major, out int minor, out int revision)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwGetGLVersion(int *major, int *minor, int *rev);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwGetGLVersion(out int major, out int minor, out int revision);
+		#endregion void glfwGetGLVersion(out int major, out int minor, out int revision)
+
+        #endregion Extension Support
+
+        #region Threading Support
+
+		#region int glfwCreateThread(GLFWthreadfun fun, IntPtr arg)
+        // TODO: Test the damn void* delegate.
+		/// <summary>
+		///		The function creates a new thread, which executes within the same
+		///		address space as the calling process. The thread entry point is
+		///		specified with the fun argument.
+		/// </summary>
+		/// <param name="fun">
+		///		A pointer to a function that acts as the entry point for the new
+		///		thread.
+		///	</param>
+		/// <param name="arg">
+		///		An arbitrary argument for the thread. arg will be passed as the
+		///		argument to the thread function pointed to by fun. For instance,
+		///		arg can point to data that is to be processed by the thread.
+		///	</param>
+		/// <returns>
+		///		The function returns a thread identification number if the thread
+		///		was created successfully. This number is always positive. If the
+		///		function fails, a negative number is returned.
+		///	</returns>
+		///	<remarks>
+		///		<para>
+		///			Once the thread function fun returns, the thread dies.
+		///		</para>
+		///		<para>
+		///			Even if the function returns a positive thread ID, indicating
+		///			that the thread was created successfully, the thread may be
+		///			unable to execute, for instance if the thread start address
+		///			is not a valid thread entry point.
+		///		</para>
+		///	</remarks>
+        //GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread(GLFWthreadfun fun, void *arg);
+		[DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern int glfwCreateThread(GLFWthreadfun fun, IntPtr arg);
+		#endregion int glfwCreateThread(GLFWthreadfun fun, IntPtr arg)
+
+		#region void glfwDestroyThread(int id)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwDestroyThread(GLFWthread ID);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwDestroyThread(int id);
+		#endregion void glfwDestroyThread(int id)
+
+		#region int glfwWaitThread(int id, int waitMode)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwWaitThread(GLFWthread ID, int waitmode);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern int glfwWaitThread(int id, int waitMode);
+		#endregion int glfwWaitThread(int id, int waitMode)
+
+		#region int glfwGetThreadID()
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwGetThreadID();
+		#endregion int glfwGetThreadID()
+
+		#region IntPtr glfwCreateMutex()
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr glfwCreateMutex();
+		#endregion IntPtr glfwCreateMutex()
+
+		#region void glfwDestroyMutex([In] IntPtr mutex)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwDestroyMutex(GLFWmutex mutex);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwDestroyMutex([In] IntPtr mutex);
+		#endregion void glfwDestroyMutex([In] IntPtr mutex)
+
+		#region void glfwLockMutex([In] IntPtr mutex)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwLockMutex(GLFWmutex mutex);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwLockMutex([In] IntPtr mutex);
+		#endregion void glfwLockMutex([In] IntPtr mutex)
+
+		#region void glfwUnlockMutex([In] IntPtr mutex)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwUnlockMutex(GLFWmutex mutex);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwUnlockMutex([In] IntPtr mutex);
+		#endregion void glfwUnlockMutex([In] IntPtr mutex)
+
+		#region IntPtr glfwCreateCond()
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glfwCreateCond();
+		#endregion IntPtr glfwCreateCond()
+
+		#region IntPtr glfwDestroyCond([In] IntPtr cond)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwDestroyCond(GLFWcond cond);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glfwDestroyCond([In] IntPtr cond);
+		#endregion IntPtr glfwDestroyCond([In] IntPtr cond)
+
+		#region void glfwWaitCond([In] IntPtr cond, [In] IntPtr mutex, double timeout)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwWaitCond(GLFWcond cond, GLFWmutex mutex, double timeout);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwWaitCond([In] IntPtr cond, [In] IntPtr mutex, double timeout);
+		#endregion void glfwWaitCond([In] IntPtr cond, [In] IntPtr mutex, double timeout)
+
+		#region void glfwSignalCond([In] IntPtr cond)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwSignalCond(GLFWcond cond);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwSignalCond([In] IntPtr cond);
+		#endregion void glfwSignalCond([In] IntPtr cond)
+
+		#region void glfwBroadcastCond([In] IntPtr cond)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwBroadcastCond(GLFWcond cond);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwBroadcastCond([In] IntPtr cond);
+		#endregion void glfwBroadcastCond([In] IntPtr cond)
+
+		#region int glfwGetNumberOfProcessors()
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors(void);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwGetNumberOfProcessors();
+		#endregion int glfwGetNumberOfProcessors()
+
+        #endregion Threading Support
+
+        #region Enable/Disable
+
+		#region void glfwEnable(int token)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwEnable(int token);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwEnable(int token);
+		#endregion void glfwEnable(int token)
+
+		#region void glfwDisable(int token)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwDisable(int token);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+		public static extern void glfwDisable(int token);
+		#endregion void glfwDisable(int token)
+
+        #endregion Enable/Disable
+
+        #region Image/Texture I/O Support
+
+		#region int glfwReadImage(string name, out GLFWimage image, int flags)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwReadImage(const char *name, GLFWimage *img, int flags);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwReadImage(string name, out GLFWimage image, int flags);
+		#endregion int glfwReadImage(string name, out GLFWimage image, int flags)
+
+        #region int glfwReadMemoryImage(IntPtr data, int size, out GLFWimage image, int flags)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int  GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags );
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwReadMemoryImage(IntPtr data, int size, out GLFWimage image, int flags);
+        #endregion int glfwReadMemoryImage(IntPtr data, int size, out GLFWimage image, int flags)
+
+        #region void glfwFreeImage(ref GLFWimage image)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI void GLFWAPIENTRY glfwFreeImage(GLFWimage *img);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern void glfwFreeImage(ref GLFWimage image);
+		#endregion void glfwFreeImage(ref GLFWimage image)
+
+		#region int glfwLoadTexture2D(string name, int flags)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D(const char *name, int flags);
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwLoadTexture2D(string name, int flags);
+		#endregion int glfwLoadTexture2D(string name, int flags)
+
+        #region int glfwLoadMemoryTexture2D(IntPtr data, int size, int flags)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int  GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags );
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwLoadMemoryTexture2D(IntPtr data, int size, int flags);
+        #endregion int glfwLoadMemoryTexture2D(IntPtr data, int size, int flags)
+
+        #region int glfwLoadTextureImage2D(ref GLFWimage img, int flags)
+        /// <summary>
+        /// 
+        /// </summary>
+        // GLFWAPI int  GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags );
+        [DllImport(GLFW_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern int glfwLoadTextureImage2D(ref GLFWimage img, int flags);
+        #endregion int glfwLoadTextureImage2D(ref GLFWimage img, int flags)
+
+        #endregion Image/Texture I/O Support
+    }
+}
diff --git a/src/Tao.Glfw/INSTALL b/src/Tao.Glfw/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Glfw/Makefile.am b/src/Tao.Glfw/Makefile.am
new file mode 100644
index 0000000..9715cd2
--- /dev/null
+++ b/src/Tao.Glfw/Makefile.am
@@ -0,0 +1,18 @@
+
+ASSEMBLY = Tao.Glfw
+SHORTNAME = tao-glfw
+VERSION = @TAOGLFW_VERSION@
+MAJOR = @TAOGLFW_MAJOR@
+
+PACKAGES =
+BINARY_LIBS = ../Tao.OpenGl/Tao.OpenGl.dll
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        Glfw.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.Glfw/Makefile.in b/src/Tao.Glfw/Makefile.in
new file mode 100644
index 0000000..ff6b319
--- /dev/null
+++ b/src/Tao.Glfw/Makefile.in
@@ -0,0 +1,414 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-glfw.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.Glfw
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-glfw.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOGLFW_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.Glfw
+SHORTNAME = tao-glfw
+MAJOR = @TAOGLFW_MAJOR@
+PACKAGES = 
+BINARY_LIBS = ../Tao.OpenGl/Tao.OpenGl.dll
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        Glfw.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.Glfw/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.Glfw/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-glfw.pc: $(top_builddir)/config.status $(srcdir)/tao-glfw.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.Glfw/NEWS b/src/Tao.Glfw/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Glfw/Properties/AssemblyInfo.cs b/src/Tao.Glfw/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..660f6a1
--- /dev/null
+++ b/src/Tao.Glfw/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.Glfw")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework GLFW Binding For .NET")]
+[assembly: AssemblyFileVersion("2.6.0.0")]
+[assembly: AssemblyInformationalVersion("2.6.0.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.Glfw.dll")]
+[assembly: AssemblyTitle("Tao Framework GLFW Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("2.6.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.Glfw/README b/src/Tao.Glfw/README
new file mode 100644
index 0000000..04dc065
--- /dev/null
+++ b/src/Tao.Glfw/README
@@ -0,0 +1,17 @@
+Tao.Glfw 2.6.0.0
+http://www.taoframework.com
+Copyright �2003-2004 Randy Ridge, All rights reserved.
+
+Tao.Glfw is a GLFW API binding for .NET, implementing GLFW 2.6.0.
+
+
+Change Log:
+
+2.6.0.0 - Sept. 04, 2007:
+    Updated to GLFW 2.6.0.
+
+2.5.0.0 - April 25, 2006:
+    Updated to GLFW 2.5.0, fixed GLFW threading.
+
+2.4.2.0 - April 20, 2004:
+    Initial release.
diff --git a/src/Tao.Glfw/Tao.Glfw.csproj b/src/Tao.Glfw/Tao.Glfw.csproj
new file mode 100644
index 0000000..1d97c65
--- /dev/null
+++ b/src/Tao.Glfw/Tao.Glfw.csproj
@@ -0,0 +1,103 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{15C1A132-940F-4C07-B81A-74C56AC80D10}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.Glfw</AssemblyName>
+    <AssemblyOriginatorKeyFile>../Tao.Glfw/Tao.Glfw.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.Glfw</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Glfw.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Glfw.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Glfw.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.Glfw.dll.config" />
+    <None Include="Tao.Glfw.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.Glfw/Tao.Glfw.dll.config b/src/Tao.Glfw/Tao.Glfw.dll.config
new file mode 100644
index 0000000..eb71b1a
--- /dev/null
+++ b/src/Tao.Glfw/Tao.Glfw.dll.config
@@ -0,0 +1,5 @@
+<configuration>
+    <dllmap dll="glfw.dll" os="windows" target="glfw.dll" />
+    <dllmap dll="glfw.dll" os="osx" target="libglfw.so.2" />
+    <dllmap dll="glfw.dll" os="!windows,osx" target="libglfw.so.2" />
+</configuration>
diff --git a/src/Tao.Glfw/Tao.Glfw.snk b/src/Tao.Glfw/Tao.Glfw.snk
new file mode 100644
index 0000000..c158f0a
Binary files /dev/null and b/src/Tao.Glfw/Tao.Glfw.snk differ
diff --git a/src/Tao.Glfw/tao-glfw.pc.in b/src/Tao.Glfw/tao-glfw.pc.in
new file mode 100644
index 0000000..ef7ac44
--- /dev/null
+++ b/src/Tao.Glfw/tao-glfw.pc.in
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.Glfw
+Description: Glfw section of the Tao framework
+Version: @TAOGLFW_VERSION@
+Requires: tao-opengl- at TAOOPENGL_MAJOR@
+Libs: -r:${libdir}/mono/tao-glfw- at TAOGLFW_MAJOR@/Tao.Glfw.dll
diff --git a/src/Tao.Lua/AUTHORS b/src/Tao.Lua/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Lua/COPYING b/src/Tao.Lua/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.Lua/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.Lua/ChangeLog b/src/Tao.Lua/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Lua/INSTALL b/src/Tao.Lua/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Lua/Lua.cs b/src/Tao.Lua/Lua.cs
new file mode 100644
index 0000000..09f0088
--- /dev/null
+++ b/src/Tao.Lua/Lua.cs
@@ -0,0 +1,2731 @@
+#region License
+/*
+ MIT License
+ Copyright 2003-2007 Tao Framework Team
+ http://www.taoframework.com
+ All rights reserved.
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+ 
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+#endregion License
+
+#region Original License
+
+/*
+ Copyright (C) 1994-2006 Lua.org, PUC-Rio.  All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#endregion Original License
+
+using System;
+using System.Security;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace Tao.Lua
+{
+    #region Aliases
+    using lua_State = System.IntPtr;
+    using size_t = System.UInt32;
+    using lua_Number = System.Double;
+    using lua_Integer = System.Int32;
+    using lua_Debug = System.IntPtr;
+    #endregion Aliases
+
+    /// #region Class Documentation
+    /// <summary>
+    ///     Lua bindings for .NET, implementing Lua 5.1.1 (http://www.lua.org).
+    /// </summary>
+    /// <remarks>
+    ///		Lua is a powerful light-weight programming language designed for
+    ///		extending applications. Lua is also frequently used as a
+    ///		general-purpose, stand-alone language.
+    ///	<p>More information can be found at the official website (http://www.lua.org).</p>
+    ///	</remarks>
+    /// #endregion Class Documentation
+    public static class Lua
+    {
+        #region Private Constants
+
+        private const string LUA_NATIVE_LIBRARY = "lua5.1.dll";
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+
+        #endregion Private Constants
+
+        #region Lua.h
+
+        #region Public Constants
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_VERSION = "Lua 5.1";
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_RELEASE = "Lua 5.1.1";
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_VERSION_NUM = 501;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_COPYRIGHT = "Copyright (C) 1994-2006 Lua.org, PUC-Rio";
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_AUTHORS = "R. Ierusalimschy, L. H. de Figueiredo & W. Celes";
+
+        // mark for precompiled code (`<esc>Lua')
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_SIGNATURE = "\033Lua";
+
+        //option for multiple returns in `lua_pcall' and `lua_call'
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_MULTRET = -1;
+
+        // pseudo-indices
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_REGISTRYINDEX = -10000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_ENVIRONINDEX = -10001;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_GLOBALSINDEX = -10002;
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="i"></param>
+        /// <returns></returns>
+        public static int lua_upvalueindex(int i) { return LUA_GLOBALSINDEX - i; }
+
+        // thread status; 0 is OK 
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_YIELDSTATUS = 1; // LUA_YIELD
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_ERRRUN = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_ERRSYNTAX = 3;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_ERRMEM = 4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_ERRERR = 5;
+
+        #endregion Public Constants
+
+        #region Public Delegates
+
+        //typedef int (*lua_CFunction) (lua_State *L);
+        /// <summary>
+        ///     Type for C functions.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <remarks>
+        ///     In order to communicate properly with Lua, a C function must use the following
+        ///     protocol, which defines the way parameters and results are passed: a C function
+        ///     receives its arguments from Lua in its stack in direct order (the first argument
+        ///     is pushed first). So, when the function starts, lua_gettop(L) returns the number
+        ///     of arguments received by the function. The first argument (if any) is at index 1
+        ///     and its last argument is at index lua_gettop(L). To return values to Lua, a C
+        ///     function just pushes them onto the stack, in direct order (the first result is
+        ///     pushed first), and returns the number of results. Any other value in the stack
+        ///     below the results will be properly discarded by Lua. Like a Lua function, a C
+        ///     function called by Lua can also return many results.
+        /// </remarks>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int lua_CFunction(lua_State L);
+
+        //functions that read/write blocks when loading/dumping Lua chunks
+        //typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);
+        /// <summary>
+        ///     The reader function used by lua_load.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="ud"></param>
+        /// <param name="sz"></param>
+        /// <returns>
+        ///     To signal the end of the chunk, the reader must return NULL. The reader
+        ///     function may return pieces of any size greater than zero.
+        /// </returns>
+        /// <remarks>
+        ///     Every time it needs another piece of the chunk, lua_load calls the reader,
+        ///     passing along its data parameter. The reader must return a pointer to a
+        ///     block of memory with a new piece of the chunk and set size to the block size.
+        ///     The block must exist until the reader function is called again.
+        /// </remarks>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [CLSCompliant(false)]
+        public delegate string lua_Reader(lua_State L, IntPtr ud, ref size_t sz);
+
+        //typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);
+        /// <summary>
+        ///     The writer function used by lua_dump. Every time it produces another piece of chunk, lua_dump calls the writer, passing along the buffer to be written (p), its size (sz), and the data parameter supplied to lua_dump.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="p"></param>
+        /// <param name="sz"></param>
+        /// <param name="ud"></param>
+        /// <returns>
+        ///     The writer returns an error code: 0 means no errors; any other value means an error and stops lua_dump from calling the writer again.
+        /// </returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [CLSCompliant(false)]
+        public delegate int lua_Writer(lua_State L, IntPtr p, size_t sz, IntPtr ud);
+
+        //typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="ud"></param>
+        /// <param name="ptr"></param>
+        /// <param name="osize"></param>
+        /// <param name="nsize"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate IntPtr lua_Alloc(IntPtr ud, IntPtr ptr, size_t osize, size_t nsize);
+
+        #endregion Public Delegates
+
+        #region Basic Types
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_TNONE = -1;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_TNIL = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_TBOOLEAN = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_TLIGHTUSERDATA = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_TNUMBER = 3;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_TSTRING = 4;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_TTABLE = 5;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_TFUNCTION = 6;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_TUSERDATA = 7;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_TTHREAD = 8;
+
+        /// <summary>
+        ///     Minimum Lua stack available to a C function
+        /// </summary>
+        public const int LUA_MINSTACK = 20;
+
+        #endregion Basic Types
+
+        #region Public Functions
+
+        #region Basic State Management
+
+        //LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);
+        /// <summary>
+        ///     Creates a new, independent state.   
+        /// </summary>
+        /// <param name="f">The argument f is the allocator function.</param>
+        /// <param name="ud">The second argument, ud, is an opaque pointer that Lua simply passes to the allocator in every call.</param>
+        /// <returns>Returns NULL if cannot create the state (due to lack of memory).</returns>
+        /// <remarks>Lua does all memory allocation for this state through this function.</remarks>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_State lua_newstate(lua_Alloc f, IntPtr ud);
+
+        //LUA_API void       (lua_close) (lua_State *L);
+        /// <summary>
+        ///     Destroys all objects in the given Lua state (calling the corresponding
+        ///     garbage-collection metamethods, if any) and frees all dynamic memory used
+        ///     by this state. On several platforms, you may not need to call this function,
+        ///     because all resources are naturally released when the host program ends. On
+        ///     the other hand, long-running programs, such as a daemon or a web server, might
+        ///     need to release states as soon as they are not needed, to avoid growing too large.
+        /// </summary>
+        /// <param name="L"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_close(lua_State L);
+
+        //LUA_API lua_State *(lua_newthread) (lua_State *L);
+        /// <summary>
+        ///     Creates a new thread, pushes it on the stack, and returns a pointer
+        ///     to a lua_State that represents this new thread. The new state returned
+        ///     by this function shares with the original state all global objects
+        ///     (such as tables), but has an independent execution stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        /// <remarks>
+        ///     There is no explicit function to close or to destroy a thread. Threads
+        ///     are subject to garbage collection, like any Lua object.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_State lua_newthread(lua_State L);
+
+        //LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="panicf"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_CFunction lua_atpanic(lua_State L, lua_CFunction panicf);
+
+        //LUA_API int   (lua_gettop) (lua_State *L);
+        /// <summary>
+        ///     Returns the index of the top element in the stack. Because indices
+        ///     start at 1, this result is equal to the number of elements in the
+        ///     stack (and so 0 means an empty stack).
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_gettop(lua_State L);
+
+        //LUA_API void  (lua_settop) (lua_State *L, int idx);
+        /// <summary>
+        ///     Accepts any acceptable index, or 0, and sets the stack top to this index. If the new top is larger than the old one, then the new elements are filled with nil. If index is 0, then all stack elements are removed.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_settop(lua_State L, int idx);
+
+        //LUA_API void  (lua_pushvalue) (lua_State *L, int idx);
+        /// <summary>
+        ///     Pushes a copy of the element at the given valid index onto the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_pushvalue(lua_State L, int idx);
+
+        //LUA_API void  (lua_remove) (lua_State *L, int idx);
+        /// <summary>
+        ///     Removes the element at the given valid index, shifting down
+        ///     the elements above this index to fill the gap. Cannot be called
+        ///     with a pseudo-index, because a pseudo-index is not an actual
+        ///     stack position.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_remove(lua_State L, int idx);
+
+        //LUA_API void  (lua_insert) (lua_State *L, int idx);
+        /// <summary>
+        ///     Moves the top element into the given valid index, shifting up
+        ///     the elements above this index to open space. Cannot be called
+        ///     with a pseudo-index, because a pseudo-index is not an actual
+        ///     stack position.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_insert(lua_State L, int idx);
+
+        //LUA_API void  (lua_replace) (lua_State *L, int idx);
+        /// <summary>
+        ///     Moves the top element into the given position (and pops it), without shifting
+        ///     any element (therefore replacing the value at the given position).
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_replace(lua_State L, int idx);
+
+        //LUA_API int   (lua_checkstack) (lua_State *L, int sz);
+        /// <summary>
+        ///     Ensures that there are at least extra free stack slots in the stack. It returns
+        ///     false if it cannot grow the stack to that size. This function never shrinks the
+        ///     stack; if the stack is already larger than the new size, it is left unchanged.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="sz"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_checkstack(lua_State L, int sz);
+
+        //LUA_API void  (lua_xmove) (lua_State *from, lua_State *to, int n);
+        /// <summary>
+        ///     Exchange values between different threads of the same global state.
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        /// <param name="n"></param>
+        /// <remarks>
+        ///     This function pops n values from the stack from, and pushes them onto the stack to.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_xmove(lua_State from, lua_State to, int n);
+
+        #endregion Basic Stack Manipulation
+
+        #region Access Functions (stack -> C)
+
+        //LUA_API int             (lua_isnumber) (lua_State *L, int idx);
+        /// <summary>
+        ///     Returns 1 if the value at the given acceptable index is a number
+        ///     or a string convertible to a number, and 0 otherwise.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_isnumber(lua_State L, int idx);
+
+        //LUA_API int             (lua_isstring) (lua_State *L, int idx);
+        /// <summary>
+        ///     Returns 1 if the value at the given acceptable index is a
+        ///     string or a number (which is always convertible to a string),
+        ///     and 0 otherwise.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_isstring(lua_State L, int idx);
+
+        //LUA_API int             (lua_iscfunction) (lua_State *L, int idx);
+        /// <summary>
+        ///     Returns 1 if the value at the given acceptable index is
+        ///     a C function, and 0 otherwise.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_iscfunction(lua_State L, int idx);
+
+        //LUA_API int             (lua_isuserdata) (lua_State *L, int idx);
+        /// <summary>
+        ///     Returns 1 if the value at the given acceptable index is a
+        ///     userdata (either full or light), and 0 otherwise.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_isuserdata(lua_State L, int idx);
+
+        //LUA_API int             (lua_type) (lua_State *L, int idx);
+        /// <summary>
+        ///     Returns the type of the value in the given acceptable index, or LUA_TNONE for a non-valid index (that is, an index to an "empty" stack position). The types returned by lua_type are coded by the following constants defined in lua.h: LUA_TNIL, LUA_TNUMBER, LUA_TBOOLEAN, LUA_TSTRING, LUA_TTABLE, LUA_TFUNCTION, LUA_TUSERDATA, LUA_TTHREAD, and LUA_TLIGHTUSERDATA.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_type(lua_State L, int idx);
+
+        //LUA_API const char     *(lua_typename) (lua_State *L, int tp);
+        /// <summary>
+        ///     Returns the name of the type encoded by the value tp, which must be one the values returned by lua_type.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="tp"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static string lua_typename(lua_State L, int tp);
+
+        //LUA_API int            (lua_equal) (lua_State *L, int idx1, int idx2);
+        /// <summary>
+        ///     Returns 1 if the two values in acceptable indices index1
+        ///     and index2 are equal, following the semantics of the Lua == operator
+        ///     (that is, may call metamethods). Otherwise returns 0. Also returns
+        ///     0 if any of the indices is non valid.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx1"></param>
+        /// <param name="idx2"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_equal(lua_State L, int idx1, int idx2);
+
+        //LUA_API int            (lua_rawequal) (lua_State *L, int idx1, int idx2);
+        /// <summary>
+        ///     Returns 1 if the two values in acceptable indices index1 and index2 
+        ///     are primitively equal (that is, without calling metamethods). Otherwise
+        ///     returns 0. Also returns 0 if any of the indices are non valid.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx1"></param>
+        /// <param name="idx2"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_rawequal(lua_State L, int idx1, int idx2);
+
+        //LUA_API int            (lua_lessthan) (lua_State *L, int idx1, int idx2);
+        /// <summary>
+        ///     Returns 1 if the value at acceptable index index1 is smaller
+        ///     than the value at acceptable index index2, following the semantics
+        ///     of the Lua less then operator (that is, may call metamethods).
+        ///     Otherwise returns 0. Also returns 0 if any of the indices is non valid.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx1"></param>
+        /// <param name="idx2"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_lessthan(lua_State L, int idx1, int idx2);
+
+        //LUA_API lua_Number      (lua_tonumber) (lua_State *L, int idx);
+        /// <summary>
+        ///     Converts the Lua value at the given acceptable index to a number (see lua_Number). The Lua value must be a number or a string convertible to a number (see §2.2.1); otherwise, lua_tonumber returns 0.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_Number lua_tonumber(lua_State L, int idx);
+
+        //LUA_API lua_Integer     (lua_tointeger) (lua_State *L, int idx);
+        /// <summary>
+        ///     Converts the Lua value at the given acceptable index to the signed integral type lua_Integer. The Lua value must be a number or a string convertible to a number (see §2.2.1); otherwise, lua_tointeger returns 0.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        /// <remarks>
+        ///     If the number is not an integer, it is truncated in some non-specified way.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_Integer lua_tointeger(lua_State L, int idx);
+
+        //LUA_API int             lua_toboolean (lua_State *L, int idx);
+        /// <summary>
+        ///     Converts the Lua value at the given acceptable index to a C boolean value (0 or 1). Like all tests in Lua, lua_toboolean returns 1 for any Lua value different from false and nil; otherwise it returns 0. It also returns 0 when called with a non-valid index. (If you want to accept only actual boolean values, use lua_isboolean to test the value's type.)
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_toboolean(lua_State L, int idx);
+
+        //LUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);
+        /// <summary>
+        ///     Converts the Lua value at the given acceptable index to a string (const char*). If len is not NULL, it also sets *len with the string length. The Lua value must be a string or a number; otherwise, the function returns NULL. If the value is a number, then lua_tolstring also changes the actual value in the stack to a string. (This change confuses lua_next when lua_tolstring is applied to keys during a table traversal.)
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <param name="len"></param>
+        /// <returns>
+        ///     lua_tolstring returns a fully aligned pointer to a string inside the Lua state. This string always has a zero ('\0') after its last character (as in C), but may contain other zeros in its body. Because Lua has garbage collection, there is no guarantee that the pointer returned by lua_tolstring will be valid after the corresponding value is removed from the stack.
+        /// </returns>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static IntPtr lua_tolstring(lua_State L, int idx, out int len);
+
+        //LUA_API size_t          (lua_objlen) (lua_State *L, int idx);
+        /// <summary>
+        ///     Returns the "length" of the value at the given acceptable
+        ///     index: for strings, this is the string length; for tables,
+        ///     this is the result of the length operator ('#'); for userdata,
+        ///     this is the size of the block of memory allocated for the
+        ///     userdata; for other values, it is 0.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static size_t lua_objlen(lua_State L, int idx);
+
+        //LUA_API lua_CFunction   (lua_tocfunction) (lua_State *L, int idx);
+        /// <summary>
+        ///     Converts a value at the given acceptable index to a C function. That value must be a C function; otherwise, returns NULL.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_CFunction lua_tocfunction(lua_State L, int idx);
+
+        //LUA_API void	       *(lua_touserdata) (lua_State *L, int idx);
+        /// <summary>
+        ///     If the value at the given acceptable index is a full userdata, returns its block address. If the value is a light userdata, returns its pointer. Otherwise, returns NULL.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static IntPtr lua_touserdata(lua_State L, int idx);
+
+        //LUA_API lua_State      *(lua_tothread) (lua_State *L, int idx);
+        /// <summary>
+        ///     Converts the value at the given acceptable index to a Lua thread (represented as lua_State*). This value must be a thread; otherwise, the function returns NULL.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_State lua_tothread(lua_State L, int idx);
+
+        //LUA_API const void     *(lua_topointer) (lua_State *L, int idx);
+        /// <summary>
+        ///     Converts the value at the given acceptable index to a generic C pointer (void*). The value may be a userdata, a table, a thread, or a function; otherwise, lua_topointer returns NULL. Different objects will give different pointers. There is no way to convert the pointer back to its original value.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns></returns>
+        /// <remarks>
+        ///     Typically this function is used only for debug information.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static IntPtr lua_topointer(lua_State L, int idx);
+
+        #endregion Access Functions (stack -> C)
+
+        #region Push Functions (C -> stack)
+
+        //LUA_API void  (lua_pushnil) (lua_State *L);
+        /// <summary>
+        ///     Pushes a nil value onto the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_pushnil(lua_State L);
+
+        //LUA_API void  (lua_pushnumber) (lua_State *L, lua_Number n);
+        /// <summary>
+        ///     Pushes a number with value n onto the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_pushnumber(lua_State L, lua_Number n);
+
+        //LUA_API void  (lua_pushinteger) (lua_State *L, lua_Integer n);
+        /// <summary>
+        ///     Pushes a number with value n onto the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_pushinteger(lua_State L, lua_Integer n);
+
+        //LUA_API void  lua_pushlstring (lua_State *L, const char *s, size_t l);
+        /// <summary>
+        ///     Pushes the string pointed to by s with size len onto the stack. Lua
+        ///     makes (or reuses) an internal copy of the given string, so the
+        ///     memory at s can be freed or reused immediately after the function
+        ///     returns. The string can contain embedded zeros.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="s"></param>
+        /// <param name="l"></param>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_pushlstring(lua_State L, string s, size_t l);
+
+        //LUA_API void  lua_pushstring (lua_State *L, const char *s);
+        /// <summary>
+        ///     Pushes the zero-terminated string pointed to by s onto the stack. Lua
+        ///     makes (or reuses) an internal copy of the given string, so the memory
+        ///     at s can be freed or reused immediately after the function returns. The
+        ///     string cannot contain embedded zeros; it is assumed to end at the first zero.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="s"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_pushstring(lua_State L, string s);
+
+        // TODO: Variable argument lists.
+        //LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, va_list argp);
+        //LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...);
+
+        //LUA_API void  (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);
+        /// <summary>
+        ///     Pushes a new C closure onto the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="fn"></param>
+        /// <param name="n"></param>
+        /// <remarks>
+        ///     When a C function is created, it is possible to associate some values
+        ///     with it, thus creating a C closure (see §3.4); these values are then
+        ///     accessible to the function whenever it is called. To associate values
+        ///     with a C function, first these values should be pushed onto the stack
+        ///     (when there are multiple values, the first value is pushed first).
+        ///     Then lua_pushcclosure is called to create and push the C function onto
+        ///     the stack, with the argument n telling how many values should be
+        ///     associated with the function. lua_pushcclosure also pops these values
+        ///     from the stack.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_pushcclosure(lua_State L, lua_CFunction fn, int n);
+
+        //LUA_API void  (lua_pushboolean) (lua_State *L, int b);
+        /// <summary>
+        ///     Pushes a boolean value with value b onto the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="b"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_pushboolean(lua_State L, int b);
+
+        //LUA_API void  (lua_pushlightuserdata) (lua_State *L, void *p);
+        /// <summary>
+        ///     Pushes a light userdata onto the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="p"></param>
+        /// <remarks>
+        ///     Userdata represents C values in Lua. A light userdata represents
+        ///     a pointer. It is a value (like a number): you do not create it, it has
+        ///     no individual metatable, and it is not collected (as it was never
+        ///     created). A light userdata is equal to "any" light userdata with
+        ///     the same C address.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_pushlightuserdata(lua_State L, IntPtr p);
+
+        //LUA_API int   (lua_pushthread) (lua_State *L);
+        /// <summary>
+        ///     Pushes the thread represented by L onto the stack. 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns>
+        ///     Returns 1 if this thread is the main thread of its state.
+        /// </returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_pushthread(lua_State L);
+
+        #endregion Push Functions (C -> stack)
+
+        #region Get Functions (Lua -> stack)
+
+        //LUA_API void  (lua_gettable) (lua_State *L, int idx);
+        /// <summary>
+        ///     Pushes onto the stack the value t[k], where t is the value at the given
+        ///     valid index index and k is the value at the top of the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <remarks>
+        ///     This function pops the key from the stack (putting the resulting value in
+        ///     its place). As in Lua, this function may trigger a metamethod for the
+        ///     "index" event.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_gettable(lua_State L, int idx);
+
+        //LUA_API void  (lua_getfield) (lua_State *L, int idx, const char *k);
+        /// <summary>
+        ///     Pushes onto the stack the value t[k], where t is the value at the
+        ///     given valid index index. As in Lua, this function may trigger a
+        ///     metamethod for the "index" event
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <param name="k"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_getfield(lua_State L, int idx, string k);
+
+        //LUA_API void  (lua_rawget) (lua_State *L, int idx);
+        /// <summary>
+        ///     Similar to lua_gettable, but does a raw access (i.e., without
+        ///     metamethods).
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_rawget(lua_State L, int idx);
+
+        //LUA_API void  (lua_rawgeti) (lua_State *L, int idx, int n);
+        /// <summary>
+        ///     Pushes onto the stack the value t[n], where t is the value at the given
+        ///     valid index index. The access is raw; that is, it does not invoke metamethods.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <param name="n"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_rawgeti(lua_State L, int idx, int n);
+
+        //LUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);
+        /// <summary>
+        ///     Creates a new empty table and pushes it onto the stack. The new table
+        ///     has space pre-allocated for narr array elements and nrec non-array elements.
+        ///     This pre-allocation is useful when you know exactly how many elements the table
+        ///     will have. Otherwise you can use the function lua_newtable.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="narr"></param>
+        /// <param name="nrec"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_createtable(lua_State L, int narr, int nrec);
+
+        //LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
+        /// <summary>
+        ///     This function allocates a new block of memory with the given
+        ///     size, pushes onto the stack a new full userdata with the block
+        ///     address, and returns this address.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="sz"></param>
+        /// <returns></returns>
+        /// <remarks>
+        ///     Userdata represents C values in Lua. A full userdata represents
+        ///     a block of memory. It is an object (like a table): you must create it,
+        ///     it can have its own metatable, and you can detect when it is being
+        ///     collected. A full userdata is only equal to itself (under raw equality).
+        ///     
+        ///     When Lua collects a full userdata with a gc metamethod, Lua calls the
+        ///     metamethod and marks the userdata as finalized. When this userdata is
+        ///     collected again then Lua frees its corresponding memory.
+        /// </remarks>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static IntPtr lua_newuserdata(lua_State L, size_t sz);
+
+        //LUA_API int   (lua_getmetatable) (lua_State *L, int objindex);
+        /// <summary>
+        ///     Pushes onto the stack the metatable of the value at the given
+        ///     acceptable index. If the index is not valid, or if the value
+        ///     does not have a metatable, the function returns 0 and pushes
+        ///     nothing on the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="objindex"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_getmetatable(lua_State L, int objindex);
+
+        //LUA_API void  (lua_getfenv) (lua_State *L, int idx);
+        /// <summary>
+        ///     Pushes onto the stack the environment table of the value at the given index.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_getfenv(lua_State L, int idx);
+
+        #endregion Get Functions (Lua -> stack)
+
+        #region Set Functions (stack -> Lua)
+
+        //LUA_API void  (lua_settable) (lua_State *L, int idx);
+        /// <summary>
+        ///     Does the equivalent to t[k] = v, where t is the value at the given valid index index, v is the value at the top of the stack, and k is the value just below the top.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <remarks>
+        ///     This function pops both the key and the value from the stack. As in Lua, this function may trigger a metamethod for the "newindex" event
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_settable(lua_State L, int idx);
+
+        //LUA_API void  (lua_setfield) (lua_State *L, int idx, const char *k);
+        /// <summary>
+        ///     Does the equivalent to t[k] = v, where t is the value at the
+        ///     given valid index index and v is the value at the top of the stack,
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <param name="k"></param>
+        /// <remarks>
+        ///     This function pops the value from the stack. As in Lua, this
+        ///     function may trigger a metamethod for the "newindex" event
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_setfield(lua_State L, int idx, string k);
+
+        //LUA_API void  (lua_rawset) (lua_State *L, int idx);
+        /// <summary>
+        ///     Similar to lua_settable, but does a raw assignment (i.e., without
+        ///     metamethods).
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_rawset(lua_State L, int idx);
+
+        //LUA_API void  (lua_rawseti) (lua_State *L, int idx, int n);
+        /// <summary>
+        ///     Does the equivalent of t[n] = v, where t is the value at the given valid index index and v
+        ///     is the value at the top of the stack,
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <param name="n"></param>
+        /// <remarks>
+        ///     This function pops the value from the stack. The assignment is
+        ///     raw; that is, it does not invoke metamethods.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_rawseti(lua_State L, int idx, int n);
+
+        //LUA_API int   (lua_setmetatable) (lua_State *L, int objindex);
+        /// <summary>
+        ///     Pops a table from the stack and sets it as the new metatable for the value at the given acceptable index.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="objindex"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_setmetatable(lua_State L, int objindex);
+
+        //LUA_API int   (lua_setfenv) (lua_State *L, int idx);
+        /// <summary>
+        ///     Pops a table from the stack and sets it as the new
+        ///     environment for the value at the given index.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns>
+        ///     If the value at the given index is neither a function nor a
+        ///     thread nor a userdata, lua_setfenv returns 0. Otherwise it returns 1.
+        /// </returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_setfenv(lua_State L, int idx);
+
+        #endregion Set Functions (stack -> Lua)
+
+        #region Load and Call Functions (Load and Run Lua code)
+
+        //LUA_API void  (lua_call) (lua_State *L, int nargs, int nresults);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="nargs"></param>
+        /// <param name="nresults"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_call(lua_State L, int nargs, int nresults);
+
+        //LUA_API int   (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);
+        /// <summary>
+        ///     Calls a function in protected mode.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="nargs">
+        ///     Both nargs and nresults have the same meaning as in lua_call. If there are
+        ///     no errors during the call, lua_pcall behaves exactly like lua_call. However,
+        ///     if there is any error, lua_pcall catches it, pushes a single value on the
+        ///     stack (the error message), and returns an error code. Like lua_call,
+        ///     lua_pcall always removes the function and its arguments from the stack.
+        /// </param>
+        /// <param name="nresults">
+        ///     Both nargs and nresults have the same meaning as in lua_call. If there are
+        ///     no errors during the call, lua_pcall behaves exactly like lua_call. However,
+        ///     if there is any error, lua_pcall catches it, pushes a single value on the
+        ///     stack (the error message), and returns an error code. Like lua_call,
+        ///     lua_pcall always removes the function and its arguments from the stack.
+        /// </param>
+        /// <param name="errfunc">
+        ///     If errfunc is 0, then the error message returned on the stack is exactly
+        ///     the original error message. Otherwise, errfunc is the stack index of an error
+        ///     handler function. (In the current implementation, this index cannot be a
+        ///     pseudo-index.) In case of runtime errors, this function will be called with
+        ///     the error message and its return value will be the message returned on the
+        ///     stack by lua_pcall.
+        /// </param>
+        /// <returns>
+        ///     The lua_pcall function returns 0 in case of success or one of the following error codes (defined in lua.h):
+        ///         LUA_ERRRUN: a runtime error.
+        ///         LUA_ERRMEM: memory allocation error. For such errors, Lua does not call the error handler function.
+        ///         LUA_ERRERR: error while running the error handler function.
+        /// </returns>
+        /// <remarks>
+        ///     Typically, the error handler function is used to add more debug information
+        ///     to the error message, such as a stack traceback. Such information cannot
+        ///     be gathered after the return of lua_pcall, since by then the stack has unwound.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_pcall(lua_State L, int nargs, int nresults, int errfunc);
+
+        //LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud);
+        /// <summary>
+        ///     Calls the C function func in protected mode. func starts with only one
+        ///     element in its stack, a light userdata containing ud. In case of errors,
+        ///     lua_cpcall returns the same error codes as lua_pcall, plus the error object
+        ///     on the top of the stack; otherwise, it returns zero, and does not change
+        ///     the stack. All values returned by func are discarded.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="func"></param>
+        /// <param name="ud"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_cpcall(lua_State L, lua_CFunction func, IntPtr ud);
+
+        //LUA_API int   (lua_load) (lua_State *L, lua_Reader reader, void *dt, const char *chunkname);
+        /// <summary>
+        ///     Loads a Lua chunk. If there are no errors, lua_load pushes the compiled
+        ///     chunk as a Lua function on top of the stack. Otherwise, it pushes an
+        ///     error message.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="reader"></param>
+        /// <param name="data">The data argument is an opaque value passed to the reader function.</param>
+        /// <param name="chunkname">The chunkname argument gives a name to the chunk, which is used for error messages and in debug information.</param>
+        /// <returns>0: no errors.  LUA_ERRSYNTAX: syntax error during pre-compilation. LUA_ERRMEM: memory allocation error.</returns>
+        /// <remarks>This function only loads a chunk; it does not run it. lua_load automatically detects whether the chunk is text or binary, and loads it accordingly (see program luac). lua_load uses a user-supplied reader function to read the chunk (see lua_Reader).</remarks>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_load(lua_State L, lua_Reader reader, IntPtr data, string chunkname);
+
+        //LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data);
+        /// <summary>
+        ///     Dumps a function as a binary chunk. Receives a Lua function on the
+        ///     top of the stack and produces a binary chunk that, if loaded again,
+        ///     results in a function equivalent to the one dumped. As it produces
+        ///     parts of the chunk, lua_dump calls function writer (see lua_Writer)
+        ///     with the given data to write them.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="writer"></param>
+        /// <param name="data"></param>
+        /// <returns>
+        ///     The value returned is the error code returned by the last call to
+        ///     the writer; 0 means no errors.
+        /// </returns>
+        /// <remarks>
+        ///     This function does not pop the Lua function from the stack.
+        /// </remarks>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_dump(lua_State L, lua_Writer writer, IntPtr data);
+
+        #endregion Load and Call Functions (Load and Run Lua code)
+
+        #region Coroutine Functions
+
+        //LUA_API int  (lua_yield) (lua_State *L, int nresults);
+        /// <summary>
+        ///     Yields a coroutine.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="nresults"></param>
+        /// <returns></returns>
+        /// <remarks>
+        ///     When a C function calls lua_yield in that way, the running coroutine suspends its execution, and the call to lua_resume that started this coroutine returns. The parameter nresults is the number of values from the stack that are passed as results to lua_resume.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_yield(lua_State L, int nresults);
+
+        //LUA_API int  (lua_resume) (lua_State *L, int narg);
+        /// <summary>
+        ///     Starts and resumes a coroutine in a given thread.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="narg"></param>
+        /// <returns>
+        ///     When it returns, the stack contains all values passed to lua_yield, or
+        ///     all values returned by the body function. lua_resume returns LUA_YIELD
+        ///     if the coroutine yields, 0 if the coroutine finishes its execution without
+        ///     errors, or an error code in case of errors (see lua_pcall). In case of 
+        ///     errors, the stack is not unwound, so you can use the debug API over it. The
+        ///     error message is on the top of the stack.
+        /// </returns>
+        /// <remarks>
+        ///     To start a coroutine, you first create a new thread (see lua_newthread);
+        ///     then you push onto its stack the main function plus any arguments;
+        ///     then you call lua_resume, with narg being the number of arguments.
+        ///     This call returns when the coroutine suspends or finishes its execution.
+        ///     To restart a coroutine, you put on its stack only the values to be passed
+        ///     as results from yield, and then call lua_resume.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_resume(lua_State L, int narg);
+
+        //LUA_API int  (lua_status) (lua_State *L);
+        /// <summary>
+        ///     Returns the status of the thread L.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        /// <remarks>
+        ///     The status can be 0 for a normal thread, an error code if the thread finished its execution with an error, or LUA_YIELD if the thread is suspended.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_status(lua_State L);
+
+        #endregion Coroutine Functions
+
+        #region Garbage-Collection Function and Options
+
+        //#define LUA_GCSTOP		0
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_GCSTOP = 0;
+
+        //#define LUA_GCRESTART		1
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_GCRESTART = 1;
+
+        //#define LUA_GCCOLLECT		2
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_GCCOLLECT = 2;
+
+        //#define LUA_GCCOUNT		3
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_GCCOUNT = 3;
+
+        //#define LUA_GCCOUNTB		4
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_GCCOUNTB = 4;
+
+        //#define LUA_GCSTEP		5
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_GCSTEP = 5;
+
+        //#define LUA_GCSETPAUSE		6
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_GCSETPAUSE = 6;
+
+        //#define LUA_GCSETSTEPMUL	7
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_GCSETSTEPMUL = 7;
+
+        //LUA_API int (lua_gc) (lua_State *L, int what, int data);
+        /// <summary>
+        ///     Controls the garbage collector.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="what"></param>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        /// <remarks>
+        ///     This function performs several tasks, according to the value of the parameter what:
+        ///         LUA_GCSTOP: stops the garbage collector.
+        ///         LUA_GCRESTART: restarts the garbage collector.
+        ///         LUA_GCCOLLECT: performs a full garbage-collection cycle.
+        ///         LUA_GCCOUNT: returns the current amount of memory (in Kbytes) in use by Lua.
+        ///         LUA_GCCOUNTB: returns the remainder of dividing the current amount of bytes of memory in use by Lua by 1024.
+        ///         LUA_GCSTEP: performs an incremental step of garbage collection. The step "size" is controlled by data (larger values mean more steps) in a non-specified way. If you want to control the step size you must experimentally tune the value of data. The function returns 1 if the step finished a garbage-collection cycle.
+        ///         LUA_GCSETPAUSE: sets data/100 as the new value for the pause of the collector (see §2.10). The function returns the previous value of the pause.
+        ///         LUA_GCSETSTEPMUL: sets arg/100 as the new value for the step multiplier of the collector (see §2.10). The function returns the previous value of the step multiplier.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_gc(lua_State L, int what, int data);
+
+        #endregion Garbage-Collection Functions
+
+        #region Miscellaneous Functions
+
+        //LUA_API int   (lua_error) (lua_State *L);
+        /// <summary>
+        ///     Generates a Lua error. The error message (which can actually
+        ///     be a Lua value of any type) must be on the stack top. This function
+        ///     does a long jump, and therefore never returns. (see luaL_error).
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_error(lua_State L);
+
+        //LUA_API int   (lua_next) (lua_State *L, int idx);
+        /// <summary>
+        ///     Pops a key from the stack, and pushes a key-value pair from the
+        ///     table at the given index (the "next" pair after the given key).
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <returns>
+        ///     If there are no more elements in the table, then lua_next
+        ///     returns 0 (and pushes nothing).
+        /// </returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_next(lua_State L, int idx);
+
+        //LUA_API void  (lua_concat) (lua_State *L, int n);
+        /// <summary>
+        ///     Concatenates the n values at the top of the stack, pops them, and leaves
+        ///     the result at the top. If n is 1, the result is the single string on
+        ///     the stack (that is, the function does nothing); if n is 0, the result
+        ///     is the empty string. Concatenation is done following the usual semantics
+        ///     of Lua.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void lua_concat(lua_State L, int n);
+
+        //LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);
+        /// <summary>
+        ///     Returns the memory-allocation function of a given state.
+        ///     If ud is not NULL, Lua stores in *ud the opaque pointer
+        ///     passed to lua_newstate.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="ud"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_Alloc lua_getallocf(lua_State L, IntPtr ud);
+
+        //LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
+        /// <summary>
+        ///     Changes the allocator function of a given state to f with
+        ///     user data ud.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="f"></param>
+        /// <param name="ud"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_Alloc lua_setallocf(lua_State L, lua_Alloc f, IntPtr ud);
+
+        #endregion Miscellaneous Functions
+
+        #region Some Useful Macros
+
+        //#define lua_pop(L,n)		lua_settop(L, -(n)-1)
+        /// <summary>
+        ///     Pops n elements from the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        public static void lua_pop(lua_State L, int n)
+        {
+            lua_settop(L, -(n) - 1);
+        }
+
+        //#define lua_newtable(L)		lua_createtable(L, 0, 0)
+        /// <summary>
+        ///     Creates a new empty table and pushes it onto the stack. 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <remarks>It is equivalent to lua_createtable(L, 0, 0).</remarks>
+        public static void lua_newtable(lua_State L)
+        {
+            lua_createtable(L, 0, 0);
+        }
+
+        //#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
+        /// <summary>
+        ///     Sets the C function f as the new value of global name.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <param name="f"></param>
+        public static void lua_register(lua_State L, string n, lua_CFunction f)
+        {
+            lua_pushcfunction(L, f);
+            lua_setglobal(L, n);
+        }
+
+        //#define lua_pushcfunction(L,f)	lua_pushcclosure(L, (f), 0)
+        /// <summary>
+        ///     Pushes a C function onto the stack. This function receives a pointer
+        ///     to a C function and pushes onto the stack a Lua value of type function
+        ///     that, when called, invokes the corresponding C function.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="f"></param>
+        /// <remarks>
+        ///     Any function to be registered in Lua must follow the correct protocol
+        ///     to receive its parameters and return its results
+        /// </remarks>
+        public static void lua_pushcfunction(lua_State L, lua_CFunction f)
+        {
+            lua_pushcclosure(L, f, 0);
+        }
+
+        //#define lua_strlen(L,i)		lua_objlen(L, (i))
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="i"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        public static size_t lua_strlen(lua_State L, int i)
+        {
+            return lua_objlen(L, i);
+        }
+
+        //#define lua_isfunction(L,n)	(lua_type(L,n) == LUA_TFUNCTION)
+        /// <summary>
+        ///     Returns 1 if the value at the given acceptable index is a
+        ///     function (either C or Lua), and 0 otherwise.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static bool lua_isfunction(lua_State L, int n)
+        {
+            return lua_type(L, n) == LUA_TFUNCTION;
+        }
+
+        //#define lua_istable(L,n)	(lua_type(L,n) == LUA_TTABLE)
+        /// <summary>
+        ///     Returns 1 if the value at the given acceptable index is a
+        ///     table, and 0 otherwise.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static bool lua_istable(lua_State L, int n)
+        {
+            return lua_type(L, n) == LUA_TLIGHTUSERDATA;
+        }
+
+        //#define lua_islightuserdata(L,n)	(lua_type(L,n) == LUA_TLIGHTUSERDATA)
+        /// <summary>
+        ///     Returns 1 if the value at the given acceptable index is a light
+        ///     userdata, and 0 otherwise.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static bool lua_islightuserdata(lua_State L, int n)
+        {
+            return lua_type(L, n) == LUA_TLIGHTUSERDATA;
+        }
+
+        //#define lua_isnil(L,n)		(lua_type(L,n) == LUA_TNIL)
+        /// <summary>
+        ///     Returns 1 if the value at the given acceptable index is nil,
+        ///     and 0 otherwise.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static bool lua_isnil(lua_State L, int n)
+        {
+            return lua_type(L, n) == LUA_TNIL;
+        }
+
+        //#define lua_isboolean(L,n)	(lua_type(L,n) == LUA_TBOOLEAN)
+        /// <summary>
+        ///     Returns 1 if the value at the given acceptable index has type boolean, and 0 otherwise.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static bool lua_isboolean(lua_State L, int n)
+        {
+            return lua_type(L, n) == LUA_TBOOLEAN;
+        }
+
+        //#define lua_isthread(L,n)	(lua_type(L, (n)) == LUA_TTHREAD)
+        /// <summary>
+        ///     Returns 1 if the value at the given acceptable index is a
+        ///     thread, and 0 otherwise.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static bool lua_isthread(lua_State L, int n)
+        {
+            return lua_type(L, n) == LUA_TTHREAD;
+        }
+
+        //#define lua_isnone(L,n)		(lua_type(L,n) == LUA_TNONE)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static bool lua_isnone(lua_State L, int n)
+        {
+            return lua_type(L, n) == LUA_TNONE;
+        }
+
+        //#define lua_isnoneornil(L, n)	(lua_type(L,n) <= 0)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static bool lua_isnoneornil(lua_State L, int n)
+        {
+            return lua_type(L, n) <= 0;
+        }
+
+        //#define lua_pushliteral(L, s)	 lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="s"></param>
+        public static void lua_pushliteral(lua_State L, string s)
+        {
+            //TODO: Implement use using lua_pushlstring instead of lua_pushstring
+            //lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)
+            lua_pushstring(L, s);
+        }
+
+        //#define lua_setglobal(L,s)	lua_setfield(L, LUA_GLOBALSINDEX, (s))
+        /// <summary>
+        ///     Pops a value from the stack and sets it as the new value of global name.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="s"></param>
+        public static void lua_setglobal(lua_State L, string s)
+        {
+            lua_setfield(L, LUA_GLOBALSINDEX, s);
+        }
+
+        //#define lua_getglobal(L,s)	lua_getfield(L, LUA_GLOBALSINDEX, (s))
+        /// <summary>
+        ///     Pushes onto the stack the value of the global name.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="s"></param>
+        public static void lua_getglobal(lua_State L, string s)
+        {
+            lua_getfield(L, LUA_GLOBALSINDEX, s);
+        }
+
+        //#define lua_tostring(L,i)	lua_tolstring(L, (i), NULL)
+        /// <summary>
+        ///     Equivalent to lua_tolstring with len equal to NULL.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="i"></param>
+        /// <returns></returns>
+        public static string lua_tostring(lua_State L, int i)
+        {
+            int strlen;
+            IntPtr str = lua_tolstring(L, i, out strlen);
+            if (str != IntPtr.Zero)
+                return Marshal.PtrToStringAnsi(str, strlen);
+            else
+                return null;
+        }
+
+        #endregion Some Useful Macros
+
+        #region Compatibility Macros and Functions
+
+        //#define lua_open()	luaL_newstate()
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public static lua_State lua_open()
+        {
+            return luaL_newstate();
+        }
+
+        //#define lua_getregistry(L)	lua_pushvalue(L, LUA_REGISTRYINDEX)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        public static void lua_getregistry(lua_State L)
+        {
+            lua_pushvalue(L, LUA_REGISTRYINDEX);
+        }
+
+        //#define lua_getgccount(L)	lua_gc(L, LUA_GCCOUNT, 0)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        public static int lua_getgccount(lua_State L)
+        {
+            return lua_gc(L, LUA_GCCOUNT, 0);
+        }
+
+        #endregion Compatibility Macros and Functions
+
+        #region Debug API
+
+        #region Event Codes
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_HOOKCALL = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_HOOKRET = 1;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_HOOKLINE = 2;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_HOOKCOUNT = 3;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_HOOKTAILRET = 4;
+
+        #endregion Event Codes
+
+        #region Event Masks
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_MASKCALL = (1 << LUA_HOOKCALL);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_MASKRET = (1 << LUA_HOOKRET);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_MASKLINE = (1 << LUA_HOOKLINE);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_MASKCOUNT = (1 << LUA_HOOKCOUNT);
+
+        //typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
+        /// <summary>
+        ///     Type for debugging hook functions.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="ar"></param>
+        /// <remarks>
+        ///     Whenever a hook is called, its ar argument has its field event set to the specific event that triggered the hook. Lua identifies these events with the following constants: LUA_HOOKCALL, LUA_HOOKRET, LUA_HOOKTAILRET, LUA_HOOKLINE, and LUA_HOOKCOUNT. Moreover, for line events, the field currentline is also set. To get the value of any other field in ar, the hook must call lua_getinfo. For return events, event may be LUA_HOOKRET, the normal value, or LUA_HOOKTAILRET. In the  [...]
+        ///     While Lua is running a hook, it disables other calls to hooks. Therefore, if a hook calls back Lua to execute a function or a chunk, this execution occurs without any calls to hooks.
+        /// </remarks>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void lua_Hook(lua_State L, ref lua_Debug ar);
+
+        //LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar);
+        /// <summary>
+        ///     Get information about the interpreter runtime stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="level"></param>
+        /// <param name="ar"></param>
+        /// <returns>When there are no errors, lua_getstack returns 1; when called with a level greater than the stack depth, it returns 0.</returns>
+        /// <remarks>This function fills parts of a lua_Debug structure with an identification of the activation record of the function executing at a given level. Level 0 is the current running function, whereas level n+1 is the function that has called level n.</remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_getstack(lua_State L, int level, ref lua_Debug ar);
+
+        //LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
+        /// <summary>
+        ///     Returns information about a specific function or function invocation.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="what"></param>
+        /// <param name="ar"></param>
+        /// <returns></returns>
+        /// <remarks>
+        ///     To get information about a function invocation, the parameter ar must be a valid activation record that was filled by a previous call to lua_getstack or given as argument to a hook (see lua_Hook).
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_getinfo(lua_State L, string what, ref lua_Debug ar);
+
+        //LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);
+        /// <summary>
+        ///     Gets information about a local variable of a given activation record.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="ar">The parameter ar must be a valid activation record that was filled by a previous call to lua_getstack or given as argument to a hook (see lua_Hook).</param>
+        /// <param name="n">The index n selects which local variable to inspect (1 is the first parameter or active local variable, and so on, until the last active local variable). lua_getlocal pushes the variable's value onto the stack and returns its name.</param>
+        /// <returns>Returns NULL (and pushes nothing) when the index is greater than the number of active local variables.</returns>
+        /// <remarks>
+        ///     Variable names starting with '(' (open parentheses) represent internal variables (loop control variables, temporaries, and C function locals).
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static string lua_getlocal(lua_State L, ref lua_Debug ar, int n);
+
+        //LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);
+        /// <summary>
+        ///     Sets the value of a local variable of a given activation record
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="ar">Parameters ar and n are as in lua_getlocal (see lua_getlocal). lua_setlocal assigns the value at the top of the stack to the variable and returns its name. It also pops the value from the stack.</param>
+        /// <param name="n">Parameters ar and n are as in lua_getlocal (see lua_getlocal). lua_setlocal assigns the value at the top of the stack to the variable and returns its name. It also pops the value from the stack.</param>
+        /// <returns>Returns NULL (and pops nothing) when the index is greater than the number of active local variables.</returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static string lua_setlocal(lua_State L, ref lua_Debug ar, int n);
+
+        //LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n);
+        /// <summary>
+        ///     Gets information about a closure's upvalue. (For Lua functions, upvalues are the external local variables that the function uses, and that are consequently included in its closure.) lua_getupvalue gets the index n of an upvalue, pushes the upvalue's value onto the stack, and returns its name. funcindex points to the closure in the stack. (Upvalues have no particular order, as they are active through the whole function. So, they are numbered in an arbitrary order.)
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="funcindex"></param>
+        /// <param name="n"></param>
+        /// <returns>Returns NULL (and pushes nothing) when the index is greater than the number of upvalues. For C functions, this function uses the empty string "" as a name for all upvalues.</returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static string lua_getupvalue(lua_State L, int funcindex, int n);
+
+        //LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n);
+        /// <summary>
+        ///     Sets the value of a closure's upvalue. Parameters funcindex and n are as in lua_getupvalue (see lua_getupvalue). It assigns the value at the top of the stack to the upvalue and returns its name. It also pops the value from the stack.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="funcindex"></param>
+        /// <param name="n"></param>
+        /// <returns>Returns NULL (and pops nothing) when the index is greater than the number of upvalues.</returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static string lua_setupvalue(lua_State L, int funcindex, int n);
+
+        //LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count);
+        /// <summary>
+        ///     Sets the debugging hook function.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="func">func is the hook function.</param>
+        /// <param name="mask">mask specifies on which events the hook will be called: it is formed by a bitwise or of the constants LUA_MASKCALL, LUA_MASKRET, LUA_MASKLINE, and LUA_MASKCOUNT.</param>
+        /// <param name="count">The count argument is only meaningful when the mask includes LUA_MASKCOUNT.</param>
+        /// <returns></returns>
+        /// <remarks>
+        ///     For each event, the hook is called as explained below:
+        ///     * The call hook: is called when the interpreter calls a function. The hook is called just after Lua enters the new function, before the function gets its arguments.
+        ///     * The return hook: is called when the interpreter returns from a function. The hook is called just before Lua leaves the function. You have no access to the values to be returned by the function.
+        ///     * The line hook: is called when the interpreter is about to start the execution of a new line of code, or when it jumps back in the code (even to the same line). (This event only happens while Lua is executing a Lua function.)
+        ///     * The count hook: is called after the interpreter executes every count instructions. (This event only happens while Lua is executing a Lua function.)
+        ///     A hook is disabled by setting mask to zero. 
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_sethook(lua_State L, lua_Hook func, int mask, int count);
+
+        //LUA_API lua_Hook lua_gethook (lua_State *L);
+        /// <summary>
+        ///     Returns the current hook function.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_Hook lua_gethook(lua_State L);
+
+        //LUA_API int lua_gethookmask (lua_State *L);
+        /// <summary>
+        ///     Returns the current hook mask.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_gethookmask(lua_State L);
+
+        //LUA_API int lua_gethookcount (lua_State *L);
+        /// <summary>
+        ///     Returns the current hook count.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int lua_gethookcount(lua_State L);
+
+        //struct lua_Debug {
+        //  int event;
+        //  const char *name;	/* (n) */
+        //  const char *namewhat;	/* (n) `global', `local', `field', `method' */
+        //  const char *what;	/* (S) `Lua', `C', `main', `tail' */
+        //  const char *source;	/* (S) */
+        //  int currentline;	/* (l) */
+        //  int nups;		/* (u) number of upvalues */
+        //  int linedefined;	/* (S) */
+        //  char short_src[LUA_IDSIZE]; /* (S) */
+        //  /* private part */
+        //  int i_ci;  /* active function */
+        //};
+        /// <summary>
+        ///     A structure used to carry different pieces of information about an active function. lua_getstack fills only the private part of this structure, for later use. To fill the other fields of lua_Debug with useful information, call lua_getinfo.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
+        public struct lua_Debug
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public int Event;
+            /// <summary>
+            ///     a reasonable name for the given function. Because functions in Lua are first-class values, they do not have a fixed name: some functions may be the value of multiple global variables, while others may be stored only in a table field. The lua_getinfo function checks how the function was called to find a suitable name. If it cannot find a name, then name is set to NULL.
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public string name;
+            /// <summary>
+            ///     explains the name field. The value of namewhat can be "global", "local", "method", "field", "upvalue", or "" (the empty string), according to how the function was called. (Lua uses the empty string when no other option seems to apply.)
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public string namewhat;
+            /// <summary>
+            /// the string "Lua" if the function is a Lua function, "C" if it is a C function, "main" if it is the main part of a chunk, and "tail" if it was a function that did a tail call. In the latter case, Lua has no other information about the function.
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public string what;
+            /// <summary>
+            /// If the function was defined in a string, then source is that string. If the function was defined in a file, then source starts with a '@' followed by the file name.
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public string source;
+            /// <summary>
+            /// the current line where the given function is executing. When no line information is available, currentline is set to -1.
+            /// </summary>
+            public int currentline;
+            /// <summary>
+            ///     the number of upvalues of the function.
+            /// </summary>
+            public int nups;
+            /// <summary>
+            /// the line number where the definition of the function starts.
+            /// </summary>
+            public int linedefined;
+            /// <summary>
+            /// a "printable" version of source, to be used in error messages.
+            /// </summary>
+            [MarshalAs(UnmanagedType.LPStr)]
+            public string short_src;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int i_ci;
+        };
+
+        #endregion Event Masks
+
+        #endregion Debug API
+
+        #endregion Public Functions
+
+        #endregion Lua.h
+
+        #region LuaLib.h
+
+        //#define LUA_FILEHANDLE		"FILE*"
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_FILEHANDLE = "FILE*";
+
+        //#define LUA_COLIBNAME	"coroutine"
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_COLIBNAME = "coroutine";
+
+        //LUALIB_API int (luaopen_base) (lua_State *L);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaopen_base(lua_State L);
+
+        //#define LUA_TABLIBNAME	"table"
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_TABLIBNAME = "table";
+
+        //LUALIB_API int (luaopen_table) (lua_State *L);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaopen_table(lua_State L);
+
+        //#define LUA_IOLIBNAME	"io"
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_IOLIBNAME = "io";
+
+        //LUALIB_API int (luaopen_io) (lua_State *L);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaopen_io(lua_State L);
+
+        //#define LUA_OSLIBNAME	"os"
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_OSLIBNAME = "os";
+
+        //LUALIB_API int (luaopen_os) (lua_State *L);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaopen_os(lua_State L);
+
+        //#define LUA_STRLIBNAME	"string"
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_STRLIBNAME = "string";
+
+        //LUALIB_API int (luaopen_string) (lua_State *L);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaopen_string(lua_State L);
+
+        //#define LUA_MATHLIBNAME	"math"
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_MATHLIBNAME = "math";
+
+        //LUALIB_API int (luaopen_math) (lua_State *L);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaopen_math(lua_State L);
+
+        //#define LUA_DBLIBNAME	"debug"
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_DBLIBNAME = "debug";
+
+        //LUALIB_API int (luaopen_debug) (lua_State *L);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaopen_debug(lua_State L);
+
+        //#define LUA_LOADLIBNAME	"package"
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_LOADLIBNAME = "package";
+
+        //LUALIB_API int (luaopen_package) (lua_State *L);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaopen_package(lua_State L);
+
+        //LUALIB_API void (luaL_openlibs) (lua_State *L); 
+        /// <summary>
+        /// Opens all standard Lua libraries into the given state.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_openlibs(lua_State L);
+
+        //#define lua_assert(x)	((void)0)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="x"></param>
+        /// <returns></returns>
+        public static int lua_asset(object x)
+        {
+            return 0;
+        }
+
+        #endregion LuaLib.h
+
+        #region LauxLib.h
+
+        //LUALIB_API int (luaL_getn) (lua_State *L, int t);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="t"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_getn(lua_State L, int t);
+
+        //LUALIB_API void (luaL_setn) (lua_State *L, int t, int n);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="t"></param>
+        /// <param name="n"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_setn(lua_State L, int t, int n);
+
+        //#define LUA_ERRFILE     (LUA_ERRERR+1)
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_ERRFILE = Lua.LUA_ERRERR + 1;
+
+        /// <summary>
+        /// Type for arrays of functions to be registered by luaL_register. name is the function name and func is a pointer to the function. Any array of luaL_Reg must end with an sentinel entry in which both name and func are NULL.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
+        public struct luaL_Reg
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public string name;
+            /// <summary>
+            /// 
+            /// </summary>
+            public Lua.lua_CFunction func;
+        }
+
+        //LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname, const luaL_Reg *l, int nup);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="libname"></param>
+        /// <param name="l"></param>
+        /// <param name="nup"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaI_openlib(lua_State L, string libname, ref luaL_Reg l, int nup);
+
+        //LUALIB_API void (luaL_register) (lua_State *L, const char *libname, const luaL_Reg *l);
+        /// <summary>
+        /// Opens a library.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="libname"></param>
+        /// <param name="l"></param>
+        /// <remarks>When called with libname equal to NULL, it simply registers all functions in the list l (see luaL_Reg) into the table on the top of the stack.
+        /// When called with a non-null libname, creates a new table t, sets it as the value of the global variable libname, sets it as the value of package.loaded[libname], and registers on it all functions in the list l. If there is a table in package.loaded[libname] or in variable libname, reuses this table instead of creating a new one.
+        /// In any case the function leaves the table on the top of the stack. </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_register(lua_State L, string libname, ref luaL_Reg l);
+
+        //LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
+        /// <summary>
+        /// Pushes onto the stack the field e from the metatable of the object at index obj. If the object does not have a metatable, or if the metatable does not have this field, returns 0 and pushes nothing.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="obj"></param>
+        /// <param name="e"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_getmetafield(lua_State L, int obj, string e);
+
+        //LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
+        /// <summary>
+        /// Calls a metamethod.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="obj"></param>
+        /// <param name="e"></param>
+        /// <returns></returns>
+        /// <remarks>
+        /// If the object at index obj has a metatable and this metatable has a field e, this function calls this field and passes the object as its only argument. In this case this function returns 1 and pushes onto the stack the value returned by the call. If there is no metatable or no metamethod, this function returns 0 (without pushing any value on the stack).
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_callmeta(lua_State L, int obj, string e);
+
+        //LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname);
+        /// <summary>
+        /// Generates an error with a message.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="narg"></param>
+        /// <param name="tname"></param>
+        /// <returns></returns>
+        /// <remarks>Generates an error with a message like:
+        /// [location]: bad argument [narg] to [function] ([tname] expected, got [realt])
+        /// where [location] is produced by luaL_where, [function] is the name of the current function, and [realt] is the type name of the actual argument. </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_typerror(lua_State L, int narg, string tname);
+
+        //LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);
+        /// <summary>
+        /// Raises an error with the following message, where func is retrieved from the call stack:
+        /// <code>bad argument #[numarg] to [func] ([extramsg])</code>
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="numarg"></param>
+        /// <param name="extramsg"></param>
+        /// <returns>This function never returns, but it is an idiom to use it in C functions as return luaL_argerror(args).</returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_argerror(lua_State L, int numarg, string extramsg);
+
+        //LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg, size_t *l);
+        /// <summary>
+        /// Checks whether the function argument narg is a string and returns this string; if l is not NULL fills *l with the string's length.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="numArg"></param>
+        /// <param name="l"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static string luaL_checklstring(lua_State L, int numArg, ref size_t l);
+
+        //LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg, const char *def, size_t *l);
+        /// <summary>
+        /// If the function argument narg is a string, returns this string. If this argument is absent or is nil, returns d. Otherwise, raises an error. If l is not NULL, fills the position *l with the results's length. 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="numArg"></param>
+        /// <param name="def"></param>
+        /// <param name="l"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static string luaL_optlstring(lua_State L, int numArg, string def, ref size_t l);
+
+        //LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);
+        /// <summary>
+        /// Checks whether the function argument narg is a number and returns this number.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="numArg"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_Number luaL_checknumber(lua_State L, int numArg);
+
+        //LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);
+        /// <summary>
+        /// If the function argument narg is a number, returns this number. If this argument is absent or is nil, returns d. Otherwise, raises an error.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="nArg"></param>
+        /// <param name="def"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_Number luaL_optnumber(lua_State L, int nArg, lua_Number def);
+
+        //LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);
+        /// <summary>
+        /// Checks whether the function argument narg is a number and returns this number cast to a lua_Integer.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="numArg"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_Integer luaL_checkinteger(lua_State L, int numArg);
+
+        //LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, lua_Integer def);
+        /// <summary>
+        /// If the function argument narg is a number, returns this number cast to a lua_Integer. If this argument is absent or is nil, returns d. Otherwise, raises an error.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="nArg"></param>
+        /// <param name="def"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_Integer luaL_optinteger(lua_State L, int nArg, lua_Integer def);
+
+        //LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
+        /// <summary>
+        /// Grows the stack size to top + sz elements, raising an error if the stack cannot grow to that size. msg is an additional text to go into the error message.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="sz"></param>
+        /// <param name="msg"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_checkstack(lua_State L, int sz, string msg);
+
+        //LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);
+        /// <summary>
+        /// Checks whether the function argument narg has type t.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="narg"></param>
+        /// <param name="t"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_checktype(lua_State L, int narg, int t);
+
+        //LUALIB_API void (luaL_checkany) (lua_State *L, int narg);
+        /// <summary>
+        /// Checks whether the function has an argument of any type (including nil) at position narg.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="narg"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_checkany(lua_State L, int narg);
+
+        //LUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);
+        /// <summary>
+        /// If the registry already has the key tname, returns 0. Otherwise, creates a new table to be used as a metatable for userdata, adds it to the registry with key tname, and returns 1.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="tname"></param>
+        /// <returns></returns>
+        /// <remarks>In both cases pushes onto the stack the final value associated with tname in the registry.</remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_newmetatable(lua_State L, string tname);
+
+        //LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
+        /// <summary>
+        /// Checks whether the function argument narg is a userdata of the type tname (see luaL_newmetatable).
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="ud"></param>
+        /// <param name="tname"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static IntPtr luaL_checkudata(lua_State L, int ud, string tname);
+
+        //LUALIB_API void (luaL_where) (lua_State *L, int lvl);
+        /// <summary>
+        /// Pushes onto the stack a string identifying the current position of the control at level lvl in the call stack. Typically this string has the format {chunkname}:{currentline}:. Level 0 is the running function, level 1 is the function that called the running function, etc.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="lvl"></param>
+        /// <remarks>This function is used to build a prefix for error messages.</remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_where(lua_State L, int lvl);
+
+        //LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
+        // TODO: Implement parameter list for luaL_error
+
+        //LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, const char *const lst[]);
+        // TODO: Check if string array lst works correctly
+        /// <summary>
+        /// Checks whether the function argument narg is a string and searches for this string in the array lst (which must be NULL-terminated). Returns the index in the array where the string was found. Raises an error if the argument is not a string or if the string cannot be found.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="narg"></param>
+        /// <param name="def"></param>
+        /// <param name="lst"></param>
+        /// <returns></returns>
+        /// <remarks>
+        /// If def is not NULL, the function uses def as a default value when there is no argument narg or if this argument is nil.
+        /// This is a useful function for mapping strings to C enums. (The usual convention in Lua libraries is to use strings instead of numbers to select options.) 
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_checkoption(lua_State L, int narg, string def, string[] lst);
+
+        //LUALIB_API int (luaL_ref) (lua_State *L, int t);
+        /// <summary>
+        /// Creates and returns a reference, in the table at index t, for the object at the top of the stack (and pops the object).
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="t"></param>
+        /// <returns></returns>
+        /// <remarks>A reference is a unique integer key. As long as you do not manually add integer keys into table t, luaL_ref ensures the uniqueness of the key it returns. You can retrieve an object referred by reference r by calling lua_rawgeti(L, t, r). Function luaL_unref frees a reference and its associated object.
+        /// If the object at the top of the stack is nil, luaL_ref returns the constant LUA_REFNIL. The constant LUA_NOREF is guaranteed to be different from any reference returned by luaL_ref.
+        /// </remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_ref(lua_State L, int t);
+
+        //LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
+        /// <summary>
+        /// Releases reference ref from the table at index t (see luaL_ref). The entry is removed from the table, so that the referred object can be collected. The reference ref is also freed to be used again.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="t"></param>
+        /// <param name="rf">If rf is LUA_NOREF or LUA_REFNIL, luaL_unref does nothing.</param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_unref(lua_State L, int t, int rf);
+
+        //LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);
+        /// <summary>
+        /// Loads a file as a Lua chunk. This function uses lua_load to load the chunk in the file named filename. If filename is NULL, then it loads from the standard input. The first line in the file is ignored if it starts with a #.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="filename"></param>
+        /// <returns></returns>
+        /// <remarks>This function returns the same results as lua_load, but it has an extra error code LUA_ERRFILE if it cannot open/read the file. As lua_load, this function only loads the chunk; it does not run it.</remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_loadfile(lua_State L, string filename);
+
+        //LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, const char *name);
+        /// <summary>
+        /// Loads a buffer as a Lua chunk. This function uses lua_load to load the chunk in the buffer pointed to by buff with size sz.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="buff"></param>
+        /// <param name="sz"></param>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        /// <remarks>This function returns the same results as lua_load. name is the chunk name, used for debug information and error messages.</remarks>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_loadbuffer(lua_State L, string buff, size_t sz, string name);
+
+        //LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
+        /// <summary>
+        /// Loads a string as a Lua chunk. This function uses lua_load to load the chunk in the zero-terminated string s.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="s"></param>
+        /// <returns></returns>
+        /// <remarks>This function returns the same results as lua_load. Also as lua_load, this function only loads the chunk; it does not run it.</remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int luaL_loadstring(lua_State L, string s);
+
+        //LUALIB_API lua_State *(luaL_newstate) (void);
+        /// <summary>
+        /// Creates a new Lua state, calling lua_newstate with an allocation function based on the standard C realloc function and setting a panic function (see lua_atpanic) that prints an error message to the standard error output in case of fatal errors.
+        /// </summary>
+        /// <returns>Returns the new state, or NULL if there is a memory allocation error.</returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static lua_State luaL_newstate();
+
+        //LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, const char *r);
+        /// <summary>
+        /// Creates a copy of string s by replacing any occurrence of the string p with the string r. Pushes the resulting string on the stack and returns it.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="s"></param>
+        /// <param name="p"></param>
+        /// <param name="r"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static string luaL_gsub(lua_State L, string s, string p, string r);
+
+        //LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, const char *fname, int szhint);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="idx"></param>
+        /// <param name="fname"></param>
+        /// <param name="szhint"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static string luaL_findtable(lua_State L, int idx, string fname, int szhint);
+
+        #region Some Useful Macros
+
+        //#define luaL_argcheck(L, cond,numarg,extramsg) ((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))
+        /// <summary>
+        /// Checks whether cond is true. If not, raises an error with the following message, where func is retrieved from the call stack:
+        /// <code>bad argument #[numarg] to [func] ([extramsg])</code>
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="cond"></param>
+        /// <param name="numarg"></param>
+        /// <param name="extramsg"></param>
+        /// <returns></returns>
+        public static bool luaL_argcheck(lua_State L, int cond, int numarg, string extramsg)
+        {
+            return cond > 0 || luaL_argerror(L, numarg, extramsg) > 0;
+        }
+
+        //#define luaL_checkstring(L,n)	(luaL_checklstring(L, (n), NULL))
+        /// <summary>
+        /// Checks whether the function argument narg is a string and returns this string.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static string luaL_checkstring(lua_State L, int n)
+        {
+            uint nullValue = 0;
+            return luaL_checklstring(L, n, ref nullValue);
+        }
+
+        //#define luaL_optstring(L,n,d)	(luaL_optlstring(L, (n), (d), NULL))
+        /// <summary>
+        /// If the function argument narg is a string, returns this string. If this argument is absent or is nil, returns d. Otherwise, raises an error.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <param name="d"></param>
+        /// <returns></returns>
+        public static string luaL_optstring(lua_State L, int n, string d)
+        {
+            uint nullValue = 0;
+            return luaL_optlstring(L, n, d, ref nullValue);
+        }
+
+        //#define luaL_checkint(L,n)	((int)luaL_checkinteger(L, (n)))
+        /// <summary>
+        /// Checks whether the function argument narg is a number and returns this number cast to an int.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static int luaL_checkint(lua_State L, int n)
+        {
+            return luaL_checkinteger(L, n);
+        }
+
+        //#define luaL_optint(L,n,d)	((int)luaL_optinteger(L, (n), (d)))
+        /// <summary>
+        /// If the function argument narg is a number, returns this number cast to an int. 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <param name="d"></param>
+        /// <returns>If this argument is absent or is nil, returns d. Otherwise, raises an error.</returns>
+        public static int luaL_optint(lua_State L, int n, int d)
+        {
+            return luaL_optinteger(L, n, d);
+        }
+
+        //#define luaL_checklong(L,n)	((long)luaL_checkinteger(L, (n)))
+        /// <summary>
+        /// Checks whether the function argument narg is a number and returns this number cast to a long.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        public static int luaL_checklong(lua_State L, int n)
+        {
+            return luaL_checkinteger(L, n);
+        }
+
+        //#define luaL_optlong(L,n,d)	((long)luaL_optinteger(L, (n), (d)))
+        /// <summary>
+        /// If the function argument narg is a number, returns this number cast to a long. If this argument is absent or is nil, returns d. Otherwise, raises an error.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        /// <param name="d"></param>
+        /// <returns></returns>
+        public static int luaL_optlong(lua_State L, int n, int d)
+        {
+            return luaL_optinteger(L, n, d);
+        }
+
+        //#define luaL_typename(L,i)	lua_typename(L, lua_type(L,(i)))
+        /// <summary>
+        /// Returns the name of the type of the value at index idx.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="i"></param>
+        /// <returns></returns>
+        public static string luaL_typename(lua_State L, int i)
+        {
+            return lua_typename(L, Lua.lua_type(L, i));
+        }
+
+        //#define luaL_dofile(L, fn)	(luaL_loadfile(L, fn) || lua_pcall(L, 0, 0, 0))
+        /// <summary>
+        /// Loads and runs the given file.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="fn"></param>
+        /// <returns>It returns 0 if there are no errors or 1 in case of errors.</returns>
+        public static int luaL_dofile(lua_State L, string fn)
+        {
+            return luaL_loadfile(L, fn) | lua_pcall(L, LUA_MULTRET, 0, 0);
+        }
+
+        //#define luaL_dostring(L, s)	(luaL_loadstring(L, s) || lua_pcall(L, 0, 0, 0))
+        /// <summary>
+        /// Loads and runs the given string.
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="s"></param>
+        /// <returns>It returns 0 if there are no errors or 1 in case of errors.</returns>
+        public static int luaL_dostring(lua_State L, string s)
+        {
+            return luaL_loadstring(L, s) | lua_pcall(L, LUA_MULTRET, 0, 0);
+        }
+
+        //#define luaL_getmetatable(L,n)	(lua_getfield(L, LUA_REGISTRYINDEX, (n)))
+        /// <summary>
+        /// Pushes onto the stack the metatable associated with name tname in the registry (see luaL_newmetatable).
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="n"></param>
+        public static void luaL_getmetatable(lua_State L, string n)
+        {
+            lua_getfield(L, LUA_REGISTRYINDEX, n);
+        }
+
+        //#define luaL_opt(L,f,n,d)	(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="f"></param>
+        /// <param name="n"></param>
+        /// <param name="d"></param>
+        public static void luaL_opt(lua_State L, int f, int n, int d)
+        {
+            // TODO: Implement luaL_opt
+            throw new NotImplementedException("The function you have called, luaL_opt, is not yet implemented.");
+        }
+
+        #endregion Some Useful Macros
+
+        #region Generic Buffer Manipulation
+
+        /// <summary>
+        /// Type for a string buffer.
+        /// </summary>
+        /// <remarks>
+        /// A string buffer allows C code to build Lua strings piecemeal. Its pattern of use is as follows:
+        ///     * First you declare a variable b of type luaL_Buffer.
+        ///     * Then you initialize it with a call luaL_buffinit(L, &b).
+        ///     * Then you add string pieces to the buffer calling any of the luaL_add* functions.
+        ///     * You finish by calling luaL_pushresult(&b). This call leaves the final string on the top of the stack.
+        /// During its normal operation, a string buffer uses a variable number of stack slots. So, while using a buffer, you cannot assume that you know where the top of the stack is. You can use the stack between successive calls to buffer operations as long as that use is balanced; that is, when you call a buffer operation, the stack is at the same level it was immediately after the previous buffer operation. (The only exception to this rule is luaL_addvalue.) After calling luaL_pushr [...]
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
+        public struct luaL_Buffer
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public string p;			/* current position in buffer */
+            /// <summary>
+            /// 
+            /// </summary>
+            public int lvl;  /* number of strings in the stack (level) */
+            /// <summary>
+            /// 
+            /// </summary>
+            public lua_State L;
+            /// <summary>
+            /// 
+            /// </summary>
+            public string buffer; // TODO: char buffer[BUFFERSIZE] ;
+        }
+
+        //#define luaL_addchar(B,c) \
+        // ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \
+        // (*(B)->p++ = (char)(c)))
+        /// <summary>
+        ///     Adds the character c to the buffer B (see luaL_Buffer).
+        /// </summary>
+        /// <param name="B"></param>
+        /// <param name="c"></param>
+        public static void luaL_addchar(ref luaL_Buffer B, char c)
+        {
+            // TODO: Implement luaL_addchar
+            throw new NotImplementedException("The function you have called, luaL_addchar, is not yet implemented.");
+        }
+
+        #region Compatibility Only
+
+        //#define luaL_putchar(B,c)	luaL_addchar(B,c)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="B"></param>
+        /// <param name="c"></param>
+        public static void luaL_putchar(ref luaL_Buffer B, char c)
+        {
+            luaL_addchar(ref B, c);
+        }
+
+        //#define luaL_addsize(B,n)	((B)->p += (n))
+        /// <summary>
+        ///     Adds a string of length n previously copied to the buffer area (see luaL_prepbuffer) to the buffer B (see luaL_Buffer).
+        /// </summary>
+        /// <param name="B"></param>
+        /// <param name="n"></param>
+        public static void luaL_addsize(luaL_Buffer B, int n)
+        {
+            // TODO: Implement luaL_addsize
+            throw new NotImplementedException("The function you have called, luaL_addsize, is not yet implemented.");
+        }
+
+        #endregion Compatibility Only
+
+        //LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);
+        /// <summary>
+        /// Initializes a buffer B. This function does not allocate any space; the buffer must be declared as a variable (see luaL_Buffer).
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="B"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_buffinit(lua_State L, ref luaL_Buffer B);
+
+        //LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B);
+        /// <summary>
+        /// Returns an address to a space of size LUAL_BUFFERSIZE where you can copy a string to be added to buffer B (see luaL_Buffer). After copying the string into this space you must call luaL_addsize with the size of the string to actually add it to the buffer.
+        /// </summary>
+        /// <param name="B"></param>
+        /// <returns></returns>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static string luaL_prepbuffer(ref luaL_Buffer B);
+
+        //LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
+        /// <summary>
+        /// Adds the string pointed to by s with length l to the buffer B (see luaL_Buffer). The string may contain embedded zeros.
+        /// </summary>
+        /// <param name="B"></param>
+        /// <param name="s"></param>
+        /// <param name="l"></param>
+        [CLSCompliant(false)]
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_addlstring(ref luaL_Buffer B, string s, size_t l);
+
+        //LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);
+        /// <summary>
+        ///     Adds the zero-terminated string pointed to by s to the buffer B (see luaL_Buffer). The string may not contain embedded zeros.
+        /// </summary>
+        /// <param name="B"></param>
+        /// <param name="s"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_addstring(ref luaL_Buffer B, string s);
+
+        //LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
+        /// <summary>
+        /// Adds the value at the top of the stack to the buffer B (see luaL_Buffer). Pops the value.
+        /// </summary>
+        /// <param name="B"></param>
+        /// <remarks>This is the only function on string buffers that can (and must) be called with an extra element on the stack, which is the value to be added to the buffer.</remarks>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_addvalue(ref luaL_Buffer B);
+
+        //LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
+        /// <summary>
+        /// Finishes the use of buffer B leaving the final string on the top of the stack.
+        /// </summary>
+        /// <param name="B"></param>
+        [DllImport(LUA_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void luaL_pushresult(ref luaL_Buffer B);
+
+        #endregion Generic Buffer Manipulation
+
+        #region Compatibility With Ref System
+
+        //#define LUA_NOREF       (-2)
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_NOREF = -2;
+
+        //#define LUA_REFNIL      (-1)
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_RENIL = -1;
+
+        //#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \
+        // (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0))
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="lockit"></param>
+        /// <returns></returns>
+        public static int lua_ref(lua_State L, bool lockit)
+        {
+            if (lockit)
+                return luaL_ref(L, LUA_REGISTRYINDEX);
+            lua_pushstring(L, "unlocked references are obsolete");
+            lua_error(L);
+            return 0;
+        }
+
+        //#define lua_unref(L,ref)        luaL_unref(L, LUA_REGISTRYINDEX, (ref))
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="reference"></param>
+        public static void lua_unref(lua_State L, int reference)
+        {
+            luaL_unref(L, LUA_REGISTRYINDEX, reference);
+        }
+
+        //#define lua_getref(L,ref)       lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="reference"></param>
+        public static void lua_getref(lua_State L, int reference)
+        {
+            lua_rawgeti(L, LUA_REGISTRYINDEX, reference);
+        }
+
+        #endregion Compatibility With Ref System
+
+        #endregion LauxLib.h
+
+        #region LuaConf.h
+
+        //#define LUA_IDSIZE	60
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_IDSIZE = 60;
+
+        //#define LUA_PROMPT		"> "
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string UA_PROMPT = "> ";
+
+        //#define LUA_PROMPT2		">> "
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_PROMT2 = ">> ";
+
+        //#define LUA_PROGNAME		"lua"
+        /// <summary>
+        /// 
+        /// </summary>
+        public const string LUA_PROGNAME = "lua";
+
+        //#define LUA_MAXINPUT	512
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUA_MAXINPUT = 512;
+
+        //#define LUAI_GCPAUSE	200  /* 200% (wait memory to double before next GC) */
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUAI_GCPAUSE = 200;
+
+        //#define LUAI_GCMUL	200
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUAI_GCMUL = 200;
+
+        //#define LUA_COMPAT_LSTR		1
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte LUA_COMPAT_LSTR = 1;
+
+        //#define LUAI_MAXCALLS	20000
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUAI_MAXCALLS = 20000;
+
+        //#define LUAI_MAXCSTACK	2048
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUAI_MAXCSTACK = 2048;
+
+        //#define LUAI_MAXCCALLS		200
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUAI_MAXCCALLS = 200;
+
+        //#define LUAI_MAXVARS		200
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUAI_MAXVARS = 200;
+
+        //#define LUAI_MAXUPVALUES	60
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUAI_MAXUPVALUES = 60;
+
+        //#define LUAL_BUFFERSIZE		BUFSIZ
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int LUAL_BUFFERSIZE = 1028;
+
+        //#define LUA_MAXCAPTURES		32
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte LUA_MAXCAPTURES = 32;
+
+        //#define LUAI_EXTRASPACE		0
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte LUAI_EXTRASPACE = 0;
+
+        #endregion LuaConf.h
+    }
+}
diff --git a/src/Tao.Lua/Makefile.am b/src/Tao.Lua/Makefile.am
new file mode 100644
index 0000000..1f0cef0
--- /dev/null
+++ b/src/Tao.Lua/Makefile.am
@@ -0,0 +1,18 @@
+
+ASSEMBLY = Tao.Lua
+SHORTNAME = tao-lua
+VERSION = @TAOLUA_VERSION@
+MAJOR = @TAOLUA_MAJOR@
+
+PACKAGES =
+BINARY_LIBS =
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        Lua.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.Lua/Makefile.in b/src/Tao.Lua/Makefile.in
new file mode 100644
index 0000000..6b9e4fa
--- /dev/null
+++ b/src/Tao.Lua/Makefile.in
@@ -0,0 +1,414 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-lua.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.Lua
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-lua.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOLUA_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.Lua
+SHORTNAME = tao-lua
+MAJOR = @TAOLUA_MAJOR@
+PACKAGES = 
+BINARY_LIBS = 
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        Lua.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.Lua/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.Lua/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-lua.pc: $(top_builddir)/config.status $(srcdir)/tao-lua.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.Lua/NEWS b/src/Tao.Lua/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Lua/Properties/AssemblyInfo.cs b/src/Tao.Lua/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..6f0a802
--- /dev/null
+++ b/src/Tao.Lua/Properties/AssemblyInfo.cs
@@ -0,0 +1,57 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2007 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+#if DEBUG
+[assembly: AssemblyConfiguration("Debug")]
+#else
+[assembly: AssemblyConfiguration("Retail")]
+#endif
+[assembly: AssemblyCopyright("Copyright ©2003-2007 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.Lua")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework Lua Binding For .NET")]
+[assembly: AssemblyFileVersion("5.1.3.0")]
+[assembly: AssemblyInformationalVersion("5.1.3.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.Lua.dll")]
+[assembly: AssemblyTitle("Tao Framework Lua Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("5.1.3.0")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.Lua/README b/src/Tao.Lua/README
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Lua/Tao.Lua.csproj b/src/Tao.Lua/Tao.Lua.csproj
new file mode 100644
index 0000000..13b4207
--- /dev/null
+++ b/src/Tao.Lua/Tao.Lua.csproj
@@ -0,0 +1,98 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{11D88031-4650-43D5-B626-4C3E9A276923}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.Lua</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.Lua.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.Lua</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Lua.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Lua.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Lua.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.Lua.dll.config" />
+    <None Include="Tao.Lua.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.Lua/Tao.Lua.dll.config b/src/Tao.Lua/Tao.Lua.dll.config
new file mode 100644
index 0000000..d147283
--- /dev/null
+++ b/src/Tao.Lua/Tao.Lua.dll.config
@@ -0,0 +1,5 @@
+<configuration>
+    <dllmap dll="lua5.1.dll" os="windows" target="lua5.1.dll" />
+    <dllmap dll="lua5.1.dll" os="osx" target="liblua5.1.so.0" />
+    <dllmap dll="lua5.1.dll" os="!windows,osx" target="liblua5.1.so.0" />
+</configuration>
diff --git a/src/Tao.Lua/Tao.Lua.snk b/src/Tao.Lua/Tao.Lua.snk
new file mode 100644
index 0000000..6446c6a
Binary files /dev/null and b/src/Tao.Lua/Tao.Lua.snk differ
diff --git a/src/Tao.Lua/tao-lua.pc.in b/src/Tao.Lua/tao-lua.pc.in
new file mode 100644
index 0000000..3c9ad9a
--- /dev/null
+++ b/src/Tao.Lua/tao-lua.pc.in
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.Lua
+Description: Lua portion of the Tao framework
+Version: @TAOLUA_VERSION@
+Requires:
+Libs: -r:${libdir}/mono/tao-lua- at TAOLUA_MAJOR@/Tao.Lua.dll
diff --git a/src/Tao.Ode/AUTHORS b/src/Tao.Ode/AUTHORS
new file mode 100644
index 0000000..9739a8a
--- /dev/null
+++ b/src/Tao.Ode/AUTHORS
@@ -0,0 +1,9 @@
+David Hudson (jendave at yahoo.com) - Updated Tao.Ode to 0.8
+
+Terry L. Triplett - Current maintainer
+mail: Terry L. Triplett <c0d3g33k at users.sourceforge.net>
+
+---------------------------------------------------------------------
+Randy Ridge - Original author of Tao Ode bindings
+cody (Sebastian Kotulla) - submitter of new expanded ODE bindings to the TAO project
+
diff --git a/src/Tao.Ode/COPYING b/src/Tao.Ode/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.Ode/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.Ode/ChangeLog b/src/Tao.Ode/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Ode/INSTALL b/src/Tao.Ode/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Ode/Makefile.am b/src/Tao.Ode/Makefile.am
new file mode 100644
index 0000000..5247cef
--- /dev/null
+++ b/src/Tao.Ode/Makefile.am
@@ -0,0 +1,18 @@
+
+ASSEMBLY = Tao.Ode
+SHORTNAME = tao-ode
+VERSION = @TAOODE_VERSION@
+MAJOR = @TAOODE_MAJOR@
+
+PACKAGES =
+BINARY_LIBS =
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        Ode.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.Ode/Makefile.in b/src/Tao.Ode/Makefile.in
new file mode 100644
index 0000000..c233c44
--- /dev/null
+++ b/src/Tao.Ode/Makefile.in
@@ -0,0 +1,414 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-ode.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS TODO
+subdir = src/Tao.Ode
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-ode.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOODE_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.Ode
+SHORTNAME = tao-ode
+MAJOR = @TAOODE_MAJOR@
+PACKAGES = 
+BINARY_LIBS = 
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        Ode.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.Ode/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.Ode/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-ode.pc: $(top_builddir)/config.status $(srcdir)/tao-ode.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.Ode/NEWS b/src/Tao.Ode/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Ode/Ode.cs b/src/Tao.Ode/Ode.cs
new file mode 100644
index 0000000..8f405ac
--- /dev/null
+++ b/src/Tao.Ode/Ode.cs
@@ -0,0 +1,7442 @@
+#region License
+/*
+ MIT License
+ Copyright 2003-2006 Tao Framework Team
+ http://www.taoframework.com
+ All rights reserved.
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+ 
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ */
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.Ode
+{
+    #region Aliases
+    // TODO: Make dReal precision controllable at compile time - the ode lib can be compiled with either single or double precision
+    using dReal = System.Single;
+    using dWorldID = System.IntPtr;
+    using dBodyID = System.IntPtr;
+    using dJointID = System.IntPtr;
+    using dJointGroupID = System.IntPtr;
+    using dGeomID = System.IntPtr;
+    using dSpaceID = System.IntPtr;
+    using dTriMeshDataID = System.IntPtr;
+    using dHeightfieldDataID = System.IntPtr;
+
+    #endregion Aliases
+
+    #region Class Documentation
+    /// <summary>
+    ///     Open Dynamics Engine (ODE - http://ode.org) bindings for .NET
+    /// 	ODE Version: 0.9
+    /// </summary>
+    #endregion Class Documentation
+    public static class Ode
+    {
+        #region Private Constants
+        #region string ODE_NATIVE_LIBRARY
+        /// <summary>
+        /// Specifies the ODE native library used in the bindings
+        /// </summary>
+        /// <remarks>
+        /// The Windows dll is specified here universally - note that
+        /// under Mono the non-windows native library can be mapped using
+        /// the ".config" file mechanism.  Kudos to the Mono team for this
+        /// simple yet elegant solution.
+        /// </remarks>
+        private const string ODE_NATIVE_LIBRARY = "ode.dll";
+        #endregion string ODE_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention used for the binding.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Cdecl" />
+        ///     for the bindings.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+
+        #region Public Constants
+        #region Error Numbers
+        /// <summary>
+        ///
+        /// </summary>
+        public enum dError : int
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            d_ERR_UNKNOWN = 0,		/* unknown error */
+            /// <summary>
+            ///
+            /// </summary>
+            d_ERR_IASSERT = 1,		/* internal assertion failed */
+            /// <summary>
+            ///
+            /// </summary>
+            d_ERR_UASSERT = 2,		/* user assertion failed */
+            /// <summary>
+            ///
+            /// </summary>
+            d_ERR_LCP = 3				/* user assertion failed */
+        };
+        #endregion Error Numbers
+
+        /// <summary>
+        /// Infinity.
+        ///
+        /// The maximum value of the current data type for dReal.
+        ///
+        /// </summary>
+        /// <remarks>
+        /// dReal can be System.Single or System.Double, based on the
+        /// multiple precision levels possible with the ODE library.
+        /// </remarks>
+        public const dReal dInfinity = dReal.MaxValue;
+
+        #region Joint Type Numbers
+        /// <summary>
+        ///
+        /// </summary>
+        public enum dJointTypes : int
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeNone = 0,		/* or "unknown" */
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeBall = 1,
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeHinge = 2,
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeSlider = 3,
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeContact = 4,
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeUniversal = 5,
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeHinge2 = 6,
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeFixed = 7,
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeNull = 8,
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeAMotor = 9,
+            /// <summary>
+            ///
+            /// </summary>
+            dJointTypeLMotor = 10
+        }
+        #endregion Joint Type Numbers
+
+        #region Joint Parameter Names
+        /// <summary>
+        /// Definition of Joint limit and motor parameter names
+        /// If a particular parameter is not implemented by a given joint, setting it will have no effect.
+        ///
+        /// These parameter names can be optionally followed by a digit (2 or 3) to indicate the second or third set of parameters, e.g. for the second axis in a hinge-2 joint, or the third axis in an AMotor joint. A constant dParamGroup is also defined such that: dParamXi = dParamX + dParamGroup * (i-1)
+        /// </summary>
+        /// <remarks>
+        /// Implemented via a macro in Ode's common.h
+        /// Translated into actual constants here following inspection of common.h
+        /// A change in the Ode macro could require these values to be updated
+        /// </remarks>
+        public enum dJointParams : int
+        {
+
+            #region Parameters for first axis
+            /// <summary>
+            /// Low stop angle or position. Setting this to -dInfinity (the default value) turns off the low stop. For rotational joints, this stop must be greater than - pi to be effective.
+            /// </summary>
+            dParamLoStop = 0,
+
+            /// <summary>
+            /// High stop angle or position. Setting this to dInfinity (the default value) turns off the high stop. For rotational joints, this stop must be less than pi to be effective. If the high stop is less than the low stop then both stops will be ineffective.
+            /// </summary>
+            dParamHiStop = 1,
+
+            /// <summary>
+            /// Desired motor velocity (this will be an angular or linear velocity).
+            /// </summary>
+            dParamVel = 2,
+
+            /// <summary>
+            /// The maximum force or torque that the motor will use to achieve the desired velocity. This must always be greater than or equal to zero. Setting this to zero (the default value) turns off the motor.
+            /// </summary>
+            dParamFMax = 3,
+
+            /// <summary>
+            /// The current joint stop/motor implementation has a small problem: when the joint is at one stop and the motor is set to move it away from the stop, too much force may be applied for one time step, causing a ``jumping'' motion. This fudge factor is used to scale this excess force. It should have a value between zero and one (the default value). If the jumping motion is too visible in a joint, the value can be reduced. Making this value too small can prevent the motor from b [...]
+            /// </summary>
+            dParamFudgeFactor = 4,
+
+            /// <summary>
+            /// The bouncyness of the stops. This is a restitution parameter in the range 0..1. 0 means the stops are not bouncy at all, 1 means maximum bouncyness.
+            /// </summary>
+            dParamBounce = 5,
+
+            /// <summary>
+            /// The constraint force mixing (CFM) value used when not at a stop.
+            /// </summary>
+            dParamCFM = 6,
+
+            /// <summary>
+            /// The error reduction parameter (ERP) used by the stops.
+            /// </summary>
+            dParamStopERP = 7,
+
+            /// <summary>
+            /// The constraint force mixing (CFM) value used by the stops. Together with the ERP value this can be used to get spongy or soft stops. Note that this is intended for unpowered joints, it does not really work as expected when a powered joint reaches its limit.
+            /// </summary>
+            dParamStopCFM = 8,
+
+            /// <summary>
+            /// Suspension error reduction parameter (ERP). Currently this is only implemented on the hinge-2 joint.
+            /// </summary>
+            dParamSuspensionERP = 9,
+
+            /// <summary>
+            /// Suspension constraint force mixing (CFM) value. Currently this is only implemented on the hinge-2 joint.
+            /// </summary>
+            dParamSuspensionCFM = 10,
+            #endregion Parameters for first axis
+
+            #region Parameters for second axis
+            /// <summary>
+            ///
+            /// </summary>
+            dParamLoStop2 = 0x100 + 0,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamHiStop2 = 0x100 + 1,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamVel2 = 0x100 + 2,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamFMax2 = 0x100 + 3,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamFudgeFactor2 = 0x100 + 4,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamBounce2 = 0x100 + 5,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamCFM2 = 0x100 + 6,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamStopERP2 = 0x100 + 7,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamStopCFM2 = 0x100 + 8,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamSuspensionERP2 = 0x100 + 9,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamSuspensionCFM2 = 0x100 + 10,
+            #endregion Parameters for second axis
+
+            #region Parameters for third axis
+            /// <summary>
+            ///
+            /// </summary>
+            dParamLoStop3 = 0x200 + 0,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamHiStop3 = 0x200 + 1,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamVel3 = 0x200 + 2,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamFMax3 = 0x200 + 3,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamFudgeFactor3 = 0x200 + 4,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamBounce3 = 0x200 + 5,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamCFM3 = 0x200 + 6,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamStopERP3 = 0x200 + 7,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamStopCFM3 = 0x200 + 8,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamSuspensionERP3 = 0x200 + 9,
+            /// <summary>
+            ///
+            /// </summary>
+            dParamSuspensionCFM3 = 0x200 + 10,
+            #endregion Parameters for third axis
+        }
+        #endregion Joint Parameter Names
+
+        #region Angular Motor Mode Numbers
+        /// <summary>
+        ///
+        /// </summary>
+        public enum dAMotorMode : int
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            dAMotorUser = 0,
+            /// <summary>
+            ///
+            /// </summary>
+            dAMotorEuler = 1
+        }
+        #endregion Angular Motor Mode Numbers
+
+        #region Class Numbers
+        /// <summary>the maximum number of user classes that are supported</summary>
+        public const int dMaxUserClasses = 4;
+
+        /// <summary>
+        /// class numbers - each geometry object needs a unique number
+        /// </summary>
+        public enum dClassNumbers : int
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            dSphereClass = 0,
+            /// <summary>
+            ///
+            /// </summary>
+            dBoxClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dCapsuleClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dCylinderClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dPlaneClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dRayClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dConvexClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dGeomTransformClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dTriMeshClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dFirstSpaceClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dSimpleSpaceClass = dFirstSpaceClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dHashSpaceClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dQuadTreeSpaceClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dLastSpaceClass = dQuadTreeSpaceClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dFirstUserClass,
+            /// <summary>
+            ///
+            /// </summary>
+            dLastUserClass = dFirstUserClass + dMaxUserClasses - 1,
+            /// <summary>
+            ///
+            /// </summary>
+            dGeomNumClasses = dLastUserClass + 1
+        }
+        #endregion Class Numbers
+
+        #region Body Flags
+        /// <summary>
+        /// some body flags
+        /// ODE source location:  objects.h Ln 37
+        /// </summary>
+        [FlagsAttribute]
+        public enum dBodyFlags : int
+        {
+            /// <summary>
+            /// use finite rotations
+            /// </summary>
+            dxBodyFlagFiniteRotation = 1,
+            /// <summary>
+            /// use finite rotations only along axis
+            /// </summary>
+            dxBodyFlagFiniteRotationAxis = 2,
+            /// <summary>
+            /// body is disabled
+            /// </summary>
+            dxBodyDisabled = 4,
+            /// <summary>
+            /// body is not influenced by gravity
+            /// </summary>
+            dxBodyNoGravity = 8,
+            /// <summary>
+            /// enable auto-disable on body
+            /// </summary>
+            dxBodyAutoDisable = 16
+        }
+        #endregion Body Flags
+
+        #region Contact Flags
+        /// <summary>
+        ///
+        /// </summary>
+        [FlagsAttribute]
+        public enum dContactFlags : int
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            dContactMu2 = 0x001,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactFDir1 = 0x002,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactBounce = 0x004,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactSoftERP = 0x008,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactSoftCFM = 0x010,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactMotion1 = 0x020,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactMotion2 = 0x040,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactSlip1 = 0x080,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactSlip2 = 0x100,
+
+            /// <summary>
+            ///
+            /// </summary>
+            dContactApprox0 = 0x0000,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactApprox1_1 = 0x1000,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactApprox1_2 = 0x2000,
+            /// <summary>
+            ///
+            /// </summary>
+            dContactApprox1 = 0x3000
+        }
+        #endregion Contact Flags
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public enum GeometryClass
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            dSphereClass = 0,
+            /// <summary>
+            /// 
+            /// </summary>
+            dBoxClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dCapsuleClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dCylinderClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dPlaneClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dRayClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dConvexClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dGeomTransformClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dTriMeshClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dHeightfieldClass,
+
+            /// <summary>
+            /// 
+            /// </summary>
+            dFirstSpaceClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dSimpleSpaceClass = dFirstSpaceClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dHashSpaceClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dQuadTreeSpaceClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dLastSpaceClass = dQuadTreeSpaceClass,
+
+            /// <summary>
+            /// 
+            /// </summary>
+            dFirstUserClass,
+            /// <summary>
+            /// 
+            /// </summary>
+            dLastUserClass = dFirstUserClass + dMaxUserClasses - 1,
+            /// <summary>
+            /// 
+            /// </summary>
+            dGeomNumClasses,
+            /// <summary>
+            /// 
+            /// </summary>
+            dMaxUserClasses = 4
+        }
+        #endregion Public Constants
+
+        #region Public Structs
+        /// <summary>
+        /// Describes the mass parameters of a rigid body
+        /// </summary>
+        /// <remarks>
+        /// mass - the total mass of the rigid body
+        /// c - center of gravity position in body frame (x,y,z)
+        /// I - 3x3 inertia tensor in body frame, about POR
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dMass
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="_mass"></param>
+            /// <param name="_c"></param>
+            /// <param name="_I"></param>
+            public dMass(dReal _mass, dVector4 _c, dMatrix3 _I)
+            {
+                mass = _mass;
+                c = _c;
+                I = _I;
+            }
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal mass;
+            /// <summary>
+            ///
+            /// </summary>
+            public dVector4 c;
+            /// <summary>
+            ///
+            /// </summary>
+            public dMatrix3 I;
+        };
+
+        /// <summary>
+        /// Contact info set by collision functions
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dContactGeom
+        {
+            /// <summary>
+            /// The contact position in global coordinates.
+            /// </summary>
+            public dVector3 pos;
+
+            /// <summary>
+            /// A unit length vector that is, generally speaking, perpendicular to the contact surface.
+            /// </summary>
+            public dVector3 normal;
+
+            /// <summary>
+            /// The depth to which the two bodies inter-penetrate each other.
+            /// If the depth is zero then the two bodies have a grazing contact,
+            /// i.e. they "only just" touch. However, this is rare - the simulation is
+            /// not perfectly accurate and will often step the bodies too far so that
+            /// the depth is nonzero.
+            /// </summary>
+            public dReal depth;
+
+            /// <summary>
+            /// The geometry objects that collided.
+            /// </summary>
+            public dGeomID g1, g2;
+
+            /// <summary>
+            /// (to be documented) - verbatim from the ODE source.
+            /// </summary>
+            public int side1, side2;
+
+        };
+
+        /// <summary>
+        /// Defines the properties of the colliding surfaces
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dSurfaceParameters
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            public dSurfaceParameters(int _mode, dReal _mu, dReal _mu2, dReal _bounce, dReal _bounce_vel, dReal _soft_erp, dReal _soft_cfm, dReal _motion1, dReal _motion2, dReal _slip1, dReal _slip2)
+            {
+                mode = _mode;
+                mu = _mu;
+                mu2 = _mu2;
+                bounce = _bounce;
+                bounce_vel = _bounce_vel;
+                soft_erp = _soft_erp;
+                soft_cfm = _soft_cfm;
+                motion1 = _motion1;
+                motion2 = _motion2;
+                slip1 = _slip1;
+                slip2 = _slip2;
+            }
+
+            /// <summary>
+            /// Contact flags. This must always be set. This is a combination of one or more of the following flags:
+            ///
+            /// dContactMu2			If not set, use mu for both friction directions.
+            /// 					If set, use mu for friction direction 1, use mu2 for friction direction 2.
+            /// dContactFDir1		If set, take fdir1 as friction direction 1, otherwise automatically compute
+            /// 					friction direction 1 to be perpendicular to the contact normal (in which
+            /// 					case its resulting orientation is unpredictable).
+            /// dContactBounce		If set, the contact surface is bouncy, in other words the bodies will
+            /// 					bounce off each other. The exact amount of bouncyness is controlled by
+            /// 					the bounce parameter.
+            ///	dContactSoftERP		If set, the error reduction parameter of the contact normal can be set
+            /// 					with the soft_erp parameter. This is useful to make surfaces soft.
+            ///	dContactSoftCFM		If set, the constraint force mixing parameter of the contact normal
+            /// 					can be set with the soft_cfm parameter. This is useful to make surfaces soft.
+            ///	dContactMotion1		If set, the contact surface is assumed to be moving independently of the
+            /// 					motion of the bodies. This is kind of like a conveyor belt running over
+            /// 					the surface. When this flag is set, motion1 defines the surface velocity
+            /// 					in friction direction 1.
+            ///	dContactMotion2		The same thing as above, but for friction direction 2.
+            /// dContactSlip1		Force-dependent-slip (FDS) in friction direction 1.
+            ///	dContactSlip2		Force-dependent-slip (FDS) in friction direction 2.
+            /// dContactApprox0		TODO: Document me
+            ///	dContactApprox1_1	Use the friction pyramid approximation for friction direction 1. If this is
+            /// 					not specified then the constant-force-limit approximation is used (and mu is
+            /// 					a force limit).
+            /// dContactApprox1_2	Use the friction pyramid approximation for friction direction 2. If this is
+            /// 					not specified then the constant-force-limit approximation is used (and mu is
+            /// 					a force limit).
+            /// dContactApprox1		Equivalent to both dContactApprox1_1 and dContactApprox1_2.
+            /// </summary>
+            public int mode;
+
+            /// <summary>
+            /// Coulomb friction coefficient.
+            /// This must be in the range 0 to dInfinity.
+            /// 0 results in a frictionless contact, and dInfinity results in a contact that never slips.
+            /// Note that frictionless contacts are less time consuming to compute than ones with friction,
+            /// and infinite friction contacts can be cheaper than contacts with finite friction.
+            ///
+            /// This must always be set.
+            /// </summary>
+            public dReal mu;
+
+            /// <summary>
+            /// Optional Coulomb friction coefficient for friction direction 2 (0..dInfinity).
+            ///
+            /// This is only set if the corresponding flag is set in mode.
+            /// </summary>
+            public dReal mu2;
+
+            /// <summary>
+            /// Restitution parameter (0..1).
+            /// 0 means the surfaces are not bouncy at all, 1 is maximum bouncyness.
+            ///
+            /// This is only set if the corresponding flag is set in mode.
+            /// </summary>
+            public dReal bounce;
+
+            /// <summary>
+            /// Restitution parameter (0..1).
+            /// 0 means the surfaces are not bouncy at all, 1 is maximum bouncyness.
+            ///
+            /// This is only set if the corresponding flag is set in mode.
+            /// </summary>
+            public dReal bounce_vel;
+
+            /// <summary>
+            /// Contact normal ``softness'' parameter.
+            ///
+            /// This is only set if the corresponding flag is set in mode.
+            /// </summary>
+            public dReal soft_erp;
+
+            /// <summary>
+            /// Contact normal ``softness'' parameter.
+            ///
+            /// This is only set if the corresponding flag is set in mode.
+            /// </summary>
+            public dReal soft_cfm;
+
+            /// <summary>
+            /// Surface velocity in friction directions 1 (in m/s).
+            ///
+            /// Only set if the corresponding flags are set in mode.
+            /// </summary>
+            public dReal motion1;
+
+            /// <summary>
+            /// Surface velocity in friction directions 1 (in m/s).
+            ///
+            /// Only set if the corresponding flags are set in mode.
+            /// </summary>
+            public dReal motion2;
+
+            /// <summary>
+            /// The coefficients of force-dependent-slip (FDS) for friction directions 1 and 2.
+            ///
+            /// These are only set if the corresponding flags are set in mode.
+            ///
+            /// FDS is an effect that causes the contacting surfaces to side past each other with a
+            /// velocity that is proportional to the force that is being applied tangentially to that surface.
+            ///
+            ///	Consider a contact point where the coefficient of friction mu is infinite. Normally, if a
+            /// force f is applied to the two contacting surfaces, to try and get them to slide past each
+            /// other, they will not move. However, if the FDS coefficient is set to a positive value k
+            /// then the surfaces will slide past each other, building up to a steady velocity of k*f
+            /// relative to each other.
+            ///
+            /// Note that this is quite different from normal frictional effects: the force does not
+            /// cause a constant acceleration of the surfaces relative to each other - it causes a
+            /// brief acceleration to achieve the steady velocity.
+            ///
+            ///	This is useful for modeling some situations, in particular tires. For example consider
+            /// a car at rest on a road. Pushing the car in its direction of travel will cause it to
+            /// start moving (i.e. the tires will start rolling). Pushing the car in the perpendicular
+            /// direction will have no effect, as the tires do not roll in that direction. However - if
+            /// the car is moving at a velocity v, applying a force f in the perpendicular direction will
+            /// cause the tires to slip on the road with a velocity proportional to f*v (Yes, this really
+            /// happens).
+            ///
+            ///	To model this in ODE set the tire-road contact parameters as follows: set friction direction 1
+            /// in the direction that the tire is rolling in, and set the FDS slip coefficient in friction
+            /// direction 2 to k*v, where v is the tire rolling velocity and k is a tire parameter that you can
+            /// choose based on experimentation.
+            ///
+            ///	Note that FDS is quite separate from the sticking/slipping effects of Coulomb friction - both
+            /// modes can be used together at a single contact point.
+            /// </summary>
+            public dReal slip1, slip2;
+        };
+
+
+        /// <summary>
+        /// Contact structure used by contact joint
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dContact
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="_surface"></param>
+            /// <param name="_geom"></param>
+            /// <param name="_fdir1"></param>
+            public dContact(dSurfaceParameters _surface, dContactGeom _geom, dVector3 _fdir1)
+            {
+                surface = _surface;
+                geom = _geom;
+                fdir1 = _fdir1;
+            }
+            /// <summary>
+            ///
+            /// </summary>
+            public dSurfaceParameters surface;
+            /// <summary>
+            ///
+            /// </summary>
+            public dContactGeom geom;
+            /// <summary>
+            ///
+            /// </summary>
+            public dVector3 fdir1;
+        };
+
+        /// <summary>
+        ///
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dVector3
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="x"></param>
+            /// <param name="y"></param>
+            /// <param name="z"></param>
+            public dVector3(dReal x, dReal y, dReal z)
+            {
+                X = x;
+                Y = y;
+                Z = z;
+                SIMD_PADDING = (dReal)0;
+            }
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal X, Y, Z;
+
+            /// <summary>
+            /// In ODE's common.h: typedef dReal dVector3[4];
+            ///
+            /// From ODE mailing list:
+            /// dVector3 is a dReal[4] to allow for future SIMD extension (the dMatrix3 is
+            /// similarily defined).
+            ///
+            ///	However, there may already be a speed difference by defining it as a
+            ///	dReal[4]; the reason is that properly alligned memory data can be accessed
+            ///	more efficiently by the CPU. You should go to great lengths to ensure that
+            ///	every instance of dVector3 in your projects are atleast 4-byte aligned
+            ///	(virtually default), 16-byte alignments are better still and usually need to
+            ///	be enforced.
+            ///
+            ///	This ensures that memory access (read/write) can be performed just a little
+            ///	bit faster.
+            ///
+            ///	For example:
+            ///	You'll notice that if you used dReal[3] for an array of dVector3, then not
+            ///	every vector would fall onto a 16-byte boundary (provided that the first
+            ///	vector was properly alligned). Whereas it is guaranteed with dReal[4]
+            ///	(provided that the first vector was properly alligned).
+            /// </summary>
+            public dReal SIMD_PADDING;
+
+            /// <summary>
+            /// Indexer to support use of array syntax as found in ODE examples
+            /// X = 0, Y = 1, Z = 2
+            /// </summary>
+            public dReal this[int index]
+            {
+                get
+                {
+                    if (index < 0 || index > 2)
+                    {
+                        throw new ArgumentOutOfRangeException("Index out of range");
+                    }
+                    dReal retVal = 0;
+                    switch (index)
+                    {
+                        case 0:
+                            retVal = X;
+                            break;
+                        case 1:
+                            retVal = Y;
+                            break;
+                        case 2:
+                            retVal = Z;
+                            break;
+                    }
+                    return retVal;
+                }
+                set
+                {
+                    if (index < 0 || index > 2)
+                    {
+                        throw new ArgumentOutOfRangeException("Index out of range");
+                    }
+                    switch (index)
+                    {
+                        case 0:
+                            X = value;
+                            break;
+                        case 1:
+                            Y = value;
+                            break;
+                        case 2:
+                            Z = value;
+                            break;
+                    }
+                }
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <returns></returns>
+            public dReal[] ToArray()
+            {
+                return new dReal[] {
+					X, Y, Z, SIMD_PADDING
+				};
+            }
+        };
+
+        /// <summary>
+        ///
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dVector4
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="x"></param>
+            /// <param name="y"></param>
+            /// <param name="z"></param>
+            /// <param name="w"></param>
+            public dVector4(dReal x, dReal y, dReal z, dReal w)
+            {
+                X = x;
+                Y = y;
+                Z = z;
+                W = w;
+            }
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal X, Y, Z, W;
+            /// <summary>
+            /// Indexer to support use of array syntax as found in ODE examples
+            /// X = 0, Y = 1, Z = 2, W = 3
+            /// </summary>
+            public dReal this[int index]
+            {
+                get
+                {
+                    if (index < 0 || index > 3)
+                    {
+                        throw new ArgumentOutOfRangeException("Index out of range");
+                    }
+                    dReal retVal = 0;
+                    switch (index)
+                    {
+                        case 0:
+                            retVal = X;
+                            break;
+                        case 1:
+                            retVal = Y;
+                            break;
+                        case 2:
+                            retVal = Z;
+                            break;
+                        case 3:
+                            retVal = W;
+                            break;
+                    }
+                    return retVal;
+                }
+                set
+                {
+                    if (index < 0 || index > 3)
+                    {
+                        throw new ArgumentOutOfRangeException("Index out of range");
+                    }
+                    switch (index)
+                    {
+                        case 0:
+                            X = value;
+                            break;
+                        case 1:
+                            Y = value;
+                            break;
+                        case 2:
+                            Z = value;
+                            break;
+                        case 3:
+                            W = value;
+                            break;
+                    }
+
+                }
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <returns></returns>
+            public dReal[] ToArray()
+            {
+                return new dReal[] {
+					X, Y, Z, W
+				};
+            }
+        };
+
+        /// <summary>
+        ///
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dQuaternion
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="x"></param>
+            /// <param name="y"></param>
+            /// <param name="z"></param>
+            /// <param name="w"></param>
+            public dQuaternion(dReal x, dReal y, dReal z, dReal w)
+            {
+                X = x;
+                Y = y;
+                Z = z;
+                W = w;
+            }
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal W, X, Y, Z;
+
+            /// <summary>
+            /// Indexer to support use of array syntax as found in ODE examples
+            /// X = 0, Y = 1, Z = 2, W = 3
+            /// </summary>
+            public dReal this[int index]
+            {
+                get
+                {
+                    if (index < 0 || index > 3)
+                    {
+                        throw new ArgumentOutOfRangeException("Index out of range");
+                    }
+                    dReal retVal = 0;
+                    switch (index)
+                    {
+                        case 0:
+                            retVal = X;
+                            break;
+                        case 1:
+                            retVal = Y;
+                            break;
+                        case 2:
+                            retVal = Z;
+                            break;
+                        case 3:
+                            retVal = W;
+                            break;
+                    }
+                    return retVal;
+                }
+                set
+                {
+                    if (index < 0 || index > 3)
+                    {
+                        throw new ArgumentOutOfRangeException("Index out of range");
+                    }
+                    switch (index)
+                    {
+                        case 0:
+                            X = value;
+                            break;
+                        case 1:
+                            Y = value;
+                            break;
+                        case 2:
+                            Z = value;
+                            break;
+                        case 3:
+                            W = value;
+                            break;
+                    }
+                }
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <returns></returns>
+            public dReal[] ToArray()
+            {
+                return new dReal[] {
+					X, Y, Z, W
+				};
+            }
+        };
+
+        /// <summary>
+        ///
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct Aabb
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="_minx"></param>
+            /// <param name="_maxx"></param>
+            /// <param name="_miny"></param>
+            /// <param name="_maxy"></param>
+            /// <param name="_minz"></param>
+            /// <param name="_maxz"></param>
+            public Aabb(dReal _minx, dReal _maxx, dReal _miny, dReal _maxy, dReal _minz, dReal _maxz)
+            {
+                minx = _minx;
+                maxx = _maxx;
+                miny = _miny;
+                maxy = _maxy;
+                minz = _minz;
+                maxz = _maxz;
+            }
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal minx, maxx, miny, maxy, minz, maxz;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dMatrix3
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="values"></param>
+            public dMatrix3(dReal[] values)
+            {
+                M00 = values[0];
+                M01 = values[1];
+                M02 = values[2];
+                M03 = values[3];
+                M10 = values[4];
+                M11 = values[5];
+                M12 = values[6];
+                M13 = values[7];
+                M20 = values[8];
+                M21 = values[9];
+                M22 = values[10];
+                M23 = values[11];
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M00;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M01;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M02;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M03;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M10;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M11;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M12;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M13;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M20;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M21;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M22;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M23;
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="index"></param>
+            /// <returns></returns>
+            public dReal this[int index]
+            {
+                get
+                {
+                    switch (index)
+                    {
+                        case 0: return M00;
+                        case 1: return M01;
+                        case 2: return M02;
+                        case 3: return M03;
+                        case 4: return M10;
+                        case 5: return M11;
+                        case 6: return M12;
+                        case 7: return M13;
+                        case 8: return M20;
+                        case 9: return M21;
+                        case 10: return M22;
+                        case 11: return M23;
+                        default: throw new ArgumentOutOfRangeException("index", index, "Must be between 0 and 11");
+                    }
+                }
+                set
+                {
+                    switch (index)
+                    {
+                        case 0: M00 = value;
+                            break;
+                        case 1: M01 = value;
+                            break;
+                        case 2: M02 = value;
+                            break;
+                        case 3: M03 = value;
+                            break;
+                        case 4: M10 = value;
+                            break;
+                        case 5: M11 = value;
+                            break;
+                        case 6: M12 = value;
+                            break;
+                        case 7: M13 = value;
+                            break;
+                        case 8: M20 = value;
+                            break;
+                        case 9: M21 = value;
+                            break;
+                        case 10: M22 = value;
+                            break;
+                        case 11: M23 = value;
+                            break;
+                        default: throw new ArgumentOutOfRangeException("index", index, "Must be between 0 and 11");
+                    }
+                }
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="x"></param>
+            /// <param name="y"></param>
+            /// <returns></returns>
+            public dReal this[int x, int y]
+            {
+                get
+                {
+                    switch (x)
+                    {
+                        case 0:
+                            switch (y)
+                            {
+                                case 0: return M00;
+                                case 1: return M01;
+                                case 2: return M02;
+                                case 3: return M03;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                        case 1:
+                            switch (y)
+                            {
+                                case 0: return M10;
+                                case 1: return M11;
+                                case 2: return M12;
+                                case 3: return M13;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                        case 2:
+                            switch (y)
+                            {
+                                case 0: return M20;
+                                case 1: return M21;
+                                case 2: return M22;
+                                case 3: return M23;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                        default: throw new ArgumentOutOfRangeException("x", x, "X value must be between 0 and 2");
+                    }
+                }
+                set
+                {
+                    switch (x)
+                    {
+                        case 0:
+                            switch (y)
+                            {
+                                case 0: M00 = value; break;
+                                case 1: M01 = value; break;
+                                case 2: M02 = value; break;
+                                case 3: M03 = value; break;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                            break;
+                        case 1:
+                            switch (y)
+                            {
+                                case 0: M10 = value; break;
+                                case 1: M11 = value; break;
+                                case 2: M12 = value; break;
+                                case 3: M13 = value; break;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                            break;
+                        case 2:
+                            switch (y)
+                            {
+                                case 0: M20 = value; break;
+                                case 1: M21 = value; break;
+                                case 2: M22 = value; break;
+                                case 3: M23 = value; break;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                            break;
+                        default: throw new ArgumentOutOfRangeException("x", x, "X value must be between 0 and 2");
+                    }
+                }
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <returns></returns>
+            public dReal[] ToArray()
+            {
+                return new dReal[] {
+			    M00, M01, M02, M03, M10, M11, M12, M13, M20, M21, M22, M23
+			  };
+            }
+        };
+
+        /// <summary>
+        ///
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dMatrix4
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="values"></param>
+            public dMatrix4(dReal[] values)
+            {
+                M00 = values[0];
+                M01 = values[1];
+                M02 = values[2];
+                M03 = values[3];
+                M10 = values[4];
+                M11 = values[5];
+                M12 = values[6];
+                M13 = values[7];
+                M20 = values[8];
+                M21 = values[9];
+                M22 = values[10];
+                M23 = values[11];
+                M30 = values[12];
+                M31 = values[13];
+                M32 = values[14];
+                M33 = values[15];
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M00;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M01;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M02;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M03;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M10;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M11;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M12;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M13;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M20;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M21;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M22;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M23;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M30;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M31;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M32;
+            /// <summary>
+            ///
+            /// </summary>
+            public dReal M33;
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="index"></param>
+            /// <returns></returns>
+            public dReal this[int index]
+            {
+                get
+                {
+                    switch (index)
+                    {
+                        case 0: return M00;
+                        case 1: return M01;
+                        case 2: return M02;
+                        case 3: return M03;
+                        case 4: return M10;
+                        case 5: return M11;
+                        case 6: return M12;
+                        case 7: return M13;
+                        case 8: return M20;
+                        case 9: return M21;
+                        case 10: return M22;
+                        case 11: return M23;
+                        case 12: return M30;
+                        case 13: return M31;
+                        case 14: return M32;
+                        case 15: return M33;
+                        default: throw new ArgumentOutOfRangeException("index", index, "Must be between 0 and 15");
+                    }
+                }
+                set
+                {
+                    switch (index)
+                    {
+                        case 0: M00 = value;
+                            break;
+                        case 1: M01 = value;
+                            break;
+                        case 2: M02 = value;
+                            break;
+                        case 3: M03 = value;
+                            break;
+                        case 4: M10 = value;
+                            break;
+                        case 5: M11 = value;
+                            break;
+                        case 6: M12 = value;
+                            break;
+                        case 7: M13 = value;
+                            break;
+                        case 8: M20 = value;
+                            break;
+                        case 9: M21 = value;
+                            break;
+                        case 10: M22 = value;
+                            break;
+                        case 11: M23 = value;
+                            break;
+                        case 12: M30 = value;
+                            break;
+                        case 13: M31 = value;
+                            break;
+                        case 14: M32 = value;
+                            break;
+                        case 15: M33 = value;
+                            break;
+                        default: throw new ArgumentOutOfRangeException("index", index, "Must be between 0 and 15");
+                    }
+                }
+            }
+
+            /// <summary>
+            ///
+            /// </summary>
+            /// <param name="x"></param>
+            /// <param name="y"></param>
+            /// <returns></returns>
+            public dReal this[int x, int y]
+            {
+                get
+                {
+                    switch (x)
+                    {
+                        case 0:
+                            switch (y)
+                            {
+                                case 0: return M00;
+                                case 1: return M01;
+                                case 2: return M02;
+                                case 3: return M03;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                        case 1:
+                            switch (y)
+                            {
+                                case 0: return M10;
+                                case 1: return M11;
+                                case 2: return M12;
+                                case 3: return M13;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                        case 2:
+                            switch (y)
+                            {
+                                case 0: return M20;
+                                case 1: return M21;
+                                case 2: return M22;
+                                case 3: return M23;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                        case 3:
+                            switch (y)
+                            {
+                                case 0: return M30;
+                                case 1: return M31;
+                                case 2: return M32;
+                                case 3: return M33;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                        default: throw new ArgumentOutOfRangeException("x", x, "X value must be between 0 and 3");
+                    }
+                }
+                set
+                {
+                    switch (x)
+                    {
+                        case 0:
+                            switch (y)
+                            {
+                                case 0: M00 = value; break;
+                                case 1: M01 = value; break;
+                                case 2: M02 = value; break;
+                                case 3: M03 = value; break;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                            break;
+                        case 1:
+                            switch (y)
+                            {
+                                case 0: M10 = value; break;
+                                case 1: M11 = value; break;
+                                case 2: M12 = value; break;
+                                case 3: M13 = value; break;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                            break;
+                        case 2:
+                            switch (y)
+                            {
+                                case 0: M20 = value; break;
+                                case 1: M21 = value; break;
+                                case 2: M22 = value; break;
+                                case 3: M23 = value; break;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                            break;
+                        case 3:
+                            switch (y)
+                            {
+                                case 0: M30 = value; break;
+                                case 1: M31 = value; break;
+                                case 2: M32 = value; break;
+                                case 3: M33 = value; break;
+                                default: throw new ArgumentOutOfRangeException("y", y, "Y value must be between 0 and 3");
+                            }
+                            break;
+                        default: throw new ArgumentOutOfRangeException("x", x, "X value must be between 0 and 3");
+                    }
+                }
+            }
+            /// <summary>
+            ///
+            /// </summary>
+            /// <returns></returns>
+            public dReal[] ToArray()
+            {
+                return new dReal[] {
+					M00, M01, M02, M03, M10, M11, M12, M13, M20, M21, M22, M23, M30, M31, M32, M33
+				};
+            }
+        };
+
+        // TODO: Should there be a dMatrix6 here to complete the set of arrays found in ODE's common.h?
+        // public struct dMatrix6 {}
+
+        /// <summary>
+        /// During the world time step, the forces that are applied by each joint are computed.
+        /// These forces are added directly to the joined bodies, and the user normally has no
+        /// way of telling which joint contributed how much force.
+        ///
+        ///	If this information is desired then the user can allocate a dJointFeedback structure
+        /// and pass its pointer to the dJointSetFeedback() function.
+        ///
+        /// The feedback information structure is defined as follows:
+        ///
+        ///	typedef struct dJointFeedback {
+        ///		dVector3 f1;       // force that joint applies to body 1
+        ///		dVector3 t1;       // torque that joint applies to body 1
+        ///		dVector3 f2;       // force that joint applies to body 2
+        ///		dVector3 t2;       // torque that joint applies to body 2
+        ///	} dJointFeedback;
+        ///
+        ///	During the time step any feedback structures that are attached to joints will be filled in with the
+        /// joint's force and torque information. The dJointGetFeedback() function returns the current feedback
+        /// structure pointer, or 0 if none is used (this is the default). dJointSetFeedback() can be passed 0
+        /// to disable feedback for that joint.
+        ///
+        ///	Now for some API design notes. It might seem strange to require that users perform the allocation
+        /// of these structures. Why not just store the data statically in each joint? The reason is that not
+        /// all users will use the feedback information, and even when it is used not all joints will need it.
+        /// It will waste memory to store it statically, especially as this structure could grow to store a
+        /// lot of extra information in the future.
+        ///
+        ///	Why not have ODE allocate the structure itself, at the user's request? The reason is that contact
+        /// joints (which are created and destroyed every time step) would require a lot of time to be spent
+        /// in memory allocation if feedback is required. Letting the user do the allocation means that a
+        /// better allocation strategy can be provided, e.g simply allocating them out of a fixed array.
+        ///
+        ///	The alternative to this API is to have a joint-force callback. This would work of course, but
+        /// it has a few problems. First, callbacks tend to pollute APIs and sometimes require the user
+        /// to go through unnatural contortions to get the data to the right place. Second, this would
+        /// expose ODE to being changed in the middle of a step (which would have bad consequences), and
+        /// there would have to be some kind of guard against this or a debugging check for it - which
+        /// would complicate things.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dJointFeedback
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            public dJointFeedback(dVector3 _f1, dVector3 _t1, dVector3 _f2, dVector3 _t2)
+            {
+                f1 = _f1;
+                t1 = _t1;
+                f2 = _f2;
+                t2 = _t2;
+            }
+
+            /// <summary>Force applied to body 1</summary>
+            public dVector3 f1;
+            /// <summary>Torque applied to body 1</summary>
+            public dVector3 t1;
+            /// <summary>Force applied to body 2</summary>
+            public dVector3 f2;
+            /// <summary>Torque applied to body 2</summary>
+            public dVector3 t2;
+        };
+        #endregion Public Structs
+
+        #region Public Delegates
+        /// <summary>
+        /// Callback function for dSpaceCollide and dSpaceCollide2
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void dNearCallback(IntPtr data, dGeomID o1, dGeomID o2);
+        #endregion Public Delegates
+
+        #region Public Externs
+        #region World Functions
+        #region World create and destroy functions
+        /// <summary>
+        /// Create a new, empty world and return its ID number.
+        /// </summary>
+        /// <remarks>
+        /// The world object is a container for rigid bodies and joints.
+        /// Objects in different worlds can not interact, for example rigid bodies from two different worlds can not collide.
+        /// All the objects in a world exist at the same point in time, thus one reason to use separate worlds is to simulate
+        /// systems at different rates.
+        ///
+        /// Most applications will only need one world.
+        /// </remarks>
+        /// <returns>A dWorldID</returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dWorldID dWorldCreate();
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dInitODE();
+
+        /// <summary>
+        /// Destroy a world and everything in it.
+        /// This includes all bodies, and all joints that are not part of a joint group.
+        /// Joints that are part of a joint group will be deactivated, and can be destroyed by calling, for example,
+        /// dJointGroupEmpty.
+        /// </summary>
+        /// <param name="world">A  dWorldID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldDestroy(dWorldID world);
+        #endregion World create and destroy functions
+        #region World gravity functions
+        /// <summary>
+        /// Set the world's global gravity vector.
+        /// The units are m/s/s (meters/second/second), so Earth's gravity vector would
+        /// be (0,0,-9.81), assuming that +z is up.
+        /// The default is no gravity, i.e. (0,0,0).
+        /// </summary>
+        /// <param name="world">the world to set</param>
+        /// <param name="x">x component of the gravity vector</param>
+        /// <param name="y">y component of the gravity vector</param>
+        /// <param name="z">z component of the gravity vector</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetGravity(dWorldID world, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Get the world's global gravity vector.
+        /// The units are m/s/s (meter/second/second).
+        /// </summary>
+        /// <param name="world">the world to query</param>
+        /// <param name="gravity">A dVector3 containing the world's gravity vector</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldGetGravity(dWorldID world, ref dVector3 gravity);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="world"></param>
+        /// <param name="X"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dWorldGetGravity(dWorldID world, out dReal X);
+
+        #endregion World gravity functions
+        #region World CFM and ERP functions
+        /// <summary>
+        /// Set the global ERP (Error Reduction Parameter) value, which controls how much error
+        /// correction is performed in each time step.
+        /// Typical values are in the range 0.1--0.8. The default is 0.2.
+        /// </summary>
+        /// <param name="world">the world to set</param>
+        /// <param name="erp">the global ERP value in the range 0.1-0.8 (default 0.2)</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetERP(dWorldID world, dReal erp);
+
+        /// <summary>
+        /// Get the global ERP value, which controls how much error correction is performed in each time step.
+        /// Typical values are in the range 0.1--0.8. The default is 0.2.
+        /// </summary>
+        /// <returns>the ERP (Error Reduction Parameter) for the world. Range 0.1-0.8</returns>
+        /// <param name="world">the world to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dWorldGetERP(dWorldID world);
+
+        /// <summary>
+        /// Set the global CFM (constraint force mixing) value.
+        /// Typical values are in the range 10^-9 -- 1.
+        /// The default is 10^-5 if single precision is being used, or 10^-10 if double precision is being used.
+        /// </summary>
+        /// <param name="world">the world to set</param>
+        /// <param name="cfm">the global CFM value to set.  Range 10^-9 to 1</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetCFM(dWorldID world, dReal cfm);
+
+        /// <summary>
+        /// Get the global CFM (constraint force mixing) value.
+        /// Typical values are in the range 10^-9 -- 1.
+        /// The default is 10-5 if single precision is being used, or 10^-10 if double precision is being used.
+        /// </summary>
+        /// <returns>the current CFM value for the world in the range 10^-9 to 1</returns>
+        /// <param name="world">the world to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dWorldGetCFM(dWorldID world);
+
+        #endregion World CFM and ERP functions
+        #region World impulse to force conversion function
+        /// <summary>
+        /// Convert linear/angular impulse to a rigid body to a force/torque vector.
+        ///
+        /// If you want to apply a linear or angular impulse to a rigid body, instead of a force or a torque,
+        /// then you can use this function to convert the desired impulse into a force/torque vector before
+        /// calling the dBodyAdd... function.
+        ///
+        /// This function is given the desired impulse as (ix,iy,iz) and puts the force vector in force.
+        ///
+        /// The current algorithm simply scales the impulse by 1/stepsize, where stepsize is the step size for
+        /// the next step that will be taken.
+        /// </summary>
+        /// <remarks>
+        /// This function is given a dWorldID because, in the future, the force computation may depend on integrator
+        /// parameters that are set as properties of the world.
+        /// </remarks>
+        /// <param name="world">the id of the world</param>
+        /// <param name="stepsize">stepsize for the next step to be taken</param>
+        /// <param name="ix">x component of the impulse</param>
+        /// <param name="iy">y component of the impulse</param>
+        /// <param name="iz">z component of the impulse</param>
+        /// <param name="force">A  dVector3 containing the resulting force vector</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldImpulseToForce(dWorldID world, dReal stepsize, dReal ix, dReal iy, dReal iz, ref dVector3 force);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="world"></param>
+        /// <param name="stepsize"></param>
+        /// <param name="ix"></param>
+        /// <param name="iy"></param>
+        /// <param name="iz"></param>
+        /// <param name="forceX"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dWorldImpulseToForce(dWorldID world, dReal stepsize, dReal ix, dReal iy, dReal iz, out dReal forceX);
+
+        #endregion World impulse to force conversion function
+        #region World Stepping Functions
+        /// <summary>
+        /// Step the world.
+        /// This uses a "big matrix" method that takes time on the order of m^3 and memory on the order of m^2,
+        /// where m is the total number of constraint rows.
+        ///
+        /// For large systems this will use a lot of memory and can be very slow, but this is currently the
+        /// most accurate method.
+        /// </summary>
+        /// <param name="world">the world to step</param>
+        /// <param name="stepsize">the stepsize</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldStep(dWorldID world, dReal stepsize);
+        #endregion World Stepping Functions
+        #region World QuickStep functions
+        /// <summary>
+        /// Step the world.
+        /// This uses an iterative method that takes time on the order of m*N and memory on the order of m, where
+        /// m is the total number of constraint rows and N is the number of iterations.
+        ///
+        /// For large systems this is a lot faster than dWorldStep, but it is less accurate.
+        /// </summary>
+        /// <remarks>
+        /// QuickStep is great for stacks of objects especially when the auto-disable feature is used as well.
+        /// However, it has poor accuracy for near-singular systems. Near-singular systems can occur when using
+        /// high-friction contacts, motors, or certain articulated structures.
+        /// For example, a robot with multiple legs sitting on the ground may be near-singular.
+        ///
+        /// There are ways to help overcome QuickStep's inaccuracy problems:
+        /// 	- 	Increase CFM.
+        /// 	-	Reduce the number of contacts in your system (e.g. use the minimum number of contacts for
+        ///     	the feet of a robot or creature).
+        ///		-	Don't use excessive friction in the contacts.
+        ///		-	Use contact slip if appropriate
+        ///		-	Avoid kinematic loops (however, kinematic loops are inevitable in legged creatures).
+        ///		-	Don't use excessive motor strength.
+        ///		-	Use force-based motors instead of velocity-based motors.
+        ///
+        /// Increasing the number of QuickStep iterations may help a little bit, but it is not going to help much
+        /// if your system is really near singular.
+        /// </remarks>
+        /// <param name="world">the world to step</param>
+        /// <param name="stepsize">the stepsize</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldQuickStep(dWorldID world, dReal stepsize);
+
+        /// <summary>
+        /// Set the number of iterations that the QuickStep method performs per step.
+        ///
+        /// More iterations will give a more accurate solution, but will take longer to compute.
+        ///
+        /// The default is 20 iterations.
+        /// </summary>
+        /// <param name="world">the world to step</param>
+        /// <param name="num">the iterations per step (default 20)</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetQuickStepNumIterations(dWorldID world, int num);
+
+        /// <summary>
+        /// Get the number of iterations that the QuickStep method performs per step.
+        ///
+        /// The default is 20 iterations.
+        /// </summary>
+        /// <returns>the iterations per step (default 20)</returns>
+        /// <param name="world">the world to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dWorldGetQuickStepNumIterations(dWorldID world);
+
+        /// <summary>
+        /// Set the QuickStep SOR over-relaxation parameter
+        /// </summary>
+        /// <param name="world">the world to set</param>
+        /// <param name="over_relaxation">over_relaxation value to use by SOR</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetQuickStepW(dWorldID world, dReal over_relaxation);
+
+        /// <summary>
+        /// Get the QuickStep SOR over-relaxation parameter
+        /// </summary>
+        /// <returns>the world's over relaxation value</returns>
+        /// <param name="world">the world to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dWorldGetQuickStepW(dWorldID world);
+        #endregion World QuickStep functions
+        #region World contact parameter functions
+        /// <summary>
+        /// Set maximum correcting velocity that contacts are allowed to generate.
+        ///
+        /// The default value is infinity (i.e. no limit).
+        ///
+        /// Reducing this value can help prevent "popping" of deeply embedded objects.
+        /// </summary>
+        /// <param name="world">the world to set</param>
+        /// <param name="vel">the maximum correcting velocity contacts can generate (default is infinity - no limit)</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetContactMaxCorrectingVel(dWorldID world, dReal vel);
+
+        /// <summary>
+        /// Get the maximum correcting velocity that contacts are allowed to generate.
+        ///
+        /// The default value is infinity (i.e. no limit).
+        /// </summary>
+        /// <returns>current maximum correcting velocity (default is infinity - no limit)</returns>
+        /// <param name="world">the world to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dWorldGetContactMaxCorrectingVel(dWorldID world);
+
+        /// <summary>
+        /// Set the depth of the surface layer around all geometry objects.
+        ///
+        /// Contacts are allowed to sink into the surface layer up to the given depth before coming to rest.
+        ///
+        /// The default value is zero.
+        ///
+        /// Increasing this to some small value (e.g. 0.001) can help prevent jittering problems due to contacts
+        /// being repeatedly made and broken.
+        /// </summary>
+        /// <param name="world">the world to set</param>
+        /// <param name="depth">the contact surface layer depth (default 0)</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetContactSurfaceLayer(dWorldID world, dReal depth);
+
+        /// <summary>
+        /// Get the depth of the surface layer around all geometry objects.
+        ///
+        /// The default value is zero.
+        /// </summary>
+        /// <returns>the world's contact surface layer (default 0)</returns>
+        /// <param name="world">the world to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dWorldGetContactSurfaceLayer(dWorldID world);
+        #endregion World contact parameter functions
+        #region World StepFast1 functions
+        /// <summary>
+        /// Step the world by stepsize seconds using the StepFast1 algorithm.
+        /// The number of iterations to perform is given by maxiterations.
+        ///
+        /// NOTE: The StepFast algorithm has been superseded by the QuickStep algorithm: see the dWorldQuickStep function.
+        /// </summary>
+        /// <param name="world">the world to set</param>
+        /// <param name="stepsize">the stepsize (in seconds)</param>
+        /// <param name="maxiterations">maximum iterations to perform</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldStepFast1(dWorldID world, dReal stepsize, int maxiterations);
+
+        /// <summary>
+        /// Set the AutoEnableDepth parameter used by the StepFast1 algorithm.
+        /// </summary>
+        /// <param name="world">the world to set</param>
+        /// <param name="autoEnableDepth">the autoenable depth</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetAutoEnableDepthSF1(dWorldID world, int autoEnableDepth);
+
+        /// <summary>
+        /// Get the AutoEnableDepth parameter used by the StepFast1 algorithm.
+        /// </summary>
+        /// <returns>the autoenable depth</returns>
+        /// <param name="world">the world to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dWorldGetAutoEnableDepthSF1(dWorldID world);
+        #endregion World StepFast1 functions
+        #region World Auto-disable functions
+        /// <summary>
+        /// Set the default auto-disable linear threshold for newly created bodies.
+        ///
+        /// The default parameter is:  AutoDisableLinearThreshold = 0.01
+        /// </summary>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="linear_threshold">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetAutoDisableLinearThreshold(dWorldID world, dReal linear_threshold);
+
+        /// <summary>
+        /// Get the current auto-disable linear threshold for newly created bodies.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="world">A  dWorldID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dWorldGetAutoDisableLinearThreshold(dWorldID world);
+
+        /// <summary>
+        /// Set the default auto-disable angular threshold for newly created bodies.
+        ///
+        /// The default parameter is:  AutoDisableAngularThreshold = 0.01
+        /// </summary>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="angular_threshold">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetAutoDisableAngularThreshold(dWorldID world, dReal angular_threshold);
+
+        /// <summary>
+        /// Get the current auto-disable angular threshold for newly created objects
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="world">A  dWorldID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dWorldGetAutoDisableAngularThreshold(dWorldID world);
+
+        /// <summary>
+        /// Set the default auto-disable steps for newly created bodies.
+        ///
+        /// The default parameter is:  AutoDisableSteps = 10
+        /// </summary>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="steps">the new auto-disable step setting</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetAutoDisableSteps(dWorldID world, int steps);
+
+        /// <summary>
+        /// Get the current auto-disable steps for newly created bodies
+        /// </summary>
+        /// <returns>number of current auto-disable steps</returns>
+        /// <param name="world">the world to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dWorldGetAutoDisableSteps(dWorldID world);
+
+        /// <summary>
+        /// Set the default auto-disable time for newly created bodies.
+        ///
+        /// The default parameter is:  AutoDisableTime = 0
+        /// </summary>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="time">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetAutoDisableTime(dWorldID world, dReal time);
+
+        /// <summary>
+        /// Get the current auto-disable time for newly created bodies.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="world">A  dWorldID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dWorldGetAutoDisableTime(dWorldID world);
+        /// <summary>
+        /// Set the default auto-disable flag for newly created bodies.
+        ///
+        /// The default parameter is:  AutoDisableFlag = disabled
+        /// </summary>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="do_auto_disable">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWorldSetAutoDisableFlag(dWorldID world, int do_auto_disable);
+
+        /// <summary>
+        /// Get the current auto-disable flag for newly created bodies.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="world">A  dWorldID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dWorldGetAutoDisableFlag(dWorldID world);
+
+        #endregion World Auto-disable functions
+        #endregion World Functions
+
+        #region Body functions
+        #region Body create and destroy functions
+        /// <summary>
+        /// Create a body in the given world with default mass parameters at position (0,0,0).
+        /// Return its ID (really a handle to the body).
+        /// </summary>
+        /// <returns>A dBodyID</returns>
+        /// <param name="world">A  dWorldID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dBodyID dBodyCreate(dWorldID world);
+
+        /// <summary>
+        /// Destroy a body.
+        ///
+        /// All joints that are attached to this body will be put into limbo (i.e. unattached and
+        /// not affecting the simulation, but they will NOT be deleted)
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyDestroy(dBodyID body);
+        #endregion Body create and destroy functions
+        #region Body position and orientation functions
+        /// <summary>
+        /// Set the position of the body.
+        ///
+        /// After setting a group of bodies, the outcome of the simulation is undefined if the new configuration
+        /// is inconsistent with the joints/constraints that are present.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetPosition(dBodyID body, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set the rotation of the body.
+        ///
+        /// After setting a group of bodies, the outcome of the simulation is undefined if the new configuration
+        /// is inconsistent with the joints/constraints that are present.
+        /// </summary>
+        /// <param name="body">the body to set</param>
+        /// <param name="R">An array of 12 elements containing the new 3x4 rotation matrix</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetRotation(dBodyID body, dReal[] R);
+
+        /// <summary>
+        /// Set the rotation of the body.
+        ///
+        /// After setting a group of bodies, the outcome of the simulation is undefined if the new configuration
+        /// is inconsistent with the joints/constraints that are present.
+        /// </summary>
+        /// <remarks>
+        /// For some reason the dMatrix3 does not marshall correctly, so this function
+        /// maintains compatibility with the ODE api by converting the supplied dMatrix3 to
+        /// and array and passing that to ODE.
+        /// </remarks>
+        /// <param name="body">the body to set</param>
+        /// <param name="R">A  dMatrix3 containing the new rotation matrix</param>
+        public static void dBodySetRotation(dBodyID body, dMatrix3 R)
+        {
+            dBodySetRotation(body, R.ToArray());
+        }
+
+        /// <summary>
+        /// Set the orientation on of the body.
+        ///
+        /// Orientation is represented by a quaternion (qs,qx,qy,qz)
+        ///
+        /// After setting a group of bodies, the outcome of the simulation is undefined if the new configuration
+        /// is inconsistent with the joints/constraints that are present.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="q">A  dQuaternion</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetQuaternion(dBodyID body, [In] ref dQuaternion q);
+
+        /// <summary>
+        /// Set the linear velocity of the body.
+        ///
+        /// After setting a group of bodies, the outcome of the simulation is undefined if the new configuration
+        /// is inconsistent with the joints/constraints that are present.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetLinearVel(dBodyID body, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set the angular velocity of the body.
+        ///
+        /// After setting a group of bodies, the outcome of the simulation is undefined if the new configuration
+        /// is inconsistent with the joints/constraints that are present.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetAngularVel(dBodyID body, dReal x, dReal y, dReal z);
+
+        [DllImport(ODE_NATIVE_LIBRARY, EntryPoint = "dBodyGetPosition")]
+        private extern unsafe static dReal* dBodyGetPosition_(dBodyID body);
+        /// <summary>
+        /// Get the position of the body
+        ///
+        /// The vector is valid until any changes are made to the rigid body system structure.
+        /// </summary>
+        /// <returns>A dVector3</returns>
+        /// <param name="body">A  dBodyID</param>
+        public static dVector3 dBodyGetPosition(dBodyID body)
+        {
+            unsafe
+            {
+                dVector3* v = (dVector3*)dBodyGetPosition_(body);
+                return *v;
+            }
+        }
+
+        [DllImport(ODE_NATIVE_LIBRARY, EntryPoint = "dBodyGetRotation")]
+        private extern unsafe static dReal* dBodyGetRotation_(dBodyID body);	// ptr to 4x3 rot matrix
+        /// <summary>
+        /// Get the rotation of the body.
+        ///
+        /// The returned value is a 4x3 rotation matrix.
+        /// The matrix is valid until any changes are made to the rigid body system structure.
+        /// </summary>
+        /// <returns>A dMatrix3</returns>
+        /// <param name="body">A  dBodyID</param>
+        public static dMatrix3 dBodyGetRotation(dBodyID body)
+        {
+            unsafe
+            {
+                dMatrix3* m = (dMatrix3*)dBodyGetRotation_(body);
+                return *m;
+            }
+        }
+
+        [DllImport(ODE_NATIVE_LIBRARY, EntryPoint = "dBodyGetQuaternion")]
+        private extern unsafe static dReal* dBodyGetQuaternion_(dBodyID body);
+        /// <summary>
+        /// Get the orientation of a body.
+        ///
+        /// Orientation is represented by a quaternion (qs,qx,qy,qz)
+        /// </summary>
+        /// <returns>A dQuaternion</returns>
+        /// <param name="body">A  dBodyID</param>
+        public static dQuaternion dBodyGetQuaternion(dBodyID body)
+        {
+            unsafe
+            {
+                dQuaternion* q = (dQuaternion*)dBodyGetQuaternion_(body);
+                return *q;
+            }
+        }
+
+        [DllImport(ODE_NATIVE_LIBRARY, EntryPoint = "dBodyGetLinearVel")]
+        private extern unsafe static dReal* dBodyGetLinearVel_(dBodyID body);
+        /// <summary>
+        /// Get the linear velocity of a body
+        ///
+        /// The vector is valid until any changes are made to the rigid body system structure.
+        /// </summary>
+        /// <returns>A dVector3</returns>
+        /// <param name="body">A  dBodyID</param>
+        public static dVector3 dBodyGetLinearVel(dBodyID body)
+        {
+            unsafe
+            {
+                dVector3* v = (dVector3*)dBodyGetLinearVel_(body);
+                return *v;
+            }
+        }
+
+        [DllImport(ODE_NATIVE_LIBRARY, EntryPoint = "dBodyGetAngularVel")]
+        private extern unsafe static dReal* dBodyGetAngularVel_(dBodyID body);
+        /// <summary>
+        /// Get the angular velocity of a body
+        ///
+        /// The vector is valid until any changes are made to the rigid body system structure.
+        /// </summary>
+        /// <returns>A dVector3</returns>
+        /// <param name="body">A  dBodyID</param>
+        public static dVector3 dBodyGetAngularVel(dBodyID body)
+        {
+            unsafe
+            {
+                dVector3* v = (dVector3*)dBodyGetAngularVel_(body);
+                return *v;
+            }
+        }
+        #endregion Body position and orientation functions
+        #region Body mass and force functions
+        /// <summary>
+        /// Set the mass of the body (see the mass functions)
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="mass">A  dMass</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetMass(dBodyID body, ref dMass mass);
+
+        /// <summary>
+        /// Get the mass of the body (see the mass functions)
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="mass">A  dMass</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyGetMass(dBodyID body, ref dMass mass);
+
+        /// <summary>
+        /// Add force to a body using absolute coordinates.
+        /// </summary>
+        /// <remarks>
+        /// Forces are accumulated on to each body, and the accumulators are zeroed after each time step.
+        ///
+        /// Force is applied at body's center of mass
+        /// </remarks>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="fx">A  dReal</param>
+        /// <param name="fy">A  dReal</param>
+        /// <param name="fz">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyAddForce(dBodyID body, dReal fx, dReal fy, dReal fz);
+
+        /// <summary>
+        /// Add torque to a body using absolute coordinates.
+        /// </summary>
+        /// <remarks>
+        /// Forces are accumulated on to each body, and the accumulators are zeroed after each time step.
+        ///
+        /// Force is applied at body's center of mass
+        /// </remarks>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="fx">A  dReal</param>
+        /// <param name="fy">A  dReal</param>
+        /// <param name="fz">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyAddTorque(dBodyID body, dReal fx, dReal fy, dReal fz);
+
+        /// <summary>
+        /// Add force to a body using relative coordinates.
+        ///
+        /// This function takes a force vector that is relative to the body's own frame of reference.
+        /// </summary>
+        /// <remarks>
+        /// Forces are accumulated on to each body, and the accumulators are zeroed after each time step.
+        ///
+        /// Force is applied at body's center of mass
+        /// </remarks>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="fx">A  dReal</param>
+        /// <param name="fy">A  dReal</param>
+        /// <param name="fz">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyAddRelForce(dBodyID body, dReal fx, dReal fy, dReal fz);
+
+        /// <summary>
+        /// Add torque to a body using relative coordinates.
+        ///
+        /// This function takes a force vector that is relative to the body's own frame of reference.
+        /// </summary>
+        /// <remarks>
+        /// Forces are accumulated on to each body, and the accumulators are zeroed after each time step.
+        ///
+        /// Force is applied at body's center of mass
+        /// </remarks>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="fx">A  dReal</param>
+        /// <param name="fy">A  dReal</param>
+        /// <param name="fz">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyAddRelTorque(dBodyID body, dReal fx, dReal fy, dReal fz);
+
+        /// <summary>
+        /// Add force to a body using absolute coordinates at specified absolute position.
+        ///
+        /// The supplied position vector specifies the point at which the force is supplied in global coordinates.
+        /// </summary>
+        /// <remarks>
+        /// Forces are accumulated on to each body, and the accumulators are zeroed after each time step.
+        ///
+        /// Force is applied at specified point.
+        /// </remarks>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="fx">A  dReal</param>
+        /// <param name="fy">A  dReal</param>
+        /// <param name="fz">A  dReal</param>
+        /// <param name="px">A  dReal</param>
+        /// <param name="py">A  dReal</param>
+        /// <param name="pz">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyAddForceAtPos(dBodyID body, dReal fx, dReal fy, dReal fz,
+            dReal px, dReal py, dReal pz);
+        /// <summary>
+        /// Add force to a body using absolute coordinates at specified relative position.
+        ///
+        /// The supplied position vector specifies the point at which the force is supplied in body-relative coordinates.
+        /// </summary>
+        /// <remarks>
+        /// Forces are accumulated on to each body, and the accumulators are zeroed after each time step.
+        ///
+        /// Force is applied at specified point.
+        /// </remarks>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="fx">A  dReal</param>
+        /// <param name="fy">A  dReal</param>
+        /// <param name="fz">A  dReal</param>
+        /// <param name="px">A  dReal</param>
+        /// <param name="py">A  dReal</param>
+        /// <param name="pz">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyAddForceAtRelPos(dBodyID body, dReal fx, dReal fy, dReal fz,
+            dReal px, dReal py, dReal pz);
+
+        /// <summary>
+        /// Add force to a body using body-relative coordinates at specified absolute position.
+        ///
+        /// The supplied position vector specifies the point at which the force is supplied in global coordinates.
+        /// </summary>
+        /// <remarks>
+        /// Forces are accumulated on to each body, and the accumulators are zeroed after each time step.
+        ///
+        /// Force is applied at specified point.
+        /// </remarks>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="fx">A  dReal</param>
+        /// <param name="fy">A  dReal</param>
+        /// <param name="fz">A  dReal</param>
+        /// <param name="px">A  dReal</param>
+        /// <param name="py">A  dReal</param>
+        /// <param name="pz">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyAddRelForceAtPos(dBodyID body, dReal fx, dReal fy, dReal fz,
+            dReal px, dReal py, dReal pz);
+
+        /// <summary>
+        /// Add force to a body using body-relative coordinates at specified relative position.
+        ///
+        /// The supplied position vector specifies the point at which the force is supplied in body-relative coordinates.
+        /// </summary>
+        /// <remarks>
+        /// Forces are accumulated on to each body, and the accumulators are zeroed after each time step.
+        ///
+        /// Force is applied at specified point.
+        /// </remarks>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="fx">A  dReal</param>
+        /// <param name="fy">A  dReal</param>
+        /// <param name="fz">A  dReal</param>
+        /// <param name="px">A  dReal</param>
+        /// <param name="py">A  dReal</param>
+        /// <param name="pz">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyAddRelForceAtRelPos(dBodyID body, dReal fx, dReal fy, dReal fz,
+            dReal px, dReal py, dReal pz);
+
+        [DllImport(ODE_NATIVE_LIBRARY, EntryPoint = "dBodyGetForce")]
+        private extern unsafe static dReal* dBodyGetForce_(dBodyID body);
+        /// <summary>
+        /// Return the current accumulated force on the body.
+        /// </summary>
+        /// <remarks>
+        /// In ODE, the returned values are pointers to internal data structures, so the vectors are only valid until any
+        /// changes are made to the rigid body system.
+        /// </remarks>
+        /// <returns>A dVector3</returns>
+        /// <param name="body">A  dBodyID</param>
+        public static dVector3 dBodyGetForce(dBodyID body)
+        {
+            unsafe
+            {
+                dVector3* v = (dVector3*)dBodyGetForce_(body);
+                return *v;
+            }
+        }
+
+        [DllImport(ODE_NATIVE_LIBRARY, EntryPoint = "dBodyGetTorque")]
+        private extern unsafe static dReal* dBodyGetTorque_(dBodyID body);
+        /// <summary>
+        /// Return the current accumulated torque on the body.
+        /// </summary>
+        /// <remarks>
+        /// In ODE, the returned values are pointers to internal data structures, so the vectors are only valid until any
+        /// changes are made to the rigid body system.
+        /// </remarks>
+        /// <returns>A dVector3</returns>
+        /// <param name="body">A  dBodyID</param>
+        public static dVector3 dBodyGetTorque(dBodyID body)
+        {
+            unsafe
+            {
+                dVector3* v = (dVector3*)dBodyGetTorque_(body);
+                return *v;
+            }
+        }
+
+        /// <summary>
+        /// Set the body force accumulation vector.
+        /// This is mostly useful to zero the force and torque for deactivated bodies before they are reactivated,
+        /// in the case where the force-adding functions were called on them while they were deactivated.
+        /// </summary>
+        /// <param name="b">A  dBodyID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetForce(dBodyID b, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set the body torque accumulation vector.
+        /// This is mostly useful to zero the force and torque for deactivated bodies before they are reactivated,
+        /// in the case where the force-adding functions were called on them while they were deactivated.
+        /// </summary>
+        /// <param name="b">A  dBodyID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetTorque(dBodyID b, dReal x, dReal y, dReal z);
+        #endregion Body mass and force functions
+        #region Body utility functions
+        /// <summary>
+        /// Take a point on a body (px,py,pz) and return that point's position in body-relative coordinates (in result).
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="px">A  dReal</param>
+        /// <param name="py">A  dReal</param>
+        /// <param name="pz">A  dReal</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyGetRelPointPos(dBodyID body, dReal px, dReal py, dReal pz,
+            ref dVector3 result);
+
+        /// <summary>
+        /// Take a point on a body (px,py,pz) and return that point's velocity in body-relative coordinates (in result).
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="px">A  dReal</param>
+        /// <param name="py">A  dReal</param>
+        /// <param name="pz">A  dReal</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyGetRelPointVel(dBodyID body, dReal px, dReal py, dReal pz,
+            ref dVector3 result);
+
+        /// <summary>
+        /// Take a point on a body (px,py,pz) and return that point's position in absolute coordinates (in result).
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="px">A  dReal</param>
+        /// <param name="py">A  dReal</param>
+        /// <param name="pz">A  dReal</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyGetPointVel(dBodyID body, dReal px, dReal py, dReal pz,
+            ref dVector3 result);
+
+        /// <summary>
+        /// This is the inverse of dBodyGetRelPointPos.
+        /// It takes a point in global coordinates (x,y,z) and returns the point's position in body-relative
+        /// coordinates (result).
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="px">A  dReal</param>
+        /// <param name="py">A  dReal</param>
+        /// <param name="pz">A  dReal</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyGetPosRelPoint(dBodyID body, dReal px, dReal py, dReal pz,
+            ref dVector3 result);
+
+        /// <summary>
+        /// Given a vector expressed in the body coordinate system (x,y,z), rotate it to the world coordinate system (result).
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="px">A  dReal</param>
+        /// <param name="py">A  dReal</param>
+        /// <param name="pz">A  dReal</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyVectorToWorld(dBodyID body, dReal px, dReal py, dReal pz,
+            ref dVector3 result);
+
+        /// <summary>
+        /// Given a vector expressed in the world coordinate system (x,y,z), rotate it to the body coordinate system (result).
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="px">A  dReal</param>
+        /// <param name="py">A  dReal</param>
+        /// <param name="pz">A  dReal</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyVectorFromWorld(dBodyID body, dReal px, dReal py, dReal pz,
+            ref dVector3 result);
+        #endregion Body utility functions
+        #region Miscellaneous Body Functions
+        /// <summary>
+        /// Set the body's user-data pointer.
+        ///
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="data">An IntPtr</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetData(dBodyID body, /*void **/ IntPtr data);
+
+        /// <summary>
+        /// Get the body's user-data pointer.
+        /// </summary>
+        /// <returns>An IntPtr</returns>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static IntPtr dBodyGetData(dBodyID body);
+
+        /// <summary>
+        /// This function controls the way a body's orientation is updated at each time step. The mode argument can be:
+        ///
+        /// 	-	0: An ``infinitesimal'' orientation update is used. This is fast to compute, but it can occasionally
+        /// 		cause inaccuracies for bodies that are rotating at high speed, especially when those bodies are
+        /// 		joined to other bodies.
+        /// 		This is the default for every new body that is created.
+        ///
+        /// 	-	1: A ``finite'' orientation update is used. This is more costly to compute, but will be more
+        /// 		accurate for high speed rotations. Note however that high speed rotations can result in many
+        /// 		types of error in a simulation, and this mode will only fix one of those sources of error.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="mode">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetFiniteRotationMode(dBodyID body, int mode);
+
+        /// <summary>
+        /// Return the current finite rotation mode of a body (0 or 1).
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dBodyGetFiniteRotationMode(dBodyID body);
+
+        /// <summary>
+        /// This sets the finite rotation axis for a body.
+        /// This axis only has meaning when the finite rotation mode is set (see dBodySetFiniteRotationMode).
+        ///
+        /// If this axis is zero (0,0,0), full finite rotations are performed on the body.
+        ///
+        /// If this axis is nonzero, the body is rotated by performing a partial finite rotation along the axis direction
+        /// followed by an infinitesimal rotation along an orthogonal direction.
+        ///
+        /// This can be useful to alleviate certain sources of error caused by quickly spinning bodies. For example, if a
+        /// car wheel is rotating at high speed you can call this function with the wheel's hinge axis as the argument to
+        /// try and improve its behavior.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetFiniteRotationAxis(dBodyID body, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Return the current finite rotation axis of a body.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyGetFiniteRotationAxis(dBodyID body, ref dVector3 result);
+
+        /// <summary>
+        /// Return the number of joints that are attached to this body.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="b">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dBodyGetNumJoints(dBodyID b);
+
+        /// <summary>
+        /// Return a joint attached to this body, given by index.
+        ///
+        /// Valid indexes are 0 to n-1 where n is the value returned by dBodyGetNumJoints.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="index">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dBodyGetJoint(dBodyID body, int index);
+
+        /// <summary>
+        /// Set whether the body is influenced by the world's gravity or not.
+        ///
+        /// If mode is nonzero it is, if mode is zero, it isn't.
+        ///
+        /// Newly created bodies are always influenced by the world's gravity.
+        /// </summary>
+        /// <param name="b">A  dBodyID</param>
+        /// <param name="mode">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetGravityMode(dBodyID b, int mode);
+
+        /// <summary>
+        /// Get whether the body is influenced by the world's gravity or not.
+        ///
+        /// If mode is nonzero it is, if mode is zero, it isn't.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="b">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dBodyGetGravityMode(dBodyID b);
+        #endregion Miscellaneous Body Functions
+        #region Body automatic enabling and disabling functions
+        // Every body can be enabled or disabled.
+        // Enabled bodies participate in the simulation, while disabled bodies are
+        // turned off and do not get updated during a simulation step.
+        // New bodies are always created in the enabled state.
+        // A disabled body that is connected through a joint to an enabled body will
+        // be automatically re-enabled at the next simulation step.
+        // Disabled bodies do not consume CPU time, therefore to speed up the
+        // simulation bodies should be disabled when they come to rest.
+        // This can be done automatically with the auto-disable feature.
+        // If a body has its auto-disable flag turned on, it will automatically
+        // disable itself when
+        // 	1. 	it has been idle for a given number of simulation steps.
+        // 	2. 	it has also been idle for a given amount of simulation time.
+        //
+        // A body is considered to be idle when the magnitudes of both its linear
+        // velocity and angular velocity are below given thresholds.
+        // Thus, every body has five auto-disable parameters:
+        // 	an enabled flag, a idle step count, an idle time, and linear/angular velocity thresholds.
+        // Newly created bodies get these parameters from world.
+        // The following functions set and get the enable/disable parameters of a body.
+
+        /// <summary>
+        /// Manually enable a body.
+        /// Note that a disabled body that is connected through a joint to an enabled body
+        /// will be automatically re-enabled at the next simulation step.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyEnable(dBodyID body);
+
+        /// <summary>
+        /// Manually disable a body.
+        /// Note that a disabled body that is connected through a joint to an enabled body
+        /// will be automatically re-enabled at the next simulation step.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodyDisable(dBodyID body);
+
+        /// <summary>
+        /// Method dBodyIsEnabled
+        /// Return 1 if a body is currently enabled or 0 if it is disabled.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dBodyIsEnabled(dBodyID body);
+
+        /// <summary>
+        /// Method dBodySetAutoDisableFlag
+        /// Set the auto-disable flag of a body.
+        ///
+        /// If the do_auto_disable is nonzero the body will be automatically disabled when it has been idle for long enough.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="do_auto_disable">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetAutoDisableFlag(dBodyID body, int do_auto_disable);
+
+        /// <summary>
+        /// Method dBodyGetAutoDisableFlag
+        /// Get the auto-disable flag of a body.
+        ///
+        /// If the do_auto_disable is nonzero the body will be automatically disabled when it has been idle for long enough.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dBodyGetAutoDisableFlag(dBodyID body);
+
+        /// <summary>
+        /// Method dBodySetAutoDisableLinearThreshold
+        /// Set a body's linear velocity threshold for automatic disabling.
+        ///
+        /// The body's linear velocity magnitude must be less than this threshold for
+        /// it to be considered idle.
+        ///
+        /// Set the threshold to dInfinity to prevent the linear velocity from being considered.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="linear_threshold">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetAutoDisableLinearThreshold(dBodyID body, dReal linear_threshold);
+
+        /// <summary>
+        /// Method dBodyGetAutoDisableLinearThreshold
+        /// Get a body's linear velocity threshold for automatic disabling.
+        ///
+        /// The body's linear velocity magnitude must be less than this threshold for
+        /// it to be considered idle.
+        ///
+        /// Set the threshold to dInfinity to prevent the linear velocity from being considered.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dBodyGetAutoDisableLinearThreshold(dBodyID body);
+
+        /// <summary>
+        /// Method dBodySetAutoDisableAngularThreshold
+        /// Set a body's angular velocity threshold for automatic disabling.
+        ///
+        /// The body's linear angular magnitude must be less than this threshold for
+        /// it to be considered idle.
+        ///
+        /// Set the threshold to dInfinity to prevent the angular velocity from being considered.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="angular_threshold">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetAutoDisableAngularThreshold(dBodyID body, dReal angular_threshold);
+
+        /// <summary>
+        /// Method dBodyGetAutoDisableAngularThreshold
+        /// Get a body's angular velocity threshold for automatic disabling.
+        ///
+        /// The body's linear angular magnitude must be less than this threshold for
+        /// it to be considered idle.
+        ///
+        /// Set the threshold to dInfinity to prevent the angular velocity from being considered.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dBodyGetAutoDisableAngularThreshold(dBodyID body);
+
+        /// <summary>
+        /// Method dBodySetAutoDisableSteps
+        /// Set the number of simulation steps that a body must be idle before
+        /// it is automatically disabled.
+        ///
+        /// Set this to zero to disable consideration of the number of steps.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="steps">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetAutoDisableSteps(dBodyID body, int steps);
+
+        /// <summary>
+        /// Method dBodyGetAutoDisableSteps
+        /// Get the number of simulation steps that a body must be idle before
+        /// it is automatically disabled.
+        ///
+        ///  If zero, consideration of the number of steps is disabled.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dBodyGetAutoDisableSteps(dBodyID body);
+
+        /// <summary>
+        /// Method dBodySetAutoDisableTime
+        /// Set the amount of simulation time that a body must be idle before
+        /// it is automatically disabled.
+        ///
+        /// Set this to zero to disable consideration of the amount of simulation time.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        /// <param name="time">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetAutoDisableTime(dBodyID body, dReal time);
+
+        /// <summary>
+        /// Method dBodyGetAutoDisableTime
+        /// Get the amount of simulation time that a body must be idle before
+        /// it is automatically disabled.
+        ///
+        /// If zero, consideration of the amount of simulation time is disabled.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dBodyGetAutoDisableTime(dBodyID body);
+
+        /// <summary>
+        /// Method dBodySetAutoDisableDefaults
+        /// Set the auto-disable parameters of the body to the default parameters
+        /// that have been set on the world.
+        /// </summary>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dBodySetAutoDisableDefaults(dBodyID body);
+        #endregion Body automatic enabling and disabling functions
+        #endregion Body functions
+
+        #region Joint functions
+        #region Joint create and destroy functions
+        /// <summary>
+        /// Create a new ball joint.
+        ///
+        /// The joint is initially in "limbo" (i.e. it has no effect on the simulation)
+        /// because it does not connect to any bodies.
+        ///
+        /// The joint group ID is 0 to allocate the joint normally.
+        /// If it is nonzero the joint is allocated in the given joint group.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dJointCreateBall(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// Create a new hinge joint.
+        ///
+        /// The joint is initially in "limbo" (i.e. it has no effect on the simulation)
+        /// because it does not connect to any bodies.
+        ///
+        /// The joint group ID is 0 to allocate the joint normally.
+        /// If it is nonzero the joint is allocated in the given joint group.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dJointCreateHinge(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// Create a new slider joint.
+        ///
+        /// The joint is initially in "limbo" (i.e. it has no effect on the simulation)
+        /// because it does not connect to any bodies.
+        ///
+        /// The joint group ID is 0 to allocate the joint normally.
+        /// If it is nonzero the joint is allocated in the given joint group.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dJointCreateSlider(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// Create a new contact joint.
+        ///
+        /// The joint is initially in "limbo" (i.e. it has no effect on the simulation)
+        /// because it does not connect to any bodies.
+        ///
+        /// The joint group ID is 0 to allocate the joint normally.
+        /// If it is nonzero the joint is allocated in the given joint group.
+        ///
+        /// The contact joint will be initialized with the given dContact structure.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="group">A  dJointGroupID</param>
+        /// <param name="contact"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dJointCreateContact(dWorldID world, dJointGroupID group, ref dContact contact);
+
+        /// <summary>
+        /// Create a new hinge-2 joint.
+        ///
+        /// The joint is initially in "limbo" (i.e. it has no effect on the simulation)
+        /// because it does not connect to any bodies.
+        ///
+        /// The joint group ID is 0 to allocate the joint normally.
+        /// If it is nonzero the joint is allocated in the given joint group.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dJointCreateHinge2(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// Create a new universal joint.
+        ///
+        /// The joint is initially in "limbo" (i.e. it has no effect on the simulation)
+        /// because it does not connect to any bodies.
+        ///
+        /// The joint group ID is 0 to allocate the joint normally.
+        /// If it is nonzero the joint is allocated in the given joint group.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dJointCreateUniversal(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// Create a new fixed joint.
+        ///
+        /// The joint is initially in "limbo" (i.e. it has no effect on the simulation)
+        /// because it does not connect to any bodies.
+        ///
+        /// The joint group ID is 0 to allocate the joint normally.
+        /// If it is nonzero the joint is allocated in the given joint group.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dJointCreateFixed(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// Create a new "null" joint.
+        ///
+        /// There's no discussion of this in the docs or sourcecode.
+        /// The only mention is the following entry in the ODE Changelog:
+        ///
+        /// 	10/11/01 russ
+        ///
+        /// 	* joints can now return m=0 to be "inactive". added a "null" joint
+        /// 	to test this.
+        ///
+        /// This suggests a null joint is mainly useful for testing and should probably
+        /// be ignored by users of the bindings.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dJointCreateNull(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// Create a new angular motor joint.
+        ///
+        /// The joint is initially in "limbo" (i.e. it has no effect on the simulation)
+        /// because it does not connect to any bodies.
+        ///
+        /// The joint group ID is 0 to allocate the joint normally.
+        /// If it is nonzero the joint is allocated in the given joint group.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dJointCreateAMotor(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// Create a new L-motor joint.
+        ///
+        /// The joint is initially in "limbo" (i.e. it has no effect on the simulation)
+        /// because it does not connect to any bodies.
+        ///
+        /// The joint group ID is 0 to allocate the joint normally.
+        /// If it is nonzero the joint is allocated in the given joint group.
+        /// </summary>
+        /// <returns>A dJointID</returns>
+        /// <param name="world">A  dWorldID</param>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dJointCreateLMotor(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// Destroy a joint, disconnecting it from its attached bodies and removing it from the world.
+        /// However, if the joint is a member of a group then this function has no effect - to destroy
+        /// that joint the group must be emptied or destroyed.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointDestroy(dJointID joint);
+
+        /// <summary>
+        /// Create a joint group.
+        ///
+        /// NOTE: 	The max_size argument is no longer used and should be set to 0.
+        /// 		It is kept for backwards compatibility.
+        /// </summary>
+        /// <returns>A dJointGroupID</returns>
+        /// <param name="max_size">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointGroupID dJointGroupCreate(int max_size);
+
+        /// <summary>
+        /// Destroy a joint group. All joints in the joint group will be destroyed.
+        /// </summary>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGroupDestroy(dJointGroupID group);
+
+        /// <summary>
+        /// Empty a joint group.
+        /// All joints in the joint group will be destroyed, but the joint group itself will not be destroyed.
+        /// </summary>
+        /// <param name="group">A  dJointGroupID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGroupEmpty(dJointGroupID group);
+        #endregion Joint create and destroy functions
+        #region Joint miscellaneous functions
+        /// <summary>
+        /// Attach the joint to some new bodies.
+        ///
+        /// If the joint is already attached, it will be detached from the old bodies first.
+        /// To attach this joint to only one body, set body1 or body2 to zero - a zero body
+        /// refers to the static environment.
+        /// Setting both bodies to zero puts the joint into "limbo", i.e. it will have no
+        /// effect on the simulation.
+        /// Some joints, like hinge-2 need to be attached to two bodies to work.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="body1">A  dBodyID</param>
+        /// <param name="body2">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointAttach(dJointID joint, dBodyID body1, dBodyID body2);
+
+        /// <summary>
+        /// Set the joint's user-data pointer.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="data">An IntPtr</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetData(dJointID joint, IntPtr data);
+
+        /// <summary>
+        /// Get the joint's user-data pointer.
+        /// </summary>
+        /// <returns>An IntPtr</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static IntPtr dJointGetData(dJointID joint);
+
+        /// <summary>
+        /// Get the joint's type.
+        ///
+        /// The available joint types are:
+        /// 	dJointTypeBall:  		A ball-and-socket joint.
+        /// 	dJointTypeHinge:  		A hinge joint.
+        /// 	dJointTypeSlider:  		A slider joint.
+        /// 	dJointTypeContact:		A contact joint.
+        /// 	dJointTypeUniversal:	A universal joint.
+        /// 	dJointTypeHinge2:		A hinge-2 joint.
+        /// 	dJointTypeFixed:		A fixed joint.
+        /// 	dJointTypeAMotor:		An angular motor joint.
+        ///		dJointTypeLMotor:		An L-motor joint.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dJointGetType(dJointID joint);
+
+        /// <summary>
+        /// Return the bodies that this joint connects.
+        ///
+        /// If index is 0 the ``first'' body will be returned,
+        /// corresponding to the body1 argument of dJointAttach.
+        /// If index is 1 the ``second'' body will be returned,
+        /// corresponding to the body2 argument of dJointAttach.
+        ///
+        /// If one of these returned body IDs is zero, the joint
+        /// connects the other body to the static environment.
+        ///
+        /// If both body IDs are zero, the joint is in ``limbo'' and has no effect on the simulation.
+        /// </summary>
+        /// <returns>A dBodyID</returns>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="index">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dBodyID dJointGetBody(dJointID joint, int index);
+
+        /// <summary>
+        /// Pass a dJointFeedback structure to the joint to collect information about
+        /// the forces applied by each joint.
+        ///
+        /// Notes from the ODE docs:
+        /// 	During the world time step, the forces that are applied by each joint are computed.
+        /// 	These forces are added directly to the joined bodies, and the user normally has no
+        /// 	way of telling which joint contributed how much force.
+        ///		If this information is desired then the user can allocate a dJointFeedback structure
+        /// 	and pass its pointer to the dJointSetFeedback() function.
+        ///
+        /// 	The feedback information structure is defined as follows (NOTE: C# version listed here):
+        /// 			public struct dJointFeedback {
+        ///					public dVector3 f1;		/* force that joint applies to body 1  */
+        ///					public dVector3 t1;		/* torque that joint applies to body 1 */
+        ///					public dVector3 f2;		/* force that joint applies to body 2  */
+        ///					public dVector3 t2;		/* torque that joint applies to body 2 */
+        ///				};
+        ///		During the time step any feedback structures that are attached to joints will be
+        /// 	filled in with the joint's force and torque information.
+        ///
+        /// 	The dJointGetFeedback() function returns the current feedback structure pointer,
+        /// 	or 0 if none is used (this is the default).
+        ///
+        /// 	dJointSetFeedback() can be passed 0 to disable feedback for that joint.
+        ///
+        /// 	TODO: Will passing 0 work?  Seems as if something else needs to be passed here
+        ///
+        ///		Now for some API design notes. It might seem strange to require that users perform the
+        /// 	allocation of these structures. Why not just store the data statically in each joint?
+        /// 	The reason is that not all users will use the feedback information, and even when it
+        /// 	is used not all joints will need it. It will waste memory to store it statically,
+        /// 	especially as this structure could grow to store a lot of extra information in the future.
+        ///		Why not have ODE allocate the structure itself, at the user's request? The reason is
+        /// 	that contact joints (which are created and destroyed every time step) would require a
+        /// 	lot of time to be spent in memory allocation if feedback is required. Letting the user
+        /// 	do the allocation means that a better allocation strategy can be provided, e.g simply
+        /// 	allocating them out of a fixed array.
+        ///
+        ///		The alternative to this API is to have a joint-force callback. This would work of course,
+        /// 	but it has a few problems. First, callbacks tend to pollute APIs and sometimes require
+        /// 	the user to go through unnatural contortions to get the data to the right place.
+        /// 	Second, this would expose ODE to being changed in the middle of a step (which would have
+        /// 	bad consequences), and there would have to be some kind of guard against this or a debugging
+        /// 	check for it - which would complicate things.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="feedback">A  dJointFeedback</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetFeedback(dJointID joint, ref dJointFeedback feedback);
+
+        [DllImport(ODE_NATIVE_LIBRARY, EntryPoint = "dJointGetFeedback")]
+        private extern unsafe static dJointFeedback* dJointGetFeedback_(dJointID joint);
+        /// <summary>
+        /// Get the jointfeedback structure from the joint to get information about
+        /// the forces applied by each joint.
+        ///
+        /// 	The feedback information structure is defined as follows (NOTE: C# version listed here):
+        /// 			public struct dJointFeedback {
+        ///					public dVector3 f1;		/* force that joint applies to body 1  */
+        ///					public dVector3 t1;		/* torque that joint applies to body 1 */
+        ///					public dVector3 f2;		/* force that joint applies to body 2  */
+        ///					public dVector3 t2;		/* torque that joint applies to body 2 */
+        ///				};
+        ///
+        /// 	The dJointGetFeedback() function returns the current feedback structure pointer,
+        /// 	or 0 if none is used (this is the default).
+        /// 	TODO: Will passing 0 work or does something special have to be done?
+        /// </summary>
+        /// <returns>A dJointFeedback</returns>
+        /// <param name="body">A  dBodyID</param>
+        public static dJointFeedback dJointGetFeedback(dBodyID body)
+        {
+            unsafe
+            {
+                dJointFeedback* v = (dJointFeedback*)dJointGetFeedback_(body);
+                return *v;
+            }
+        }
+
+        /// <summary>
+        /// Undocumented in ODE.
+        ///
+        /// Seems to return the first joint connecting the two specified bodies
+        /// </summary>
+        /// <param name="body1">the first body to query</param>
+        /// <param name="body2">the second body to query</param>
+        /// <returns>the id of the first joint found connecting the bodies</returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dJointID dConnectingJoint(dBodyID body1, dBodyID body2);
+
+        /// <summary>
+        /// Undocumented in ODE.
+        ///
+        /// Seems to return a list of the joints connecting the two specified bodies
+        /// </summary>
+        /// <param name="body1">the first body to query</param>
+        /// <param name="body2">the second body to query</param>
+        /// <param name="connectingJoints">An array of dJointID listing the joints connecting the specified bodies</param>
+        /// <returns>an int specifying the number of connecting joints found</returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dConnectingJointList(dBodyID body1, dBodyID body2, out dJointID[] connectingJoints);
+
+        /// <summary>
+        /// Test if the two specified bodies are connected by a joint.
+        ///
+        /// Return 1 if yes, otherwise return 0
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="body1">A  dBodyID</param>
+        /// <param name="body2">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dAreConnected(dBodyID body1, dBodyID body2);
+
+        /// <summary>
+        /// Return 1 if the two bodies are connected together by a joint that does not
+        /// have type joint_type, otherwise return 0.
+        /// joint_type is a dJointTypeXXX constant.
+        /// This is useful for deciding whether to add contact joints between two bodies:
+        /// if they are already connected by non-contact joints then it may not be
+        /// appropriate to add contacts, however it is okay to add more contact between
+        /// bodies that already have contacts.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="body1">A  dBodyID</param>
+        /// <param name="body2">A  dBodyID</param>
+        /// <param name="joint_type">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dAreConnectedExcluding(dBodyID body1, dBodyID body2, int joint_type);
+        #endregion Joint miscellaneous functions
+        #region Joint parameter setting functions
+        #region Ball Joint functions
+        /// <summary>
+        /// Method dJointSetBallAnchor
+        /// Set the joint anchor point.
+        /// The joint will try to keep this point on each body together.
+        /// The input is specified in world coordinates.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetBallAnchor(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Method dJointSetBallAnchor2
+        /// Set the joint anchor point.
+        /// The joint will try to keep this point on each body together.
+        /// The input is specified in world coordinates.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetBallAnchor2(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Method dJointGetBallAnchor
+        /// Get the joint anchor point on body 1, in world coordinates.
+        /// If the joint is perfectly satisfied, this will be the same as the point on body 2.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetBallAnchor(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Method dJointGetBallAnchor2
+        /// Get the joint anchor point on body 2, in world coordinates.
+        /// You can think of a ball and socket joint as trying to keep the
+        /// result of dJointGetBallAnchor() and dJointGetBallAnchor2() the same.
+        /// If the joint is perfectly satisfied, this function will return the
+        /// same value as dJointGetBallAnchor to within roundoff errors.
+        /// dJointGetBallAnchor2 can be used, along with dJointGetBallAnchor,
+        /// to see how far the joint has come apart.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetBallAnchor2(dJointID joint, ref dVector3 result);
+        #endregion Ball Joint functions
+        #region Hinge Joint functions
+        /// <summary>
+        /// Set hinge anchor parameters
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetHingeAnchor(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set hinge anchor parameters
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        /// <param name="ax">A dReal</param>
+        /// <param name="ay">A dReal</param>
+        /// <param name="az">A dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetHingeAnchorDelta(dJointID joint, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az);
+
+        /// <summary>
+        /// Set hinge axis parameters
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetHingeAxis(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Get the joint anchor point, in world coordinates.
+        /// This returns the point on body 1.
+        /// If the joint is perfectly satisfied, this will be the same as the point on body 2.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetHingeAnchor(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get the joint anchor point, in world coordinates.
+        /// This returns the point on body 2.
+        /// If the joint is perfectly satisfied, this will return the same value as dJointGetHingeAnchor.
+        /// If not, this value will be slightly different.
+        /// This can be used, for example, to see how far the joint has come apart.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetHingeAnchor2(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get the hinge axis parameter for the joint.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetHingeAxis(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get the hinge angle of the joint.
+        /// The angle is measured between the two bodies, or between the body
+        /// and the static environment.
+        /// The angle will be between -pi..pi.
+        /// When the hinge anchor or axis is set, the current position of the
+        /// attached bodies is examined and that position will be the zero angle.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetHingeAngle(dJointID joint);
+
+        /// <summary>
+        /// Get the time derivative of the hinge angle of the joint
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetHingeAngleRate(dJointID joint);
+
+        /// <summary>
+        /// Set limit/motor parameters for a hinge joint
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="parameter">An int</param>
+        /// <param name="value">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetHingeParam(dJointID joint, dJointParams parameter, dReal value);
+
+        /// <summary>
+        /// Get limit/motor parameters for a hinge joint
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="parameter">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetHingeParam(dJointID joint, dJointParams parameter);
+
+        /// <summary>
+        /// Applies the torque about the hinge axis.
+        ///
+        /// That is, it applies a torque with magnitude torque, in the direction of
+        /// the hinge axis, to body 1, and with the same magnitude but in opposite
+        /// direction to body 2.
+        /// </summary>
+        /// <remarks>
+        /// This function is just a wrapper for dBodyAddTorque
+        /// </remarks>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="torque">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointAddHingeTorque(dJointID joint, dReal torque);
+        #endregion Hinge Joint functions
+        #region Slider Joint functions
+        /// <summary>
+        /// Set the slider axis parameter.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetSliderAxis(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set the slider axis delta.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        /// <param name="ax">A  dReal</param>
+        /// <param name="ay">A  dReal</param>
+        /// <param name="az">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetSliderAxisDelta(dJointID joint, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az);
+
+        /// <summary>
+        /// Get the slider axis parameter
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetSliderAxis(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get the slider linear position (i.e. the slider's ``extension'')
+        ///
+        /// When the axis is set, the current position of the attached bodies
+        /// is examined and that position will be the zero position.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetSliderPosition(dJointID joint);
+
+        /// <summary>
+        /// Get the time derivative of the slider linear position.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetSliderPositionRate(dJointID joint);
+
+        /// <summary>
+        /// Set limit/motor parameters for a slider joint
+        ///
+        /// See http://ode.org/ode-latest-userguide.html#sec_7_5_1 for details
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="parameter">An int</param>
+        /// <param name="value">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetSliderParam(dJointID joint, dJointParams parameter, dReal value);
+
+        /// <summary>
+        /// Get limit/motor parameters for a slider joint
+        ///
+        /// See http://ode.org/ode-latest-userguide.html#sec_7_5_1 for details
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="parameter">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetSliderParam(dJointID joint, dJointParams parameter);
+
+        /// <summary>
+        /// Applies the given force in the slider's direction.
+        /// That is, it applies a force with magnitude force, in the direction
+        /// slider's axis, to body1, and with the same magnitude but opposite
+        /// direction to body2.
+        /// </summary>
+        /// <remarks>
+        /// This function is just a wrapper for dBodyAddForce.
+        /// </remarks>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="force">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointAddSliderForce(dJointID joint, dReal force);
+        #endregion Slider Joint functions
+        #region Hinge-2 Joint functions
+        /// <summary>
+        /// Set hinge-2 anchor parameters
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetHinge2Anchor(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set hinge-2 axis 1 parameters
+        ///
+        /// Axis 1 and axis 2 must not lie on the same line
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetHinge2Axis1(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set hinge-2 axis 2 parameters
+        ///
+        /// Axis 1 and axis 2 must not lie on the same line
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetHinge2Axis2(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Get the joint anchor point, in world coordinates.
+        /// This returns the point on body 1.
+        /// If the joint is perfectly satisfied, this will be the same as the point on body 2.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetHinge2Anchor(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get the joint anchor point, in world coordinates.
+        /// This returns the point on body 2.
+        /// If the joint is perfectly satisfied, this will return the same value as dJointGetHinge2Anchor.
+        /// If not, this value will be slightly different.
+        /// This can be used, for example, to see how far the joint has come apart.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetHinge2Anchor2(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get hinge-2 axis 1 parameters.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetHinge2Axis1(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get hinge-2 axis 2 parameters.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetHinge2Axis2(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get the hinge-2 angles (around axis 1 and axis 2)
+        ///
+        /// When the anchor or axis is set, the current position of the attached bodies
+        /// is examined and that position will be the zero angle.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetHinge2Angle1(dJointID joint);
+
+        /// <summary>
+        /// Get the time derivative of hinge-2 angle 1
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetHinge2Angle1Rate(dJointID joint);
+
+        /// <summary>
+        /// Get the time derivative of hinge-2 angle 2
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetHinge2Angle2Rate(dJointID joint);
+
+        /// <summary>
+        /// Set limit/motor parameters for a hinge-2 joint
+        ///
+        /// See http://ode.org/ode-latest-userguide.html#sec_7_5_1 for details
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="parameter">An int</param>
+        /// <param name="value">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetHinge2Param(dJointID joint, dJointParams parameter, dReal value);
+
+        /// <summary>
+        /// Get limit/motor parameters for a hinge-2 joint
+        ///
+        /// See http://ode.org/ode-latest-userguide.html#sec_7_5_1 for details
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="parameter">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetHinge2Param(dJointID joint, dJointParams parameter);
+
+        /// <summary>
+        /// Applies torque1 about the hinge2's axis 1, and torque2 about the hinge2's axis 2.
+        /// This function is just a wrapper for dBodyAddTorque.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="torque1">A  dReal</param>
+        /// <param name="torque2">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointAddHinge2Torques(dJointID joint, dReal torque1, dReal torque2);
+        #endregion Hinge-2 Joint functions
+        #region Universal Joint functions
+        /// <summary>
+        /// Set universal joint anchor parameters.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetUniversalAnchor(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set universal joint axis 1 parameters
+        ///
+        /// Axis 1 and axis 2 should be perpendicular to each other.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetUniversalAxis1(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set universal joint axis 2 parameters
+        ///
+        /// Axis 1 and axis 2 should be perpendicular to each other.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetUniversalAxis2(dJointID joint, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Get the joint anchor point, in world coordinates.
+        /// This returns the point on body 1.
+        /// If the joint is perfectly satisfied, this will be the same as the point on body 2.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetUniversalAnchor(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get the joint anchor point, in world coordinates.
+        /// This returns the point on body 2.
+        /// You can think of the ball and socket part of a universal joint as trying
+        /// to keep the result of dJointGetBallAnchor() and dJointGetBallAnchor2() the same.
+        /// If the joint is perfectly satisfied, this function will return the same value as
+        /// dJointGetUniversalAnchor to within roundoff errors.
+        /// dJointGetUniversalAnchor2 can be used, along with dJointGetUniversalAnchor, to
+        /// see how far the joint has come apart.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetUniversalAnchor2(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get parameters for universal joint axis 1
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetUniversalAxis1(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Get parameters for universal joint axis 2
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetUniversalAxis2(dJointID joint, ref dVector3 result);
+
+        /// <summary>
+        /// Set limit/motor parameters for a universal joint
+        ///
+        /// See http://ode.org/ode-latest-userguide.html#sec_7_5_1 for details
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="parameter">An int</param>
+        /// <param name="value">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetUniversalParam(dJointID joint, dJointParams parameter, dReal value);
+
+        /// <summary>
+        /// Get limit/motor parameters for a universal joint
+        ///
+        /// See http://ode.org/ode-latest-userguide.html#sec_7_5_1 for details
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="parameter">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetUniversalParam(dJointID joint, dJointParams parameter);
+
+        /// <summary>
+        /// Applies torque1 about the universal's axis 1, and torque2 about the universal's axis 2.
+        /// </summary>
+        /// <remarks>
+        /// This function is just a wrapper for dBodyAddTorque.
+        /// </remarks>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="torque1">A  dReal</param>
+        /// <param name="torque2">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointAddUniversalTorques(dJointID joint, dReal torque1, dReal torque2);
+
+        // TODO: Document this - not found in ode docs
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="joint"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetUniversalAngle1(dJointID joint);
+
+        // TODO: Document this - not found in ode docs
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="joint"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetUniversalAngle2(dJointID joint);
+
+        // TODO: Document this - not found in ode docs
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="joint"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetUniversalAngle1Rate(dJointID joint);
+
+        // TODO: Document this - not found in ode docs
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="joint"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetUniversalAngle2Rate(dJointID joint);
+        #endregion Universal Joint functions
+        #region Fixed Joint functions
+        /// <summary>
+        /// Call this on the fixed joint after it has been attached to remember the current desired
+        /// relative offset and desired relative rotation between the bodies.
+        /// </summary>
+        /// <remarks>
+        /// The fixed joint maintains a fixed relative position and orientation between two bodies,
+        /// or between a body and the static environment.
+        /// Using this joint is almost never a good idea in practice, except when debugging.
+        /// If you need two bodies to be glued together it is better to represent that as a single body.
+        /// </remarks>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetFixed(dJointID joint);
+        #endregion Fixed Joint functions
+        #region Angular Motor Joint functions
+        /// <summary>
+        /// Set the angular motor mode.
+        /// The mode parameter must be one of the following constants:
+        /// 	dAMotorUser:	The AMotor axes and joint angle settings are entirely controlled by the user.
+        /// 					This is the default mode.
+        ///		dAMotorEuler:	Euler angles are automatically computed.
+        /// 					The axis a1 is also automatically computed.
+        /// 					The AMotor axes must be set correctly when in this mode, as described below.
+        /// 					When this mode is initially set the current relative orientations of the
+        /// 					bodies will correspond to all euler angles at zero.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="mode">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetAMotorMode(dJointID joint, int mode);
+
+        /// <summary>
+        /// Get the angular motor mode.
+        /// The mode parameter will be one of the following constants:
+        /// 	dAMotorUser:	The AMotor axes and joint angle settings are entirely controlled by the user.
+        /// 					This is the default mode.
+        ///		dAMotorEuler:	Euler angles are automatically computed.
+        /// 					The axis a1 is also automatically computed.
+        /// 					The AMotor axes must be set correctly when in this mode, as described below.
+        /// 					When this mode is initially set the current relative orientations of the
+        /// 					bodies will correspond to all euler angles at zero.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dJointGetAMotorMode(dJointID joint);
+
+        /// <summary>
+        /// Set the number of angular axes that will be controlled by the AMotor.
+        /// The argument num can range from 0 (which effectively deactivates the joint) to 3.
+        /// This is automatically set to 3 in dAMotorEuler mode.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="num">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetAMotorNumAxes(dJointID joint, int num);
+
+        /// <summary>
+        /// Get the number of angular axes controlled by the AMotor.
+        /// The number of axes can range from 0 (which effectively deactivates the joint) to 3.
+        /// This is automatically set to 3 in dAMotorEuler mode.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="joint">A  dJointID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dJointGetAMotorNumAxes(dJointID joint);
+
+        /// <summary>
+        /// Set the AMotor axes.
+        /// The anum argument selects the axis to change (0,1 or 2).
+        /// Each axis can have one of three ``relative orientation'' modes, selected by rel:
+        /// 	*	0: The axis is anchored to the global frame.
+        ///		*	1: The axis is anchored to the first body.
+        ///		*	2: The axis is anchored to the second body.
+        ///
+        /// The axis vector (x,y,z) is always specified in global coordinates regardless of the setting of rel.
+        ///
+        /// For dAMotorEuler mode:
+        /// 	* Only axes 0 and 2 need to be set. Axis 1 will be determined automatically at each time step.
+        ///		* Axes 0 and 2 must be perpendicular to each other.
+        ///		* Axis 0 must be anchored to the first body, axis 2 must be anchored to the second body.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="anum">An int</param>
+        /// <param name="rel">An int</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetAMotorAxis(dJointID joint, int anum, int rel,
+            dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Get the specified AMotor axis.
+        /// The anum argument selects the axis to get (0,1 or 2).
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="anum">An int</param>
+        /// <param name="result">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointGetAMotorAxis(dJointID joint, int anum, ref dVector3 result);
+
+        /// <summary>
+        /// Get the relative orientation mode for the specified axis
+        /// The anum argument selects the axis to get (0,1 or 2).
+        /// The return value will represent one of three ``relative orientation'' modes:
+        /// 	*	0: The axis is anchored to the global frame.
+        ///		*	1: The axis is anchored to the first body.
+        ///		*	2: The axis is anchored to the second body.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="anum">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dJointGetAMotorAxisRel(dJointID joint, int anum);
+
+        /// <summary>
+        /// Tell the AMotor what the current angle is along axis anum.
+        /// This function should only be called in dAMotorUser mode, because in this mode
+        /// the AMotor has no other way of knowing the joint angles.
+        /// The angle information is needed if stops have been set along the axis,
+        /// but it is not needed for axis motors.
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="anum">An int</param>
+        /// <param name="angle">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetAMotorAngle(dJointID joint, int anum, dReal angle);
+
+        /// <summary>
+        /// Return the current angle for axis anum.
+        /// In dAMotorUser mode this is simply the value that was set with dJointSetAMotorAngle.
+        /// In dAMotorEuler mode this is the corresponding euler angle.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="anum">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetAMotorAngle(dJointID joint, int anum);
+
+        /// <summary>
+        /// Return the current angle rate for axis anum.
+        /// In dAMotorUser mode this is always zero, as not enough information is available.
+        /// In dAMotorEuler mode this is the corresponding euler angle rate.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="anum">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetAMotorAngleRate(dJointID joint, int anum);
+
+        /// <summary>
+        /// Set limit/motor parameters for a an angular motor joint
+        ///
+        /// See http://ode.org/ode-latest-userguide.html#sec_7_5_1 for details
+        /// </summary>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="parameter">An int</param>
+        /// <param name="value">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointSetAMotorParam(dJointID joint, dJointParams parameter, dReal value);
+
+        /// <summary>
+        /// Get limit/motor parameters for a an angular motor joint
+        ///
+        /// See http://ode.org/ode-latest-userguide.html#sec_7_5_1 for details
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="parameter">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dJointGetAMotorParam(dJointID joint, dJointParams parameter);
+
+        /// <summary>
+        /// Applies torque0 about the AMotor's axis 0,
+        /// torque1 about the AMotor's axis 1,
+        /// and torque2 about the AMotor's axis 2.
+        /// If the motor has fewer than three axes, the higher torques are ignored.
+        /// </summary>
+        /// <remarks>
+        /// This function is just a wrapper for dBodyAddTorque.
+        /// </remarks>
+        /// <param name="joint">A  dJointID</param>
+        /// <param name="torque1">A  dReal</param>
+        /// <param name="torque2">A  dReal</param>
+        /// <param name="torque3">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dJointAddAMotorTorques(dJointID joint, dReal torque1, dReal torque2, dReal torque3);
+        #endregion Angular Motor Joint functions
+        #region L-Motor Joint functions
+        // <summary>TODO: Implement me</summary>
+        // dJointSetLMotorNumAxes(dJointID, int num);
+
+        // <summary>TODO: Implement me</summary>
+        // dJointSetLMotorAxis(dJointID, int anum, int rel, dReal x, dReal y, dReal z);
+
+        // <summary>TODO: Implement me</summary>
+        // dJointSetLMotorParam(dJointID, int anum, int rel, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="anum"></param>
+        /// <param name="rel"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="z"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointSetLMotorAxis(dJointID j, int anum, int rel, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="num"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointSetLMotorNumAxes(dJointID j, int num);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="parameter"></param>
+        /// <param name="value"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointSetLMotorParam(dJointID j, int parameter, dReal value);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="parameter"></param>
+        /// <param name="value"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void JointSetPlane2DAngleParam(dJointID j, int parameter, dReal value);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="parameter"></param>
+        /// <param name="value"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointSetPlane2DXParam(dJointID j, int parameter, dReal value);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="parameter"></param>
+        /// <param name="value"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointSetPlane2DYParam(dJointID j, int parameter, dReal value);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="z"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointSetPRAnchor(dJointID j, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="z"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointSetPRAxis1(dJointID j, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="z"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointSetPRAxis2(dJointID j, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="parameter"></param>
+        /// <param name="value"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointSetPRParam(dJointID j, int parameter, dReal value);
+        // <summary>TODO: Implement me</summary>
+        //int dJointGetLMotorNumAxes (dJointID);
+
+        // <summary>TODO: Implement me</summary>
+        //void dJointGetLMotorAxis (dJointID, int anum, dVector3 result);
+
+        // <summary>TODO: Implement me</summary>
+        //dReal dJointGetLMotorParam (dJointID, int parameter);
+        //
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="anum"></param>
+        /// <param name="result"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointGetLMotorAxis(dJointID j, int anum, out dVector3 result);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int dJointGetLMotorNumAxes(dJointID j);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="parameter"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dReal dJointGetLMotorParam(dJointID j, int parameter);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="result"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointGetPRAnchor(dJointID j, out dVector3 result);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="result"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointGetPRAxis1(dJointID j, out dVector3 result);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="result"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointGetPRAxis2(dJointID j, out dVector3 result);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="parameter"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dReal dJointGetPRParam(dJointID j, int parameter);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dReal dJointGetPRPosition(dJointID j);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <param name="angle1"></param>
+        /// <param name="angle2"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointGetUniversalAngles(dJointID j, out dReal angle1, out dReal angle2);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="j"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dReal dJointGetPRPositionRate(dJointID j);
+
+
+        #endregion L-Motor Joint functions
+
+        #endregion Joint parameter setting functions
+        #endregion Joint functions
+
+        #region Mass functions
+        /// <summary>
+        /// Set all the mass parameters to zero
+        /// </summary>
+        /// <param name="mass">A reference to a dMass</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassSetZero(ref dMass mass);
+
+        /// <summary>
+        /// Set the mass parameters to the given values.
+        /// </summary>
+        /// <remarks>
+        /// The inertia matrix looks like this:
+        ///     [ I11 I12 I13 ]
+        ///     [ I12 I22 I23 ]
+        ///     [ I13 I23 I33 ]
+        /// </remarks>
+        /// <param name="mass">A reference to a dMass</param>
+        /// <param name="themass">the mass of the body</param>
+        /// <param name="cgx">the x coordinate for the center of gravity position in the body frame</param>
+        /// <param name="cgy">the y coordinate for the center of gravity position in the body frame</param>
+        /// <param name="cgz">the z coordinate for the center of gravity position in the body frame</param>
+        /// <param name="I11">An element of the inertia matrix</param>
+        /// <param name="I22">An element of the inertia matrix</param>
+        /// <param name="I33">An element of the inertia matrix</param>
+        /// <param name="I12">An element of the inertia matrix</param>
+        /// <param name="I13">An element of the inertia matrix</param>
+        /// <param name="I23">An element of the inertia matrix</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassSetParameters(ref dMass mass, dReal themass,
+            dReal cgx, dReal cgy, dReal cgz,
+            dReal I11, dReal I22, dReal I33,
+            dReal I12, dReal I13, dReal I23);
+
+        /// <summary>
+        /// Set the mass parameters to represent a sphere of the given radius and density, with
+        /// the center of mass at (0,0,0) relative to the body.
+        /// </summary>
+        /// <param name="mass">the mass to set</param>
+        /// <param name="density">the density of the sphere</param>
+        /// <param name="radius">the radius of the sphere</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassSetSphere(ref dMass mass, dReal density, dReal radius);
+
+        /// <summary>
+        /// Set the mass parameters to represent a sphere of the given total mass and radius, with
+        /// the center of mass at (0,0,0) relative to the body.
+        /// </summary>
+        /// <param name="mass">the mass to set</param>
+        /// <param name="total_mass">the total mass of the sphere</param>
+        /// <param name="radius">the radius of the sphere</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassSetSphereTotal(ref dMass mass, dReal total_mass, dReal radius);
+
+        /// <summary>
+        /// Set the mass parameters to represent a capsule of the given parameters and density, with
+        /// the center of mass at (0,0,0) relative to the body.
+        /// </summary>
+        /// <remarks>
+        /// The cylinder's long axis is oriented along the body's x, y or z axis according to the value of direction (1=x, 2=y, 3=z).
+        /// </remarks>
+        /// <param name="mass">the mass to set</param>
+        /// <param name="density">The density of the capsule</param>
+        /// <param name="direction">The orientation of the cylinder's long axis (1=x, 2=y, 3=z)</param>
+        /// <param name="radius">The radius of the cylinder (and the spherical cap)</param>
+        /// <param name="length">The length of the cylinder (not counting the spherical cap)</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassSetCapsule(ref dMass mass, dReal density, int direction,
+            dReal radius, dReal length);
+
+        /// <summary>
+        /// Set the mass parameters to represent a capsule of the given parameters and total mass, with
+        /// the center of mass at (0,0,0) relative to the body.
+        /// </summary>
+        /// <remarks>
+        /// The capsule's long axis is oriented along the body's x, y or z axis according to the value of direction (1=x, 2=y, 3=z).
+        /// </remarks>
+        /// <param name="mass">the mass to set</param>
+        /// <param name="total_mass">The total mass of the capsule</param>
+        /// <param name="direction">The orientation of the capsule's long axis (1=x, 2=y, 3=z)</param>
+        /// <param name="radius">The radius of the capsule (and the spherical cap)</param>
+        /// <param name="length">The length of the capsule (not counting the spherical cap)</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassSetCapsuleTotal(ref dMass mass, dReal total_mass, int direction,
+            dReal radius, dReal length);
+
+        /// <summary>
+        /// Set the mass parameters to represent a flat-ended cylinder of the given parameters and density, with
+        /// the center of mass at (0,0,0) relative to the body.
+        /// </summary>
+        /// <remarks>
+        /// The cylinder's long axis is oriented along the body's x, y or z axis according to the value of direction (1=x, 2=y, 3=z).
+        /// </remarks>
+        /// <param name="mass">the mass to set</param>
+        /// <param name="density">the density of the cylinder</param>
+        /// <param name="direction">the orientation of the cylinder</param>
+        /// <param name="radius">The radius of the cylinder</param>
+        /// <param name="length">The length of the cylinder</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassSetCylinder(ref dMass mass, dReal density, int direction,
+            dReal radius, dReal length);
+
+        /// <summary>
+        /// Set the mass parameters to represent a flat-ended cylinder of the given parameters and total mass, with
+        /// the center of mass at (0,0,0) relative to the body.
+        /// </summary>
+        /// <remarks>
+        /// The cylinder's long axis is oriented along the body's x, y or z axis according to the value of direction (1=x, 2=y, 3=z).
+        /// </remarks>
+        /// <param name="mass">the mass to set</param>
+        /// <param name="total_mass">the total mass of the cylinder</param>
+        /// <param name="direction">the orientation of the cylinder</param>
+        /// <param name="radius">The radius of the cylinder</param>
+        /// <param name="length">The length of the cylinder</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassSetCylinderTotal(ref dMass mass, dReal total_mass, int direction,
+            dReal radius, dReal length);
+
+        /// <summary>
+        /// Set the mass parameters to represent a box of the given dimensions and density, with
+        /// the center of mass at (0,0,0) relative to the body.
+        /// </summary>
+        /// <param name="mass">the mass to set</param>
+        /// <param name="density">The density of the box</param>
+        /// <param name="lx">The side length of the box along the x axis</param>
+        /// <param name="ly">The side length of the box along the y axis</param>
+        /// <param name="lz">The side length of the box along the z axis</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassSetBox(ref dMass mass, dReal density,
+            dReal lx, dReal ly, dReal lz);
+
+        /// <summary>
+        /// Set the mass parameters to represent a box of the given dimensions and total mass, with
+        /// the center of mass at (0,0,0) relative to the body.
+        /// </summary>
+        /// <param name="mass">the mass to set</param>
+        /// <param name="total_mass">The total mass of the box</param>
+        /// <param name="lx">The side length of the box along the x axis</param>
+        /// <param name="ly">The side length of the box along the y axis</param>
+        /// <param name="lz">The side length of the box along the z axis</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassSetBoxTotal(ref dMass mass, dReal total_mass,
+            dReal lx, dReal ly, dReal lz);
+
+        /// <summary>
+        /// Given mass parameters for some object, adjust them so the total mass is now newmass
+        /// </summary>
+        /// <remarks>
+        /// This is useful when using the "mass set" functions to set the mass parameters for
+        /// certain objects - they take the object density, not the total mass.
+        /// </remarks>
+        /// <param name="mass">the mass parameters to adjust</param>
+        /// <param name="newmass">the new total mass</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassAdjust(ref dMass mass, dReal newmass);
+
+        /// <summary>
+        /// Given mass parameters for some object, adjust them to represent the object displaced
+        /// by (x,y,z) relative to the body frame.
+        /// </summary>
+        /// <param name="mass">the mass parameters to translate</param>
+        /// <param name="x">The displacement along the x axis</param>
+        /// <param name="y">The displacement along the y axis</param>
+        /// <param name="z">The displacement along the z axis</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassTranslate(ref dMass mass, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Given mass parameters for some object, adjust them to represent the object rotated by R relative to the body frame.
+        /// </summary>
+        /// <param name="mass">the mass to rotate</param>
+        /// <param name="R">An array of 12 elements containing a 3x4 rotation matrix</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassRotate(ref dMass mass, dReal[] R);
+
+        /// <summary>
+        /// Given mass parameters for some object, adjust them to represent the object rotated by R relative to the body frame.
+        /// </summary>
+        /// <param name="mass">A  dMass</param>
+        /// <param name="R">A  dMatrix3</param>
+        public static void dMassRotate(ref dMass mass, dMatrix3 R)
+        { // for compatibility
+            dMassRotate(ref mass, R.ToArray());
+        }
+
+        /// <summary>
+        /// Add the mass b to the mass a.
+        /// </summary>
+        /// <remarks>
+        /// mass a is modified to represent the combined mass
+        /// </remarks>
+        /// <param name="a">id of mass a</param>
+        /// <param name="b">id of mass b</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dMassAdd(ref dMass a, dMass b);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="mass"></param>
+        /// <param name="density"></param>
+        /// <param name="g"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dMassSetTrimesh(out dMass mass, dReal density, dGeomID g);
+        #endregion Mass functions
+
+        #region Collision functions
+        /// <summary>
+        /// Destroy a geom, removing it from any space it is in first.
+        /// This one function destroys a geom of any type, but to create a geom you
+        /// must call a creation function for that type.
+        /// When a space is destroyed, if its cleanup mode is 1 (the default) then
+        /// all the geoms in that space are automatically destroyed as well.
+        /// </summary>
+        /// <param name="geom">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomDestroy(dGeomID geom);
+
+        /// <summary>
+        /// Set the user-defined data pointer stored in the geom.
+        ///
+        /// WARNING: It is unclear from the ODE source and the documentation what the nature of
+        /// user-data is.
+        /// This function is here for the sake of completeness because it is part of ODE's public API, but
+        /// has NOT been tested in any way.
+        ///
+        /// Use at own risk.
+        /// </summary>
+        /// <param name="geom">A  dGeomID</param>
+        /// <param name="data">An IntPtr</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetData(dGeomID geom, IntPtr data);
+
+        /// <summary>
+        /// Get the user-defined data pointer stored in the geom.
+        ///
+        /// WARNING: It is unclear from the ODE source and the documentation what the nature of
+        /// user-data is.
+        /// This function is here for the sake of completeness because it is part of ODE's public API, but
+        /// has NOT been tested in any way.
+        ///
+        /// Use at own risk.
+        /// </summary>
+        /// <returns>A void*</returns>
+        /// <param name="geom">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static IntPtr dGeomGetData(dGeomID geom);
+
+        /// <summary>
+        /// Set the body associated with a placeable geom.
+        ///
+        /// Setting a body on a geom automatically combines the position vector and
+        /// rotation matrix of the body and geom, so that setting the position or
+        /// orientation of one will set the value for both objects.
+        /// Setting a body ID of zero gives the geom its own position and rotation,
+        /// independent from any body.
+        /// If the geom was previously connected to a body then its new independent
+        /// position/rotation is set to the current position/rotation of the body.
+        ///
+        /// Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.
+        /// </summary>
+        /// <param name="geom">A  dGeomID</param>
+        /// <param name="body">A  dBodyID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetBody(dGeomID geom, dBodyID body);
+
+        /// <summary>
+        /// Get the body associated with a placeable geom.
+        /// </summary>
+        /// <returns>A dBodyID</returns>
+        /// <param name="geom">A dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dBodyID dGeomGetBody(dGeomID geom);
+
+        /// <summary>
+        /// Set the position vector of a placeable geom.
+        ///
+        /// This function is analogous to dBodySetPosition.
+        ///
+        /// If the geom is attached to a body, the body's position will also be changed.
+        ///
+        /// Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.
+        /// </summary>
+        /// <param name="geom">dGeomID of the geom to set</param>
+        /// <param name="x">the new X coordinate</param>
+        /// <param name="y">the new Y coordinate</param>
+        /// <param name="z">the new Z coordinate</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetPosition(dGeomID geom, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set the rotation matrix of a placeable geom.
+        ///
+        /// This function is analogous to dBodySetRotation.
+        ///
+        /// If the geom is attached to a body, the body's rotation will also be changed.
+        ///
+        /// Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.
+        /// </summary>
+        /// <param name="geom">the geom to set</param>
+        /// <param name="R">An array of 12 elements containing the new 3x4 rotation matrix</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetRotation(dGeomID geom, dReal[] R);
+
+        /// <summary>
+        /// Set the rotation matrix of a placeable geom.
+        ///
+        /// This function is analogous to dBodySetRotation.
+        ///
+        /// If the geom is attached to a body, the body's rotation will also be changed.
+        ///
+        /// Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.
+        /// </summary>
+        /// <param name="geom">the geom to set</param>
+        /// <param name="R">dMatrix3 containing the new rotation matrix</param>
+        public static void dGeomSetRotation(dGeomID geom, dMatrix3 R)
+        { // for compatibility
+            dGeomSetRotation(geom, R.ToArray());
+        }
+
+        /// <summary>
+        /// Set the rotation of a placeable geom.
+        ///
+        /// This function is analogous to dBodySetQuaternion.
+        ///
+        /// If the geom is attached to a body, the body's rotation will also be changed.
+        ///
+        /// Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.
+        /// </summary>
+        /// <param name="geom">the geom to set</param>
+        /// <param name="q">the new rotation</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetQuaternion(dGeomID geom, dQuaternion q);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="w"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomSetQuaternion(dGeomID geom, ref dReal w);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "dGeomGetPosition"), SuppressUnmanagedCodeSecurity]
+        private extern unsafe static dReal* dGeomGetPosition_(dGeomID geom);
+        /// <summary>
+        /// Return the geom's position vector.
+        ///
+        /// In native ODE, the returned values are pointers to internal data
+        /// structures, so the vectors are valid until any changes are made to the
+        /// geom.
+        ///
+        /// If the geom is attached to a body, the body's position vector will be
+        /// returned, i.e. the result will be identical to calling dBodyGetPosition
+        ///
+        /// dGeomGetQuaternion copies the geom's quaternion into the space provided.
+        /// If the geom is attached to a body, the body's quaternion will be returned,
+        /// i.e. the resulting quaternion will be the same as the result of calling dBodyGetQuaternion.
+        ///
+        /// Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.
+        /// </summary>
+        /// <returns>the geom's position vector</returns>
+        /// <param name="geom">the geom to query</param>
+        public static dVector3 dGeomGetPosition(dGeomID geom)
+        {
+            unsafe
+            {
+                dVector3* v = (dVector3*)dGeomGetPosition_(geom);
+                return *v;
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="pHeightData"></param>
+        /// <param name="bCopyHeightData"></param>
+        /// <param name="width"></param>
+        /// <param name="depth"></param>
+        /// <param name="widthSamples"></param>
+        /// <param name="depthSamples"></param>
+        /// <param name="scale"></param>
+        /// <param name="offset"></param>
+        /// <param name="thickness"></param>
+        /// <param name="bWrap"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataBuildByte(dHeightfieldDataID d, byte[] pHeightData, int bCopyHeightData,
+                dReal width, dReal depth, int widthSamples, int depthSamples,
+                dReal scale, dReal offset, dReal thickness, int bWrap);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="pHeightData"></param>
+        /// <param name="bCopyHeightData"></param>
+        /// <param name="width"></param>
+        /// <param name="depth"></param>
+        /// <param name="widthSamples"></param>
+        /// <param name="depthSamples"></param>
+        /// <param name="scale"></param>
+        /// <param name="offset"></param>
+        /// <param name="thickness"></param>
+        /// <param name="bWrap"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataBuildByte(dHeightfieldDataID d, IntPtr pHeightData, int bCopyHeightData,
+                dReal width, dReal depth, int widthSamples, int depthSamples,
+                dReal scale, dReal offset, dReal thickness, int bWrap);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="pUserData"></param>
+        /// <param name="pCallback"></param>
+        /// <param name="width"></param>
+        /// <param name="depth"></param>
+        /// <param name="widthSamples"></param>
+        /// <param name="depthSamples"></param>
+        /// <param name="scale"></param>
+        /// <param name="offset"></param>
+        /// <param name="thickness"></param>
+        /// <param name="bWrap"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataBuildCallback(dHeightfieldDataID d, IntPtr pUserData, dHeightfieldGetHeight pCallback,
+                dReal width, dReal depth, int widthSamples, int depthSamples,
+                dReal scale, dReal offset, dReal thickness, int bWrap);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="pHeightData"></param>
+        /// <param name="bCopyHeightData"></param>
+        /// <param name="width"></param>
+        /// <param name="depth"></param>
+        /// <param name="widthSamples"></param>
+        /// <param name="depthSamples"></param>
+        /// <param name="scale"></param>
+        /// <param name="offset"></param>
+        /// <param name="thickness"></param>
+        /// <param name="bWrap"></param>
+        [CLSCompliant(false)]
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataBuildShort(dHeightfieldDataID d, ushort[] pHeightData, int bCopyHeightData,
+                dReal width, dReal depth, int widthSamples, int depthSamples,
+                dReal scale, dReal offset, dReal thickness, int bWrap);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="pHeightData"></param>
+        /// <param name="bCopyHeightData"></param>
+        /// <param name="width"></param>
+        /// <param name="depth"></param>
+        /// <param name="widthSamples"></param>
+        /// <param name="depthSamples"></param>
+        /// <param name="scale"></param>
+        /// <param name="offset"></param>
+        /// <param name="thickness"></param>
+        /// <param name="bWrap"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataBuildShort(dHeightfieldDataID d, short[] pHeightData, int bCopyHeightData,
+                dReal width, dReal depth, int widthSamples, int depthSamples,
+                dReal scale, dReal offset, dReal thickness, int bWrap);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="pHeightData"></param>
+        /// <param name="bCopyHeightData"></param>
+        /// <param name="width"></param>
+        /// <param name="depth"></param>
+        /// <param name="widthSamples"></param>
+        /// <param name="depthSamples"></param>
+        /// <param name="scale"></param>
+        /// <param name="offset"></param>
+        /// <param name="thickness"></param>
+        /// <param name="bWrap"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataBuildShort(dHeightfieldDataID d, IntPtr pHeightData, int bCopyHeightData,
+                dReal width, dReal depth, int widthSamples, int depthSamples,
+                dReal scale, dReal offset, dReal thickness, int bWrap);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="pHeightData"></param>
+        /// <param name="bCopyHeightData"></param>
+        /// <param name="width"></param>
+        /// <param name="depth"></param>
+        /// <param name="widthSamples"></param>
+        /// <param name="depthSamples"></param>
+        /// <param name="scale"></param>
+        /// <param name="offset"></param>
+        /// <param name="thickness"></param>
+        /// <param name="bWrap"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataBuildSingle(dHeightfieldDataID d, float[] pHeightData, int bCopyHeightData,
+                dReal width, dReal depth, int widthSamples, int depthSamples,
+                dReal scale, dReal offset, dReal thickness, int bWrap);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="pHeightData"></param>
+        /// <param name="bCopyHeightData"></param>
+        /// <param name="width"></param>
+        /// <param name="depth"></param>
+        /// <param name="widthSamples"></param>
+        /// <param name="depthSamples"></param>
+        /// <param name="scale"></param>
+        /// <param name="offset"></param>
+        /// <param name="thickness"></param>
+        /// <param name="bWrap"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataBuildSingle(dHeightfieldDataID d, IntPtr pHeightData, int bCopyHeightData,
+                dReal width, dReal depth, int widthSamples, int depthSamples,
+                dReal scale, dReal offset, dReal thickness, int bWrap);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="pHeightData"></param>
+        /// <param name="bCopyHeightData"></param>
+        /// <param name="width"></param>
+        /// <param name="depth"></param>
+        /// <param name="widthSamples"></param>
+        /// <param name="depthSamples"></param>
+        /// <param name="scale"></param>
+        /// <param name="offset"></param>
+        /// <param name="thickness"></param>
+        /// <param name="bWrap"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataBuildDouble(dHeightfieldDataID d, double[] pHeightData, int bCopyHeightData,
+                dReal width, dReal depth, int widthSamples, int depthSamples,
+                dReal scale, dReal offset, dReal thickness, int bWrap);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="pHeightData"></param>
+        /// <param name="bCopyHeightData"></param>
+        /// <param name="width"></param>
+        /// <param name="depth"></param>
+        /// <param name="widthSamples"></param>
+        /// <param name="depthSamples"></param>
+        /// <param name="scale"></param>
+        /// <param name="offset"></param>
+        /// <param name="thickness"></param>
+        /// <param name="bWrap"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataBuildDouble(dHeightfieldDataID d, IntPtr pHeightData, int bCopyHeightData,
+                dReal width, dReal depth, int widthSamples, int depthSamples,
+                dReal scale, dReal offset, dReal thickness, int bWrap);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dHeightfieldDataID dGeomHeightfieldDataCreate();
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataDestroy(dHeightfieldDataID d);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="minHeight"></param>
+        /// <param name="maxHeight"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldDataSetBounds(dHeightfieldDataID d, dReal minHeight, dReal maxHeight);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="g"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dHeightfieldDataID dGeomHeightfieldGetHeightfieldData(dGeomID g);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="g"></param>
+        /// <param name="d"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomHeightfieldSetHeightfieldData(dGeomID g, dHeightfieldDataID d);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "dGeomGetRotation"), SuppressUnmanagedCodeSecurity]
+        private extern unsafe static dReal* dGeomGetRotation_(dGeomID geom);
+        /// <summary>
+        /// Get the rotation matrix of a placeable geom.
+        ///
+        /// In native ODE, the returned values are pointers to internal data
+        /// structures, so the matrices are valid until any changes are made to the
+        /// geom.
+        ///
+        /// If the geom is attached to a body, the body's rotation matrix will be
+        /// returned, i.e. the result will be identical to calling dBodyGetRotation.
+        ///
+        /// Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.
+        /// </summary>
+        /// <returns>the geom's rotation matrix</returns>
+        /// <param name="geom">the geom to query</param>
+        public static dMatrix3 dGeomGetRotation(dGeomID geom)
+        {
+            unsafe
+            {
+                dMatrix3* m = (dMatrix3*)dGeomGetRotation_(geom);
+                return *m;
+            }
+        }
+
+        /// <summary>
+        /// Get the rotation quaternion of a placeable geom.
+        ///
+        /// dGeomGetQuaternion copies the geom's quaternion into the structure provided.
+        ///
+        /// If the geom is attached to a body, the body's quaternion will be returned,
+        /// i.e. the resulting quaternion will be the same as the result of calling dBodyGetQuaternion.
+        ///
+        /// Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.
+        /// </summary>
+        /// <param name="geom">the geom to query</param>
+        /// <param name="result">a copy of the rotation quaternion.</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomGetQuaternion(dGeomID geom, ref dQuaternion result);
+
+        /// <summary>
+        /// Return in aabb an axis aligned bounding box that surrounds the given geom.
+        ///
+        /// The aabb array has elements (minx, maxx, miny, maxy, minz, maxz).
+        ///
+        /// If the geom is a space, a bounding box that surrounds all contained geoms is returned.
+        ///
+        /// This function may return a pre-computed cached bounding box, if it can
+        /// determine that the geom has not moved since the last time the bounding box was computed.
+        /// </summary>
+        /// <param name="geom">the geom to query</param>
+        /// <param name="aabb">the returned bounding box</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomGetAABB(dGeomID geom, out Aabb aabb);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="minX"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomGetAABB(dGeomID geom, out dReal minX);
+
+        /// <summary>
+        /// Determine if a geom is a space.
+        /// </summary>
+        /// <returns>An int, non-zero if the given geom is a space, zero otherwise.</returns>
+        /// <param name="geom">The geom to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dGeomIsSpace(dGeomID geom);
+
+        /// <summary>
+        /// Query for the space containing the specified geom.
+        /// </summary>
+        /// <returns>The space containing the geom, or NULL if the geom is not contained by a space.</returns>
+        /// <param name="geom">the geom to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dSpaceID dGeomGetSpace(dGeomID geom);
+
+        /// <summary>
+        /// Given a geom, this returns its class number. The standard class numbers are:
+        ///		dSphereClass  			Sphere
+        ///		dBoxClass  				Box
+        ///		dCylinderClass  		Regular flat-ended cylinder
+        ///		dCapsuleClass			Capped cylinder
+        ///		dPlaneClass  			Infinite plane (non-placeable)
+        ///		dRayClass  				Ray
+        ///		dConvexClass			Convex class
+        ///		dGeomTransformClass 	Geometry transform
+        ///		dTriMeshClass  			Triangle mesh
+        ///		dSimpleSpaceClass  		Simple space
+        ///		dHashSpaceClass  		Hash table based space
+        ///		dQuadTreeSpaceClass		Quad-tree based space
+        ///		dFirstUserClass			First user class
+        ///		dLastUserClass			Last user class
+        ///
+        /// User defined classes will return their own numbers.
+        /// </summary>
+        /// <returns>The geom class ID.</returns>
+        /// <param name="geom">the geom to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dGeomGetClass(dGeomID geom);
+
+        /// <summary>
+        /// Set the "category" bitfield for the given geom.
+        /// This bitfield is used by spaces to govern which geoms will interact
+        /// with each other.
+        ///
+        /// The bitfield is guaranteed to be at least 32 bits wide.
+        ///
+        /// The default category and collide values for newly created geoms have all bits set.
+        ///
+        /// Note this is NOT CLS-compliant (due to the use of ulong to hold the 32-bit bitfield)
+        /// TODO: Implement a CLS-compliant work-around or justify why not
+        /// </summary>
+        /// <param name="geom">the geom to set</param>
+        /// <param name="bits">the new bitfield value</param>
+        [CLSCompliant(false)]
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetCategoryBits(dGeomID geom, ulong bits);
+
+        /// <summary>
+        /// Set the "collide" bitfield for the given geom.
+        ///
+        /// This bitfield is used by spaces to govern which geoms will interact
+        /// with each other.
+        ///
+        /// The bitfield is guaranteed to be at least 32 bits wide.
+        ///
+        /// The default category and collide values for newly created geoms have all bits set.
+        ///
+        /// Note this is NOT CLS-compliant (due to the use of ulong to hold the 32-bit bitfield)
+        /// TODO: Implement a CLS-compliant work-around or justify why not
+        /// </summary>
+        /// <param name="geom">the geom to set</param>
+        /// <param name="bits">the new bitfield value</param>
+        [CLSCompliant(false)]
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetCollideBits(dGeomID geom, ulong bits);
+
+        /// <summary>
+        /// Get the "category" bitfield for the given geom.
+        /// This bitfield is used by spaces to govern which geoms will interact
+        /// with each other.
+        ///
+        /// The bitfield is guaranteed to be at least 32 bits wide.
+        ///
+        /// The default category and collide values for newly created geoms have all bits set.
+        ///
+        /// Note this is NOT CLS-compliant (due to the use of ulong to hold the 32-bit bitfield)
+        /// TODO: Implement a CLS-compliant work-around or justify why not
+        /// </summary>
+        /// <returns>the current bitfield value</returns>
+        /// <param name="geom">the geom to query</param>
+        [CLSCompliant(false)]
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static ulong dGeomGetCategoryBits(dGeomID geom);
+
+        /// <summary>
+        /// Get the "collide" bitfield for the given geom.
+        /// This bitfield is used by spaces to govern which geoms will interact
+        /// with each other.
+        ///
+        /// The bitfield is guaranteed to be at least 32 bits wide.
+        ///
+        /// The default category and collide values for newly created geoms have all bits set.
+        ///
+        /// Note this is NOT CLS-compliant (due to the use of ulong to hold the 32-bit bitfield)
+        /// TODO: Implement a CLS-compliant work-around or justify why not
+        /// </summary>
+        /// <returns>the current bitfield</returns>
+        /// <param name="geom">the geom to query</param>
+        [CLSCompliant(false)]
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static ulong dGeomGetCollideBits(dGeomID geom);
+
+        /// <summary>
+        /// Enable a geom.
+        ///
+        /// Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2,
+        /// although they can still be members of a space.
+        ///
+        /// New geoms are created in the enabled state.
+        /// </summary>
+        /// <param name="geom">the geom to enable</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomEnable(dGeomID geom);
+
+        /// <summary>
+        /// Disable a geom.
+        ///
+        /// Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2,
+        /// although they can still be members of a space.
+        ///
+        /// New geoms are created in the enabled state.
+        /// </summary>
+        /// <param name="geom">the geom to disable</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomDisable(dGeomID geom);
+
+        /// <summary>
+        /// Check if a geom is enabled.
+        ///
+        /// New geoms are created in the enabled state.
+        /// </summary>
+        /// <returns>Returns non-zero if a geom is enabled, zero otherwise.</returns>
+        /// <param name="geom">the geom to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dGeomIsEnabled(dGeomID geom);
+
+        #region Geom Offsets
+        /// <summary>
+        /// Geom Offset Overview
+        /// Geom offsets allow geom objects to be offset from a body's position.
+        /// This is useful for cases where an object has an offset centre of mass,
+        /// or is made up out of several geoms each with their own local position.
+        /// Native support for geom offsets means that the geomTransform container is now obselete.
+        ///
+        /// The real advantage over geomTransform is that there is a much easier interface for
+        /// setting, getting, and modifying a geom's offset from its body.
+        /// The elimination of geomTransform simplifies callbacks which no longer have to
+        /// special case that geom class type.
+        /// In terms of performance, the new code has a negligible performance difference
+        /// and a memory improvement compared to using a geomTransform.
+        ///
+        /// Geom Offset and Bodies
+        /// An offset only makes sense for geoms which are connected to bodies.
+        /// It is an error to attempt to set an offset for a geom which is not connected to a body.
+        /// When a geom is disconnected from a body, any offset will be automatically eliminated.
+        /// Thus, the possible states a geom can be in are:
+        ///     * Geom
+        ///     * Geom on body
+        ///     * Geom on body, with an offset
+        /// To create an offset, just call one of the geomSetOffset functions.
+        /// The offset will be automatically created if it does not yet exist.
+        /// Geom offsets are normally set by specifying the offset in local coordinates.
+        /// An extra set of functions are provided to allow an offset to be determined by
+        /// providing world coordinates and subtracting them from the current body position.
+        /// These second set of functions, geomSetOffsetWorldPosition(),etc, allow the user to
+        /// essentially say "keep the body where it is, and move its geom to this position in the world".
+        /// Set the local offset position of a geom from its body.
+        ///
+        /// After this call, the geom will be at a new position determined from the
+        /// body's position and the offset.
+        /// The geom must be attached to a body.
+        /// If the geom did not have an offset, it is automatically created.
+        /// </summary>
+        /// <param name="geom">the geom to set</param>
+        /// <param name="x">the new X coordinate</param>
+        /// <param name="y">the new Y coordinate</param>
+        /// <param name="z">the new Z coordinate</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetOffsetPosition(dGeomID geom, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set the local offset rotation matrix of a geom from its body.
+        ///
+        /// Sets the geom's rotational offset in local coordinates.
+        /// After this call, the geom will be at a new position determined from the
+        /// body's position and the offset.
+        /// The geom must be attached to a body.
+        /// If the geom did not have an offset, it is automatically created.
+        /// </summary>
+        /// <param name="geom">the geom to set.</param>
+        /// <param name="R">the new rotation matrix.</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetOffsetRotation(dGeomID geom, dMatrix3 R);
+
+        /// <summary>
+        /// Set the local offset rotation of a geom from its body.
+        ///
+        /// Sets the geom's rotational offset in local coordinates.
+        /// After this call, the geom will be at a new position determined from the
+        /// body's position and the offset.
+        /// The geom must be attached to a body.
+        /// If the geom did not have an offset, it is automatically created.
+        /// </summary>
+        /// <param name="geom">the geom to set.</param>
+        /// <param name="Q">the new rotation.</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetOffsetQuaternion(dGeomID geom, dQuaternion Q);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="X"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomSetOffsetQuaternion(dGeomID geom, ref dReal X);
+
+        /// <summary>
+        /// Set the offset position of a geom from its body.
+        ///
+        /// Sets the geom's positional offset to move it to the new world
+        /// coordinates.
+        /// After this call, the geom will be at the world position passed in,
+        /// and the offset will be the difference from the current body position.
+        /// The geom must be attached to a body.
+        /// If the geom did not have an offset, it is automatically created.
+        /// </summary>
+        /// <param name="geom">the geom to set.</param>
+        /// <param name="x">the new X coordinate.</param>
+        /// <param name="y">the new Y coordinate.</param>
+        /// <param name="z">the new Z coordinate.</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetOffsetWorldPosition(dGeomID geom, dReal x, dReal y, dReal z);
+
+        /// <summary>
+        /// Set the offset rotation of a geom from its body.
+        ///
+        /// Sets the geom's rotational offset to orient it to the new world
+        /// rotation matrix.
+        /// After this call, the geom will be at the world orientation passed in,
+        /// and the offset will be the difference from the current body orientation.
+        /// The geom must be attached to a body.
+        /// If the geom did not have an offset, it is automatically created.
+        /// </summary>
+        /// <param name="geom">the geom to set.</param>>
+        /// <param name="R">the new rotation matrix.</param>>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetOffsetWorldRotation(dGeomID geom, dMatrix3 R);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="M00"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomSetOffsetWorldRotation(dGeomID geom, ref dReal M00);
+
+
+        /// <summary>
+        /// Set the offset rotation of a geom from its body.
+        ///
+        /// Sets the geom's rotational offset to orient it to the new world
+        /// rotation matrix.
+        /// After this call, the geom will be at the world orientation passed in,
+        /// and the offset will be the difference from the current body orientation.
+        /// The geom must be attached to a body.
+        /// If the geom did not have an offset, it is automatically created.
+        /// </summary>
+        /// <param name="geom">the geom to set.</param>
+        /// <param name="Q">the new rotation.</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSetOffsetWorldQuaternion(dGeomID geom, dQuaternion Q);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="X"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomSetOffsetWorldQuaternion(dGeomID geom, ref dReal X);
+
+        /// <summary>
+        /// Clear any offset from the geom.
+        ///
+        /// If the geom has an offset, it is eliminated and the geom is
+        /// repositioned at the body's position.  If the geom has no offset,
+        /// this function does nothing.
+        /// This is more efficient than calling dGeomSetOffsetPosition(zero)
+        /// and dGeomSetOffsetRotation(identiy), because this function actually
+        /// eliminates the offset, rather than leaving it as the identity transform.
+        /// </summary>
+        /// <param name="geom">the geom to have its offset destroyed.</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomClearOffset(dGeomID geom);
+
+        /// <summary>
+        /// Check to see whether the geom has an offset.
+        ///
+        /// This function will return non-zero if the offset has been created.
+        /// Note that there is a difference between a geom with no offset,
+        /// and a geom with an offset that is the identity transform.
+        /// In the latter case, although the observed behaviour is identical,
+        /// there is a unnecessary computation involved because the geom will
+        /// be applying the transform whenever it needs to recalculate its world
+        /// position.
+        /// </summary>
+        /// <param name="geom">the geom to query.</param>
+        /// <returns>Non-zero if the geom has an offset, zero otherwise.</returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dGeomIsOffset(dGeomID geom);
+
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "dGeomGetOffsetPosition"), SuppressUnmanagedCodeSecurity]
+        private extern unsafe static dReal* dGeomGetOffsetPosition_(dGeomID geom);
+        /// <summary>
+        /// Get the offset position vector of a geom.
+        ///
+        /// Returns the positional offset of the geom in local coordinates.
+        /// If the geom has no offset, this function returns the zero vector.
+        /// </summary>
+        /// <param name="geom">the geom to query.</param>
+        /// <returns>A pointer to the geom's offset vector.</returns>
+        /// <remarks>
+        /// The returned value is a pointer to the geom's internal
+        /// data structure. It is valid until any changes are made
+        ///	to the geom.
+        ///	</remarks>
+        public static dVector3 dGeomGetOffsetPosition(dGeomID geom)
+        {
+            unsafe
+            {
+                dVector3* v = (dVector3*)dGeomGetOffsetPosition_(geom);
+                return *v;
+            }
+        }
+
+
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "dGeomGetOffsetRotation"), SuppressUnmanagedCodeSecurity]
+        private extern unsafe static dReal* dGeomGetOffsetRotation_(dGeomID geom);
+        ///<summary>
+        /// Get the offset rotation matrix of a geom.
+        ///
+        /// Returns the rotational offset of the geom as a matrix.
+        /// If the geom has no offset, this function returns ????
+        /// FIXME - ODE docs incorrect.
+        /// </summary>
+        /// <param name="geom">the geom to query</param>
+        /// <returns>A pointer to the geom's offset rotation matrix.</returns>
+        /// <remarks>
+        /// The returned value is a pointer to the geom's internal
+        /// data structure. It is valid until any changes are made
+        /// to the geom.
+        /// </remarks>
+        public static dMatrix3 dGeomGetOffsetRotation(dGeomID geom)
+        {
+            unsafe
+            {
+                dMatrix3* m = (dMatrix3*)dGeomGetOffsetRotation_(geom);
+                return *m;
+            }
+        }
+
+
+        /// <summary>
+        /// Get the offset rotation quaternion of a geom.
+        ///
+        /// Returns the rotation offset of the geom as a quaternion.
+        /// If the geom has no offset, the identity quaternion is returned.
+        /// </summary>
+        /// <param name="geom">the geom to query</param>
+        /// <param name="result">a copy of the rotation quaternion</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomGetOffsetQuaternion(dGeomID geom, ref dQuaternion result);
+
+        #endregion Geom Offsets
+
+        #endregion Collision functions
+
+        #region Collision Detection
+        /// <summary>
+        /// Given two geoms o1 and o2 that potentially intersect, generate contact
+        /// information for them.
+        ///
+        /// Internally, this just calls the correct class-specific collision functions
+        /// for o1 and o2.
+        ///
+        /// "flags" specifies how contacts should be generated if the geoms touch. The
+        /// lower 16 bits of flags is an integer that specifies the maximum number
+        /// of contact points to generate. Note that if this number is zero, this
+        /// function just pretends that it is one - in other words you can not ask
+        /// for zero contacts. All other bits in flags must be zero.
+        /// In the future the other bits may be used to select from different contact
+        /// generation strategies.
+        ///
+        /// "contacts" points to an array of dContactGeom structures. The array must
+        /// be able to hold at least the maximum number of contacts. These
+        /// dContactGeom structures may be embedded within larger structures in the
+        /// array - the skip parameter is the byte offset from one dContactGeom to
+        /// the next in the array. If skip is sizeof(dContactGeom) then contact
+        /// points to a normal (C-style) array. It is an error for skip to be smaller
+        /// than sizeof(dContactGeom).
+        ///
+        /// If the geoms intersect, this function returns the number of contact points
+        /// generated (and updates the contact array), otherwise it returns 0 (and the
+        ///  contact array is not touched).
+        ///
+        /// If a space is passed as o1 or o2 then this function will collide all
+        /// objects contained in o1 with all objects contained in o2, and return
+        /// the resulting contact points. This method for colliding spaces with
+        /// geoms (or spaces with spaces) provides no user control over the
+        /// individual collisions. To get that control, use dSpaceCollide or
+        /// dSpaceCollide2 instead.
+        ///
+        /// If o1 and o2 are the same geom then this function will do nothing and
+        /// return 0. Technically speaking an object intersects with itself, but
+        /// it is not useful to find contact points in this case.
+        ///
+        /// This function does not care if o1 and o2 are in the same space or not
+        /// (or indeed if they are in any space at all).
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="o1">A  dGeomID</param>
+        /// <param name="o2">A  dGeomID</param>
+        /// <param name="flags">An int</param>
+        /// <param name="contacts">A  dContactGeom[]</param>
+        /// <param name="skip">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dCollide(dGeomID o1, dGeomID o2, int flags, [In, Out]dContactGeom[] contacts, int skip);
+
+        /// <summary>
+        /// This determines which pairs of geoms in a space may potentially intersect,
+        /// and calls the callback function with each candidate pair.
+        ///
+        /// The callback function is of type dNearCallback, which is defined as:
+        ///		typedef void dNearCallback (void *data, dGeomID o1, dGeomID o2);
+        ///
+        /// The data argument is passed from dSpaceCollide directly to the callback
+        /// function. Its meaning is user defined.
+        /// The o1 and o2 arguments are the geoms that may be near each other.
+        /// The callback function can call dCollide on o1 and o2 to generate contact
+        /// points between each pair. Then these contact points may be added to the
+        /// simulation as contact joints. The user's callback function can of course
+        /// chose not to call dCollide for any pair, e.g. if the user decides that
+        /// those pairs should not interact.
+        ///
+        /// Other spaces that are contained within the colliding space are not treated
+        /// specially, i.e. they are not recursed into. The callback function may be
+        /// passed these contained spaces as one or both geom arguments.
+        ///
+        /// dSpaceCollide() is guaranteed to pass all intersecting geom pairs to the
+        /// callback function, but it may also make mistakes and pass non-intersecting
+        /// pairs. The number of mistaken calls depends on the internal algorithms
+        /// used by the space. Thus you should not expect that dCollide will return
+        /// contacts for every pair passed to the callback.
+        /// </summary>
+        /// <param name="space">A  dSpaceID</param>
+        /// <param name="data">An IntPtr</param>
+        /// <param name="callback">A  dNearCallback</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dSpaceCollide(dSpaceID space, IntPtr data, dNearCallback callback);
+
+        /// <summary>
+        /// This function is similar to dSpaceCollide, except that it is passed two
+        /// geoms (or spaces) as arguments. It calls the callback for all
+        /// potentially intersecting pairs that contain one geom from o1 and one geom
+        /// from o2.
+        ///
+        /// The exact behavior depends on the types of o1 and o2:
+        ///		If one argument is a non-space geom and the other is a space, the
+        /// 	callback is called with all potential intersections between the geom and
+        /// 	the objects in the space.
+        /// 	If both o1 and o2 are spaces then this calls the callback for all potentially
+        /// 	intersecting pairs that contain one geom from o1 and one geom from o2. The
+        /// 	algorithm that is used depends on what kinds of spaces are being collided.
+        /// 	If no optimized algorithm can be selected then this function will resort
+        /// 	to one of the following two strategies:
+        /// 		1. 	All the geoms in o1 are tested one-by-one against o2.
+        /// 		2. 	All the geoms in o2 are tested one-by-one against o1.
+        /// 	The strategy used may depend on a number of rules, but in general the
+        /// 	space with less objects has its geoms examined one-by-one.
+        /// 		-	If both arguments are the same space, this is equivalent to calling
+        /// 			dSpaceCollide on that space.
+        /// 		-	If both arguments are non-space geoms, this simply calls the callback
+        /// 			once with these arguments.
+        ///
+        /// If this function is given a space and an geom X in that same space, this
+        /// case is not treated specially. In this case the callback will always be
+        /// called with the pair (X,X), because an objects always intersects with
+        /// itself. The user may either test for this case and ignore it, or just
+        /// pass the pair (X,X) to dCollide (which will be guaranteed to return 0).
+        /// </summary>
+        /// <param name="o1">A  dGeomID</param>
+        /// <param name="o2">A  dGeomID</param>
+        /// <param name="data">An IntPtr</param>
+        /// <param name="callback">A  dNearCallback</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dSpaceCollide2(dGeomID o1, dGeomID o2, IntPtr data, dNearCallback callback);
+        #endregion Collision Detection
+
+        #region Sphere class
+        /// <summary>
+        /// Create a sphere geom of the given radius, and return its ID. If space is
+        /// nonzero, insert it into that space. The point of reference for a sphere
+        /// is its center.
+        /// </summary>
+        /// <returns>A dGeomID</returns>
+        /// <param name="space">A  dSpaceID</param>
+        /// <param name="radius">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dCreateSphere(dSpaceID space, dReal radius);
+
+        /// <summary>
+        /// Set the radius of the given sphere.
+        /// </summary>
+        /// <param name="sphere">A  dGeomID</param>
+        /// <param name="radius">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomSphereSetRadius(dGeomID sphere, dReal radius);
+
+        /// <summary>
+        /// Return the radius of the given sphere.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="sphere">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dGeomSphereGetRadius(dGeomID sphere);
+
+        /// <summary>
+        /// Return the depth of the point (x,y,z) in the given sphere.
+        ///
+        /// Points inside the geom will have positive depth, points outside it will
+        /// have negative depth, and points on the surface will have zero depth.
+        /// </summary>
+        /// <returns>A dReal</returns>
+        /// <param name="sphere">A  dGeomID</param>
+        /// <param name="x">A  dReal</param>
+        /// <param name="y">A  dReal</param>
+        /// <param name="z">A  dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dGeomSpherePointDepth(dGeomID sphere, dReal x, dReal y, dReal z);
+        #endregion Sphere class
+
+        #region Convex class
+        // TODO: Implement - Convex support is new in ODE and not yet documented or clearly stable
+        // ODE_API dGeomID dCreateConvex (dSpaceID space, dReal *_planes, unsigned int _planecount, dReal *_points, unsigned int _pointcount,unsigned int *_polygons);
+        // ODE_API void dGeomSetConvex (dGeomID g, dReal *_planes, unsigned int _count, dReal *_points, unsigned int _pointcount,unsigned int *_polygons);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="planes"></param>
+        /// <param name="planeCount"></param>
+        /// <param name="points"></param>
+        /// <param name="pointCount"></param>
+        /// <param name="polygons"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomSetConvex(dGeomID geom, dReal[] planes, int planeCount, dReal[] points, int pointCount, int[] polygons);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="space"></param>
+        /// <param name="planes"></param>
+        /// <param name="planeCount"></param>
+        /// <param name="points"></param>
+        /// <param name="pointCount"></param>
+        /// <param name="polygons"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dGeomID dCreateConvex(dSpaceID space, dReal[] planes, int planeCount, dReal[] points, int pointCount, int[] polygons);
+        #endregion Convex class
+
+        #region Box class
+        /// <summary>
+        /// Create a box geom of the given x/y/z side lengths (lx,ly,lz), and return
+        /// its ID.
+        ///
+        /// If space is nonzero, insert it into that space. The point of reference
+        /// for a box is its center.
+        /// </summary>
+        /// <returns>A dGeomID</returns>
+        /// <param name="space">the space the box should be inserted to</param>
+        /// <param name="lx">length of the x side</param>
+        /// <param name="ly">length of the y side</param>
+        /// <param name="lz">length of the z side</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dCreateBox(dSpaceID space, dReal lx, dReal ly, dReal lz);
+
+        /// <summary>
+        /// Set the side lengths of the given box.
+        /// </summary>
+        /// <param name="box">the box to be set</param>
+        /// <param name="lx">length of the x side</param>
+        /// <param name="ly">length of the y side</param>
+        /// <param name="lz">length of the z side</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomBoxSetLengths(dGeomID box, dReal lx, dReal ly, dReal lz);
+
+        /// <summary>
+        /// Return in result the side lengths of the given box.
+        /// </summary>
+        /// <param name="box">the box to query</param>
+        /// <param name="result">vector3 containing the side lengths</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomBoxGetLengths(dGeomID box, ref dVector3 result);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="x"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomBoxGetLengths(dGeomID geom, out dReal x);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="pos"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomCopyOffsetPosition(dGeomID geom, ref dVector3 pos);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="X"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomCopyOffsetPosition(dGeomID geom, ref dReal X);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="R"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomCopyOffsetRotation(dGeomID geom, ref dMatrix3 R);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="M00"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomCopyOffsetRotation(dGeomID geom, ref dReal M00);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="pos"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomCopyPosition(dGeomID geom, out dVector3 pos);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="X"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomCopyPosition(dGeomID geom, out dReal X);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="R"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomCopyRotation(dGeomID geom, out dMatrix3 R);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="M00"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomCopyRotation(dGeomID geom, out dReal M00);
+
+
+        /// <summary>
+        /// Return the depth of the point (x,y,z) in the given box.
+        ///
+        /// Points inside the geom will have positive depth, points outside it will
+        /// have negative depth, and points on the surface will have zero depth.
+        /// </summary>
+        /// <returns>the depth of the point</returns>
+        /// <param name="box">the box to query</param>
+        /// <param name="x">the x-coordinate of the point</param>
+        /// <param name="y">the y-coordinate of the point</param>
+        /// <param name="z">the z-coordinate of the point</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dGeomBoxPointDepth(dGeomID box, dReal x, dReal y, dReal z);
+        #endregion Box class
+        #region Plane class
+        /// <summary>
+        /// Create a plane geom of the given parameters, and return its ID.
+        ///
+        /// If space is nonzero, insert it into that space. The plane equation is
+        ///		a*x+b*y+c*z = d
+        ///
+        /// The plane's normal vector is (a,b,c), and it must have length 1.
+        ///
+        /// Planes are non-placeable geoms. This means that, unlike placeable geoms,
+        /// planes do not have an assigned position and rotation. This means that
+        /// the parameters (a,b,c,d) are always in global coordinates. In other words
+        /// it is assumed that the plane is always part of the static environment and
+        /// not tied to any movable object.
+        /// </summary>
+        /// <returns>the plane</returns>
+        /// <param name="space">the space to insert the plane into</param>
+        /// <param name="a">the a parameter of the plane</param>
+        /// <param name="b">the b parameter of the plane</param>
+        /// <param name="c">the c parameter of the plane</param>
+        /// <param name="d">the d parameter of the plane</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dCreatePlane(dSpaceID space, dReal a, dReal b, dReal c, dReal d);
+
+        /// <summary>
+        /// Set the parameters of the given plane.
+        /// </summary>
+        /// <param name="plane">the plane to set</param>
+        /// <param name="a">the a parameter to set</param>
+        /// <param name="b">the b parameter to set</param>
+        /// <param name="c">the c parameter to set</param>
+        /// <param name="d">the d parameter to set</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomPlaneSetParams(dGeomID plane, dReal a, dReal b, dReal c, dReal d);
+
+        /// <summary>
+        /// Return in result the parameters of the given plane.
+        /// </summary>
+        /// <param name="plane">the plane to query</param>
+        /// <param name="result">A dVector4 containing the plane's parameters</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomPlaneGetParams(dGeomID plane, ref dVector4 result);
+
+        /// <summary>
+        /// Return the depth of the point (x,y,z) in the given plane.
+        ///
+        /// Points inside the geom will have positive depth, points outside it will
+        /// have negative depth, and points on the surface will have zero depth.
+        /// </summary>
+        /// <returns>the depth of the point as a dReal</returns>
+        /// <param name="plane">the plane to query</param>
+        /// <param name="x">the x coordinate of the point</param>
+        /// <param name="y">the y coordinate of the point</param>
+        /// <param name="z">the z coordinate of the point</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dGeomPlanePointDepth(dGeomID plane, dReal x, dReal y, dReal z);
+        #endregion Plane class
+        #region Capsule class
+        /// <summary>
+        /// Create a capsule geom of the given parameters, and return its ID.
+        /// If space is nonzero, insert it into that space.
+        ///
+        /// A capsule is like a normal cylinder except it has half-sphere
+        /// caps at its ends. This feature makes the internal collision detection
+        /// code particularly fast and accurate. The cylinder's length, not counting
+        /// the caps, is given by length. The cylinder is aligned along the geom's
+        /// local Z axis. The radius of the caps, and of the cylinder itself, is
+        /// given by radius.
+        /// </summary>
+        /// <returns>the capsule</returns>
+        /// <param name="space">the space to add the capsule to</param>
+        /// <param name="radius">the radius of the capsule</param>
+        /// <param name="length">the length of the capsule</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dCreateCapsule(dSpaceID space, dReal radius, dReal length);
+
+        /// <summary>
+        /// Set the parameters of the given capsule.
+        /// </summary>
+        /// <param name="capsule">the capsule to manipulate</param>
+        /// <param name="radius">the new radius</param>
+        /// <param name="length">the new length</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomCapsuleSetParams(dGeomID capsule, dReal radius, dReal length);
+
+        /// <summary>
+        /// Return in radius and length the parameters of the given capsule.
+        /// </summary>
+        /// <param name="capsule">the capsule to query</param>
+        /// <param name="radius">a reference to the dReal variable to hold the returned radius</param>
+        /// <param name="length">a reference to the dReal variable to hold the returned length</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomCapsuleGetParams(dGeomID capsule, ref dReal radius, ref dReal length);
+
+        /// <summary>
+        /// Return the depth of the point (x,y,z) in the given capsule.
+        ///
+        /// Points inside the geom will have positive depth, points outside it will
+        /// have negative depth, and points on the surface will have zero depth.
+        /// </summary>
+        /// <returns>the depth of the point</returns>
+        /// <param name="capsule">the capsule to query</param>
+        /// <param name="x">the x coordinate of the point</param>
+        /// <param name="y">the y coordinate of the point</param>
+        /// <param name="z">the z coordinate of the point</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dGeomCapsulePointDepth(dGeomID capsule, dReal x, dReal y, dReal z);
+        #endregion Capsule class
+        #region Cylinder class
+        /// <summary>
+        /// Create a (flat-ended) cylinder geom of the given parameters, and return its ID.
+        /// If space is nonzero, insert it into that space.
+        ///
+        /// The cylinder's length is given by length. The cylinder is aligned along the geom's
+        /// local Z axis.
+        /// The radius of the cylinder is given by radius.
+        /// </summary>
+        /// <returns>the cylinder id</returns>
+        /// <param name="space">the space to add the cylinder to</param>
+        /// <param name="radius">the radius of the cylinder</param>
+        /// <param name="length">the length of the cylinder</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dCreateCylinder(dSpaceID space, dReal radius, dReal length);
+
+        /// <summary>
+        /// Set the parameters of the given cylinder.
+        /// </summary>
+        /// <param name="cylinder">the cylinder to manipulate</param>
+        /// <param name="radius">the new radius</param>
+        /// <param name="length">the new length</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomCylinderSetParams(dGeomID cylinder, dReal radius, dReal length);
+
+        /// <summary>
+        /// Return in radius and length the parameters of the given cylinder.
+        /// </summary>
+        /// <param name="cylinder">the cylinder to query</param>
+        /// <param name="radius">a reference to the dReal variable to hold the returned radius</param>
+        /// <param name="length">a reference to the dReal variable to hold the returned length</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomCylinderGetParams(dGeomID cylinder, ref dReal radius, ref dReal length);
+
+        // <summary>
+        // Return the depth of the point (x,y,z) in the given cylinder.
+        //
+        // Points inside the geom will have positive depth, points outside it will
+        // have negative depth, and points on the surface will have zero depth.
+        // </summary>
+        // <returns>the depth of the point</returns>
+        // <param name="cylinder">the cylinder to query</param>
+        // <param name="x">the x coordinate of the point</param>
+        // <param name="y">the y coordinate of the point</param>
+        // <param name="z">the z coordinate of the point</param>
+        // TODO: Uncomment when implemented by ODE
+        //		[DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        //		public extern static dReal dGeomCylinderPointDepth(dGeomID cylinder, dReal x, dReal y, dReal z);
+        #endregion Cylinder class
+        #region Ray class
+        /// <summary>
+        /// Create a ray geom of the given length, and return its ID.
+        ///
+        /// If space is nonzero, insert it into that space.
+        /// </summary>
+        /// <remarks>
+        /// A ray is different from all the other geom classes in that it does not
+        /// represent a solid object. It is an infinitely thin line that starts from
+        /// the geom's position and extends in the direction of the geom's local Z-axis.
+        ///
+        /// Calling dCollide between a ray and another geom will result in at most one
+        /// contact point. Rays have their own conventions for the contact information
+        /// in the dContactGeom structure (thus it is not useful to create contact
+        /// joints from this information):
+        ///
+        /// 	pos - 		This is the point at which the ray intersects the surface of the
+        /// 				other geom, regardless of whether the ray starts from inside or
+        /// 				outside the geom.
+        /// 	normal - 	This is the surface normal of the other geom at the contact point.
+        /// 				if dCollide is passed the ray as its first geom then the normal
+        /// 				will be oriented correctly for ray reflection from that surface
+        /// 				(otherwise it will have the opposite sign).
+        /// 	depth - 	This is the distance from the start of the ray to the contact point.
+        ///
+        /// Rays are useful for things like visibility testing, determining the path of
+        /// projectiles or light rays, and for object placement.
+        /// </remarks>
+        /// <returns>the id of the new ray</returns>
+        /// <param name="space">the space to add the ray to</param>
+        /// <param name="length">the length of the ray</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dCreateRay(dSpaceID space, dReal length);
+
+        /// <summary>
+        /// Set the length of the given ray.
+        /// </summary>
+        /// <param name="ray">the ray to change</param>
+        /// <param name="length">the new length of the ray</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomRaySetLength(dGeomID ray, dReal length);
+
+        /// <summary>
+        /// Get the length of the given ray.
+        /// </summary>
+        /// <returns>the length of the ray</returns>
+        /// <param name="ray">the ray to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dReal dGeomRayGetLength(dGeomID ray);
+
+        /// <summary>
+        /// Set the starting position (px,py,pz) and direction (dx,dy,dz) of the given ray.
+        /// The ray's rotation matrix will be adjusted so that the local Z-axis is aligned
+        /// with the direction.
+        ///
+        /// Note that this does not adjust the ray's length.
+        /// </summary>
+        /// <param name="ray">the ray to set</param>
+        /// <param name="px">x-coordinate of the starting position</param>
+        /// <param name="py">y-coordinate of the starting position</param>
+        /// <param name="pz">z-coordinate of the starting position</param>
+        /// <param name="dx">x-coordinate of the direction</param>
+        /// <param name="dy">y-coordinate of the direction</param>
+        /// <param name="dz">z-coordinate of the direction</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomRaySet(dGeomID ray, dReal px, dReal py, dReal pz,
+            dReal dx, dReal dy, dReal dz);
+
+        /// <summary>
+        /// Get the starting position (start) and direction (dir) of the ray.
+        /// The returned direction will be a unit length vector.
+        /// </summary>
+        /// <param name="ray">the ray to query</param>
+        /// <param name="start">dVector3 containing the returned start position</param>
+        /// <param name="dir">dVector3 containing the returned direction</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomRayGet(dGeomID ray, ref dVector3 start, ref dVector3 dir);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="ray"></param>
+        /// <param name="startX"></param>
+        /// <param name="dirX"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomRayGet(dGeomID ray, ref dReal startX, ref dReal dirX);
+
+
+        /// <summary>
+        /// Set ray flags that influence ray collision detection.
+        ///
+        /// These flags are currently only noticed by the trimesh collider, because they can make a major difference there.
+        /// </summary>
+        /// <param name="g">the ray to set</param>
+        /// <param name="FirstContact">An int representing first contact - undocumented in ODE</param>
+        /// <param name="BackfaceCull">An int representing backface cull - undocumented in ODE</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomRaySetParams(dGeomID g, int FirstContact, int BackfaceCull);
+
+        /// <summary>
+        /// Get ray flags that influence ray collision detection.
+        /// </summary>
+        /// <param name="g">the ray to query</param>
+        /// <param name="FirstContact">An int representing first contact - undocumented in ODE</param>
+        /// <param name="BackfaceCull">An int representing backface cull - undocumented in ODE</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomRayGetParams(dGeomID g, ref int FirstContact, ref int BackfaceCull);
+
+        /// <summary>
+        /// Get ray flags that influence ray collision detection.
+        /// TODO: Document me - Not documented in ODE
+        /// </summary>
+        /// <param name="g">the ray to query</param>
+        /// <param name="FirstContact">An int[]</param>
+        /// <param name="BackfaceCull">An int[]</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomRayGetParams(dGeomID g, [Out]int[] FirstContact, [Out]int[] BackfaceCull);
+
+        /// <summary>
+        /// Set the closest hit parameter for a ray
+        /// TODO: Document me - not documented in ODE
+        /// </summary>
+        /// <param name="g">the ray to set</param>
+        /// <param name="closestHit">An int representing closest hit - not documented in ODE</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomRaySetClosestHit(dGeomID g, int closestHit);
+
+        /// <summary>
+        /// Get the closest hit parameter for a ray
+        /// TODO: Document me - not documented in ODE
+        /// </summary>
+        /// <returns>An int representing the closest hit parameter</returns>
+        /// <param name="g">the ray to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dGeomRayGetClosestHit(dGeomID g);
+        #endregion Ray class
+        #region Geometry transform class
+        /// <summary>
+        /// Create a new geometry transform object, and return its ID.
+        /// NOTE:  The new Geometry offset API is favored over transforms.
+        ///
+        /// If space is nonzero, insert it into that space.
+        /// On creation the encapsulated geometry is set to 0.
+        /// </summary>
+        /// <remarks>
+        /// A geometry transform `T' is a geom that encapsulates another geom `E',
+        /// allowing E to be positioned and rotated arbitrarily with respect to
+        /// its point of reference.
+        /// Most placeable geoms (like the sphere and box) have their point of
+        /// reference corresponding to their center of mass, allowing them to be
+        /// easily connected to dynamics objects. Transform objects give you more
+        /// flexibility - for example, you can offset the center of a sphere, or
+        /// rotate a cylinder so that its axis is something other than the default.
+        /// T mimics the object E that it encapsulates: T is inserted into a space
+        /// and attached to a body as though it was E. E itself must not be inserted
+        /// into a space or attached to a body. E's position and rotation are set to
+        /// constant values that say how it is transformed relative to T. If E's
+        /// position and rotation are left at their default values, T will behave
+        /// exactly like E would have if you had used it directly.
+        /// </remarks>
+        /// <returns>A dGeomID</returns>
+        /// <param name="space">A  dSpaceID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dCreateGeomTransform(dSpaceID space);
+
+        /// <summary>
+        /// Set the geom that the geometry transform g encapsulates. The object obj
+        /// must not be inserted into any space, and must not be associated with any body.
+        ///
+        /// If g has its clean-up mode turned on, and it already encapsulates an object,
+        /// the old object will be destroyed before it is replaced with the new one.
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="obj">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTransformSetGeom(dGeomID g, dGeomID obj);
+
+        /// <summary>
+        /// Get the geom that the geometry transform g encapsulates.
+        /// </summary>
+        /// <returns>A dGeomID</returns>
+        /// <param name="g">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dGeomTransformGetGeom(dGeomID g);
+
+        /// <summary>
+        /// Set the clean-up mode of geometry transform g.
+        ///
+        /// If the clean-up mode is 1, then the encapsulated object will be destroyed
+        /// when the geometry transform is destroyed.
+        /// If the clean-up mode is 0 this does not happen.
+        ///
+        /// The default clean-up mode is 0.
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="mode">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTransformSetCleanup(dGeomID g, int mode);
+
+        /// <summary>
+        /// Get the clean-up mode of geometry transform g.
+        ///
+        /// If the clean-up mode is 1, then the encapsulated object will be destroyed
+        /// when the geometry transform is destroyed.
+        /// If the clean-up mode is 0 this does not happen.
+        ///
+        /// The default clean-up mode is 0.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="g">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dGeomTransformGetCleanup(dGeomID g);
+
+        /// <summary>
+        /// Set and get the "information" mode of geometry transform g.
+        ///
+        /// The mode can be 0 or 1. The default mode is 0.
+        /// With mode 0, when a transform object is collided with another object
+        /// (using dCollide (tx_geom,other_geom,...)), the g1 field of the
+        /// dContactGeom structure is set to the geom that is encapsulated by the
+        /// transform object. This value of g1 allows the caller to interrogate the
+        /// type of the geom that is transformed, but it does not allow the caller
+        /// to determine the position in global coordinates or the associated body,
+        /// as both of these properties are used differently for encapsulated geoms.
+        /// With mode 1, the g1 field of the dContactGeom structure is set to the
+        /// transform object itself. This makes the object appear just like any other
+        /// kind of geom, as dGeomGetBody will return the attached body, and
+        /// dGeomGetPosition will return the global position.
+        /// To get the actual type of the encapsulated geom in this case,
+        /// dGeomTransformGetGeom must be used.
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="mode">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTransformSetInfo(dGeomID g, int mode);
+
+        /// <summary>
+        /// Set and get the "information" mode of geometry transform g.
+        ///
+        /// The mode can be 0 or 1. The default mode is 0.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="g">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dGeomTransformGetInfo(dGeomID g);
+        #endregion Geometry transform class
+        #region User Custom Geom class
+        /// <summary>
+        /// Create a custom (user) geom class and register with ODE.
+        /// Note ODE limits the number of custom geom classes that can be generated.
+        ///
+        /// NOTE also that this is untested and may need modification/clarification before
+        /// being considered stable.
+        /// </summary>
+        /// <param name="customclass">the custom class object</param>
+        /// <returns>a class number for the new custom geom class</returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dCreateGeomClass(dGeomClass customclass);
+
+
+        /// <summary>Return a class data for a custom user defined geom</summary>
+        /// <param name="geom"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static IntPtr dGeomGetClassData(dGeomID geom);
+
+        /// <summary>
+        /// Create an instance of a custom user-defined geom class.
+        /// </summary>
+        /// <param name="classnum">the class number of the custom geom, generated by dCreateGeomClass</param>
+        /// <returns>the id (handle) of the new geom instance</returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dCreateGeom(int classnum);
+
+        #endregion User Custom Geom class
+        #region Utility Functions
+        /// <summary>
+        /// Given two line segments A and B with endpoints a1-a2 and b1-b2, return
+        /// the points on A and B that are closest to each other (in cp1 and cp2).
+        ///
+        /// In the case of parallel lines where there are multiple solutions, a
+        /// solution involving the endpoint of at least one line will be returned.
+        /// This will work correctly for zero length lines, e.g. if a1==a2 and/or b1==b2.
+        /// </summary>
+        /// <param name="a1">A dVector3 containing endpoint 1 of line segment A</param>
+        /// <param name="a2">A dVector3 containing endpoint 2 of line segment A</param>
+        /// <param name="b1">A dVector3 containing endpoint 1 of line segment B</param>
+        /// <param name="b2">A dVector3 containing endpoint 2 of line segment B</param>
+        /// <param name="cp1">A dVector3 returning the closest point on A</param>
+        /// <param name="cp2">A dVector3 returning the closest point on B</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dClosestLineSegmentPoints(dVector3 a1, dVector3 a2,
+            dVector3 b1, dVector3 b2,
+            ref dVector3 cp1, ref dVector3 cp2);
+
+        /// <summary>
+        /// Given boxes (p1,R1,side1) and (p2,R2,side2), return 1 if they intersect
+        /// or 0 if not. p is the center of the box, R is the rotation matrix for
+        /// the box, and side is a vector of x/y/z side lengths.
+        /// </summary>
+        /// <returns>1 if the boxes intersect, 0 if they do not</returns>
+        /// <param name="_p1">A dVector3 containing the center coordinates for box 1</param>
+        /// <param name="R1">A dMatrix3 containing the rotation matrix for box 1</param>
+        /// <param name="side1">A dVector3 containing the side lengths (x/y/z) for box 1</param>
+        /// <param name="_p2">A dVector3 containing the center coordinates for box 2</param>
+        /// <param name="R2">A dMatrix3 containing the rotation matrix for box 2</param>
+        /// <param name="side2">A dVector3 containing the side lengths (x/y/z) for box 2</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dBoxTouchesBox(dVector3 _p1, dMatrix3 R1,
+            dVector3 side1, dVector3 _p2,
+            dMatrix3 R2, dVector3 side2);
+
+        /// <summary>
+        /// given two boxes (p1,R1,side1) and (p2,R2,side2), collide them together and
+        /// generate contact points. this returns 0 if there is no contact otherwise
+        /// it returns the number of contacts generated.
+        /// `normal' returns the contact normal.
+        /// `depth' returns the maximum penetration depth along that normal.
+        /// `return_code' returns a number indicating the type of contact that was
+        /// detected:
+        ///        1,2,3 = box 2 intersects with a face of box 1
+        ///        4,5,6 = box 1 intersects with a face of box 2
+        ///        7..15 = edge-edge contact
+        /// `maxc' is the maximum number of contacts allowed to be generated, i.e.
+        /// the size of the `contact' array.
+        /// `contact' and `skip' are the contact array information provided to the
+        /// collision functions.
+        ///
+        /// this function only fills in the position and depth fields.
+        /// </summary>
+        /// TODO: Needs testing.
+        /// <param name="p1">A dVector3 containing the center coordinates for box 1</param>
+        /// <param name="R1">A dMatrix3 containing the rotation matrix for box 1</param>
+        /// <param name="side1">A dVector3 containing the side lengths (x/y/z) for box 1</param>
+        /// <param name="p2">A dVector3 containing the center coordinates for box 2</param>
+        /// <param name="R2">A dMatrix3 containing the rotation matrix for box 2</param>
+        /// <param name="side2">A dVector3 containing the side lengths (x/y/z) for box 1</param>
+        /// <param name="normal">returns the value of the contact normal</param>
+        /// <param name="depth">returns the maximum penetration along the contact normal</param>
+        /// <param name="return_code">returns the type of contact detected</param>
+        /// <param name="maxc">specifies the maximum number of contacts allowed (should match size of contact array)</param>
+        /// <param name="contact">an array of ContactGeoms returning the contact information</param>
+        /// <param name="skip">contact array information provided to collision functions.  Size of contact geom?</param>
+        /// <returns>the number of contacts generated</returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int dBoxBox(dVector3 p1, dMatrix3 R1,
+         dVector3 side1, dVector3 p2,
+         dMatrix3 R2, dVector3 side2,
+         ref dVector3 normal, ref dReal depth, ref int return_code,
+         int maxc, ref dContactGeom[] contact, int skip);
+
+        /// <summary>
+        /// This function can be used as the AABB-getting function in a geometry class,
+        /// if you don't want to compute tight bounds for the AABB.
+        /// It returns +/- infinity in each direction.
+        /// </summary>
+        /// <param name="geom">the geom</param>
+        /// <param name="aabb">the returned Aabb with all positions set to +/- infinity</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dInfiniteAABB(dGeomID geom, ref Aabb aabb);
+
+        /// <summary>
+        /// This deallocates some extra memory used by ODE that can not be deallocated using the normal destroy functions,
+        /// e.g. dWorldDestroy.
+        /// You can use this function at the end of your application to prevent memory leak checkers from complaining about ODE.
+        /// </summary>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dCloseODE();
+        #endregion Utility Functions
+
+        #region Space functions
+        /// <summary>
+        /// Create a simple space.
+        ///
+        /// If space is nonzero, insert the new space into that space.
+        /// </summary>
+        /// <returns>A dSpaceID</returns>
+        /// <param name="space">A  dSpaceID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dSpaceID dSimpleSpaceCreate(dSpaceID space);
+
+        /// <summary>
+        /// Create a multi-resolution hash table space.
+        ///
+        /// If space is nonzero, insert the new space into that space.
+        /// </summary>
+        /// <returns>A dSpaceID</returns>
+        /// <param name="space">A  dSpaceID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dSpaceID dHashSpaceCreate(dSpaceID space);
+
+        /// <summary>
+        /// Creates a quadtree space.
+        /// If space is nonzero, insert the new space into that space.
+        ///
+        /// Center and Extents define the size of the root block.
+        /// Depth sets the depth of the tree - the number of blocks that are created is 4^Depth
+        /// </summary>
+        /// <returns>A dSpaceID</returns>
+        /// <param name="space">handle of space to replace</param>
+        /// <param name="Center">center of root block</param>
+        /// <param name="Extents">extents of root block</param>
+        /// <param name="Depth">depth of tree</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dSpaceID dQuadTreeSpaceCreate(dSpaceID space, dVector3 Center, dVector3 Extents, int Depth);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="space"></param>
+        /// <param name="centerX"></param>
+        /// <param name="extentsX"></param>
+        /// <param name="depth"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dSpaceID dQuadTreeSpaceCreate(dSpaceID space, ref dReal centerX, ref dReal extentsX, int depth);
+
+        /// <summary>
+        /// This destroys a space.
+        /// It functions exactly like dGeomDestroy except that it takes a dSpaceID argument.
+        /// When a space is destroyed, if its cleanup mode is 1 (the default) then all the
+        /// geoms in that space are automatically destroyed as well.
+        /// </summary>
+        /// <param name="space">the space to destroy</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dSpaceDestroy(dSpaceID space);
+
+        /// <summary>
+        /// Sets some parameters for a multi-resolution hash table space.
+        ///
+        /// The smallest and largest cell sizes used in the hash table will be
+        /// 2^minlevel and 2^maxlevel respectively.
+        ///
+        /// minlevel must be less than or equal to maxlevel.
+        /// </summary>
+        /// <param name="space">the space to modify</param>
+        /// <param name="minlevel">minimum level (determines smallest cell size).</param>
+        /// <param name="maxlevel">maximum level (determines largest cell size)</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dHashSpaceSetLevels(dSpaceID space, int minlevel, int maxlevel);
+
+        /// <summary>
+        /// Get some parameters for a multi-resolution hash table space.
+        ///
+        /// The smallest and largest cell sizes used in the hash table will be
+        /// 2^minlevel and 2^maxlevel respectively.
+        ///
+        /// minlevel must be less than or equal to maxlevel.
+        ///
+        /// The minimum and maximum levels are returned through pointers.
+        /// If a pointer is zero then it is ignored and no argument is returned.
+        /// </summary>
+        /// <param name="space">the space to query</param>
+        /// <param name="minlevel">returns current minlevel</param>
+        /// <param name="maxlevel">returns current maxlevel</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dHashSpaceGetLevels(dSpaceID space, ref int minlevel, ref int maxlevel);
+
+        /// <summary>
+        /// Set the clean-up mode of the space.
+        ///
+        /// If the clean-up mode is 1, then the contained geoms will be destroyed
+        /// when the space is destroyed.
+        /// If the clean-up mode is 0 this does not happen.
+        ///
+        /// The default clean-up mode for new spaces is 1.
+        /// </summary>
+        /// <param name="space">the space to set</param>
+        /// <param name="mode">the cleanup mode</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dSpaceSetCleanup(dSpaceID space, int mode);
+
+        /// <summary>
+        /// Get the clean-up mode of the space.
+        /// </summary>
+        /// <returns>the current cleanup mode for the space</returns>
+        /// <param name="space">the space to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dSpaceGetCleanup(dSpaceID space);
+
+        /// <summary>
+        /// Add a geom to a space.
+        ///
+        /// This does nothing if the geom is already in the space.
+        ///
+        /// This function can be called automatically if a space argument is given to
+        /// a geom creation function.
+        /// </summary>
+        /// <param name="space">the space to add the geom to</param>
+        /// <param name="geom">the geom to be added</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dSpaceAdd(dSpaceID space, dGeomID geom);
+
+        /// <summary>
+        /// Remove a geom from a space.
+        ///
+        /// This does nothing if the geom is not actually in the space.
+        ///
+        /// This function is called automatically by dGeomDestroy if the geom is in a space.
+        /// </summary>
+        /// <param name="space">the space containing the geom</param>
+        /// <param name="geom">the geom to be removed</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dSpaceRemove(dSpaceID space, dGeomID geom);
+
+        /// <summary>
+        /// Return 1 if the given geom is in the given space, or return 0 if it is not.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="space">the space to query</param>
+        /// <param name="geom">the geom to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dSpaceQuery(dSpaceID space, dGeomID geom);
+
+        /// <summary>
+        /// Cleans the space
+        /// </summary>
+        /// <param name="space">the space to clean</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dSpaceClean(dSpaceID space);
+
+        /// <summary>
+        /// Return the number of geoms contained within a space.
+        /// </summary>
+        /// <returns>the number of geoms in the space</returns>
+        /// <param name="space">the space to query</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dSpaceGetNumGeoms(dSpaceID space);
+
+        /// <summary>
+        /// Return the i'th geom contained within the space.
+        ///
+        /// i must range from 0 to dSpaceGetNumGeoms()-1.
+        ///
+        /// If any change is made to the space (including adding and deleting geoms)
+        /// then no guarantee can be made about how the index number of any
+        /// particular geom will change. Thus no space changes should be made while
+        /// enumerating the geoms.
+        /// This function is guaranteed to be fastest when the geoms are accessed in
+        /// the order 0,1,2,etc. Other non-sequential orders may result in slower
+        /// access, depending on the internal implementation.
+        /// </summary>
+        /// <returns>a handle to the geom</returns>
+        /// <param name="space">the space to query</param>
+        /// <param name="i">the index number of the geom to get</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dSpaceGetGeom(dSpaceID space, int i);
+        #endregion Space functions
+
+        #region TriMesh enums
+        /// <summary>
+        ///
+        /// </summary>
+        public enum TriMeshNumbers : int
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            TRIMESH_FACE_NORMALS = 1,
+            /// <summary>
+            ///
+            /// </summary>
+            TRIMESH_LAST_TRANSFORMATION = 2
+        }
+        #endregion TriMesh enums
+
+        #region TriMesh functions
+
+        /// <summary>
+        /// Create a dTriMeshData object which is used to store mesh data.
+        /// </summary>
+        /// <returns>the id of the new trimesh data object</returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dTriMeshDataID dGeomTriMeshDataCreate();
+
+        /// <summary>
+        /// Destroy a dTriMeshData object.
+        /// </summary>
+        /// <param name="g">the id of the trimesh data object to destroy</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshDataDestroy(dTriMeshDataID g);
+
+        /// <summary>
+        /// In order to efficiently resolve collisions, dCollideTTL needs the
+        /// positions of the colliding trimeshes in the previous timestep. This is
+        /// used to calculate an estimated velocity of each colliding triangle, which
+        /// is used to find the direction of impact, contact normals, etc. This
+        /// requires the user to update these variables at every timestep. This update
+        /// is performed outside of ODE, so it is not included in ODE itself.
+        /// The code to do this looks something like this:
+        ///		const double *DoubleArrayPtr =
+        ///			Bodies[BodyIndex].TransformationMatrix->GetArray();
+        ///		dGeomTriMeshDataSet( TriMeshData,
+        ///			TRIMESH_LAST_TRANSFORMATION,
+        ///			(void *) DoubleArrayPtr );
+        ///
+        /// The transformation matrix is the standard 4x4 homogeneous transform matrix,
+        /// and the "DoubleArray" is the standard flattened array of the 16 matrix values.
+        /// </summary>
+        /// <param name="g">the trimesh dataset handle</param>
+        /// <param name="data_id">data id, like TRIMESH_LAST_TRANSFORMATION</param>
+        /// <param name="data">a reference to the "DoubleArray"</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshDataSet(dTriMeshDataID g, int data_id, ref IntPtr data);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="g"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomTriMeshDataUpdate(dTriMeshDataID g);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="g"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dTriMeshDataID dGeomTriMeshGetData(dGeomID g);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern unsafe static dMatrix4* dGeomTriMeshGetLastTransformUnsafe(dGeomID geom);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <returns></returns>
+        public static dMatrix4 dGeomTriMeshGetLastTransform(dGeomID geom)
+        {
+            unsafe { return *(dGeomTriMeshGetLastTransformUnsafe(geom)); }
+        }
+
+        #region Trimesh data filling functions
+        // Note: this section of the ODE api seems a bit rougher than the rest
+        // Not surprising since it is still in flux according to the docs.
+        // The code below is a best attempt to work with what is there currently.
+
+        /// <summary>
+        /// Build Trimesh data with single precision used in vertex data.
+        /// </summary>
+        /// <remarks>
+        /// Applies to all the dGeomTriMeshDataBuild single and double versions.
+        ///
+        /// (From http://ode.org/ode-latest-userguide.html#sec_10_7_6)
+        ///
+        /// Used for filling a dTriMeshData object with data.
+        ///
+        /// No data is copied here, so the pointers passed into this function must
+        /// remain valid.
+        /// This is how the strided data works:
+        ///		struct StridedVertex {
+        ///			dVector3 Vertex;  // 4th component can be left out, reducing memory usage
+        ///			// Userdata
+        ///		};
+        ///		int VertexStride = sizeof (StridedVertex);
+        ///
+        ///		struct StridedTri {
+        ///			int Indices[3];
+        ///			// Userdata
+        ///		};
+        ///		int TriStride = sizeof (StridedTri);
+        ///
+        ///	The Normals argument is optional: the normals of the faces of each
+        /// trimesh object. For example,
+        ///		dTriMeshDataID TriMeshData;
+        ///		TriMeshData = dGeomTriMeshGetTriMeshDataID (
+        ///			Bodies[BodyIndex].GeomID);
+        ///
+        ///		// as long as dReal == floats
+        ///		dGeomTriMeshDataBuildSingle (TriMeshData,
+        ///			// Vertices
+        ///			Bodies[BodyIndex].VertexPositions,
+        ///			3*sizeof(dReal), (int) numVertices,
+        ///			// Faces
+        ///			Bodies[BodyIndex].TriangleIndices,
+        ///			(int) NumTriangles, 3*sizeof(unsigned int),
+        ///			// Normals
+        ///			Bodies[BodyIndex].FaceNormals);
+        ///
+        ///	This pre-calculation saves some time during evaluation of the contacts,
+        /// but isn't necessary. If you don't want to calculate the face normals
+        /// before construction (or if you have enormous trimeshes and know that
+        /// only very few faces will be touching and want to save time), just pass
+        /// a "NULL" for the Normals argument, and dCollideTTL will take care of the
+        /// normal calculations itself.
+        /// </remarks>
+        /// <param name="g">A  dTriMeshDataID</param>
+        /// <param name="Vertices">A  dVector3[]</param>
+        /// <param name="VertexStride">An int</param>
+        /// <param name="VertexCount">An int</param>
+        /// <param name="Indices">An int[]</param>
+        /// <param name="IndexCount">An int</param>
+        /// <param name="TriStride">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshDataBuildSingle(dTriMeshDataID g,
+            dVector3[] Vertices, int VertexStride, int VertexCount,
+            int[] Indices, int IndexCount, int TriStride);
+
+        /// <summary>
+        /// Build Trimesh data with single precision used in vertex data.
+        /// This function takes a normals array which is used as a trimesh-trimesh
+        /// optimization.
+        /// </summary>
+        /// <param name="g">A  dTriMeshDataID</param>
+        /// <param name="Vertices">A  dVector3[]</param>
+        /// <param name="VertexStride">An int</param>
+        /// <param name="VertexCount">An int</param>
+        /// <param name="Indices">An int[]</param>
+        /// <param name="IndexCount">An int</param>
+        /// <param name="TriStride">An int</param>
+        /// <param name="Normals">A  dVector3[]</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshDataBuildSingle1(dTriMeshDataID g,
+            dVector3[] Vertices, int VertexStride, int VertexCount,
+            int[] Indices, int IndexCount, int TriStride,
+            dVector3[] Normals);
+
+        /// <summary>
+        /// Build Trimesh data with double precision used in vertex data.
+        /// </summary>
+        /// <param name="g">A  dTriMeshDataID</param>
+        /// <param name="Vertices">A  dVector3</param>
+        /// <param name="VertexStride">An int</param>
+        /// <param name="VertexCount">An int</param>
+        /// <param name="Indices">An int[]</param>
+        /// <param name="IndexCount">An int</param>
+        /// <param name="TriStride">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshDataBuildDouble(dTriMeshDataID g,
+            dVector3 Vertices, int VertexStride, int VertexCount,
+            int[] Indices, int IndexCount, int TriStride);
+
+        /// <summary>
+        /// Build Trimesh data with double precision used in vertex data.
+        /// This function takes a normals array which is used as a trimesh-trimesh
+        /// optimization.
+        /// </summary>
+        /// <param name="g">A  dTriMeshDataID</param>
+        /// <param name="Vertices">A  dVector3[]</param>
+        /// <param name="VertexStride">An int</param>
+        /// <param name="VertexCount">An int</param>
+        /// <param name="Indices">An int[]</param>
+        /// <param name="IndexCount">An int</param>
+        /// <param name="TriStride">An int</param>
+        /// <param name="Normals">A  dVector3[]</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshDataBuildDouble1(dTriMeshDataID g,
+            dVector3[] Vertices, int VertexStride, int VertexCount,
+            int[] Indices, int IndexCount, int TriStride,
+            dVector3[] Normals);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="g"></param>
+        /// <param name="vertices"></param>
+        /// <param name="vertexStride"></param>
+        /// <param name="vertexCount"></param>
+        /// <param name="indices"></param>
+        /// <param name="indexCount"></param>
+        /// <param name="triStride"></param>
+        /// <param name="normals"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomTriMeshDataBuildDouble(dTriMeshDataID g,
+            IntPtr vertices, int vertexStride, int vertexCount,
+            IntPtr indices, int indexCount, int triStride,
+            IntPtr normals);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="g"></param>
+        /// <param name="vertices"></param>
+        /// <param name="vertexStride"></param>
+        /// <param name="vertexCount"></param>
+        /// <param name="indices"></param>
+        /// <param name="indexCount"></param>
+        /// <param name="triStride"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomTriMeshDataBuildDouble(dTriMeshDataID g,
+            IntPtr vertices, int vertexStride, int vertexCount,
+            IntPtr indices, int indexCount, int triStride);
+
+        /// <summary>
+        /// Simple trimesh build function provided for convenience.
+        ///
+        /// Uses single/double precision vertices and normals depending on the
+        /// current value of the dReal alias.
+        /// The precision to use depends on which version of the ODE library is being
+        /// used - single or double precision.  Depends on whether dSINGLE or dDOUBLE is
+        /// defined during ODE compilation.
+        /// </summary>
+        /// <param name="g">A  dTriMeshDataID</param>
+        /// <param name="Vertices">A  dVector3[]</param>
+        /// <param name="VertexCount">An int</param>
+        /// <param name="Indices">An int[]</param>
+        /// <param name="IndexCount">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshDataBuildSimple(dTriMeshDataID g,
+            dVector3[] Vertices, int VertexCount,
+            int[] Indices, int IndexCount);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="g"></param>
+        /// <param name="vertices"></param>
+        /// <param name="vertexStride"></param>
+        /// <param name="vertexCount"></param>
+        /// <param name="indices"></param>
+        /// <param name="indexCount"></param>
+        /// <param name="triStride"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomTriMeshDataBuildSingle(dTriMeshDataID g,
+            IntPtr vertices, int vertexStride, int vertexCount,
+            IntPtr indices, int indexCount, int triStride);
+
+        /// <summary>
+        /// Simple trimesh build function provided for convenience.
+        /// This version takes a normals array to use for trimesh-trimesh optimization.
+        ///
+        /// Uses single/double precision vertices and normals depending on the
+        /// current value of the dReal alias.
+        /// The precision to use depends on which version of the ODE library is being
+        /// used - single or double precision.  Depends on whether dSINGLE or dDOUBLE is
+        /// defined during ODE compilation.
+        /// </summary>
+        /// <param name="g">A  dTriMeshDataID</param>
+        /// <param name="Vertices">A  dVector3[]</param>
+        /// <param name="VertexCount">An int</param>
+        /// <param name="Indices">An int[]</param>
+        /// <param name="IndexCount">An int</param>
+        /// <param name="Normals">A  dVector3[]</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshDataBuildSimple1(dTriMeshDataID g,
+            dVector3[] Vertices, int VertexCount,
+            int[] Indices, int IndexCount,
+            dVector3[] Normals);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="g"></param>
+        /// <param name="vertices"></param>
+        /// <param name="vertexStride"></param>
+        /// <param name="vertexCount"></param>
+        /// <param name="indices"></param>
+        /// <param name="indexCount"></param>
+        /// <param name="triStride"></param>
+        /// <param name="normals"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomTriMeshDataBuildSingle1(dTriMeshDataID g,
+            IntPtr vertices, int vertexStride, int vertexCount,
+            IntPtr indices, int indexCount, int triStride,
+            IntPtr normals);
+        #endregion Trimesh data filling functions
+        #region Trimesh callback functions
+        /// <summary>
+        /// Per triangle callback.
+        /// Allows user to state if a collision with a particular triangle is wanted
+        /// If the return value is zero no contact will be generated.
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int dTriCallback(dGeomID TriMesh, dGeomID RefObject, int TriangleIndex);
+
+        /// <summary>
+        /// Set per triangle callback for specified trimesh.
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="Callback">A  dTriCallback</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshSetCallback(dGeomID g, dTriCallback Callback);
+
+        /// <summary>
+        /// Get per triangle callback for specified trimesh.
+        /// </summary>
+        /// <returns>A dTriCallback</returns>
+        /// <param name="g">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dTriCallback dGeomTriMeshGetCallback(dGeomID g);
+
+        /// <summary>
+        /// Per object callback.
+        /// Allows user to get the list of all intersecting triangles in one shot.
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void dTriArrayCallback(dGeomID TriMesh, dGeomID RefObject, int[] TriIndices, int TriCount);
+
+        /// <summary>
+        /// Set per object callback for specified trimesh.
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="ArrayCallback">A  dTriArrayCallback</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshSetArrayCallback(dGeomID g, dTriArrayCallback ArrayCallback);
+
+        /// <summary>
+        /// Get per object callback for specified trimesh
+        /// </summary>
+        /// <returns>A dTriArrayCallback</returns>
+        /// <param name="g">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dTriArrayCallback dGeomTriMeshGetArrayCallback(dGeomID g);
+
+        /// <summary>
+        /// Ray callback.
+        /// Allows the user to determine if a ray collides with a triangle based on
+        /// the barycentric coordinates of an intersection. The user can for example
+        /// sample a bitmap to determine if a collision should occur.
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int dTriRayCallback(dGeomID TriMesh, dGeomID Ray, int TriangleIndex, dReal u, dReal v);
+
+        /// <summary>
+        /// Set ray callback for specified trimesh.
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="Callback">A  dTriRayCallback</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshSetRayCallback(dGeomID g, dTriRayCallback Callback);
+
+        /// <summary>
+        /// Get ray callback for specified trimesh.
+        /// </summary>
+        /// <returns>A dTriRayCallback</returns>
+        /// <param name="g">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dTriRayCallback dGeomTriMeshGetRayCallback(dGeomID g);
+
+        #endregion Trimesh callback functions
+
+        /// <summary>
+        /// Trimesh class constructor.
+        ///
+        /// The Data member defines the vertex data the newly created triangle mesh will use.
+        ///
+        /// Callbacks are optional.
+        /// </summary>
+        /// <returns>A dGeomID</returns>
+        /// <param name="space">A  dSpaceID</param>
+        /// <param name="Data">A  dTriMeshDataID</param>
+        /// <param name="Callback">A  dTriCallback</param>
+        /// <param name="ArrayCallback">A  dTriArrayCallback</param>
+        /// <param name="RayCallback">A  dTriRayCallback</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dGeomID dCreateTriMesh(dSpaceID space, dTriMeshDataID Data, dTriCallback Callback, dTriArrayCallback ArrayCallback, dTriRayCallback RayCallback);
+
+        /// <summary>
+        /// Replaces the current vertex data.
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="Data">A  dTriMeshDataID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshSetData(dGeomID g, dTriMeshDataID Data);
+
+        // enable/disable/check temporal coherence
+        /// <summary>
+        /// Enable/disable the use of temporal coherence during tri-mesh collision checks.
+        /// Temporal coherence can be enabled/disabled per tri-mesh instance/geom class pair,
+        /// currently it works for spheres and boxes. The default for spheres and boxes is 'false'.
+        /// The 'enable' param should be 1 for true, 0 for false.
+        /// Temporal coherence is optional because allowing it can cause subtle efficiency problems
+        /// in situations where a tri-mesh may collide with many different geoms during its lifespan.
+        /// If you enable temporal coherence on a tri-mesh then these problems can be eased by
+        /// intermittently calling dGeomTriMeshClearTCCache for it.
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="geomClass">An int</param>
+        /// <param name="enable">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshEnableTC(dGeomID g, int geomClass, int enable);
+
+        /// <summary>
+        /// Checks whether the use of temporal coherence during tri-mesh collision checks is enabled.
+        ///
+        /// Returns 1 if enabled, 0 if not enabled.
+        /// </summary>
+        /// <returns>An int</returns>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="geomClass">An int</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dGeomTriMeshIsTCEnabled(dGeomID g, int geomClass);
+
+        /// <summary>
+        /// Clears the internal temporal coherence caches. When a geom has its
+        /// collision checked with a trimesh once, data is stored inside the trimesh.
+        /// With large worlds with lots of seperate objects this list could get huge.
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshClearTCCache(dGeomID g);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="g"></param>
+        /// <param name="data_id"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr dGeomTriMeshDataGet(dTriMeshDataID g, int data_id);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="g"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomTriMeshDataPreprocess(dTriMeshDataID g);
+
+        /// <summary>
+        /// Returns the TriMeshDataID for the specified geom.
+        /// </summary>
+        /// <returns>A dTriMeshDataID</returns>
+        /// <param name="g">A  dGeomID</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static dTriMeshDataID dGeomTriMeshGetTriMeshDataID(dGeomID g);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="last_trans"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomTriMeshSetLastTransform(dTriMeshDataID d, ref dMatrix4 last_trans);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <param name="M00"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dGeomTriMeshSetLastTransform(dTriMeshDataID d, ref dReal M00);
+
+        /// <summary>
+        /// Retrieves a triangle in object space. The v0, v1 and v2 arguments are optional.
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="Index">An int</param>
+        /// <param name="v0">A  dVector3</param>
+        /// <param name="v1">A  dVector3</param>
+        /// <param name="v2">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshGetTriangle(dGeomID g, int Index, ref dVector3 v0, ref dVector3 v1, ref dVector3 v2);
+
+        /// <summary>
+        /// Retrieves a position on the requested triangle and the given
+        /// barycentric coordinates
+        /// </summary>
+        /// <param name="g">A  dGeomID</param>
+        /// <param name="Index">An int</param>
+        /// <param name="u">A  dReal</param>
+        /// <param name="v">A  dReal</param>
+        /// <param name="Out">A  dVector3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dGeomTriMeshGetPoint(dGeomID g, int Index, dReal u, dReal v, ref dVector3 Out);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="d"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static int dGeomTriMeshGetTriangleCount(dTriMeshDataID d);
+        #endregion TriMesh functions
+
+        #region Rotation Functions
+
+        /// <summary>
+        /// Set R to the identity matrix (i.e. no rotation).
+        /// </summary>
+        /// <param name="R">A dMatrix3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dRSetIdentity(out dMatrix3 R);
+
+        /// <summary>
+        /// Compute the rotation matrix R as a rotation of angle radians along the axis (ax,ay,az).
+        /// </summary>
+        /// <param name="R">A dMatrix3</param>
+        /// <param name="ax">A dReal</param>
+        /// <param name="ay">A dReal</param>
+        /// <param name="az">A dReal</param>
+        /// <param name="angle">A dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dRFromAxisAndAngle(out dMatrix3 R, dReal ax, dReal ay, dReal az, dReal angle);
+
+        /// <summary>
+        /// Compute the rotation matrix R from the three Euler rotation angles.
+        /// </summary>
+        /// <param name="R">A dMatrix3</param>
+        /// <param name="phi">A dReal</param>
+        /// <param name="theta">A dReal</param>
+        /// <param name="psi">A dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dRFromEulerAngles(out dMatrix3 R, dReal phi, dReal theta, dReal psi);
+
+        /// <summary>
+        /// Compute the rotation matrix R from the two vectors `a' (ax,ay,az) and `b' (bx,by,bz). `a' and `b' are the desired x and y axes of the rotated coordinate system. If necessary, `a' and `b' will be made unit length, and `b' will be projected so that it is perpendicular to `a'. The desired z axis is the cross product of `a' and `b'.
+        /// </summary>
+        /// <param name="R">A dMatrix3</param>
+        /// <param name="ax">A dReal</param>
+        /// <param name="ay">A dReal</param>
+        /// <param name="az">A dReal</param>
+        /// <param name="bx">A dReal</param>
+        /// <param name="by">A dReal</param>
+        /// <param name="bz">A dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dRFrom2Axes(out dMatrix3 R, dReal ax, dReal ay, dReal az, dReal bx, dReal by, dReal bz);
+
+        /// <summary>
+        /// TODO: Document Me
+        /// </summary>
+        /// <param name="R"></param>
+        /// <param name="ax"></param>
+        /// <param name="ay"></param>
+        /// <param name="az"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dRFromZAxis(dReal[] R, dReal ax, dReal ay, dReal az);
+
+        /// <summary>
+        /// ODE API compatability function due to dMatrix3 marshalling errors
+        /// </summary>
+        /// <param name="R"></param>
+        /// <param name="ax"></param>
+        /// <param name="ay"></param>
+        /// <param name="az"></param>
+        public static void dRFromZAxis(dMatrix3 R, dReal ax, dReal ay, dReal az)
+        {
+            dRFromZAxis(R.ToArray(), ax, ay, az);
+        }
+
+        /// <summary>
+        /// Set q to the identity rotation (i.e. no rotation).
+        /// </summary>
+        /// <param name="q">A dQuaternion</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dQSetIdentity(out dQuaternion q);
+
+        /// <summary>
+        /// Compute q as a rotation of angle radians along the axis (ax,ay,az).
+        /// </summary>
+        /// <param name="q">A dQuaternion</param>
+        /// <param name="ax">A dReal</param>
+        /// <param name="ay">A dReal</param>
+        /// <param name="az">A dReal</param>
+        /// <param name="angle">A dReal</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dQFromAxisAndAngle(out dQuaternion q, dReal ax, dReal ay, dReal az, dReal angle);
+
+        /// <summary>
+        /// Set qa = qb*qc. This is that same as qa = rotation qc followed by rotation qb. The 0/1/2 versions are analogous to the multiply functions, i.e. 1 uses the inverse of qb, and 2 uses the inverse of qc. Option 3 uses the inverse of both.
+        /// </summary>
+        /// <param name="qa">A dQuaternion</param>
+        /// <param name="qb">A returning dQuaternion</param>
+        /// <param name="qc">A returning dQuaternion</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dQMultiply0(out dQuaternion qa, ref dQuaternion qb, ref dQuaternion qc);
+
+        /// <summary>
+        /// Set qa = qb*qc. This is that same as qa = rotation qc followed by rotation qb. The 0/1/2 versions are analogous to the multiply functions, i.e. 1 uses the inverse of qb, and 2 uses the inverse of qc. Option 3 uses the inverse of both.
+        /// </summary>
+        /// <param name="qa">A dQuaternion</param>
+        /// <param name="qb">A returning dQuaternion</param>
+        /// <param name="qc">A returning dQuaternion</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dQMultiply1(out dQuaternion qa, ref dQuaternion qb, ref dQuaternion qc);
+
+        /// <summary>
+        /// Set qa = qb*qc. This is that same as qa = rotation qc followed by rotation qb. The 0/1/2 versions are analogous to the multiply functions, i.e. 1 uses the inverse of qb, and 2 uses the inverse of qc. Option 3 uses the inverse of both.
+        /// </summary>
+        /// <param name="qa">A dQuaternion</param>
+        /// <param name="qb">A returning dQuaternion</param>
+        /// <param name="qc">A returning dQuaternion</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dQMultiply2(out dQuaternion qa, ref dQuaternion qb, ref dQuaternion qc);
+
+        /// <summary>
+        /// Set qa = qb*qc. This is that same as qa = rotation qc followed by rotation qb. The 0/1/2 versions are analogous to the multiply functions, i.e. 1 uses the inverse of qb, and 2 uses the inverse of qc. Option 3 uses the inverse of both.
+        /// </summary>
+        /// <param name="qa">A dQuaternion</param>
+        /// <param name="qb">A returning dQuaternion</param>
+        /// <param name="qc">A returning dQuaternion</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dQMultiply3(out dQuaternion qa, ref dQuaternion qb, ref dQuaternion qc);
+
+        /// <summary>
+        /// Convert quaternion q to rotation matrix R.
+        /// </summary>
+        /// <param name="q">A dQuaternion</param>
+        /// <param name="R">A dMatrix3</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dQtoR(ref dQuaternion q, out dMatrix3 R);
+
+        /// <summary>
+        /// Convert rotation matrix R to quaternion q.
+        /// </summary>
+        /// <param name="R">A dMatrix3</param>
+        /// <param name="q">A dQuaternion</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dRtoQ(ref dMatrix3 R, out dQuaternion q);
+
+        /// <summary>
+        /// Given an existing orientation q and an angular velocity vector w, return in dq the resulting dq/dt.
+        /// </summary>
+        /// <param name="w">A dVector3</param>
+        /// <param name="q">A dQuaternion</param>
+        /// <param name="dq">A dVector4</param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public extern static void dWtoDQ(ref dVector3 w, ref dQuaternion q, out dVector4 dq);
+
+        #endregion Rotation Functions
+
+        #endregion Public Externs
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="body"></param>
+        /// <param name="pos"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dBodyCopyPosition(dBodyID body, out dVector3 pos);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="body"></param>
+        /// <param name="X"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dBodyCopyPosition(dBodyID body, out dReal X);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="body"></param>
+        /// <param name="quat"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dBodyCopyQuaternion(dBodyID body, out dQuaternion quat);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="body"></param>
+        /// <param name="X"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dBodyCopyQuaternion(dBodyID body, out dReal X);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="body"></param>
+        /// <param name="R"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dBodyCopyRotation(dBodyID body, out dMatrix3 R);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="body"></param>
+        /// <param name="M00"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dBodyCopyRotation(dBodyID body, out dReal M00);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="o1"></param>
+        /// <param name="o2"></param>
+        /// <param name="aabb"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int dAABBTestFn(dGeomID o1, dGeomID o2, ref dReal aabb);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="o1"></param>
+        /// <param name="o2"></param>
+        /// <param name="flags"></param>
+        /// <param name="contact"></param>
+        /// <param name="skip"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int dColliderFn(dGeomID o1, dGeomID o2, int flags, out dContactGeom contact, int skip);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="aabb"></param>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void dGetAABBFn(dGeomID geom, out dReal aabb);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="num"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate dColliderFn dGetColliderFnFn(int num);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="o"></param>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void dGeomDtorFn(dGeomID o);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="p_user_data"></param>
+        /// <param name="x"></param>
+        /// <param name="z"></param>
+        /// <returns></returns>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate dReal dHeightfieldGetHeight(IntPtr p_user_data, int x, int z);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct dGeomClass
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public int bytes;
+            /// <summary>
+            /// 
+            /// </summary>
+            public dGetColliderFnFn collider;
+            /// <summary>
+            /// 
+            /// </summary>
+            public dGetAABBFn aabb;
+            /// <summary>
+            /// 
+            /// </summary>
+            public dAABBTestFn aabb_test;
+            /// <summary>
+            /// 
+            /// </summary>
+            public dGeomDtorFn dtor;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="space"></param>
+        /// <param name="data"></param>
+        /// <param name="bPlaceable"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr dCreateHeightfield(dSpaceID space, IntPtr data, int bPlaceable);
+
+
+        // NOT IMPLEMENTED
+        // This region contains functions in the ODE 0.9 source that are part of the
+        // ODE public API (labeled ODE_API in the ODE source), but aren't implemented in
+        // Tao.Ode.  In a few cases they may be awaiting implementation, but most of the
+        // functions here are deliberately not implemented.
+        // The primary reason for not implementing a function is that it does not seem to
+        // implement core ODE functionality and so isn't worth the effort to wrap.  Such a
+        // function could be better implemented in fully managed code rather than calling
+        // into the ODE library.
+        // An example of this is dSetZero(dReal *a, int n), which just sets a vector or matrix
+        // of size n to all zeros.  This can easily be done in managed code by the Tao.Ode user.
+        //
+        // Conceivably, some utility functions such as this could be implemented as fully managed
+        // parts of Tao.Ode, if deemed useful.
+        //
+        // If any of the functions listed here are of interest to a Tao.Ode user, please discuss
+        // with the Tao.Ode maintainers.
+        //
+        // Unimplemented functions:
+        //
+        // From ode's matrix.h
+        // ODE_API void dSetZero (dReal *a, int n);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="n"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dSetZero(out dReal a, int n);
+        // ODE_API void dSetValue (dReal *a, int n, dReal value);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="n"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dSetValue(out dReal a, int n);
+        // ODE_API void dSetErrorHandler (dMessageFunction *fn);
+        // ODE_API void dSetDebugHandler (dMessageFunction *fn);
+        // ODE_API void dSetMessageHandler (dMessageFunction *fn);
+        // ODE_API dMessageFunction *dGetErrorHandler(void);
+        // ODE_API dMessageFunction *dGetDebugHandler(void);
+        // ODE_API dMessageFunction *dGetMessageHandler(void);
+        // ODE_API void dError (int num, const char *msg, ...);
+        // ODE_API void dDebug (int num, const char *msg, ...);
+        // ODE_API void dMessage (int num, const char *msg, ...);
+        //ODE_API dReal dDot (const dReal *a, const dReal *b, int n);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="X0"></param>
+        /// <param name="X1"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dReal dDot(ref dReal X0, ref dReal X1, int n);
+        // ODE_API void dMultiply0 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r);
+        // ODE_API void dMultiply1 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r);
+        // ODE_API void dMultiply2 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="world"></param>
+        /// <param name="group"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dJointID dJointCreatePlane2D(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="world"></param>
+        /// <param name="group"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dJointID dJointCreatePR(dWorldID world, dJointGroupID group);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="joint"></param>
+        /// <param name="torque"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dJointAddPRTorque(dJointID joint, dReal torque);
+        // ODE_API int dFactorCholesky (dReal *A, int n);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="A00"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int dFactorCholesky(ref dReal A00, int n);
+        // ODE_API void dSolveCholesky (const dReal *L, dReal *b, int n);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="b"></param>
+        /// <param name="n"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dSolveCholesky(ref dReal L, out dReal b, int n);
+        // ODE_API int dInvertPDMatrix (const dReal *A, dReal *Ainv, int n);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="A"></param>
+        /// <param name="Ainv"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int dInvertPDMatrix(ref dReal A, out dReal Ainv, int n);
+        // ODE_API int dIsPositiveDefinite (const dReal *A, int n);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="A"></param>
+        /// <param name="n"></param>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int dIsPositiveDefinite(ref dReal A, int n);
+        // ODE_API void dFactorLDLT (dReal *A, dReal *d, int n, int nskip);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="A"></param>
+        /// <param name="d"></param>
+        /// <param name="n"></param>
+        /// <param name="nskip"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dFactorLDLT(ref dReal A, out dReal d, int n, int nskip);
+        // ODE_API void dSolveL1 (const dReal *L, dReal *b, int n, int nskip);
+        // ODE_API void dSolveL1T (const dReal *L, dReal *b, int n, int nskip);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="b"></param>
+        /// <param name="n"></param>
+        /// <param name="nskip"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dSolveL1T(ref dReal L, out dReal b, int n, int nskip);
+        // ODE_API void dVectorScale (dReal *a, const dReal *d, int n);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="d"></param>
+        /// <param name="n"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dVectorScale(out dReal a, ref dReal d, int n);
+        // ODE_API void dSolveLDLT (const dReal *L, const dReal *d, dReal *b, int n, int nskip);
+        // ODE_API void dLDLTAddTL (dReal *L, dReal *d, const dReal *a, int n, int nskip);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="L"></param>
+        /// <param name="d"></param>
+        /// <param name="a"></param>
+        /// <param name="n"></param>
+        /// <param name="nskip"></param>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void dLDLTAddTL(ref dReal L, ref dReal d, ref dReal a, int n, int nskip);
+        // ODE_API void dLDLTRemove (dReal **A, const int *p, dReal *L, dReal *d,
+        //          int n1, int n2, int r, int nskip);
+        // ODE_API void dRemoveRowCol (dReal *A, int n, int nskip, int r);
+        //
+        // memory management functions from memory.h:
+        // ODE_API void dSetAllocHandler (dAllocFunction *fn);
+        // ODE_API void dSetReallocHandler (dReallocFunction *fn);
+        // ODE_API void dSetFreeHandler (dFreeFunction *fn);
+        // ODE_API dAllocFunction *dGetAllocHandler (void);
+        // ODE_API dReallocFunction *dGetReallocHandler (void);
+        // ODE_API dFreeFunction *dGetFreeHandler (void);
+        // ODE_API void * dAlloc (size_t size);
+        // ODE_API void * dRealloc (void *ptr, size_t oldsize, size_t newsize);
+        // ODE_API void dFree (void *ptr, size_t size);
+        //
+        // miscellaneous functions from misc.h:
+        //ODE_API int dTestRand(void);
+        //ODE_API unsigned long dRand(void);
+        //ODE_API unsigned long  dRandGetSeed(void);
+        //ODE_API void dRandSetSeed (unsigned long s);
+        //ODE_API int dRandInt (int n);
+        //ODE_API dReal dRandReal(void);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        [DllImport(ODE_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern dReal dRandReal();
+        //ODE_API void dPrintMatrix (const dReal *A, int n, int m, char *fmt = "%10.4f ",
+        //           FILE *f=stdout);
+        //ODE_API void dPrintMatrix (const dReal *A, int n, int m, char *fmt, FILE *f);
+        //ODE_API void dMakeRandomVector (dReal *A, int n, dReal range);
+        //ODE_API void dMakeRandomMatrix (dReal *A, int n, int m, dReal range);
+        //ODE_API void dClearUpperTriangle (dReal *A, int n);
+        //ODE_API dReal dMaxDifference (const dReal *A, const dReal *B, int n, int m);
+        //ODE_API dReal dMaxDifferenceLowerTriangle (const dReal *A, const dReal *B, int n);
+
+        // From odemath.h
+        // ODE_API void dNormalize3 (dVector3 a);
+        // ODE_API void dNormalize4 (dVector4 a);
+        // void dPlaneSpace (const dVector3 n, dVector3 p, dVector3 q);
+
+        // from timer.h
+        // ODE_API void dStopwatchReset (dStopwatch *);
+        // ODE_API void dStopwatchStart (dStopwatch *);
+        // ODE_API void dStopwatchStop  (dStopwatch *);
+        // ODE_API double dStopwatchTime (dStopwatch *);	/* returns total time in secs */
+        // ODE_API void dTimerStart (const char *description);	/* pass a static string here */
+        // ODE_API void dTimerNow (const char *description);	/* pass a static string here */
+        // ODE_API void dTimerEnd(void);
+        // ODE_API void dTimerReport (FILE *fout, int average);
+        // ODE_API double dTimerTicksPerSecond(void);
+        // ODE_API double dTimerResolution(void);
+
+        // from compatability.h
+        // already implemented as dQtoR
+        // ODE_API void dRfromQ (dMatrix3 R, const dQuaternion q);
+
+        // already implemented as dRtoQ
+        // ODE_API void dQfromR (dQuaternion q, const dMatrix3 R);
+
+        // already implemented as dWtoDQ
+        // ODE_API void dDQfromW (dReal dq[4], const dVector3 w, const dQuaternion q);
+    }
+}
diff --git a/src/Tao.Ode/Properties/AssemblyInfo.cs b/src/Tao.Ode/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..fec008e
--- /dev/null
+++ b/src/Tao.Ode/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright (c)2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright (c)2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.Ode")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework Tao.Ode Binding For .NET")]
+[assembly: AssemblyFileVersion("0.9.0.0")]
+[assembly: AssemblyInformationalVersion("0.9.0.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.Ode.dll")]
+[assembly: AssemblyTitle("Tao Framework Tao.Ode Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("0.9.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.Ode/README b/src/Tao.Ode/README
new file mode 100644
index 0000000..34e1752
--- /dev/null
+++ b/src/Tao.Ode/README
@@ -0,0 +1,33 @@
+Tao.Ode 0.8.0.0
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.Ode is an ODE API binding for .NET, implementing ODE 0.8.
+
+
+Change Log:
+0.9.0.0 - Feb 1, 2008:
+	Update to ODE 0.8 by David Hudson (jendave at yahoo.com)
+0.8.0.0 - Nov 10, 2007:
+	Update to ODE 0.8 by David Hudson (jendave at yahoo.com)
+0.6.0.0 - July 25, 2006:
+	Update to ODE 0.6 complete.
+	The ODE 0.6 release consists of many bug fixes and
+	improvements since the 0.5 release.
+	There are also many documented and undocumented changes in the API.
+	Notable changes: CCylinder renamed to Capsule
+			 Support for geom offsets added (geom transforms discouraged)
+	This update also includes a patch from Markus Ewald to fix a bug in
+	dGeomSetRotation and inspired related changes.  Thanks Markus.
+
+0.5.0.2 - Jan 25, 2006:
+	Version bump.  Various bug fixes and changes made over the recent
+	months, the most significant being that collision callbacks should
+	now be working.
+
+0.5.0.1 - July 24, 2005:
+	Merge in changes from cody (Sebastian Kotulla)
+	
+0.5.0.0 - November 28, 2004:
+    Initial release.
diff --git a/src/Tao.Ode/TODO b/src/Tao.Ode/TODO
new file mode 100644
index 0000000..0354918
--- /dev/null
+++ b/src/Tao.Ode/TODO
@@ -0,0 +1,23 @@
+Issues
+------
+
+Single/Double precision:
+	Currently the code is configured for single precision, so can only be 
+	run against a single precision Ode library.
+	Tao.Ode binding can be configured for double precision by changing the 
+	value of the dReal alias to System.Double and recompiling, but this 
+	hasn't been tested extensively.
+	What needs to be worked out is a reasonable way to deal with the fact 
+	that there can be at least 2 versions of the ODE library.  
+	Possible solutions:
+	-	Compile 2 versions of Tao.Ode (Tao.Ode.Single.dll and 
+		Tao.Ode.Double.dll) as part of normal build
+	-	Target a single assembly (Tao.Ode.dll) but control precision 
+		at compile time with appropriate #ifdef statements.
+	-	Your solution here - let me know on the Tao mailing list
+   
+
+Unit tests:
+	Unit tests need to be written to cover as much ODE functionality as possible.
+	Tests for Matrix3 marshalling have already been implemented.
+
diff --git a/src/Tao.Ode/Tao.Ode.csproj b/src/Tao.Ode/Tao.Ode.csproj
new file mode 100644
index 0000000..fd0e87a
--- /dev/null
+++ b/src/Tao.Ode/Tao.Ode.csproj
@@ -0,0 +1,98 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{FF441462-B6DB-480C-844B-1281C439D514}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.Ode</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.Ode.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.Ode</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Ode.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Ode.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Ode.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.Ode.dll.config" />
+    <None Include="Tao.Ode.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.Ode/Tao.Ode.dll.config b/src/Tao.Ode/Tao.Ode.dll.config
new file mode 100644
index 0000000..33e2cb1
--- /dev/null
+++ b/src/Tao.Ode/Tao.Ode.dll.config
@@ -0,0 +1,5 @@
+<configuration>
+    <dllmap dll="ode.dll" os="windows" target="ode.dll" />
+    <dllmap dll="ode.dll" os="osx" target="libode.so.0debian1" />
+    <dllmap dll="ode.dll" os="!windows,osx" target="libode.so.0debian1" />
+</configuration>
diff --git a/src/Tao.Ode/Tao.Ode.snk b/src/Tao.Ode/Tao.Ode.snk
new file mode 100644
index 0000000..886acc0
Binary files /dev/null and b/src/Tao.Ode/Tao.Ode.snk differ
diff --git a/src/Tao.Ode/tao-ode.pc.in b/src/Tao.Ode/tao-ode.pc.in
new file mode 100644
index 0000000..67b3bca
--- /dev/null
+++ b/src/Tao.Ode/tao-ode.pc.in
@@ -0,0 +1,8 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.Ode
+Description: Ode portion of the Tao framework
+Version: @TAOODE_VERSION@
+Libs: -r:${libdir}/mono/tao-ode- at TAOODE_MAJOR@/Tao.Ode.dll
diff --git a/src/Tao.OpenAl/ALDelegates.cs b/src/Tao.OpenAl/ALDelegates.cs
new file mode 100644
index 0000000..a51a352
--- /dev/null
+++ b/src/Tao.OpenAl/ALDelegates.cs
@@ -0,0 +1,247 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+namespace Tao.OpenAl
+{
+    using System;
+    using System.Runtime.InteropServices;
+
+    internal static class Delegates
+    {
+        static Delegates()
+        {
+        }
+
+        /// <summary>
+        /// Creates a System.Delegate that can be used to call a dynamically exported OpenAL function.
+        /// </summary>
+        /// <param name="name">The function string for the OpenAL function</param>
+        /// <param name="signature">The signature of the OpenAL function.</param>
+        /// <returns>
+        /// A System.Delegate that can be used to call this OpenAL function or null
+        /// if the function is not available in the current OpenAL context.
+        /// </returns>
+        public static Delegate GetDelegateForExtensionMethod(string name, Type signature)
+        {
+            IntPtr address = Al.alGetProcAddress(name);
+            if (address == IntPtr.Zero)
+            {
+                return null;
+            }
+            else
+            {
+                return Marshal.GetDelegateForFunctionPointer(address, signature);
+            }
+        }
+
+        #region X-RAM
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void EAXSetBufferModeDelegate(int n, [Out] int* buffers, int value);
+        internal static EAXSetBufferModeDelegate EAXSetBufferMode = (EAXSetBufferModeDelegate)GetDelegateForExtensionMethod("EAXSetBufferMode", typeof(EAXSetBufferModeDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate int EAXGetBufferModeDelegate(int buffer, [Out] int* reserved);
+        internal static EAXGetBufferModeDelegate EAXGetBufferMode = (EAXGetBufferModeDelegate)GetDelegateForExtensionMethod("EAXGetBufferMode", typeof(EAXGetBufferModeDelegate));
+        #endregion
+
+        #region EFX_EXT
+        #region alEffect
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGenEffectsDelegate(int size, [Out] int* effects);
+        internal static alGenEffectsDelegate alGenEffects = (alGenEffectsDelegate)GetDelegateForExtensionMethod("alGenEffects", typeof(alGenEffectsDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alDeleteEffectsDelegate(int size, int* effects);
+        internal static alDeleteEffectsDelegate alDeleteEffects = (alDeleteEffectsDelegate)GetDelegateForExtensionMethod("alDeleteEffects", typeof(alDeleteEffectsDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal delegate bool alIsEffectDelegate(int effect);
+        internal static alIsEffectDelegate alIsEffect = (alIsEffectDelegate)GetDelegateForExtensionMethod("alIsEffect", typeof(alIsEffectDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal delegate void alEffectiDelegate(int effect, int param, int value);
+        internal static alEffectiDelegate alEffecti = (alEffectiDelegate)GetDelegateForExtensionMethod("alEffecti", typeof(alEffectiDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alEffectivDelegate(int effect, int param, int* value);
+        internal static alEffectivDelegate alEffectiv = (alEffectivDelegate)GetDelegateForExtensionMethod("alEffectiv", typeof(alEffectivDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal delegate void alEffectfDelegate(int effect, int param, float value);
+        internal static alEffectfDelegate alEffectf = (alEffectfDelegate)GetDelegateForExtensionMethod("alEffectf", typeof(alEffectfDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alEffectfvDelegate(int effect, int param, float* value);
+        internal static alEffectfvDelegate alEffectfv = (alEffectfvDelegate)GetDelegateForExtensionMethod("alEffectfv", typeof(alEffectfvDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetEffectiDelegate(int effect, int param, [Out] int* value);
+        internal static alGetEffectiDelegate alGetEffecti = (alGetEffectiDelegate)GetDelegateForExtensionMethod("alGetEffecti", typeof(alGetEffectiDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetEffectivDelegate(int effect, int param, [Out] int* value);
+        internal static alGetEffectivDelegate alGetEffectiv = (alGetEffectivDelegate)GetDelegateForExtensionMethod("alGetEffectiv", typeof(alGetEffectivDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetEffectfDelegate(int effect, int param, [Out] float* value);
+        internal static alGetEffectfDelegate alGetEffectf = (alGetEffectfDelegate)GetDelegateForExtensionMethod("alGetEffectf", typeof(alGetEffectfDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetEffectfvDelegate(int effect, int param, [Out] float* value);
+        internal static alGetEffectfvDelegate alGetEffectfv = (alGetEffectfvDelegate)GetDelegateForExtensionMethod("alGetEffectfv", typeof(alGetEffectfvDelegate));
+        #endregion
+
+        #region alFilter
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGenFiltersDelegate(int size, [Out] int* Filters);
+        internal static alGenFiltersDelegate alGenFilters = (alGenFiltersDelegate)GetDelegateForExtensionMethod("alGenFilters", typeof(alGenFiltersDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alDeleteFiltersDelegate(int size, int* Filters);
+        internal static alDeleteFiltersDelegate alDeleteFilters = (alDeleteFiltersDelegate)GetDelegateForExtensionMethod("alDeleteFilters", typeof(alDeleteFiltersDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal delegate bool alIsFilterDelegate(int Filter);
+        internal static alIsFilterDelegate alIsFilter = (alIsFilterDelegate)GetDelegateForExtensionMethod("alIsFilter", typeof(alIsFilterDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal delegate void alFilteriDelegate(int Filter, int param, int value);
+        internal static alFilteriDelegate alFilteri = (alFilteriDelegate)GetDelegateForExtensionMethod("alFilteri", typeof(alFilteriDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alFilterivDelegate(int Filter, int param, int* value);
+        internal static alFilterivDelegate alFilteriv = (alFilterivDelegate)GetDelegateForExtensionMethod("alFilteriv", typeof(alFilterivDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal delegate void alFilterfDelegate(int Filter, int param, float value);
+        internal static alFilterfDelegate alFilterf = (alFilterfDelegate)GetDelegateForExtensionMethod("alFilterf", typeof(alFilterfDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alFilterfvDelegate(int Filter, int param, float* value);
+        internal static alFilterfvDelegate alFilterfv = (alFilterfvDelegate)GetDelegateForExtensionMethod("alFilterfv", typeof(alFilterfvDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetFilteriDelegate(int Filter, int param, [Out] int* value);
+        internal static alGetFilteriDelegate alGetFilteri = (alGetFilteriDelegate)GetDelegateForExtensionMethod("alGetFilteri", typeof(alGetFilteriDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetFilterivDelegate(int Filter, int param, [Out] int* value);
+        internal static alGetFilterivDelegate alGetFilteriv = (alGetFilterivDelegate)GetDelegateForExtensionMethod("alGetFilteriv", typeof(alGetFilterivDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetFilterfDelegate(int Filter, int param, [Out] float* value);
+        internal static alGetFilterfDelegate alGetFilterf = (alGetFilterfDelegate)GetDelegateForExtensionMethod("alGetFilterf", typeof(alGetFilterfDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetFilterfvDelegate(int Filter, int param, [Out] float* value);
+        internal static alGetFilterfvDelegate alGetFilterfv = (alGetFilterfvDelegate)GetDelegateForExtensionMethod("alGetFilterfv", typeof(alGetFilterfvDelegate));
+        #endregion
+
+        #region alFilter
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGenAuxiliaryEffectSlotsDelegate(int size, [Out] int* AuxiliaryEffectSlots);
+        internal static alGenAuxiliaryEffectSlotsDelegate alGenAuxiliaryEffectSlots = (alGenAuxiliaryEffectSlotsDelegate)GetDelegateForExtensionMethod("alGenAuxiliaryEffectSlots", typeof(alGenAuxiliaryEffectSlotsDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alDeleteAuxiliaryEffectSlotsDelegate(int size, int* AuxiliaryEffectSlots);
+        internal static alDeleteAuxiliaryEffectSlotsDelegate alDeleteAuxiliaryEffectSlots = (alDeleteAuxiliaryEffectSlotsDelegate)GetDelegateForExtensionMethod("alDeleteAuxiliaryEffectSlots", typeof(alDeleteAuxiliaryEffectSlotsDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal delegate bool alIsAuxiliaryEffectSlotDelegate(int AuxiliaryEffectSlot);
+        internal static alIsAuxiliaryEffectSlotDelegate alIsAuxiliaryEffectSlot = (alIsAuxiliaryEffectSlotDelegate)GetDelegateForExtensionMethod("alIsAuxiliaryEffectSlot", typeof(alIsAuxiliaryEffectSlotDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal delegate void alAuxiliaryEffectSlotiDelegate(int AuxiliaryEffectSlot, int param, int value);
+        internal static alAuxiliaryEffectSlotiDelegate alAuxiliaryEffectSloti = (alAuxiliaryEffectSlotiDelegate)GetDelegateForExtensionMethod("alAuxiliaryEffectSloti", typeof(alAuxiliaryEffectSlotiDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alAuxiliaryEffectSlotivDelegate(int AuxiliaryEffectSlot, int param, int* value);
+        internal static alAuxiliaryEffectSlotivDelegate alAuxiliaryEffectSlotiv = (alAuxiliaryEffectSlotivDelegate)GetDelegateForExtensionMethod("alAuxiliaryEffectSlotiv", typeof(alAuxiliaryEffectSlotivDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal delegate void alAuxiliaryEffectSlotfDelegate(int AuxiliaryEffectSlot, int param, float value);
+        internal static alAuxiliaryEffectSlotfDelegate alAuxiliaryEffectSlotf = (alAuxiliaryEffectSlotfDelegate)GetDelegateForExtensionMethod("alAuxiliaryEffectSlotf", typeof(alAuxiliaryEffectSlotfDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alAuxiliaryEffectSlotfvDelegate(int AuxiliaryEffectSlot, int param, float* value);
+        internal static alAuxiliaryEffectSlotfvDelegate alAuxiliaryEffectSlotfv = (alAuxiliaryEffectSlotfvDelegate)GetDelegateForExtensionMethod("alAuxiliaryEffectSlotfv", typeof(alAuxiliaryEffectSlotfvDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetAuxiliaryEffectSlotiDelegate(int AuxiliaryEffectSlot, int param, [Out] int* value);
+        internal static alGetAuxiliaryEffectSlotiDelegate alGetAuxiliaryEffectSloti = (alGetAuxiliaryEffectSlotiDelegate)GetDelegateForExtensionMethod("alGetAuxiliaryEffectSloti", typeof(alGetAuxiliaryEffectSlotiDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetAuxiliaryEffectSlotivDelegate(int AuxiliaryEffectSlot, int param, [Out] int* value);
+        internal static alGetAuxiliaryEffectSlotivDelegate alGetAuxiliaryEffectSlotiv = (alGetAuxiliaryEffectSlotivDelegate)GetDelegateForExtensionMethod("alGetAuxiliaryEffectSlotiv", typeof(alGetAuxiliaryEffectSlotivDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetAuxiliaryEffectSlotfDelegate(int AuxiliaryEffectSlot, int param, [Out] float* value);
+        internal static alGetAuxiliaryEffectSlotfDelegate alGetAuxiliaryEffectSlotf = (alGetAuxiliaryEffectSlotfDelegate)GetDelegateForExtensionMethod("alGetAuxiliaryEffectSlotf", typeof(alGetAuxiliaryEffectSlotfDelegate));
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        [System.Security.SuppressUnmanagedCodeSecurity()]
+        internal unsafe delegate void alGetAuxiliaryEffectSlotfvDelegate(int AuxiliaryEffectSlot, int param, [Out] float* value);
+        internal static alGetAuxiliaryEffectSlotfvDelegate alGetAuxiliaryEffectSlotfv = (alGetAuxiliaryEffectSlotfvDelegate)GetDelegateForExtensionMethod("alGetAuxiliaryEffectSlotfv", typeof(alGetAuxiliaryEffectSlotfvDelegate));
+        #endregion
+        #endregion
+
+    }
+}
diff --git a/src/Tao.OpenAl/AUTHORS b/src/Tao.OpenAl/AUTHORS
new file mode 100644
index 0000000..c827b8a
--- /dev/null
+++ b/src/Tao.OpenAl/AUTHORS
@@ -0,0 +1,4 @@
+Randy Ridge
+Rob Loach
+Dave Hudson
+C.J. Adams-Collier (build system)
diff --git a/src/Tao.OpenAl/Al.cs b/src/Tao.OpenAl/Al.cs
new file mode 100644
index 0000000..5647cb3
--- /dev/null
+++ b/src/Tao.OpenAl/Al.cs
@@ -0,0 +1,6196 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+// Disable missing XML comment warnings
+#pragma warning disable 1591 
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tao.OpenAl
+{
+    #region Class Documentation
+    /// <summary>
+    ///     OpenAL binding for .NET, implementing AL 1.1.
+    /// </summary>
+    /// <remarks>
+    ///     Binds functions and definitions in OpenAL32.dll or libAL.so.
+    /// </remarks>
+    #endregion Class Documentation
+    public static class Al
+    {
+        // --- Fields ---
+        #region Private Constants
+        #region string AL_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies OpenAl's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies OpenAl32.dll everywhere; will be mapped via .config for mono.
+        /// </remarks>
+        private const string AL_NATIVE_LIBRARY = "OpenAL32.dll";
+        #endregion string AL_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Cdecl" />.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+
+        #region Public OpenAL 1.1 Constants
+        #region AL_INVALID
+        /// <summary>
+        ///     Bad value.
+        /// </summary>
+        // #define AL_INVALID -1
+        public const int AL_INVALID = -1;
+        #endregion AL_INVALID
+
+        #region AL_NONE
+        /// <summary>
+        ///     Disable value.
+        /// </summary>
+        // #define AL_NONE 0
+        public const int AL_NONE = 0;
+        #endregion AL_NONE
+
+        #region AL_FALSE
+        /// <summary>
+        ///     bool false.
+        /// </summary>
+        // #define AL_FALSE 0
+        public const int AL_FALSE = 0;
+        #endregion AL_FALSE
+
+        #region AL_TRUE
+        /// <summary>
+        ///     bool true.
+        /// </summary>
+        // #define AL_TRUE 1
+        public const int AL_TRUE = 1;
+        #endregion AL_TRUE
+
+        #region AL_SOURCE_TYPE
+        /// <summary>
+        ///     Indicates the type of AL_SOURCE.  Sources can be spatialized.
+        /// </summary>
+        // #define AL_SOURCE_TYPE 0x1027
+        public const int AL_SOURCE_TYPE = 0x1027;
+        #endregion AL_SOURCE_TYPE
+
+        //Deprecated in 1.1
+        //#region AL_SOURCE_ABSOLUTE
+        // <summary>
+        //     Indicates source has absolute coordinates.
+        // </summary>
+        // #define AL_SOURCE_ABSOLUTE 0x201
+        //public const int AL_SOURCE_ABSOLUTE = 0x201;
+        //#endregion AL_SOURCE_ABSOLUTE
+
+        #region AL_SOURCE_RELATIVE
+        /// <summary>
+        ///     Indicates source has listener-relative coordinates.
+        /// </summary>
+        // #define AL_SOURCE_RELATIVE 0x202
+        public const int AL_SOURCE_RELATIVE = 0x202;
+        #endregion AL_SOURCE_RELATIVE
+
+        #region AL_CONE_INNER_ANGLE
+        /// <summary>
+        ///     Directional source, inner cone angle, in degrees.  The accepted range is 0 to
+        ///     360, the default value is 360.
+        /// </summary>
+        // #define AL_CONE_INNER_ANGLE 0x1001
+        public const int AL_CONE_INNER_ANGLE = 0x1001;
+        #endregion AL_CONE_INNER_ANGLE
+
+        #region AL_CONE_OUTER_ANGLE
+        /// <summary>
+        ///     Directional source, outer cone angle, in degrees.  The accepted range is 0 to
+        ///     360, the default value is 360.
+        /// </summary>
+        // #define AL_CONE_OUTER_ANGLE 0x1002
+        public const int AL_CONE_OUTER_ANGLE = 0x1002;
+        #endregion AL_CONE_OUTER_ANGLE
+
+        #region AL_PITCH
+        /// <summary>
+        ///     Specifies the pitch to be applied, either at source, or on mixer results, at
+        ///     listener.  The accepted range is 0.5 to 2.0, the default value is 1.0.
+        /// </summary>
+        // #define AL_PITCH 0x1003
+        public const int AL_PITCH = 0x1003;
+        #endregion AL_PITCH
+
+        #region AL_POSITION
+        /// <summary>
+        ///     Specifies the current location in three dimensional space.  OpenAL, like OpenGL,
+        ///     uses a right-handed coordinate system, where in a frontal default view X (thumb)
+        ///     points right, Y points up (index finger), and Z points towards the viewer/camera
+        ///     (middle finger).  To switch to a left-handed coordinate system, flip the sign on
+        ///     the Z coordinate.  Listener position is always in the world coordinate system.
+        /// </summary>
+        // #define AL_POSITION 0x1004
+        public const int AL_POSITION = 0x1004;
+        #endregion AL_POSITION
+
+        #region AL_DIRECTION
+        /// <summary>
+        ///     Specifies the current direction as forward vector.
+        /// </summary>
+        // #define AL_DIRECTION 0x1005
+        public const int AL_DIRECTION = 0x1005;
+        #endregion AL_DIRECTION
+
+        #region AL_VELOCITY
+        /// <summary>
+        ///     Specifies the current velocity in three dimensional space.
+        /// </summary>
+        // #define AL_VELOCITY 0x1006
+        public const int AL_VELOCITY = 0x1006;
+        #endregion AL_VELOCITY
+
+        #region AL_LOOPING
+        /// <summary>
+        ///     Indicates whether source has to loop infinitely.  The accepted values are
+        ///     <see cref="AL_TRUE" /> or <see cref="AL_FALSE" />, the default value is
+        ///     <see cref="AL_FALSE" />.
+        /// </summary>
+        // #define AL_LOOPING 0x1007
+        public const int AL_LOOPING = 0x1007;
+        #endregion AL_LOOPING
+
+        #region AL_STATIC
+        /// <summary>
+        ///     Indicates whether source is meant to be static.  The accepted values are
+        ///     <see cref="AL_TRUE" /> or <see cref="AL_FALSE" />, the default value is
+        ///     <see cref="AL_FALSE" />.
+        /// </summary>
+        // #define AL_STATIC 0x1028
+        public const int AL_STATIC = 0x1028;
+        #endregion AL_STATIC
+
+        #region AL_STREAMING
+        /// <summary>
+        ///     Indicates whether source is meant to be streaming.  The accepted values are
+        ///     <see cref="AL_TRUE" /> or <see cref="AL_FALSE" />, the default value is
+        ///     <see cref="AL_FALSE" />.
+        /// </summary>
+        // #define AL_STREAMING 0x1029
+        public const int AL_STREAMING = 0x1029;
+        #endregion AL_STREAMING
+
+        #region AL_UNDETERMINED
+        /// <summary>
+        ///     Indicates whether source is meant to be undetermined.  The accepted values are
+        ///     <see cref="AL_TRUE" /> or <see cref="AL_FALSE" />, the default value is
+        ///     <see cref="AL_FALSE" />.
+        /// </summary>
+        // #define AL_UNDETERMINED 0x1029
+        public const int AL_UNDETERMINED = 0x1030;
+        #endregion AL_UNDETERMINED
+
+        #region AL_BUFFER
+        /// <summary>
+        ///     Indicates the buffer to provide sound samples.  The accepted range is any valid
+        ///     buffer ID.
+        /// </summary>
+        // #define AL_BUFFER 0x1009
+        public const int AL_BUFFER = 0x1009;
+        #endregion AL_BUFFER
+
+        #region AL_GAIN
+        /// <summary>
+        ///     Indicates the gain (volume amplification) applied.  The accepted range is 0.0
+        ///     or above.  A value of 1.0 means unattenuated/unchanged.  Each division by 2 equals
+        ///     an attenuation of -6dB.  Each multiplication by 2 equals an amplification of +6dB.
+        ///     A value of 0.0 is meaningless with respect to a logarithmic scale; it is
+        ///     interpreted as zero volume, the channel is effectively disabled.
+        /// </summary>
+        // #define AL_GAIN 0x100A
+        public const int AL_GAIN = 0x100A;
+        #endregion AL_GAIN
+
+        //Deprecated in 1.1.
+        //#region AL_BYTE_LOKI
+        // <summary>
+        //     byte offset into source (in canon format).  -1 if source is not playing.  Do not
+        //     set this, get this.  The accepted range is -1 or above.
+        // </summary>
+        // #define AL_BYTE_LOKI 0x100C
+        //public const int AL_BYTE_LOKI = 0x100C;
+        //#endregion AL_BYTE_LOKI
+
+        #region AL_MIN_GAIN
+        /// <summary>
+        ///     Indicates minimum source attenuation.  The accepted range is 0.0 to 1.0.
+        /// </summary>
+        // #define AL_MIN_GAIN 0x100D
+        public const int AL_MIN_GAIN = 0x100D;
+        #endregion AL_MIN_GAIN
+
+        #region AL_MAX_GAIN
+        /// <summary>
+        ///     Indicates maximum source attenuation.  The accepted range is 0.0 to 1.0.
+        /// </summary>
+        /// #define AL_MAX_GAIN 0x100E
+        public const int AL_MAX_GAIN = 0x100E;
+        #endregion AL_MAX_GAIN
+
+        #region AL_ORIENTATION
+        /// <summary>
+        ///     Specifies the current orientation.
+        /// </summary>
+        // #define AL_ORIENTATION 0x100F
+        public const int AL_ORIENTATION = 0x100F;
+        #endregion AL_ORIENTATION
+
+        #region AL_REFERENCE_DISTANCE
+        /// <summary>
+        ///     byte offset into source (in canon format).  -1 if source is not playing.  Do not
+        ///     set this, only get this value.  The accepted range is 0.0 or above.  The default
+        ///     value is 1.0.
+        /// </summary>
+        // #define AL_REFERENCE_DISTANCE 0x1020
+        public const int AL_REFERENCE_DISTANCE = 0x1020;
+        #endregion AL_REFERENCE_DISTANCE
+
+        #region AL_ROLLOFF_FACTOR
+        /// <summary>
+        ///     Indicates the rolloff factor for the source.  The accepted range is 0.0 or
+        ///     above.  The default value is 1.0.
+        /// </summary>
+        // #define AL_ROLLOFF_FACTOR 0x1021
+        public const int AL_ROLLOFF_FACTOR = 0x1021;
+        #endregion AL_ROLLOFF_FACTOR
+
+        #region AL_CONE_OUTER_GAIN
+        /// <summary>
+        ///     Indicates the gain (volume amplification) applied.  The accepted range is 0.0 or
+        ///     above.  A value of 1.0 means unattenuated/unchanged.  Each division by 2 equals an
+        ///     attenuation of -6dB.  Each multiplication by 2 equals an amplification of +6dB.
+        ///     A value of 0.0 is meaningless with respect to a logarithmic scale; it is
+        ///     interpreted as zero volume, the channel is effectively disabled.
+        /// </summary>
+        // #define AL_CONE_OUTER_GAIN 0x1022
+        public const int AL_CONE_OUTER_GAIN = 0x1022;
+        #endregion AL_CONE_OUTER_GAIN
+
+        #region AL_MAX_DISTANCE
+        /// <summary>
+        ///     Specifies the maximum distance.  The accepted range is 0.0 or above.
+        /// </summary>
+        // #define AL_MAX_DISTANCE 0x1023
+        public const int AL_MAX_DISTANCE = 0x1023;
+        #endregion AL_MAX_DISTANCE
+
+        #region AL_CHANNEL_MASK
+        /// <summary>
+        ///     Specifies the channel mask.  The accepted range is 0 to 255.
+        /// </summary>
+        // #define AL_CHANNEL_MASK 0x3000
+        public const int AL_CHANNEL_MASK = 0x3000;
+        #endregion AL_CHANNEL_MASK
+
+        #region AL_SOURCE_STATE
+        /// <summary>
+        ///     Source state information.
+        /// </summary>
+        // #define AL_SOURCE_STATE 0x1010
+        public const int AL_SOURCE_STATE = 0x1010;
+        #endregion AL_SOURCE_STATE
+
+        #region AL_INITIAL
+        /// <summary>
+        ///     Source initialized.
+        /// </summary>
+        // #define AL_INITIAL 0x1011
+        public const int AL_INITIAL = 0x1011;
+        #endregion AL_INITIAL
+
+        #region AL_PLAYING
+        /// <summary>
+        ///     Source playing.
+        /// </summary>
+        // #define AL_PLAYING 0x1012
+        public const int AL_PLAYING = 0x1012;
+        #endregion AL_PLAYING
+
+        #region AL_PAUSED
+        /// <summary>
+        ///     Source paused.
+        /// </summary>
+        // #define AL_PAUSED 0x1013
+        public const int AL_PAUSED = 0x1013;
+        #endregion AL_PAUSED
+
+        #region AL_STOPPED
+        /// <summary>
+        ///     Source stopped.
+        /// </summary>
+        // #define AL_STOPPED 0x1014
+        public const int AL_STOPPED = 0x1014;
+        #endregion AL_STOPPED
+
+        #region AL_BUFFERS_QUEUED
+        /// <summary>
+        ///     Buffers are queued.
+        /// </summary>
+        // #define AL_BUFFERS_QUEUED 0x1015
+        public const int AL_BUFFERS_QUEUED = 0x1015;
+        #endregion AL_BUFFERS_QUEUED
+
+        #region AL_BUFFERS_PROCESSED
+        /// <summary>
+        ///     Buffers are processed.
+        /// </summary>
+        // #define AL_BUFFERS_PROCESSED 0x1016
+        public const int AL_BUFFERS_PROCESSED = 0x1016;
+        #endregion AL_BUFFERS_PROCESSED
+
+        #region AL_SEC_OFFSET
+        /// <summary>
+        ///     Source buffer position information.
+        /// </summary>
+        // #define AL_SEC_OFFSET 0x1024
+        public const int AL_SEC_OFFSET = 0x1024;
+        #endregion AL_SEC_OFFSET
+
+        #region AL_SAMPLE_OFFSET
+        /// <summary>
+        ///     Source buffer position information.
+        /// </summary>
+        // #define AL_SAMPLE_OFFSET 0x1025
+        public const int AL_SAMPLE_OFFSET = 0x1025;
+        #endregion AL_SAMPLE_OFFSET
+
+        #region AL_BYTE_OFFSET
+        /// <summary>
+        ///     Source buffer position information.
+        /// </summary>
+        // #define AL_BYTE_OFFSET 0x1026
+        public const int AL_BYTE_OFFSET = 0x1026;
+        #endregion AL_BYTE_OFFSET
+
+        #region AL_FORMAT_MONO8
+        /// <summary>
+        ///     8-bit mono buffer.
+        /// </summary>
+        // #define AL_FORMAT_MONO8 0x1100
+        public const int AL_FORMAT_MONO8 = 0x1100;
+        #endregion AL_FORMAT_MONO8
+
+        #region AL_FORMAT_MONO16
+        /// <summary>
+        ///     16-bit mono buffer.
+        /// </summary>
+        // #define AL_FORMAT_MONO16 0x1101
+        public const int AL_FORMAT_MONO16 = 0x1101;
+        #endregion AL_FORMAT_MONO16
+
+        #region AL_FORMAT_STEREO8
+        /// <summary>
+        ///     8-bit stereo buffer.
+        /// </summary>
+        // #define AL_FORMAT_STEREO8 0x1102
+        public const int AL_FORMAT_STEREO8 = 0x1102;
+        #endregion AL_FORMAT_STEREO8
+
+        #region AL_FORMAT_STEREO16
+        /// <summary>
+        ///     16-bit stereo buffer.
+        /// </summary>
+        // #define AL_FORMAT_STEREO16 0x1103
+        public const int AL_FORMAT_STEREO16 = 0x1103;
+        #endregion AL_FORMAT_STEREO16
+
+        #region AL_FREQUENCY
+        /// <summary>
+        ///     Buffer frequency, in units of Hertz (Hz).  This is the number of samples per
+        ///     second.  Half of the sample frequency marks the maximum significant frequency
+        ///     component.
+        /// </summary>
+        // #define AL_FREQUENCY 0x2001
+        public const int AL_FREQUENCY = 0x2001;
+        #endregion AL_FREQUENCY
+
+        #region AL_BITS
+        /// <summary>
+        ///     Buffer bit depth.
+        /// </summary>
+        // #define AL_BITS 0x2002
+        public const int AL_BITS = 0x2002;
+        #endregion AL_BITS
+
+        #region AL_CHANNELS
+        /// <summary>
+        ///     Buffer channels.
+        /// </summary>
+        // #define AL_CHANNELS 0x2003
+        public const int AL_CHANNELS = 0x2003;
+        #endregion AL_CHANNELS
+
+        #region AL_SIZE
+        /// <summary>
+        ///     Buffer size.
+        /// </summary>
+        // #define AL_SIZE 0x2004
+        public const int AL_SIZE = 0x2004;
+        #endregion AL_SIZE
+
+        #region AL_DATA
+        /// <summary>
+        ///     Buffer data.
+        /// </summary>
+        // #define AL_DATA 0x2005
+        public const int AL_DATA = 0x2005;
+        #endregion AL_DATA
+
+        #region AL_UNUSED
+        /// <summary>
+        ///     Buffer unused.
+        /// </summary>
+        // #define AL_UNUSED 0x2010
+        public const int AL_UNUSED = 0x2010;
+        #endregion AL_UNUSED
+
+        #region AL_QUEUED
+        /// <summary>
+        ///     Buffer queued.
+        /// </summary>
+        // #define AL_QUEUED 0x2011
+        public const int AL_QUEUED = 0x2011;
+        #endregion AL_QUEUED
+
+        #region AL_PENDING
+        /// <summary>
+        ///     Buffer pending.
+        /// </summary>
+        // #define AL_PENDING 0x2011
+        public const int AL_PENDING = 0x2011;
+        #endregion AL_PENDING
+
+        #region AL_CURRENT
+        /// <summary>
+        ///     Buffer current.
+        /// </summary>
+        // #define AL_CURRENT 0x2012
+        public const int AL_CURRENT = 0x2012;
+        #endregion AL_CURRENT
+
+        #region AL_PROCESSED
+        /// <summary>
+        ///     Buffer processed.
+        /// </summary>
+        // #define AL_PROCESSED 0x2012
+        public const int AL_PROCESSED = 0x2012;
+        #endregion AL_PROCESSED
+
+        #region AL_NO_ERROR
+        /// <summary>
+        ///     No error.
+        /// </summary>
+        // #define AL_NO_ERROR AL_FALSE
+        public const int AL_NO_ERROR = AL_FALSE;
+        #endregion AL_NO_ERROR
+
+        #region AL_INVALID_NAME
+        /// <summary>
+        ///     Illegal name passed as an argument to an AL call.
+        /// </summary>
+        // #define AL_INVALID_NAME 0xA001
+        public const int AL_INVALID_NAME = 0xa001;
+        #endregion AL_INVALID_NAME
+
+        #region AL_ILLEGAL_ENUM
+        /// <summary>
+        ///     Illegal enum passed as an argument to an AL call.
+        /// </summary>
+        // #define AL_ILLEGAL_ENUM 0xA002
+        public const int AL_ILLEGAL_ENUM = 0xA002;
+        #endregion AL_ILLEGAL_ENUM
+
+        #region AL_INVALID_ENUM
+        /// <summary>
+        ///     Illegal enum passed as an argument to an AL call.
+        /// </summary>
+        // #define AL_INVALID_ENUM 0xA002
+        public const int AL_INVALID_ENUM = 0xA002;
+        #endregion AL_INVALID_ENUM
+
+        #region AL_INVALID_VALUE
+        /// <summary>
+        ///     Illegal value passed as an argument to an AL call.  Applies to parameter
+        ///     values, but not to enumerations.
+        /// </summary>
+        // #define AL_INVALID_VALUE 0xA003
+        public const int AL_INVALID_VALUE = 0xA003;
+        #endregion AL_INVALID_VALUE
+
+        #region AL_ILLEGAL_COMMAND
+        /// <summary>
+        ///     A function was called at an inappropriate time or in an inappropriate way,
+        ///     causing an illegal state.  This can be an incompatible value, object ID, and/or
+        ///     function.
+        /// </summary>
+        // #define AL_ILLEGAL_COMMAND 0xA004
+        public const int AL_ILLEGAL_COMMAND = 0xA004;
+        #endregion AL_ILLEGAL_COMMAND
+
+        #region AL_INVALID_OPERATION
+        /// <summary>
+        ///     A function was called at an inappropriate time or in an inappropriate way,
+        ///     causing an illegal state.  This can be an incompatible value, object ID, and/or
+        ///     function.
+        /// </summary>
+        // #define AL_INVALID_OPERATION 0xA004
+        public const int AL_INVALID_OPERATION = 0xA004;
+        #endregion AL_INVALID_OPERATION
+
+        #region AL_OUT_OF_MEMORY
+        /// <summary>
+        ///     A function could not be completed, because there is not enough memory available.
+        /// </summary>
+        // #define AL_OUT_OF_MEMORY 0xA005
+        public const int AL_OUT_OF_MEMORY = 0xA005;
+        #endregion AL_OUT_OF_MEMORY
+
+        #region AL_VENDOR
+        /// <summary>
+        ///     Vendor name.
+        /// </summary>
+        // #define AL_VENDOR 0xb001
+        public const int AL_VENDOR = 0xB001;
+        #endregion AL_VENDOR
+
+        #region AL_VERSION
+        /// <summary>
+        ///     Version.
+        /// </summary>
+        // #define AL_VERSION 0xB002
+        public const int AL_VERSION = 0xB002;
+        #endregion AL_VERSION
+
+        #region AL_RENDERER
+        /// <summary>
+        ///     Renderer.
+        /// </summary>
+        // #define AL_RENDERER 0xB003
+        public const int AL_RENDERER = 0xB003;
+        #endregion AL_RENDERER
+
+        #region AL_EXTENSIONS
+        /// <summary>
+        ///     Extensions.
+        /// </summary>
+        // #define AL_EXTENSIONS 0xB004
+        public const int AL_EXTENSIONS = 0xB004;
+        #endregion AL_EXTENSIONS
+
+        #region AL_DOPPLER_FACTOR
+        /// <summary>
+        ///     Doppler scale.  The default value is 1.0.
+        /// </summary>
+        // #define AL_DOPPLER_FACTOR 0xC000
+        public const int AL_DOPPLER_FACTOR = 0xC000;
+        #endregion AL_DOPPLER_FACTOR
+
+        #region AL_DOPPLER_VELOCITY
+        /// <summary>
+        ///     Doppler velocity.  The default value is 1.0.
+        /// </summary>
+        // #define AL_DOPPLER_VELOCITY 0xC001
+        public const int AL_DOPPLER_VELOCITY = 0xC001;
+        #endregion AL_DOPPLER_VELOCITY
+
+        #region AL_SPEED_OF_SOUND
+        /// <summary>
+        ///     Speed of Sound
+        /// </summary>
+        // #define AL_SPEED_OF_SOUND 0xC003
+        public const int AL_SPEED_OF_SOUND = 0xC003;
+        #endregion AL_SPEED_OF_SOUND
+
+        #region AL_DISTANCE_SCALE
+        /// <summary>
+        ///     Distance scaling.
+        /// </summary>
+        // #define AL_DISTANCE_SCALE 0xC002
+        public const int AL_DISTANCE_SCALE = 0xC002;
+        #endregion AL_DISTANCE_SCALE
+
+        #region AL_DISTANCE_MODEL
+        /// <summary>
+        ///     Distance model.  The default value is <see cref="AL_INVERSE_DISTANCE_CLAMPED" />.
+        /// </summary>
+        // #define AL_DISTANCE_MODEL 0xD000
+        public const int AL_DISTANCE_MODEL = 0xD000;
+        #endregion AL_DISTANCE_MODEL
+
+        #region AL_INVERSE_DISTANCE
+        /// <summary>
+        ///     Inverse distance model.
+        /// </summary>
+        // #define AL_INVERSE_DISTANCE 0xD001
+        public const int AL_INVERSE_DISTANCE = 0xD001;
+        #endregion AL_INVERSE_DISTANCE
+
+        #region AL_INVERSE_DISTANCE_CLAMPED
+        /// <summary>
+        ///     Inverse distance clamped model.
+        /// </summary>
+        // #define AL_INVERSE_DISTANCE_CLAMPED 0xD002
+        public const int AL_INVERSE_DISTANCE_CLAMPED = 0xD002;
+        #endregion AL_INVERSE_DISTANCE_CLAMPED
+
+        #region AL_LINEAR_DISTANCE
+        /// <summary>
+        ///     
+        /// </summary>
+        // #define AL_LINEAR_DISTANCE 0xD003
+        public const int AL_LINEAR_DISTANCE = 0xD003;
+        #endregion AL_LINEAR_DISTANCE
+
+        #region AL_LINEAR_DISTANCE_CLAMPED
+        /// <summary>
+        ///     
+        /// </summary>
+        // #define AL_LINEAR_DISTANCE_CLAMPED 0xD004
+        public const int AL_LINEAR_DISTANCE_CLAMPED = 0xD004;
+        #endregion AL_LINEAR_DISTANCE_CLAMPED
+
+        #region AL_EXPONENT_DISTANCE
+        /// <summary>
+        ///     
+        /// </summary>
+        // #define AL_EXPONENT_DISTANCE 0xD005
+        public const int AL_EXPONENT_DISTANCE = 0xD005;
+        #endregion AL_EXPONENT_DISTANCE
+
+        #region AL_EXPONENT_DISTANCE_CLAMPED
+        /// <summary>
+        ///     
+        /// </summary>
+        // #define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
+        public const int AL_EXPONENT_DISTANCE_CLAMPED = 0xD006;
+        #endregion AL_EXPONENT_DISTANCE_CLAMPED
+
+        #region AL_ENV_ROOM_IASIG
+        /// <summary>
+        ///     Room.  The accepted range is -10000 to 0.  The default value is -10000.
+        /// </summary>
+        // #define AL_ENV_ROOM_IASIG 0x3001
+        public const int AL_ENV_ROOM_IASIG = 0x3001;
+        #endregion AL_ENV_ROOM_IASIG
+
+        #region AL_ENV_ROOM_HIGH_FREQUENCY_IASIG
+        /// <summary>
+        ///     Room high frequency.  The accepted range is -10000 to 0.  The default value is 0.
+        /// </summary>
+        // #define AL_ENV_ROOM_HIGH_FREQUENCY_IASIG 0x3002
+        public const int AL_ENV_ROOM_HIGH_FREQUENCY_IASIG = 0x3002;
+        #endregion AL_ENV_ROOM_HIGH_FREQUENCY_IASIG
+
+        #region AL_ENV_ROOM_ROLLOFF_FACTOR
+        /// <summary>
+        ///     Room rolloff factor.  The accepted range is 0.1 to 20.0.  The default value is
+        ///     0.0.
+        /// </summary>
+        // #define AL_ENV_ROOM_ROLLOFF_FACTOR_IASIG 0x3003
+        public const int AL_ENV_ROOM_ROLLOFF_FACTOR = 0x3003;
+        #endregion AL_ENV_ROOM_ROLLOFF_FACTOR
+
+        #region AL_ENV_DECAY_TIME_IASIG
+        /// <summary>
+        ///     Decay time.  The accepted range is 0.1 to 20.0.  The default value is 1.0.
+        /// </summary>
+        // #define AL_ENV_DECAY_TIME_IASIG 0x3004
+        public const int AL_ENV_DECAY_TIME_IASIG = 0x3004;
+        #endregion AL_ENV_DECAY_TIME_IASIG
+
+        #region AL_ENV_DECAY_HIGH_FREQUENCY_RATIO_IASIG
+        /// <summary>
+        ///     Decay high frequency ratio.  The accepted range is 0.1 to 2.0.  The default value
+        ///     is 0.5.
+        /// </summary>
+        // #define AL_ENV_DECAY_HIGH_FREQUENCY_RATIO_IASIG 0x3005
+        public const int AL_ENV_DECAY_HIGH_FREQUENCY_RATIO_IASIG = 0x3005;
+        #endregion AL_ENV_DECAY_HIGH_FREQUENCY_RATIO_IASIG
+
+        #region AL_ENV_REFLECTIONS_IASIG
+        /// <summary>
+        ///     Reflections.  The accepted range is -10000 to 1000.  The default value is -10000.
+        /// </summary>
+        // #define AL_ENV_REFLECTIONS_IASIG 0x3006
+        public const int AL_ENV_REFLECTIONS_IASIG = 0x3006;
+        #endregion AL_ENV_REFLECTIONS_IASIG
+
+        #region AL_ENV_REFLECTIONS_DELAY_IASIG
+        /// <summary>
+        ///     Reflections delay.  The accepted range is 0.0 to 0.3.  The default value is 0.02.
+        /// </summary>
+        // #define AL_ENV_REFLECTIONS_DELAY_IASIG 0x3006
+        public const int AL_ENV_REFLECTIONS_DELAY_IASIG = 0x3006;
+        #endregion AL_ENV_REFLECTIONS_DELAY_IASIG
+
+        #region AL_ENV_REVERB_IASIG
+        /// <summary>
+        ///     Reverb.  The accepted range is -10000 to 2000.  The default value is -10000.
+        /// </summary>
+        // #define AL_ENV_REVERB_IASIG 0x3007
+        public const int AL_ENV_REVERB_IASIG = 0x3007;
+        #endregion AL_ENV_REVERB_IASIG
+
+        #region AL_ENV_REVERB_DELAY_IASIG
+        /// <summary>
+        ///     Reverb delay.  The accepted range is 0.0 to 0.1.  The default value is 0.04.
+        /// </summary>
+        // #define AL_ENV_REVERB_DELAY_IASIG 0x3008
+        public const int AL_ENV_REVERB_DELAY_IASIG = 0x3008;
+        #endregion AL_ENV_REVERB_DELAY_IASIG
+
+        #region AL_ENV_DIFFUSION_IASIG
+        /// <summary>
+        ///     Diffusion.  The accepted range is 0.0 to 100.0.  The default value is 100.0.
+        /// </summary>
+        // #define AL_ENV_DIFFUSION_IASIG 0x3009
+        public const int AL_ENV_DIFFUSION_IASIG = 0x3009;
+        #endregion AL_ENV_DIFFUSION_IASIG
+
+        #region AL_ENV_DENSITY_IASIG
+        /// <summary>
+        ///     Density.  The accepted range is 0.0 to 100.0.  The default value is 100.0.
+        /// </summary>
+        // #define AL_ENV_DENSITY_IASIG 0x300A
+        public const int AL_ENV_DENSITY_IASIG = 0x300A;
+        #endregion AL_ENV_DENSITY_IASIG
+
+        #region AL_ENV_HIGH_FREQUENCY_REFERENCE_IASIG
+        /// <summary>
+        ///     High frequency reference.  The accepted range is 20.0 to 20000.0.  The default
+        ///     value is 5000.0.
+        /// </summary>
+        // #define AL_ENV_HIGH_FREQUENCY_REFERENCE_IASIG 0x300B
+        public const int AL_ENV_HIGH_FREQUENCY_REFERENCE_IASIG = 0x300B;
+        #endregion AL_ENV_HIGH_FREQUENCY_REFERENCE_IASIG
+
+        #region AL_FORMAT_QUAD16
+        /// <summary>
+        ///     Format specifier for 16bit 4-channel audio.
+        /// </summary>
+        /// <remarks>
+        /// Note that if the enumeration value is not supported by the current OpenAl implementation,
+        /// an OpenAL error is generated the first, but only the first time this field is accessed.
+        /// The field then has a value of zero.
+        /// </remarks>
+        // Enumeration value has to be queried at runtime.
+        public static readonly int AL_FORMAT_QUAD16 = alGetEnumValue("AL_FORMAT_QUAD16");
+        #endregion AL_FORMAT_QUAD16
+
+        #region AL_FORMAT_51CHN16
+        /// <summary>
+        ///     Format specifier for 16bit 6-channel audio.
+        /// </summary>
+        /// <remarks>
+        /// Note that if the enumeration value is not supported by the current OpenAl implementation,
+        /// an OpenAL error is generated the first, but only the first time this field is accessed.
+        /// The field then has a value of zero.
+        /// </remarks>
+        // Enumeration value has to be queried at runtime.
+        public static readonly int AL_FORMAT_51CHN16 = alGetEnumValue("AL_FORMAT_51CHN16");
+        #endregion AL_FORMAT_51CHN16
+
+        #region AL_FORMAT_61CHN16
+        /// <summary>
+        ///     Format specifier for 16bit 7-channel audio.
+        /// </summary>
+        /// <remarks>
+        /// Note that if the enumeration value is not supported by the current OpenAl implementation,
+        /// an OpenAL error is generated the first, but only the first time this field is accessed.
+        /// The field then has a value of zero.
+        /// </remarks>
+        // Enumeration value has to be queried at runtime.
+        public static readonly int AL_FORMAT_61CHN16 = alGetEnumValue("AL_FORMAT_61CHN16");
+        #endregion AL_FORMAT_61CHN16
+
+        #region AL_FORMAT_71CHN16
+        /// <summary>
+        ///     Format specifier for 16bit 8-channel audio.
+        /// </summary>
+        /// <remarks>
+        /// Note that if the enumeration value is not supported by the current OpenAl implementation,
+        /// an OpenAL error is generated the first, but only the first time this field is accessed.
+        /// The field then has a value of zero.
+        /// </remarks>
+        // Enumeration value has to be queried at runtime.
+        public static readonly int AL_FORMAT_71CHN16 = alGetEnumValue("AL_FORMAT_71CHN16");
+        #endregion AL_FORMAT_71CHN16
+
+        #region AL_STORAGE_AUTOMATIC
+        /// <summary>
+        ///     See 'OpenAL Programmer's Guide' for more information.
+        /// </summary>
+        /// <remarks>
+        /// Note that if the enumeration value is not supported by the current OpenAl implementation,
+        /// an OpenAL error is generated the first, but only the first time this field is accessed.
+        /// The field then has a value of zero.
+        /// </remarks>
+        // Enumeration value has to be queried at runtime.
+        public static readonly int AL_STORAGE_AUTOMATIC = alGetEnumValue("AL_STORAGE_AUTOMATIC");
+        #endregion AL_STORAGE_AUTOMATIC
+
+        #region AL_STORAGE_HARDWARE
+        /// <summary>
+        ///     See 'OpenAL Programmer's Guide' for more information.
+        /// </summary>
+        /// <remarks>
+        /// Note that if the enumeration value is not supported by the current OpenAl implementation,
+        /// an OpenAL error is generated the first, but only the first time this field is accessed.
+        /// The field then has a value of zero.
+        /// </remarks>
+        // Enumeration value has to be queried at runtime.
+        public static readonly int AL_STORAGE_HARDWARE = alGetEnumValue("AL_STORAGE_HARDWARE");
+        #endregion AL_STORAGE_HARDWARE
+
+        #region AL_STORAGE_ACCESSIBLE
+        /// <summary>
+        ///     See 'OpenAL Programmer's Guide' for more information.
+        /// </summary>
+        /// <remarks>
+        /// Note that if the enumeration value is not supported by the current OpenAl implementation,
+        /// an OpenAL error is generated the first, but only the first time this field is accessed.
+        /// The field then has a value of zero.
+        /// </remarks>
+        // Enumeration value has to be queried at runtime.
+        public static readonly int AL_STORAGE_ACCESSIBLE = alGetEnumValue("AL_STORAGE_ACCESSIBLE");
+        #endregion AL_STORAGE_ACCESSIBLE
+
+        #region AL_EAX_RAM_SIZE
+        /// <summary>
+        ///     See 'OpenAL Programmer's Guide' for more information.
+        /// </summary>
+        /// <remarks>
+        /// Note that if the enumeration value is not supported by the current OpenAl implementation,
+        /// an OpenAL error is generated the first, but only the first time this field is accessed.
+        /// The field then has a value of zero.
+        /// </remarks>
+        // Enumeration value has to be queried at runtime.
+        public static readonly int AL_EAX_RAM_SIZE = alGetEnumValue("AL_EAX_RAM_SIZE");
+        #endregion AL_EAX_RAM_SIZE
+
+        #region AL_EAX_RAM_FREE
+        /// <summary>
+        ///     See 'OpenAL Programmer's Guide' for more information.
+        /// </summary>
+        /// <remarks>
+        /// Note that if the enumeration value is not supported by the current OpenAl implementation,
+        /// an OpenAL error is generated the first, but only the first time this field is accessed.
+        /// The field then has a value of zero.
+        /// </remarks>
+        // Enumeration value has to be queried at runtime.
+        public static readonly int AL_EAX_RAM_FREE = alGetEnumValue("AL_EAX_RAM_FREE");
+        #endregion AL_EAX_RAM_FREE
+
+        #region EFX_EXT
+        //#define AL_METERS_PER_UNIT                                 0x20004
+        public const int AL_METERS_PER_UNIT = 0x20004;
+
+        //#define AL_DIRECT_FILTER                                   0x20005
+        public const int AL_DIRECT_FILTER = 0x20005;
+        //#define AL_AUXILIARY_SEND_FILTER                           0x20006
+        public const int AL_AUXILIARY_SEND_FILTER = 0x20006;
+        //#define AL_AIR_ABSORPTION_FACTOR                           0x20007
+        public const int AL_AIR_ABSORPTION_FACTOR = 0x20007;
+        //#define AL_ROOM_ROLLOFF_FACTOR                             0x20008
+        public const int AL_ROOM_ROLLOFF_FACTOR = 0x20008;
+        //#define AL_CONE_OUTER_GAINHF                               0x20009
+        public const int AL_CONE_OUTER_GAINHF = 0x20009;
+        //#define AL_DIRECT_FILTER_GAINHF_AUTO                       0x2000A
+        public const int AL_DIRECT_FILTER_GAINHF_AUTO = 0x2000A;
+        //#define AL_AUXILIARY_SEND_FILTER_GAIN_AUTO                 0x2000B
+        public const int AL_AUXILIARY_SEND_FILTER_GAIN_AUTO = 0x2000B;
+        //#define AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO               0x2000C
+        public const int AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO = 0x2000C;
+
+        //#define AL_EFFECTSLOT_EFFECT                               0x0001
+        public const int AL_EFFECTSLOT_EFFECT = 0x0001;
+        //#define AL_EFFECTSLOT_GAIN                                 0x0002
+        public const int AL_EFFECTSLOT_GAIN = 0x0002;
+        //#define AL_EFFECTSLOT_AUXILIARY_SEND_AUTO                  0x0003
+        public const int AL_EFFECTSLOT_AUXILIARY_SEND_AUTO = 0x0003;
+        //#define AL_EFFECTSLOT_NULL                                 0x0000
+        public const int AL_EFFECTSLOT_NULL = 0x0000;
+
+        /* Reverb Parameters */
+        //#define AL_REVERB_DENSITY                                  0x0001
+        public const int AL_REVERB_DENSITY = 0x0001;
+        //#define AL_REVERB_DIFFUSION                                0x0002
+        public const int AL_REVERB_DIFFUSION = 0x0002;
+        //#define AL_REVERB_GAIN                                     0x0003
+        public const int AL_REVERB_GAIN = 0x0003;
+        //#define AL_REVERB_GAINHF                                   0x0004
+        public const int AL_REVERB_GAINHF = 0x0004;
+        //#define AL_REVERB_DECAY_TIME                               0x0005
+        public const int AL_REVERB_DECAY_TIME = 0x0005;
+        //#define AL_REVERB_DECAY_HFRATIO                            0x0006
+        public const int AL_REVERB_DECAY_HFRATIO = 0x0006;
+        //#define AL_REVERB_REFLECTIONS_GAIN                         0x0007
+        public const int AL_REVERB_REFLECTIONS_GAIN = 0x0007;
+        //#define AL_REVERB_REFLECTIONS_DELAY                        0x0008
+        public const int AL_REVERB_REFLECTIONS_DELAY = 0x0008;
+        //#define AL_REVERB_LATE_REVERB_GAIN                         0x0009
+        public const int AL_REVERB_LATE_REVERB_GAIN = 0x0009;
+        //#define AL_REVERB_LATE_REVERB_DELAY                        0x000A
+        public const int AL_REVERB_LATE_REVERB_DELAY = 0x000A;
+        //#define AL_REVERB_AIR_ABSORPTION_GAINHF                    0x000B 
+        public const int AL_REVERB_AIR_ABSORPTION_GAINHF = 0x000B;
+        //#define AL_REVERB_ROOM_ROLLOFF_FACTOR                      0x000C
+        public const int AL_REVERB_ROOM_ROLLOFF_FACTOR = 0x000C;
+        //#define AL_REVERB_DECAY_HFLIMIT                            0x000D
+        public const int AL_REVERB_DECAY_HFLIMIT = 0x000D;
+
+        ///* Chorus Parameters */
+        //#define AL_CHORUS_WAVEFORM                                 0x0001
+        public const int AL_CHORUS_WAVEFORM = 0x0001;
+        //#define AL_CHORUS_PHASE                                    0x0002
+        public const int AL_CHORUS_PHASE = 0x0002;
+        //#define AL_CHORUS_RATE                                     0x0003
+        public const int AL_CHORUS_RATE = 0x0003;
+        //#define AL_CHORUS_DEPTH                                    0x0004
+        public const int AL_CHORUS_DEPTH = 0x0004;
+        //#define AL_CHORUS_FEEDBACK                                 0x0005
+        public const int AL_CHORUS_FEEDBACK = 0x0005;
+        //#define AL_CHORUS_DELAY                                    0x0006
+        public const int AL_CHORUS_DELAY = 0x0006;
+
+        ///* Distortion Parameters */
+        //#define AL_DISTORTION_EDGE                                 0x0001
+        public const int AL_DISTORTION_EDGE = 0x0001;
+        //#define AL_DISTORTION_GAIN                                 0x0002
+        public const int AL_DISTORTION_GAIN = 0x0002;
+        //#define AL_DISTORTION_LOWPASS_CUTOFF                       0x0003
+        public const int AL_DISTORTION_LOWPASS_CUTOFF = 0x0003;
+        //#define AL_DISTORTION_EQCENTER                             0x0004
+        public const int AL_DISTORTION_EQCENTER = 0x0004;
+        //#define AL_DISTORTION_EQBANDWIDTH                          0x0005
+        public const int AL_DISTORTION_EQBANDWIDTH = 0x0005;
+
+        ///* Echo Parameters */
+        //#define AL_ECHO_DELAY                                      0x0001
+        public const int AL_ECHO_DELAY = 0x0001;
+        //#define AL_ECHO_LRDELAY                                    0x0002
+        public const int AL_ECHO_LRDELAY = 0x0002;
+        //#define AL_ECHO_DAMPING                                    0x0003
+        public const int AL_ECHO_DAMPING = 0x0003;
+        //#define AL_ECHO_FEEDBACK                                   0x0004
+        public const int AL_ECHO_FEEDBACK = 0x0004;
+        //#define AL_ECHO_SPREAD                                     0x0005
+        public const int AL_ECHO_SPREAD = 0x0005;
+
+        ///* Flanger Parameters */
+        //#define AL_FLANGER_WAVEFORM                                0x0001
+        public const int AL_FLANGER_WAVEFORM = 0x0001;
+        //#define AL_FLANGER_PHASE                                   0x0002
+        public const int AL_FLANGER_PHASE = 0x0002;
+        //#define AL_FLANGER_RATE                                    0x0003
+        public const int AL_FLANGER_RATE = 0x0003;
+        //#define AL_FLANGER_DEPTH                                   0x0004
+        public const int AL_FLANGER_DEPTH = 0x0004;
+        //#define AL_FLANGER_FEEDBACK                                0x0005
+        public const int AL_FLANGER_FEEDBACK = 0x0005;
+        //#define AL_FLANGER_DELAY                                   0x0006
+        public const int AL_FLANGER_DELAY = 0x0006;
+
+        ///* Frequencyshifter Parameters */
+        //#define AL_FREQUENCY_SHIFTER_FREQUENCY                     0x0001
+        public const int AL_FREQUENCY_SHIFTER_FREQUENCY = 0x0001;
+        //#define AL_FREQUENCY_SHIFTER_LEFT_DIRECTION                0x0002
+        public const int AL_FREQUENCY_SHIFTER_LEFT_DIRECTION = 0x0002;
+        //#define AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION               0x0003
+        public const int AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION = 0x0003;
+
+        ///* Vocalmorpher Parameters */
+        //#define AL_VOCAL_MORPHER_PHONEMEA                          0x0001
+        public const int AL_VOCAL_MORPHER_PHONEMEA = 0x0001;
+        //#define AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING            0x0002
+        public const int AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING = 0x0002;
+        //#define AL_VOCAL_MORPHER_PHONEMEB                          0x0003
+        public const int AL_VOCAL_MORPHER_PHONEMEB = 0x0003;
+        //#define AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING            0x0004
+        public const int AL_VOCAL_MORPHER_PHENEMEB_COARSE_TUNING = 0x0004;
+        //#define AL_VOCAL_MORPHER_WAVEFORM                          0x0005
+        public const int AL_VOCAL_MORPHER_WAVEFORM = 0x0005;
+        //#define AL_VOCAL_MORPHER_RATE                              0x0006
+        public const int AL_VOCAL_MORPHER_RATE = 0x0006;
+
+        ///* Pitchshifter Parameters */
+        //#define AL_PITCH_SHIFTER_COARSE_TUNE                       0x0001
+        public const int AL_PITCH_SHIFTER_COARSE_TUNE = 0x0001;
+        //#define AL_PITCH_SHIFTER_FINE_TUNE                         0x0002
+        public const int AL_PITCH_SHIFTER_FINE_TUNE = 0x0002;
+
+        ///* Ringmodulator Parameters */
+        //#define AL_RING_MODULATOR_FREQUENCY                        0x0001
+        public const int AL_RING_MODULATOR_FREQUENCY = 0x0001;
+        //#define AL_RING_MODULATOR_HIGHPASS_CUTOFF                  0x0002
+        public const int AL_RING_MODULATOR_HIGHPASS_CUTOFF = 0x0002;
+        //#define AL_RING_MODULATOR_WAVEFORM                         0x0003
+        public const int AL_RING_MODULATOR_WAVEFORM = 0x0003;
+
+        ///* Autowah Parameters */
+        //#define AL_AUTOWAH_ATTACK_TIME                             0x0001
+        public const int AL_AUTOWAH_ATTACK_TIME = 0x0001;
+        //#define AL_AUTOWAH_RELEASE_TIME                            0x0002
+        public const int AL_AUTOWAH_RELEASE_TIME = 0x0002;
+        //#define AL_AUTOWAH_RESONANCE                               0x0003
+        public const int AL_AUTOWAH_RESONANCE = 0x0003;
+        //#define AL_AUTOWAH_PEAK_GAIN                               0x0004
+        public const int AL_AUTOWAH_PEAK_GAIN = 0x0004;
+
+        ///* Compressor Parameters */
+        //#define AL_COMPRESSOR_ONOFF                                0x0001
+        public const int AL_COMPRESSOR_ONOFF = 0x0001;
+
+        ///* Equalizer Parameters */
+        //#define AL_EQUALIZER_LOW_GAIN                              0x0001
+        public const int AL_EQUALIZER_LOW_GAIN = 0x0001;
+        //#define AL_EQUALIZER_LOW_CUTOFF                            0x0002
+        public const int AL_EQUALIZER_LOW_CUTOFF = 0x0002;
+        //#define AL_EQUALIZER_MID1_GAIN                             0x0003
+        public const int AL_EQUALIZER_MID1_GAIN = 0x0003;
+        //#define AL_EQUALIZER_MID1_CENTER                           0x0004
+        public const int AL_EQUALIZER_MID1_CENTER = 0x0004;
+        //#define AL_EQUALIZER_MID1_WIDTH                            0x0005
+        public const int AL_EQUALIZER_MID1_WIDTH = 0x0005;
+        //#define AL_EQUALIZER_MID2_GAIN                             0x0006
+        public const int AL_EQUALIZER_MID2_GAIN = 0x0006;
+        //#define AL_EQUALIZER_MID2_CENTER                           0x0007
+        public const int AL_EQUALIZER_MID2_CENTER = 0x0007;
+        //#define AL_EQUALIZER_MID2_WIDTH                            0x0008
+        public const int AL_EQUALIZER_MID2_WIDTH = 0x0008;
+        //#define AL_EQUALIZER_HIGH_GAIN                             0x0009
+        public const int AL_EQUALIZER_HIGH_GAIN = 0x0009;
+        //#define AL_EQUALIZER_HIGH_CUTOFF                           0x000A
+        public const int AL_EQUALIZER_HIGH_CUTOFF = 0x000A;
+
+        /* Effect type */
+        //#define AL_EFFECT_FIRST_PARAMETER                          0x0000
+        public const int AL_EFFECT_FIRST_PARAMETER = 0x0000;
+        //#define AL_EFFECT_LAST_PARAMETER                           0x8000
+        public const int AL_EFFECT_LAST_PARAMETER = 0x8000;
+        //#define AL_EFFECT_TYPE                                     0x8001
+        public const int AL_EFFECT_TYPE = 0x8001;
+
+        /* Effect type definitions to be used with AL_EFFECT_TYPE. */
+        //#define AL_EFFECT_NULL                                     0x0000  /* Can also be used as an Effect Object ID */
+        public const int AL_EFFECT_NULL = 0x0000;
+        //#define AL_EFFECT_REVERB                                   0x0001
+        public const int AL_EFFECT_REVERB = 0x0001;
+        //#define AL_EFFECT_CHORUS                                   0x0002
+        public const int AL_EFFECT_CHORUS = 0x0002;
+        //#define AL_EFFECT_DISTORTION                               0x0003
+        public const int AL_EFFECT_DISTORTION = 0x0003;
+        //#define AL_EFFECT_ECHO                                     0x0004
+        public const int AL_EFFECT_ECHO = 0x0004;
+        //#define AL_EFFECT_FLANGER                                  0x0005
+        public const int AL_EFFECT_FLANGER = 0x0005;
+        //#define AL_EFFECT_FREQUENCY_SHIFTER                        0x0006
+        public const int AL_EFFECT_FREQUENCY_SHIFTER = 0x0006;
+        //#define AL_EFFECT_VOCAL_MORPHER                            0x0007
+        public const int AL_EFFECT_VOCAL_MORPHER = 0x0007;
+        //#define AL_EFFECT_PITCH_SHIFTER                            0x0008
+        public const int AL_EFFECT_PITCH_SHIFTER = 0x0008;
+        //#define AL_EFFECT_RING_MODULATOR                           0x0009
+        public const int AL_EFFECT_RING_MODULATOR = 0x0009;
+        //#define AL_EFFECT_AUTOWAH                                  0x000A
+        public const int AL_EFFECT_AUTOWAH = 0x000A;
+        //#define AL_EFFECT_COMPRESSOR                               0x000B
+        public const int AL_EFFECT_COMPRESSOR = 0x000B;
+        //#define AL_EFFECT_EQUALIZER                                0x000C
+        public const int AL_EFFECT_EQUALIZER = 0x000C;
+
+        /* Lowpass parameters. */
+        //#define AL_LOWPASS_GAIN                                    0x0001
+        public const int AL_LOWPASS_GAIN = 0x0001;
+        //#define AL_LOWPASS_GAINHF                                  0x0002
+        public const int AL_LOWPASS_GAINHF = 0x0002;
+
+        ///* Highpass Parameters */
+        //#define AL_HIGHPASS_GAIN                                   0x0001
+        public const int AL_HIGHPASS_GAIN = 0x0001;
+        //#define AL_HIGHPASS_GAINLF                                 0x0002
+        public const int AL_HIGHPASS_GAINLF = 0x0002;
+
+        ///* Bandpass Parameters */
+        //#define AL_BANDPASS_GAIN                                   0x0001
+        public const int AL_BANDPASS_GAIN = 0x0001;
+        //#define AL_BANDPASS_GAINLF                                 0x0002
+        public const int AL_BANDPASS_GAINLF = 0x0002;
+        //#define AL_BANDPASS_GAINHF                                 0x0003
+        public const int AL_BANDPASS_GAINHF = 0x0003;
+
+        ///* Filter type */
+        //#define AL_FILTER_FIRST_PARAMETER                          0x0000
+        public const int AL_FILTER_FIRST_PARAMETER = 0x0000;
+        //#define AL_FILTER_LAST_PARAMETER                           0x8000
+        public const int AL_FILTER_LAST_PARAMETER = 0x8000;
+        //#define AL_FILTER_TYPE                                     0x8001
+        public const int AL_FILTER_TYPE = 0x8001;
+
+        ///* Filter type definitions to be used with AL_FILTER_TYPE. */
+        //#define AL_FILTER_NULL                                     0x0000  /* Can also be used as a Filter Object ID */
+        public const int AL_FILTER_NULL = 0x0000;
+        //#define    AL_FILTER_LOWPASS                                  0x0001
+        public const int AL_FILTER_LOWPASS = 0x0001;
+        //#define AL_FILTER_HIGHPASS                                 0x0002
+        public const int AL_FILTER_HIGHPASS = 0x0002;
+        //#define AL_FILTER_BANDPASS                                 0x0003
+        public const int AL_FILTER_BANDPASS = 0x0003;
+        #endregion
+
+        #endregion Public OpenAL 1.1 Constants
+
+        // --- Public Externs ---
+        #region Public OpenAL 1.1 Methods
+        #region alBufferData(int buffer, int format, [In] byte[] data, int size, int frequency)
+        /// <summary>
+        ///     Fills a buffer with audio data.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name to be filled with data.
+        /// </param>
+        /// <param name="format">
+        ///     <para>
+        ///         Format type from among the following:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FORMAT_MONO8" /></item>
+        ///             <item><see cref="AL_FORMAT_MONO16" /></item>
+        ///             <item><see cref="AL_FORMAT_STEREO8" /></item>
+        ///             <item><see cref="AL_FORMAT_STEREO16" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="data">
+        ///     Pointer to the audio data.
+        /// </param>
+        /// <param name="size">
+        ///     The size of the audio data in bytes.
+        /// </param>
+        /// <param name="frequency">
+        ///     The frequency of the audio data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alBufferData(ALuint buffer, ALenum format, ALvoid* data, ALsizei size, ALsizei freq);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alBufferData(int buffer, int format, [In] byte[] data, int size, int frequency);
+        #endregion alBufferData(int buffer, int format, [In] byte[] data, int size, int frequency)
+
+        #region alBufferData(int buffer, int format, [In] IntPtr data, int size, int frequency)
+        /// <summary>
+        ///     Fills a buffer with audio data.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name to be filled with data.
+        /// </param>
+        /// <param name="format">
+        ///     <para>
+        ///         Format type from among the following:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FORMAT_MONO8" /></item>
+        ///             <item><see cref="AL_FORMAT_MONO16" /></item>
+        ///             <item><see cref="AL_FORMAT_STEREO8" /></item>
+        ///             <item><see cref="AL_FORMAT_STEREO16" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="data">
+        ///     Pointer to the audio data.
+        /// </param>
+        /// <param name="size">
+        ///     The size of the audio data in bytes.
+        /// </param>
+        /// <param name="frequency">
+        ///     The frequency of the audio data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alBufferData(ALuint buffer, ALenum format, ALvoid* data, ALsizei size, ALsizei freq);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alBufferData(int buffer, int format, [In] IntPtr data, int size, int frequency);
+        #endregion alBufferData(int buffer, int format, [In] IntPtr data, int size, int frequency)
+
+        #region alBufferData(int buffer, int format, [In] void *data, int size, int frequency)
+        /// <summary>
+        ///     Fills a buffer with audio data.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name to be filled with data.
+        /// </param>
+        /// <param name="format">
+        ///     <para>
+        ///         Format type from among the following:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FORMAT_MONO8" /></item>
+        ///             <item><see cref="AL_FORMAT_MONO16" /></item>
+        ///             <item><see cref="AL_FORMAT_STEREO8" /></item>
+        ///             <item><see cref="AL_FORMAT_STEREO16" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="data">
+        ///     Pointer to the audio data.
+        /// </param>
+        /// <param name="size">
+        ///     The size of the audio data in bytes.
+        /// </param>
+        /// <param name="frequency">
+        ///     The frequency of the audio data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alBufferData(ALuint buffer, ALenum format, ALvoid* data, ALsizei size, ALsizei freq);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alBufferData(int buffer, int format, [In] void* data, int size, int frequency);
+        #endregion alBufferData(int buffer, int format, [In] void *data, int size, int frequency)
+
+        #region void alBufferf(int bid, int param, float val)
+        /// <summary>
+        ///     Set Buffer parameters.
+        /// </summary>
+        // AL_API void AL_APIENTRY alBufferf( ALuint bid, ALenum param, ALfloat value );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alBufferf(int bid, int param, float val);
+        #endregion void alBufferf(int bid, int param, float val)
+
+        #region void alBuffer3f(int bid, int param, float value1, float value2, float value3)
+        /// <summary>
+        ///     Set Buffer parameters.
+        /// </summary>
+        // AL_API void AL_APIENTRY alBuffer3f( ALuint bid, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3 );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alBuffer3f(int bid, int param, float value1, float value2, float value3);
+        #endregion void alBuffer3f(int bid, int param, float value1, float value2, float value3)
+
+        #region void alBufferfv(int bid, int param, out float val)
+        /// <summary>
+        ///     Set Buffer parameters.
+        /// </summary>
+        // AL_API void AL_APIENTRY alBufferfv( ALuint bid, ALenum param, ALfloat *value );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alBufferfv(int bid, int param, out float val);
+        #endregion void alBufferfv(int bid, int param, out float val)
+
+        #region void alBufferi(int bid, int param, int val)
+        /// <summary>
+        ///     Set Buffer parameters.
+        /// </summary>
+        // AL_API void AL_APIENTRY alBufferi( ALuint bid, ALenum param, ALint value );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alBufferi(int bid, int param, int val);
+        #endregion void alBufferi(int bid, int param, int val)
+
+        #region void alBuffer3i(int bid, int param, int value1, int value2, int value3)
+        /// <summary>
+        ///     Set Buffer parameters.
+        /// </summary>
+        // AL_API void AL_APIENTRY alBuffer3i( ALuint bid, ALenum param, ALint value1, ALint value2, ALint value3 );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alBuffer3i(int bid, int param, int value1, int value2, int value3);
+        #endregion void alBuffer3i(int bid, int param, int value1, int value2, int value3)
+
+        #region void alBufferiv(int bid, int param, out int val)
+        /// <summary>
+        ///     Set Buffer parameters.
+        /// </summary>
+        // AL_API void AL_APIENTRY alBufferiv( ALuint bid, ALenum param, ALint *value );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alBufferiv(int bid, int param, out int val);
+        #endregion void alBufferiv(int bid, int param, out int val)
+
+        #region alDeleteBuffers(int number, [In] ref int buffer)
+        /// <summary>
+        ///     Deletes one or more buffers.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of buffers to be deleted.
+        /// </param>
+        /// <param name="buffer">
+        ///     Pointer to an array of buffer names identifying the buffers to be deleted.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of buffers cannot be deleted, an error will be
+        ///     generated which can be detected with <see cref="alGetError" />.  If an error
+        ///     occurs, no buffers will be deleted.  If <i>number</i> equals zero,
+        ///     <b>alDeleteBuffers</b> does nothing and will not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDeleteBuffers(ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDeleteBuffers(int number, [In] ref int buffer);
+        #endregion alDeleteBuffers(int number, [In] ref int buffer)
+
+        #region alDeleteBuffers(int number, [In] int[] buffers)
+        /// <summary>
+        ///     Deletes one or more buffers.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of buffers to be deleted.
+        /// </param>
+        /// <param name="buffers">
+        ///     Pointer to an array of buffer names identifying the buffers to be deleted.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of buffers cannot be deleted, an error will be
+        ///     generated which can be detected with <see cref="alGetError" />.  If an error
+        ///     occurs, no buffers will be deleted.  If <i>number</i> equals zero,
+        ///     <b>alDeleteBuffers</b> does nothing and will not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDeleteBuffers(ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDeleteBuffers(int number, [In] int[] buffers);
+        #endregion alDeleteBuffers(int number, [In] int[] buffers)
+
+        #region alDeleteBuffers(int number, [In] IntPtr buffers)
+        /// <summary>
+        ///     Deletes one or more buffers.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of buffers to be deleted.
+        /// </param>
+        /// <param name="buffers">
+        ///     Pointer to an array of buffer names identifying the buffers to be deleted.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of buffers cannot be deleted, an error will be
+        ///     generated which can be detected with <see cref="alGetError" />.  If an error
+        ///     occurs, no buffers will be deleted.  If <i>number</i> equals zero,
+        ///     <b>alDeleteBuffers</b> does nothing and will not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDeleteBuffers(ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDeleteBuffers(int number, [In] IntPtr buffers);
+        #endregion alDeleteBuffers(int number, [In] IntPtr buffers)
+
+        #region alDeleteBuffers(int number, [In] int *buffers)
+        /// <summary>
+        ///     Deletes one or more buffers.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of buffers to be deleted.
+        /// </param>
+        /// <param name="buffers">
+        ///     Pointer to an array of buffer names identifying the buffers to be deleted.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of buffers cannot be deleted, an error will be
+        ///     generated which can be detected with <see cref="alGetError" />.  If an error
+        ///     occurs, no buffers will be deleted.  If <i>number</i> equals zero,
+        ///     <b>alDeleteBuffers</b> does nothing and will not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDeleteBuffers(ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alDeleteBuffers(int number, [In] int* buffers);
+        #endregion alDeleteBuffers(int number, [In] int *buffers)
+
+        #region alDeleteSources(int number, [In] ref int sources)
+        /// <summary>
+        ///     Deletes one or more sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be deleted.
+        /// </param>
+        /// <param name="sources">
+        ///     Pointer to an array of source names identifying the sources to be deleted.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of sources cannot be deleted, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     sources will be deleted.  If <i>number</i> equals zero, <b>alDeleteSources</b>
+        ///     does nothing and will not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDeleteSources(ALsizei n, ALuint* sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDeleteSources(int number, [In] ref int sources);
+        #endregion alDeleteSources(int number, [In] ref int sources)
+
+        #region alDeleteSources(int number, [In] int[] sources)
+        /// <summary>
+        ///     Deletes one or more sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be deleted.
+        /// </param>
+        /// <param name="sources">
+        ///     Pointer to an array of source names identifying the sources to be deleted.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of sources cannot be deleted, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     sources will be deleted.  If <i>number</i> equals zero, <b>alDeleteSources</b>
+        ///     does nothing and will not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDeleteSources(ALsizei n, ALuint* sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDeleteSources(int number, [In] int[] sources);
+        #endregion alDeleteSources(int number, [In] int[] sources)
+
+        #region alDeleteSources(int number, [In] IntPtr sources)
+        /// <summary>
+        ///     Deletes one or more sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be deleted.
+        /// </param>
+        /// <param name="sources">
+        ///     Pointer to an array of source names identifying the sources to be deleted.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of sources cannot be deleted, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     sources will be deleted.  If <i>number</i> equals zero, <b>alDeleteSources</b>
+        ///     does nothing and will not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDeleteSources(ALsizei n, ALuint* sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDeleteSources(int number, [In] IntPtr sources);
+        #endregion alDeleteSources(int number, [In] IntPtr sources)
+
+        #region alDeleteSources(int number, [In] int *sources)
+        /// <summary>
+        ///     Deletes one or more sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be deleted.
+        /// </param>
+        /// <param name="sources">
+        ///     Pointer to an array of source names identifying the sources to be deleted.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of sources cannot be deleted, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     sources will be deleted.  If <i>number</i> equals zero, <b>alDeleteSources</b>
+        ///     does nothing and will not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDeleteSources(ALsizei n, ALuint* sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alDeleteSources(int number, [In] int* sources);
+        #endregion alDeleteSources(int number, [In] int *sources)
+
+        #region alDisable(int capability)
+        /// <summary>
+        ///     Disables a feature of the OpenAL driver.
+        /// </summary>
+        /// <param name="capability">
+        ///     The capability to disable.
+        /// </param>
+        /// <remarks>
+        ///     At the time of this writing, there are no features to be disabled using this
+        ///     function, so if it is called the error <see cref="AL_INVALID_ENUM" /> will be
+        ///     generated.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDisable(ALenum capability);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDisable(int capability);
+        #endregion alDisable(int capability)
+
+        #region alDistanceModel(int val)
+        /// <summary>
+        ///     Selects the OpenAL distance model.
+        /// </summary>
+        /// <param name="val">
+        ///     <para>
+        ///         The distance model to be set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_NONE" /></item>
+        ///             <item><see cref="AL_INVERSE_DISTANCE" /></item>
+        ///             <item><see cref="AL_INVERSE_DISTANCE_CLAMPED" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         The default distance model in OpenAL is <see cref="AL_INVERSE_DISTANCE" />.
+        ///     </para>
+        ///     <para>
+        ///         The <see cref="AL_INVERSE_DISTANCE" /> model works according to the following
+        ///         formula:
+        ///     </para>
+        ///     <para>
+        ///         <c>
+        ///             G_dB = AL_GAIN � 20log10(1 + AL_ROLLOFF_FACTOR * (distance � AL_REFERENCE_DISTANCE) / AL_REFERENCE_DISTANCE));
+        ///             G_dB = min(G_dB, AL_MAX_GAIN);
+        ///             G_dB = max(G_dB, AL_MIN_GAIN);
+        ///         </c>
+        ///     </para>
+        ///     <para>
+        ///         The <see cref="AL_INVERSE_DISTANCE_CLAMPED" /> model works according to the
+        ///         following formula:
+        ///     </para>
+        ///     <para>
+        ///         <c>
+        ///             distance = max(distance, AL_REFERENCE_DISTANCE);
+        ///             distance = min(distance, AL_MAX_DISTANCE);
+        ///             G_dB = AL_GAIN � 20log10(1 + AL_ROLLOFF_FACTOR * (distance � AL_REFERENCE_DISTANCE) / AL_REFERENCE_DISTANCE));
+        ///             G_dB = min(G_dB, AL_MAX_GAIN);
+        ///             G_dB = max(G_dB, AL_MIN_GAIN);
+        ///         </c>
+        ///     </para>
+        ///     <para>
+        ///         The <see cref="AL_NONE" /> model works according to the following formula:
+        ///     </para>
+        ///     <para>
+        ///         <c>
+        ///             G_db = AL_GAIN;
+        ///         </c>
+        ///     </para>
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDistanceModel(ALenum value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDistanceModel(int val);
+        #endregion alDistanceModel(int val)
+
+        #region alDopplerFactor(float val)
+        /// <summary>
+        ///     Selects the OpenAL Doppler factor value.
+        /// </summary>
+        /// <param name="val">
+        ///     The Doppler scale value to set.
+        /// </param>
+        /// <remarks>
+        ///     The default Doppler factor value is 1.0.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDopplerFactor(ALfloat value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDopplerFactor(float val);
+        #endregion alDopplerFactor(float val)
+
+        #region alDopplerVelocity(float val)
+        /// <summary>
+        ///     Selects the OpenAL Doppler velocity value.
+        /// </summary>
+        /// <param name="val">
+        ///     The Doppler velocity value to set.
+        /// </param>
+        /// <remarks>
+        ///     The default Doppler velocity value is 343.3.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDopplerVelocity(ALfloat value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDopplerVelocity(float val);
+        #endregion alDopplerVelocity(float val)
+
+        #region alSpeedOfSound(float val)
+        /// <summary>
+        ///     Selects the OpenAL Speed of Sound value.
+        /// </summary>
+        /// <param name="val">
+        ///     The Speed of Sound value to set.
+        /// </param>
+        /// <remarks>
+        ///     
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alDopplerVelocity(ALfloat value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSpeedOfSound(float val);
+        #endregion alSpeedOfSound(float val)
+
+        #region alEnable(int capability)
+        /// <summary>
+        ///     Enables a feature of the OpenAL driver.
+        /// </summary>
+        /// <param name="capability">
+        ///     The capability to enable.
+        /// </param>
+        /// <remarks>
+        ///     At the time of this writing, there are no features to be enabled using this
+        ///     function, so if it is called the error <see cref="AL_INVALID_ENUM" /> will be
+        ///     generated.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alEnable(ALenum capability);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alEnable(int capability);
+        #endregion alEnable(int capability)
+
+        #region alGenBuffers(int number, out int buffer)
+        /// <summary>
+        ///     Generates one or more buffers.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of buffers to be generated.
+        /// </param>
+        /// <param name="buffer">
+        ///     Pointer to an array of integer values which will store the names of the new
+        ///     buffers.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of buffers cannot be created, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     buffers will be generated.  If <i>number</i> equals zero, <b>alGenBuffers</b>
+        ///     does nothing and does not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGenBuffers(ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGenBuffers(int number, out int buffer);
+        #endregion alGenBuffers(int number, out int buffer)
+
+        #region alGenBuffers(int number, [Out] int[] buffers)
+        /// <summary>
+        ///     Generates one or more buffers.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of buffers to be generated.
+        /// </param>
+        /// <param name="buffers">
+        ///     Pointer to an array of integer values which will store the names of the new
+        ///     buffers.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of buffers cannot be created, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     buffers will be generated.  If <i>number</i> equals zero, <b>alGenBuffers</b>
+        ///     does nothing and does not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGenBuffers(ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGenBuffers(int number, [Out] int[] buffers);
+        #endregion alGenBuffers(int number, [Out] int[] buffers)
+
+        #region alGenBuffers(int number, [Out] IntPtr buffers)
+        /// <summary>
+        ///     Generates one or more buffers.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of buffers to be generated.
+        /// </param>
+        /// <param name="buffers">
+        ///     Pointer to an array of integer values which will store the names of the new
+        ///     buffers.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of buffers cannot be created, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     buffers will be generated.  If <i>number</i> equals zero, <b>alGenBuffers</b>
+        ///     does nothing and does not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGenBuffers(ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGenBuffers(int number, [Out] IntPtr buffers);
+        #endregion alGenBuffers(int number, [Out] IntPtr buffers)
+
+        #region alGenBuffers(int number, [Out] int *buffers)
+        /// <summary>
+        ///     Generates one or more buffers.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of buffers to be generated.
+        /// </param>
+        /// <param name="buffers">
+        ///     Pointer to an array of integer values which will store the names of the new
+        ///     buffers.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of buffers cannot be created, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     buffers will be generated.  If <i>number</i> equals zero, <b>alGenBuffers</b>
+        ///     does nothing and does not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGenBuffers(ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGenBuffers(int number, [Out] int* buffers);
+        #endregion alGenBuffers(int number, [Out] int *buffers)
+
+        #region alGenSources(int number, out int source)
+        /// <summary>
+        ///     Generates one or more sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be generated.
+        /// </param>
+        /// <param name="source">
+        ///     Pointer to an array of integer values which will store the names of the new
+        ///     sources.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of sources cannot be created, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     sources will be generated.  If <i>number</i> equals zero, <b>alGenSources</b>
+        ///     does nothing and does not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGenSources(ALsizei n, ALuint* sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGenSources(int number, out int source);
+        #endregion alGenSources(int number, out int source)
+
+        #region alGenSources(int number, [Out] int[] sources)
+        /// <summary>
+        ///     Generates one or more sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be generated.
+        /// </param>
+        /// <param name="sources">
+        ///     Pointer to an array of integer values which will store the names of the new
+        ///     sources.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of sources cannot be created, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     sources will be generated.  If <i>number</i> equals zero, <b>alGenSources</b>
+        ///     does nothing and does not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGenSources(ALsizei n, ALuint* sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGenSources(int number, [Out] int[] sources);
+        #endregion alGenSources(int number, [Out] int[] sources)
+
+        #region alGenSources(int number, [Out] IntPtr sources)
+        /// <summary>
+        ///     Generates one or more sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be generated.
+        /// </param>
+        /// <param name="sources">
+        ///     Pointer to an array of integer values which will store the names of the new
+        ///     sources.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of sources cannot be created, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     sources will be generated.  If <i>number</i> equals zero, <b>alGenSources</b>
+        ///     does nothing and does not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGenSources(ALsizei n, ALuint* sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGenSources(int number, [Out] IntPtr sources);
+        #endregion alGenSources(int number, [Out] IntPtr sources)
+
+        #region alGenSources(int number, [Out] int *sources)
+        /// <summary>
+        ///     Generates one or more sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be generated.
+        /// </param>
+        /// <param name="sources">
+        ///     Pointer to an array of integer values which will store the names of the new
+        ///     sources.
+        /// </param>
+        /// <remarks>
+        ///     If the requested number of sources cannot be created, an error will be generated
+        ///     which can be detected with <see cref="alGetError" />.  If an error occurs, no
+        ///     sources will be generated.  If <i>number</i> equals zero, <b>alGenSources</b>
+        ///     does nothing and does not return an error.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGenSources(ALsizei n, ALuint* sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGenSources(int number, [Out] int* sources);
+        #endregion alGenSources(int number, [Out] int *sources)
+
+        #region int alGetBoolean(int state)
+        /// <summary>
+        ///     Returns a boolean OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     The state to be queried.
+        /// </param>
+        /// <returns>
+        ///     The boolean value (<see cref="AL_TRUE" /> or <see cref="AL_FALSE" />) described
+        ///     by <i>state</i> will be returned.
+        /// </returns>
+        /// <remarks>
+        ///     There aren�t any boolean states defined at the time of this writing, so this
+        ///     function will always generate the error <see cref="AL_INVALID_ENUM" />.
+        /// </remarks>
+        // ALAPI ALboolean ALAPIENTRY alGetBoolean(ALenum param);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alGetBoolean(int state);
+        #endregion int alGetBoolean(int state)
+
+        #region alGetBooleanv(int state, out int output)
+        /// <summary>
+        ///     Retrieves a boolean OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     The state to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        /// <remarks>
+        ///     There aren�t any boolean states defined at the time of this writing, so this
+        ///     function will always generate the error <see cref="AL_INVALID_ENUM" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBooleanv(ALenum param, ALboolean* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBooleanv(int state, out int output);
+        #endregion alGetBooleanv(int state, out int output)
+
+        #region alGetBooleanv(int state, [Out] int[] output)
+        /// <summary>
+        ///     Retrieves a boolean OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     The state to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        /// <remarks>
+        ///     There aren�t any boolean states defined at the time of this writing, so this
+        ///     function will always generate the error <see cref="AL_INVALID_ENUM" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBooleanv(ALenum param, ALboolean* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBooleanv(int state, [Out] int[] output);
+        #endregion alGetBooleanv(int state, [Out] int[] output)
+
+        #region alGetBooleanv(int state, [Out] IntPtr output)
+        /// <summary>
+        ///     Retrieves a boolean OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     The state to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        /// <remarks>
+        ///     There aren�t any boolean states defined at the time of this writing, so this
+        ///     function will always generate the error <see cref="AL_INVALID_ENUM" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBooleanv(ALenum param, ALboolean* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBooleanv(int state, [Out] IntPtr output);
+        #endregion alGetBooleanv(int state, [Out] IntPtr output)
+
+        #region alGetBooleanv(int state, [Out] int *output)
+        /// <summary>
+        ///     Retrieves a boolean OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     The state to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        /// <remarks>
+        ///     There aren�t any boolean states defined at the time of this writing, so this
+        ///     function will always generate the error <see cref="AL_INVALID_ENUM" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBooleanv(ALenum param, ALboolean* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetBooleanv(int state, [Out] int* output);
+        #endregion alGetBooleanv(int state, [Out] int *output)
+
+        #region alGetBufferf(int buffer, int attribute, out int val)
+        /// <summary>
+        ///     Retrieves a floating point property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     The name of the attribute to be retrieved.
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <remarks>
+        ///     There are no float attributes for buffers at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferf(int buffer, int attribute, out int val);
+        #endregion alGetBufferf(int buffer, int attribute, out int val)
+
+        #region alGetBufferf(int buffer, int attribute, [Out] int[] val)
+        /// <summary>
+        ///     Retrieves a floating point property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     The name of the attribute to be retrieved.
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <remarks>
+        ///     There are no float attributes for buffers at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferf(int buffer, int attribute, [Out] int[] val);
+        #endregion alGetBufferf(int buffer, int attribute, [Out] int[] val)
+
+        #region alGetBufferf(int buffer, int attribute, [Out] IntPtr val)
+        /// <summary>
+        ///     Retrieves a floating point property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     The name of the attribute to be retrieved.
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <remarks>
+        ///     There are no float attributes for buffers at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferf(int buffer, int attribute, [Out] IntPtr val);
+        #endregion alGetBufferf(int buffer, int attribute, [Out] IntPtr val)
+
+        #region alGetBufferf(int buffer, int attribute, [Out] float *val)
+        /// <summary>
+        ///     Retrieves a floating point property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     The name of the attribute to be retrieved.
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <remarks>
+        ///     There are no float attributes for buffers at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetBufferf(int buffer, int attribute, [Out] float* val);
+        #endregion alGetBufferf(int buffer, int attribute, [Out] float *val)
+
+        #region void alGetBuffer3f(int buffer, int attribute, out float value1, out float value2, out float value3)
+        /// <summary>
+        ///     Retrieves a floating point property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     The name of the attribute to be retrieved.
+        /// </param>
+        /// <param name="value1">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <param name="value2">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <param name="value3">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <remarks>
+        ///     There are no float attributes for buffers at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat* value1, ALfloat* value2, ALfloat* value3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBuffer3f(int buffer, int attribute, out float value1, out float value2, out float value3);
+        #endregion void alGetBuffer3f(int buffer, int attribute, out float value1, out float value2, out float value3)
+
+        #region alGetBufferfv(int buffer, int attribute, out float val)
+        /// <summary>
+        ///     Retrieves a floating point property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     The name of the attribute to be retrieved.
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <remarks>
+        ///     There are no float attributes for buffers at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferfv(int buffer, int attribute, out float val);
+        #endregion alGetBufferfv(int buffer, int attribute, out float val)
+
+        #region alGetBufferfv(int buffer, int attribute, [Out] float[] val)
+        /// <summary>
+        ///     Retrieves a floating point property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     The name of the attribute to be retrieved.
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <remarks>
+        ///     There are no float attributes for buffers at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferfv(int buffer, int attribute, [Out] float[] val);
+        #endregion alGetBufferfv(int buffer, int attribute, [Out] float[] val)
+
+        #region alGetBufferfv(int buffer, int attribute, [Out] IntPtr val)
+        /// <summary>
+        ///     Retrieves a floating point property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     The name of the attribute to be retrieved.
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <remarks>
+        ///     There are no float attributes for buffers at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferfv(int buffer, int attribute, [Out] IntPtr val);
+        #endregion alGetBufferfv(int buffer, int attribute, [Out] IntPtr val)
+
+        #region alGetBufferfv(int buffer, int attribute, [Out] float *val)
+        /// <summary>
+        ///     Retrieves a floating point property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     The name of the attribute to be retrieved.
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an float to hold the retrieved data.
+        /// </param>
+        /// <remarks>
+        ///     There are no float attributes for buffers at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetBufferfv(int buffer, int attribute, [Out] float* val);
+        #endregion alGetBufferfv(int buffer, int attribute, [Out] float *val)
+
+        #region alGetBufferi(int buffer, int attribute, out int val)
+        /// <summary>
+        ///     Retrieves an integer property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FREQUENCY" /></item>
+        ///             <item><see cref="AL_BITS" /></item>
+        ///             <item><see cref="AL_CHANNELS" /></item>
+        ///             <item><see cref="AL_SIZE" /></item>
+        ///             <item><see cref="AL_DATA" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an integer to hold the retrieved data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferi(int buffer, int attribute, out int val);
+        #endregion alGetBufferi(int buffer, int attribute, out int val)
+
+        #region alGetBufferi(int buffer, int attribute, [Out] int[] val)
+        /// <summary>
+        ///     Retrieves an integer property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FREQUENCY" /></item>
+        ///             <item><see cref="AL_BITS" /></item>
+        ///             <item><see cref="AL_CHANNELS" /></item>
+        ///             <item><see cref="AL_SIZE" /></item>
+        ///             <item><see cref="AL_DATA" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an integer to hold the retrieved data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferi(int buffer, int attribute, [Out] int[] val);
+        #endregion alGetBufferi(int buffer, int attribute, [Out] int[] val)
+
+        #region alGetBufferi(int buffer, int attribute, [Out] IntPtr val)
+        /// <summary>
+        ///     Retrieves an integer property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FREQUENCY" /></item>
+        ///             <item><see cref="AL_BITS" /></item>
+        ///             <item><see cref="AL_CHANNELS" /></item>
+        ///             <item><see cref="AL_SIZE" /></item>
+        ///             <item><see cref="AL_DATA" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an integer to hold the retrieved data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferi(int buffer, int attribute, [Out] IntPtr val);
+        #endregion alGetBufferi(int buffer, int attribute, [Out] IntPtr val)
+
+        #region alGetBufferi(int buffer, int attribute, [Out] int *val)
+        /// <summary>
+        ///     Retrieves an integer property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FREQUENCY" /></item>
+        ///             <item><see cref="AL_BITS" /></item>
+        ///             <item><see cref="AL_CHANNELS" /></item>
+        ///             <item><see cref="AL_SIZE" /></item>
+        ///             <item><see cref="AL_DATA" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an integer to hold the retrieved data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetBufferi(int buffer, int attribute, [Out] int* val);
+        #endregion alGetBufferi(int buffer, int attribute, [Out] int *val)
+
+        #region void alGetBuffer3i(int buffer, int attribute, out int value1, out int value2, out int value3)
+        /// <summary>
+        ///     Retrieves an integer property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     The name of the attribute to be retrieved.
+        /// </param>
+        /// <param name="value1">
+        ///     A pointer to an int to hold the retrieved data.
+        /// </param>
+        /// <param name="value2">
+        ///     A pointer to an int to hold the retrieved data.
+        /// </param>
+        /// <param name="value3">
+        ///     A pointer to an int to hold the retrieved data.
+        /// </param>
+        /// <remarks>
+        ///     There are no int attributes for buffers at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALint* value1, ALint* value2, ALint* value3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBuffer3i(int buffer, int attribute, out int value1, out int value2, out int value3);
+        #endregion void alGetBuffer3i(int buffer, int attribute, out int value1, out int value2, out int value3)
+
+        #region alGetBufferiv(int buffer, int attribute, out int val)
+        /// <summary>
+        ///     Retrieves an integer property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FREQUENCY" /></item>
+        ///             <item><see cref="AL_BITS" /></item>
+        ///             <item><see cref="AL_CHANNELS" /></item>
+        ///             <item><see cref="AL_SIZE" /></item>
+        ///             <item><see cref="AL_DATA" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an integer to hold the retrieved data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferiv(int buffer, int attribute, out int val);
+        #endregion alGetBufferiv(int buffer, int attribute, out int val)
+
+        #region alGetBufferiv(int buffer, int attribute, [Out] int[] val)
+        /// <summary>
+        ///     Retrieves an integer property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FREQUENCY" /></item>
+        ///             <item><see cref="AL_BITS" /></item>
+        ///             <item><see cref="AL_CHANNELS" /></item>
+        ///             <item><see cref="AL_SIZE" /></item>
+        ///             <item><see cref="AL_DATA" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an integer to hold the retrieved data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferiv(int buffer, int attribute, [Out] int[] val);
+        #endregion alGetBufferiv(int buffer, int attribute, [Out] int[] val)
+
+        #region alGetBufferiv(int buffer, int attribute, [Out] IntPtr val)
+        /// <summary>
+        ///     Retrieves an integer property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FREQUENCY" /></item>
+        ///             <item><see cref="AL_BITS" /></item>
+        ///             <item><see cref="AL_CHANNELS" /></item>
+        ///             <item><see cref="AL_SIZE" /></item>
+        ///             <item><see cref="AL_DATA" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an integer to hold the retrieved data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetBufferiv(int buffer, int attribute, [Out] IntPtr val);
+        #endregion alGetBufferiv(int buffer, int attribute, [Out] IntPtr val)
+
+        #region alGetBufferiv(int buffer, int attribute, [Out] int *val)
+        /// <summary>
+        ///     Retrieves an integer property of a buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_FREQUENCY" /></item>
+        ///             <item><see cref="AL_BITS" /></item>
+        ///             <item><see cref="AL_CHANNELS" /></item>
+        ///             <item><see cref="AL_SIZE" /></item>
+        ///             <item><see cref="AL_DATA" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to an integer to hold the retrieved data.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetBufferiv(int buffer, int attribute, [Out] int* val);
+        #endregion alGetBufferiv(int buffer, int attribute, [Out] int *val)
+
+        #region double alGetDouble(int state)
+        /// <summary>
+        ///     Returns a double precision floating point OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     The state to be queried.
+        /// </param>
+        /// <returns>
+        ///     The double value described by <i>state</i> will be returned.
+        /// </returns>
+        /// <remarks>
+        ///     There aren�t any double precision floating point states defined at the time of
+        ///     this writing, so this function will always generate the error
+        ///     <see cref="AL_INVALID_ENUM" />.
+        /// </remarks>
+        // ALAPI ALdouble ALAPIENTRY alGetDouble(ALenum param);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern double alGetDouble(int state);
+        #endregion double alGetDouble(int state)
+
+        #region alGetDoublev(int state, out double output)
+        /// <summary>
+        ///     Retrieves a double precision floating point OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     The state to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        /// <remarks>
+        ///     There aren�t any double precision floating point states defined at the time of
+        ///     this writing, so this function will always generate the error
+        ///     <see cref="AL_INVALID_ENUM" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetDoublev(ALenum param, ALdouble* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetDoublev(int state, out double output);
+        #endregion alGetDoublev(int state, out double output)
+
+        #region alGetDoublev(int state, [Out] double[] output)
+        /// <summary>
+        ///     Retrieves a double precision floating point OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     The state to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        /// <remarks>
+        ///     There aren�t any double precision floating point states defined at the time of
+        ///     this writing, so this function will always generate the error
+        ///     <see cref="AL_INVALID_ENUM" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetDoublev(ALenum param, ALdouble* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetDoublev(int state, [Out] double[] output);
+        #endregion alGetDoublev(int state, [Out] double[] output)
+
+        #region alGetDoublev(int state, [Out] IntPtr output)
+        /// <summary>
+        ///     Retrieves a double precision floating point OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     The state to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        /// <remarks>
+        ///     There aren�t any double precision floating point states defined at the time of
+        ///     this writing, so this function will always generate the error
+        ///     <see cref="AL_INVALID_ENUM" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetDoublev(ALenum param, ALdouble* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetDoublev(int state, [Out] IntPtr output);
+        #endregion alGetDoublev(int state, [Out] IntPtr output)
+
+        #region alGetDoublev(int state, [Out] double *output)
+        /// <summary>
+        ///     Retrieves a double precision floating point OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     The state to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        /// <remarks>
+        ///     There aren�t any double precision floating point states defined at the time of
+        ///     this writing, so this function will always generate the error
+        ///     <see cref="AL_INVALID_ENUM" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetDoublev(ALenum param, ALdouble* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetDoublev(int state, [Out] double* output);
+        #endregion alGetDoublev(int state, [Out] double *output)
+
+        #region int alGetEnumValue(string enumName)
+        /// <summary>
+        ///     Returns the enumeration value of an OpenAL enum described by a string.
+        /// </summary>
+        /// <param name="enumName">
+        ///     A string describing an OpenAL enum.
+        /// </param>
+        /// <returns>
+        ///     The actual value for the described enum is returned.
+        /// </returns>
+        // ALAPI ALenum ALAPIENTRY alGetEnumValue(ALubyte* ename);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alGetEnumValue(string enumName);
+        #endregion int alGetEnumValue(string enumName)
+
+        #region int alGetError()
+        /// <summary>
+        ///     Returns the current error state and then clears the error state.
+        /// </summary>
+        /// <returns>
+        ///     The error state.
+        /// </returns>
+        /// <remarks>
+        ///     When an OpenAL error occurs, the error state is set and will not be changed until
+        ///     the error state is retrieved using <b>alGetError</b>.  Whenever <b>alGetError</b>
+        ///     is called, the error state is cleared and the last state (the current state when
+        ///     the call was made) is returned.  To isolate error detection to a specific portion
+        ///     of code, <b>alGetError</b> should be called before the isolated section to clear
+        ///     the current error state.
+        /// </remarks>
+        // ALAPI ALenum ALAPIENTRY alGetError(ALvoid);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alGetError();
+        #endregion int alGetError()
+
+        #region float alGetFloat(int state)
+        /// <summary>
+        ///     Returns a floating point OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The state to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_DOPPLER_FACTOR" /></item>
+        ///             <item><see cref="AL_DOPPLER_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     The floating point value described by <i>state</i> will be returned.
+        /// </returns>
+        // ALAPI ALfloat ALAPIENTRY alGetFloat(ALenum param);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern float alGetFloat(int state);
+        #endregion float alGetFloat(int state)
+
+        #region alGetFloatv(int state, out float output)
+        /// <summary>
+        ///     Retrieves a floating point OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The state to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_DOPPLER_FACTOR" /></item>
+        ///             <item><see cref="AL_DOPPLER_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetFloatv(ALenum param, ALfloat* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetFloatv(int state, out float output);
+        #endregion alGetFloatv(int state, out float output)
+
+        #region alGetFloatv(int state, [Out] float[] output)
+        /// <summary>
+        ///     Retrieves a floating point OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The state to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_DOPPLER_FACTOR" /></item>
+        ///             <item><see cref="AL_DOPPLER_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetFloatv(ALenum param, ALfloat* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetFloatv(int state, [Out] float[] output);
+        #endregion alGetFloatv(int state, [Out] float[] output)
+
+        #region alGetFloatv(int state, [Out] IntPtr output)
+        /// <summary>
+        ///     Retrieves a floating point OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The state to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_DOPPLER_FACTOR" /></item>
+        ///             <item><see cref="AL_DOPPLER_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetFloatv(ALenum param, ALfloat* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetFloatv(int state, [Out] IntPtr output);
+        #endregion alGetFloatv(int state, [Out] IntPtr output)
+
+        #region alGetFloatv(int state, [Out] float *output)
+        /// <summary>
+        ///     Retrieves a floating point OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The state to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_DOPPLER_FACTOR" /></item>
+        ///             <item><see cref="AL_DOPPLER_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetFloatv(ALenum param, ALfloat* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetFloatv(int state, [Out] float* output);
+        #endregion alGetFloatv(int state, [Out] float *output)
+
+        #region int alGetInteger(int state)
+        /// <summary>
+        ///     Returns an integer OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The state to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_DISTANCE_MODEL" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     The integer value described by <i>state</i> will be returned.
+        /// </returns>
+        // ALAPI ALint ALAPIENTRY alGetInteger(ALenum param);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alGetInteger(int state);
+        #endregion int alGetInteger(int state)
+
+        #region alGetIntegerv(int state, out int output)
+        /// <summary>
+        ///     Retrieves an integer OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The state to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_DISTANCE_MODEL" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetIntegerv(ALenum param, ALint* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetIntegerv(int state, out int output);
+        #endregion alGetIntegerv(int state, out int output)
+
+        #region alGetIntegerv(int state, [Out] int[] output)
+        /// <summary>
+        ///     Retrieves an integer OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The state to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_DISTANCE_MODEL" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetIntegerv(ALenum param, ALint* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetIntegerv(int state, [Out] int[] output);
+        #endregion alGetIntegerv(int state, [Out] int[] output)
+
+        #region alGetIntegerv(int state, [Out] IntPtr output)
+        /// <summary>
+        ///     Retrieves an integer OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The state to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_DISTANCE_MODEL" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetIntegerv(ALenum param, ALint* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetIntegerv(int state, [Out] IntPtr output);
+        #endregion alGetIntegerv(int state, [Out] IntPtr output)
+
+        #region alGetIntegerv(int state, [Out] int *output)
+        /// <summary>
+        ///     Retrieves an integer OpenAL state.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The state to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_DISTANCE_MODEL" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the location where the state will be stored.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetIntegerv(ALenum param, ALint* data);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetIntegerv(int state, [Out] int* output);
+        #endregion alGetIntegerv(int state, [Out] int *output)
+
+        #region alGetListener3f(int attribute, out float output1, out float output2, out float output3)
+        /// <summary>
+        ///     Retrieves a set of three floating point values from a property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output1">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        /// <param name="output2">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        /// <param name="output3">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListener3f(ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListener3f(int attribute, out float output1, out float output2, out float output3);
+        #endregion alGetListener3f(int attribute, out float output1, out float output2, out float output3)
+
+        #region alGetListener3f(int attribute, [Out] float[] output1, [Out] float[] output2, [Out] float[] output3)
+        /// <summary>
+        ///     Retrieves a set of three floating point values from a property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output1">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        /// <param name="output2">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        /// <param name="output3">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListener3f(ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListener3f(int attribute, [Out] float[] output1, [Out] float[] output2, [Out] float[] output3);
+        #endregion alGetListener3f(int attribute, [Out] float[] output1, [Out] float[] output2, [Out] float[] output3)
+
+        #region alGetListener3f(int attribute, [Out] IntPtr output1, [Out] IntPtr output2, [Out] IntPtr output3)
+        /// <summary>
+        ///     Retrieves a set of three floating point values from a property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output1">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        /// <param name="output2">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        /// <param name="output3">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListener3f(ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListener3f(int attribute, [Out] IntPtr output1, [Out] IntPtr output2, [Out] IntPtr output3);
+        #endregion alGetListener3f(int attribute, [Out] IntPtr output1, [Out] IntPtr output2, [Out] IntPtr output3)
+
+        #region alGetListener3f(int attribute, [Out] float *output1, [Out] float *output2, [Out] float *output3)
+        /// <summary>
+        ///     Retrieves a set of three floating point values from a property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output1">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        /// <param name="output2">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        /// <param name="output3">
+        ///     Pointer to the the floating point being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListener3f(ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetListener3f(int attribute, [Out] float* output1, [Out] float* output2, [Out] float* output3);
+        #endregion alGetListener3f(int attribute, [Out] float *output1, [Out] float *output2, [Out] float *output3)
+
+        #region alGetListenerf(int attribute, out float output)
+        /// <summary>
+        ///     Retrieves a floating point property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_GAIN" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the floating point value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListenerf(ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListenerf(int attribute, out float output);
+        #endregion alGetListenerf(int attribute, out float output)
+
+        #region alGetListenerf(int attribute, [Out] float[] output)
+        /// <summary>
+        ///     Retrieves a floating point property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_GAIN" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the floating point value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListenerf(ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListenerf(int attribute, [Out] float[] output);
+        #endregion alGetListenerf(int attribute, [Out] float[] output)
+
+        #region alGetListenerf(int attribute, [Out] IntPtr output)
+        /// <summary>
+        ///     Retrieves a floating point property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_GAIN" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the floating point value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListenerf(ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListenerf(int attribute, [Out] IntPtr output);
+        #endregion alGetListenerf(int attribute, [Out] IntPtr output)
+
+        #region alGetListenerf(int attribute, [Out] float *output)
+        /// <summary>
+        ///     Retrieves a floating point property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_GAIN" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the floating point value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListenerf(ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetListenerf(int attribute, [Out] float* output);
+        #endregion alGetListenerf(int attribute, [Out] float *output)
+
+        #region alGetListenerfv(int attribute, out float output)
+        /// <summary>
+        ///     Retrieves a floating point-vector property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_ORIENTATION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the floating point-vector value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListenerfv(ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListenerfv(int attribute, out float output);
+        #endregion alGetListenerfv(int attribute, out float output)
+
+        #region alGetListenerfv(int attribute, [Out] float[] output)
+        /// <summary>
+        ///     Retrieves a floating point-vector property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_ORIENTATION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the floating point-vector value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListenerfv(ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListenerfv(int attribute, [Out] float[] output);
+        #endregion alGetListenerfv(int attribute, [Out] float[] output)
+
+        #region alGetListenerfv(int attribute, [Out] IntPtr output)
+        /// <summary>
+        ///     Retrieves a floating point-vector property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_ORIENTATION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the floating point-vector value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListenerfv(ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListenerfv(int attribute, [Out] IntPtr output);
+        #endregion alGetListenerfv(int attribute, [Out] IntPtr output)
+
+        #region alGetListenerfv(int attribute, [Out] float *output)
+        /// <summary>
+        ///     Retrieves a floating point-vector property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_ORIENTATION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the floating point-vector value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListenerfv(ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetListenerfv(int attribute, [Out] float* output);
+        #endregion alGetListenerfv(int attribute, [Out] float *output)
+
+        #region alGetListeneri(int attribute, out int output)
+        /// <summary>
+        ///     Retrieves an integer property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     The name of the attribute to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        /// <remarks>
+        ///     There are no integer listener attributes at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetListeneri(ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListeneri(int attribute, out int output);
+        #endregion alGetListeneri(int attribute, out int output)
+
+        #region alGetListeneri(int attribute, [Out] int[] output)
+        /// <summary>
+        ///     Retrieves an integer property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     The name of the attribute to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        /// <remarks>
+        ///     There are no integer listener attributes at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetListeneri(ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListeneri(int attribute, [Out] int[] output);
+        #endregion alGetListeneri(int attribute, [Out] int[] output)
+
+        #region alGetListeneri(int attribute, [Out] IntPtr output)
+        /// <summary>
+        ///     Retrieves an integer property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     The name of the attribute to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        /// <remarks>
+        ///     There are no integer listener attributes at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetListeneri(ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListeneri(int attribute, [Out] IntPtr output);
+        #endregion alGetListeneri(int attribute, [Out] IntPtr output)
+
+        #region alGetListeneri(int attribute, [Out] int *output)
+        /// <summary>
+        ///     Retrieves an integer property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     The name of the attribute to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        /// <remarks>
+        ///     There are no integer listener attributes at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetListeneri(ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetListeneri(int attribute, [Out] int* output);
+        #endregion alGetListeneri(int attribute, [Out] int *output)
+
+        #region alGetListener3i(int attribute, [Out] int *output1, [Out] int *output2, [Out] int *output3)
+        /// <summary>
+        ///     Retrieves a set of three integer values from a property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="output1">
+        ///     Pointer to the integer being retrieved.
+        /// </param>
+        /// <param name="output2">
+        ///     Pointer to the integer being retrieved.
+        /// </param>
+        /// <param name="output3">
+        ///     Pointer to the intger being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetListener3i(ALenum param, ALint* v1, ALfint* v2, ALint* v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetListener3i(int attribute, [Out] int* output1, [Out] int* output2, [Out] int* output3);
+        #endregion alGetListener3i(int attribute, [Out] int *output1, [Out] int *output2, [Out] int *output3)
+
+        #region alGetListeneriv(int attribute, out int output)
+        /// <summary>
+        ///     Retrieves an integer property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     The name of the attribute to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        /// <remarks>
+        ///     There are no integer listener attributes at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetListeneriv(ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListeneriv(int attribute, out int output);
+        #endregion alGetListeneriv(int attribute, out int output)
+
+        #region alGetListeneriv(int attribute, [Out] int[] output)
+        /// <summary>
+        ///     Retrieves an integer property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     The name of the attribute to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        /// <remarks>
+        ///     There are no integer listener attributes at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetListeneriv(ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListeneriv(int attribute, [Out] int[] output);
+        #endregion alGetListeneriv(int attribute, [Out] int[] output)
+
+        #region alGetListeneriv(int attribute, [Out] IntPtr output)
+        /// <summary>
+        ///     Retrieves an integer property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     The name of the attribute to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        /// <remarks>
+        ///     There are no integer listener attributes at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetListeneriv(ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetListeneriv(int attribute, [Out] IntPtr output);
+        #endregion alGetListeneriv(int attribute, [Out] IntPtr output)
+
+        #region alGetListeneriv(int attribute, [Out] int *output)
+        /// <summary>
+        ///     Retrieves an integer property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     The name of the attribute to be queried.
+        /// </param>
+        /// <param name="output">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        /// <remarks>
+        ///     There are no integer listener attributes at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alGetListeneriv(ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetListeneriv(int attribute, [Out] int* output);
+        #endregion alGetListeneriv(int attribute, [Out] int *output)
+
+        #region IntPtr alGetProcAddress(string functionName)
+        /// <summary>
+        ///     Returns the address of an OpenAL extension function.
+        /// </summary>
+        /// <param name="functionName">
+        ///     A string containing the function name.
+        /// </param>
+        /// <returns>
+        ///     A pointer to the desired function is returned.
+        /// </returns>
+        /// <remarks>
+        ///     The return value will be IntPtr.Zero if the function is not found.
+        /// </remarks>
+        // ALAPI ALvoid* ALAPIENTRY alGetProcAddress(ALubyte* fname);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr alGetProcAddress(string functionName);
+        #endregion IntPtr alGetProcAddress(string functionName)
+
+        #region alGetSource3f(int source, int attribute, out float value1, out float value2, out float value3)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="value1">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <param name="value2">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <param name="value3">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSource3f(ALuint source,  ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSource3f(int source, int attribute, out float value1, out float value2, out float value3);
+        #endregion alGetSource3f(int source, int attribute, out float value1, out float value2, out float value3)
+
+        #region alGetSource3f(int source, int attribute, [Out] float[] value1, [Out] float[] value2, [Out] float[] value3)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="value1">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <param name="value2">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <param name="value3">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSource3f(ALuint source,  ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSource3f(int source, int attribute, [Out] float[] value1, [Out] float[] value2, [Out] float[] value3);
+        #endregion alGetSource3f(int source, int attribute, [Out] float[] value1, [Out] float[] value2, [Out] float[] value3)
+
+        #region alGetSource3f(int source, int attribute, [Out] IntPtr value1, [Out] IntPtr value2, [Out] IntPtr value3)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="value1">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <param name="value2">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <param name="value3">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSource3f(ALuint source,  ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSource3f(int source, int attribute, [Out] IntPtr value1, [Out] IntPtr value2, [Out] IntPtr value3);
+        #endregion alGetSource3f(int source, int attribute, [Out] IntPtr value1, [Out] IntPtr value2, [Out] IntPtr value3)
+
+        #region alGetSource3f(int source, int attribute, [Out] float *value1, [Out] float *value2, [Out] float *value3)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="value1">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <param name="value2">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <param name="value3">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSource3f(ALuint source,  ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetSource3f(int source, int attribute, [Out] float* value1, [Out] float* value2, [Out] float* value3);
+        #endregion alGetSource3f(int source, int attribute, [Out] float *value1, [Out] float *value2, [Out] float *value3)
+
+        #region alGetSourcef(int source, int attribute, out float val)
+        /// <summary>
+        ///     Retrieves a floating point property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_PITCH" /></item>
+        ///             <item><see cref="AL_GAIN" /></item>
+        ///             <item><see cref="AL_MIN_GAIN" /></item>
+        ///             <item><see cref="AL_MAX_GAIN" /></item>
+        ///             <item><see cref="AL_MAX_DISTANCE" /></item>
+        ///             <item><see cref="AL_ROLLOFF_FACTOR" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_GAIN" /></item>
+        ///             <item><see cref="AL_CONE_INNER_ANGLE" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_ANGLE" /></item>
+        ///             <item><see cref="AL_REFERENCE_DISTANCE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the floating point value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourcef(int source, int attribute, out float val);
+        #endregion alGetSourcef(int source, int attribute, out float val)
+
+        #region alGetSourcef(int source, int attribute, [Out] float[] val)
+        /// <summary>
+        ///     Retrieves a floating point property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_PITCH" /></item>
+        ///             <item><see cref="AL_GAIN" /></item>
+        ///             <item><see cref="AL_MIN_GAIN" /></item>
+        ///             <item><see cref="AL_MAX_GAIN" /></item>
+        ///             <item><see cref="AL_MAX_DISTANCE" /></item>
+        ///             <item><see cref="AL_ROLLOFF_FACTOR" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_GAIN" /></item>
+        ///             <item><see cref="AL_CONE_INNER_ANGLE" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_ANGLE" /></item>
+        ///             <item><see cref="AL_REFERENCE_DISTANCE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the floating point value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourcef(int source, int attribute, [Out] float[] val);
+        #endregion alGetSourcef(int source, int attribute, [Out] float[] val)
+
+        #region alGetSourcef(int source, int attribute, [Out] IntPtr val)
+        /// <summary>
+        ///     Retrieves a floating point property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_PITCH" /></item>
+        ///             <item><see cref="AL_GAIN" /></item>
+        ///             <item><see cref="AL_MIN_GAIN" /></item>
+        ///             <item><see cref="AL_MAX_GAIN" /></item>
+        ///             <item><see cref="AL_MAX_DISTANCE" /></item>
+        ///             <item><see cref="AL_ROLLOFF_FACTOR" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_GAIN" /></item>
+        ///             <item><see cref="AL_CONE_INNER_ANGLE" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_ANGLE" /></item>
+        ///             <item><see cref="AL_REFERENCE_DISTANCE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the floating point value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourcef(int source, int attribute, [Out] IntPtr val);
+        #endregion alGetSourcef(int source, int attribute, [Out] IntPtr val)
+
+        #region alGetSourcef(int source, int attribute, [Out] float *val)
+        /// <summary>
+        ///     Retrieves a floating point property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_PITCH" /></item>
+        ///             <item><see cref="AL_GAIN" /></item>
+        ///             <item><see cref="AL_MIN_GAIN" /></item>
+        ///             <item><see cref="AL_MAX_GAIN" /></item>
+        ///             <item><see cref="AL_MAX_DISTANCE" /></item>
+        ///             <item><see cref="AL_ROLLOFF_FACTOR" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_GAIN" /></item>
+        ///             <item><see cref="AL_CONE_INNER_ANGLE" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_ANGLE" /></item>
+        ///             <item><see cref="AL_REFERENCE_DISTANCE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the floating point value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetSourcef(int source, int attribute, [Out] float* val);
+        #endregion alGetSourcef(int source, int attribute, [Out] float *val)
+
+        #region alGetSourcefv(int source, int attribute, out float val)
+        /// <summary>
+        ///     Retrieves a floating point-vector property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute being retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the vector to retrieve.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourcefv(int source, int attribute, out float val);
+        #endregion alGetSourcefv(int source, int attribute, out float val)
+
+        #region alGetSourcefv(int source, int attribute, [Out] float[] values)
+        /// <summary>
+        ///     Retrieves a floating point-vector property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute being retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     A pointer to the vector to retrieve.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourcefv(int source, int attribute, [Out] float[] values);
+        #endregion alGetSourcefv(int source, int attribute, [Out] float[] values)
+
+        #region alGetSourcefv(int source, int attribute, [Out] IntPtr values)
+        /// <summary>
+        ///     Retrieves a floating point-vector property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute being retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     A pointer to the vector to retrieve.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourcefv(int source, int attribute, [Out] IntPtr values);
+        #endregion alGetSourcefv(int source, int attribute, [Out] IntPtr values)
+
+        #region alGetSourcefv(int source, int attribute, [Out] float *values)
+        /// <summary>
+        ///     Retrieves a floating point-vector property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute being retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     A pointer to the vector to retrieve.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetSourcefv(int source, int attribute, [Out] float* values);
+        #endregion alGetSourcefv(int source, int attribute, [Out] float *values)
+
+        #region alGetSourcei(int source, int attribute, out int val)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_SOURCE_RELATIVE" /></item>
+        ///             <item><see cref="AL_BUFFER" /></item>
+        ///             <item><see cref="AL_SOURCE_STATE" /></item>
+        ///             <item><see cref="AL_BUFFERS_QUEUED" /></item>
+        ///             <item><see cref="AL_BUFFERS_PROCESSED" /></item>
+        ///             <item><see cref="AL_CONE_INNER_ANGLE" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_ANGLE" /></item>
+        ///             <item><see cref="AL_LOOPING" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcei(ALuint source, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourcei(int source, int attribute, out int val);
+        #endregion alGetSourcei(int source, int attribute, out int val)
+
+        #region alGetSourcei(int source, int attribute, [Out] int[] val)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_SOURCE_RELATIVE" /></item>
+        ///             <item><see cref="AL_BUFFER" /></item>
+        ///             <item><see cref="AL_SOURCE_STATE" /></item>
+        ///             <item><see cref="AL_BUFFERS_QUEUED" /></item>
+        ///             <item><see cref="AL_BUFFERS_PROCESSED" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcei(ALuint source, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourcei(int source, int attribute, [Out] int[] val);
+        #endregion alGetSourcei(int source, int attribute, [Out] int[] val)
+
+        #region alGetSourcei(int source, int attribute, [Out] IntPtr val)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_SOURCE_RELATIVE" /></item>
+        ///             <item><see cref="AL_BUFFER" /></item>
+        ///             <item><see cref="AL_SOURCE_STATE" /></item>
+        ///             <item><see cref="AL_BUFFERS_QUEUED" /></item>
+        ///             <item><see cref="AL_BUFFERS_PROCESSED" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcei(ALuint source, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourcei(int source, int attribute, [Out] IntPtr val);
+        #endregion alGetSourcei(int source, int attribute, [Out] IntPtr val)
+
+        #region alGetSourcei(int source, int attribute, [Out] int *val)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_SOURCE_RELATIVE" /></item>
+        ///             <item><see cref="AL_BUFFER" /></item>
+        ///             <item><see cref="AL_SOURCE_STATE" /></item>
+        ///             <item><see cref="AL_BUFFERS_QUEUED" /></item>
+        ///             <item><see cref="AL_BUFFERS_PROCESSED" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourcei(ALuint source, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetSourcei(int source, int attribute, [Out] int* val);
+        #endregion alGetSourcei(int source, int attribute, [Out] int *val)
+
+        #region alGetSource3i(int source, int attribute, out int value1, out int value2, out int value3)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="value1">
+        ///     The int values which the attribute will be set to.
+        /// </param>
+        /// <param name="value2">
+        ///     The int values which the attribute will be set to.
+        /// </param>
+        /// <param name="value3">
+        ///     The int values which the attribute will be set to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSource3i(ALuint source,  ALenum param, ALin* v1, ALint* v2, ALint* v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSource3i(int source, int attribute, out int value1, out int value2, out int value3);
+        #endregion alGetSource3i(int source, int attribute, out int value1, out int value2, out int value3)
+
+        #region alGetSourceiv(int source, int attribute, out int val)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_SOURCE_RELATIVE" /></item>
+        ///             <item><see cref="AL_BUFFER" /></item>
+        ///             <item><see cref="AL_SOURCE_STATE" /></item>
+        ///             <item><see cref="AL_BUFFERS_QUEUED" /></item>
+        ///             <item><see cref="AL_BUFFERS_PROCESSED" /></item>
+        ///             <item><see cref="AL_CONE_INNER_ANGLE" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_ANGLE" /></item>
+        ///             <item><see cref="AL_LOOPING" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourceiv(ALuint source, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourceiv(int source, int attribute, out int val);
+        #endregion alGetSourceiv(int source, int attribute, out int val)
+
+        #region alGetSourceiv(int source, int attribute, [Out] int[] val)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_SOURCE_RELATIVE" /></item>
+        ///             <item><see cref="AL_BUFFER" /></item>
+        ///             <item><see cref="AL_SOURCE_STATE" /></item>
+        ///             <item><see cref="AL_BUFFERS_QUEUED" /></item>
+        ///             <item><see cref="AL_BUFFERS_PROCESSED" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourceiv(ALuint source, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourceiv(int source, int attribute, [Out] int[] val);
+        #endregion alGetSourceiv(int source, int attribute, [Out] int[] val)
+
+        #region alGetSourceiv(int source, int attribute, [Out] IntPtr val)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_SOURCE_RELATIVE" /></item>
+        ///             <item><see cref="AL_BUFFER" /></item>
+        ///             <item><see cref="AL_SOURCE_STATE" /></item>
+        ///             <item><see cref="AL_BUFFERS_QUEUED" /></item>
+        ///             <item><see cref="AL_BUFFERS_PROCESSED" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourceiv(ALuint source, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alGetSourceiv(int source, int attribute, [Out] IntPtr val);
+        #endregion alGetSourceiv(int source, int attribute, [Out] IntPtr val)
+
+        #region alGetSourceiv(int source, int attribute, [Out] int *val)
+        /// <summary>
+        ///     Retrieves an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being retrieved.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to retrieve:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_SOURCE_RELATIVE" /></item>
+        ///             <item><see cref="AL_BUFFER" /></item>
+        ///             <item><see cref="AL_SOURCE_STATE" /></item>
+        ///             <item><see cref="AL_BUFFERS_QUEUED" /></item>
+        ///             <item><see cref="AL_BUFFERS_PROCESSED" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     A pointer to the integer value being retrieved.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alGetSourceiv(ALuint source, ALenum param, ALint* value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alGetSourceiv(int source, int attribute, [Out] int* val);
+        #endregion alGetSourceiv(int source, int attribute, [Out] int *val)
+
+        #region string alGetString(int state)
+        /// <summary>
+        ///     Retrieves an OpenAL string property.
+        /// </summary>
+        /// <param name="state">
+        ///     <para>
+        ///         The property to be queried:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_VENDOR" /></item>
+        ///             <item><see cref="AL_VERSION" /></item>
+        ///             <item><see cref="AL_RENDERER" /></item>
+        ///             <item><see cref="AL_EXTENSIONS" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     A pointer to a null-terminated string.
+        /// </returns>
+        // ALAPI ALubyte* ALAPIENTRY alGetString(ALenum param);
+        public static string alGetString(int state)
+        {
+            return Marshal.PtrToStringAnsi(_alGetString(state));
+        }
+
+        [DllImport(AL_NATIVE_LIBRARY, EntryPoint = "alGetString", CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr _alGetString(int state);
+        #endregion string alGetString(int state)
+
+        #region alHint(int target, int mode)
+        /// <summary>
+        ///     Sets application preferences for driver performance choices.
+        /// </summary>
+        /// <param name="target">
+        ///     Unknown.
+        /// </param>
+        /// <param name="mode">
+        ///     Unknown.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alHint(ALenum target, ALenum mode);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alHint(int target, int mode);
+        #endregion alHint(int target, int mode)
+
+        #region int alIsBuffer(int buffer)
+        /// <summary>
+        ///     Tests if a buffer name is valid.
+        /// </summary>
+        /// <param name="buffer">
+        ///     A buffer name to be tested for validity.
+        /// </param>
+        /// <returns>
+        ///     bool value <see cref="AL_TRUE" /> if the buffer name is valid or
+        ///     <see cref="AL_FALSE" /> if the buffer name is not valid.
+        /// </returns>
+        // ALAPI ALboolean ALAPIENTRY alIsBuffer(ALuint buffer);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alIsBuffer(int buffer);
+        #endregion int alIsBuffer(int buffer)
+
+        #region int alIsEnabled(int capability)
+        /// <summary>
+        ///     Returns a value indicating if a specific feature is enabled in the OpenAL driver.
+        /// </summary>
+        /// <param name="capability">
+        ///     The capability to query.
+        /// </param>
+        /// <returns>
+        ///     <see cref="AL_TRUE" /> if the capability is enabled, <see cref="AL_FALSE" /> if
+        ///     the capability is disabled.
+        /// </returns>
+        /// <remarks>
+        ///     At the time of this writing, this function always returns <see cref="AL_FALSE" />,
+        ///     and since there are no capabilities defined yet, the error
+        ///     <see cref="AL_INVALID_ENUM" /> will also be set.
+        /// </remarks>
+        // ALAPI ALboolean ALAPIENTRY alIsEnabled(ALenum capability);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alIsEnabled(int capability);
+        #endregion int alIsEnabled(int capability)
+
+        #region int alIsExtensionPresent(string extensionName)
+        /// <summary>
+        ///     Tests if a specific extension is available for the OpenAL driver.
+        /// </summary>
+        /// <param name="extensionName">
+        ///     A string describing the desired extension.
+        /// </param>
+        /// <returns>
+        ///     <see cref="AL_TRUE" /> if the extension is available, <see cref="AL_FALSE" /> if
+        ///     the extension is not available.
+        /// </returns>
+        // ALAPI ALboolean ALAPIENTRY alIsExtensionPresent(ALubyte* fname);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alIsExtensionPresent(string extensionName);
+        #endregion int alIsExtensionPresent(String extensionName)
+
+        #region int alIsSource(int id)
+        /// <summary>
+        ///     Tests if a source name is valid.
+        /// </summary>
+        /// <param name="id">
+        ///     A source name to be tested for validity.
+        /// </param>
+        /// <returns>
+        ///     bool value <see cref="AL_TRUE" /> if the source name is valid or
+        ///     <see cref="AL_FALSE" /> if the source name is not valid.
+        /// </returns>
+        // ALAPI ALboolean ALAPIENTRY alIsSource(ALuint id);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alIsSource(int id);
+        #endregion int alIsSource(int id)
+
+        #region alListener3f(int attribute, float value1, float value2, float value3)
+        /// <summary>
+        ///     Sets a floating point property for the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="value1">
+        ///     The value to set the attribute to.
+        /// </param>
+        /// <param name="value2">
+        ///     The value to set the attribute to.
+        /// </param>
+        /// <param name="value3">
+        ///     The value to set the attribute to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alListener3f(ALenum param, ALfloat v1, ALfloat v2, ALfloat v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alListener3f(int attribute, float value1, float value2, float value3);
+        #endregion alListener3f(int attribute, float value1, float value2, float value3)
+
+        #region alListenerf(int attribute, float val)
+        /// <summary>
+        ///     Sets a floating point property for the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     The name of the attribute to be set.
+        /// </param>
+        /// <param name="val">
+        ///     The float value to set the attribute to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alListenerf(ALenum param, ALfloat value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alListenerf(int attribute, float val);
+        #endregion alListenerf(int attribute, float val)
+
+        #region alListenerfv(int attribute, [In] ref float values)
+        /// <summary>
+        ///     Sets a floating point-vector property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_ORIENTATION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     Pointer to floating point-vector values.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alListenerfv(ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alListenerfv(int attribute, [In] ref float values);
+        #endregion alListenerfv(int attribute, [In] ref float values)
+
+        #region alListenerfv(int attribute, [In] float[] values)
+        /// <summary>
+        ///     Sets a floating point-vector property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_ORIENTATION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     Pointer to floating point-vector values.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alListenerfv(ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alListenerfv(int attribute, [In] float[] values);
+        #endregion alListenerfv(int attribute, [In] float[] values)
+
+        #region alListenerfv(int attribute, [In] IntPtr values)
+        /// <summary>
+        ///     Sets a floating point-vector property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_ORIENTATION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     Pointer to floating point-vector values.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alListenerfv(ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alListenerfv(int attribute, [In] IntPtr values);
+        #endregion alListenerfv(int attribute, [In] IntPtr values)
+
+        #region alListenerfv(int attribute, [In] float *values)
+        /// <summary>
+        ///     Sets a floating point-vector property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_ORIENTATION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     Pointer to floating point-vector values.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alListenerfv(ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alListenerfv(int attribute, [In] float* values);
+        #endregion alListenerfv(int attribute, [In] float *values)
+
+        #region alListeneri(int attribute, int val)
+        /// <summary>
+        ///     Sets an integer property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     The name of the attribute to be set.
+        /// </param>
+        /// <param name="val">
+        ///     The integer value to set the attribute to.
+        /// </param>
+        /// <remarks>
+        ///     There are no integer listener attributes at this time.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alListeneri(ALenum param, ALint value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alListeneri(int attribute, int val);
+        #endregion alListeneri(int attribute, int val)
+
+        #region alListener3i(int attribute, int value1, int value2, int value3)
+        /// <summary>
+        ///     Sets an integer property for the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="value1">
+        ///     The value to set the attribute to.
+        /// </param>
+        /// <param name="value2">
+        ///     The value to set the attribute to.
+        /// </param>
+        /// <param name="value3">
+        ///     The value to set the attribute to.
+        /// </param>
+        // AL_API void AL_APIENTRY alListener3i( ALenum param, ALint value1, ALint value2, ALint value3 )
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alListener3i(int attribute, int value1, int value2, int value3);
+        #endregion alListener3i(int attribute, int value1, int value2, int value3)
+
+        #region alListeneriv(int attribute, [In] ref int values)
+        /// <summary>
+        ///     Sets a integer-vector property of the listener.
+        /// </summary>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to be set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_ORIENTATION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     Pointer to integer-vector values.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alListeneriv(ALenum param, ALint* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alListeneriv(int attribute, [In] ref int values);
+        #endregion alListeneriv(int attribute, [In] ref int values)
+
+        #region alQueuei(int source, int attribute, int val)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="source">
+        ///     Unknown.
+        /// </param>
+        /// <param name="attribute">
+        ///     Unknown.
+        /// </param>
+        /// <param name="val">
+        ///     Unknown.
+        /// </param>
+        // ALAPI void ALAPIENTRY alQueuei(ALuint sid, ALenum param, ALint value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alQueuei(int source, int attribute, int val);
+        #endregion alQueuei(int source, int attribute, int val)
+
+        #region alSource3f(int source, int attribute, float value1, float value2, float value3)
+        /// <summary>
+        ///     Sets a source property requiring three floating point values.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being set.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="value1">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <param name="value2">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <param name="value3">
+        ///     The float values which the attribute will be set to.
+        /// </param>
+        /// <remarks>
+        ///     This function is an alternative to <see cref="alSourcefv(int, int, System.IntPtr)" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSource3f(ALuint source, ALenum param, ALfloat v1, ALfloat v2, ALfloat v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSource3f(int source, int attribute, float value1, float value2, float value3);
+        #endregion alSource3f(int source, int attribute, float value1, float value2, float value3)
+
+        #region alSourcef(int source, int attribute, float val)
+        /// <summary>
+        ///     Sets a floating point property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being set.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_PITCH" /></item>
+        ///             <item><see cref="AL_GAIN" /></item>
+        ///             <item><see cref="AL_MAX_DISTANCE" /></item>
+        ///             <item><see cref="AL_ROLLOFF_FACTOR" /></item>
+        ///             <item><see cref="AL_REFERENCE_DISTANCE" /></item>
+        ///             <item><see cref="AL_MIN_GAIN" /></item>
+        ///             <item><see cref="AL_MAX_GAIN" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_GAIN" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     The value to set the attribute to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourcef(ALuint source, ALenum param, ALfloat value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcef(int source, int attribute, float val);
+        #endregion alSourcef(int source, int attribute, float val)
+
+        #region alSourcefv(int source, int attribute, [In] ref float values)
+        /// <summary>
+        ///     Sets a floating point-vector property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being set.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute being set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     A pointer to the vector to set the attribute to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourcefv(ALuint source, ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcefv(int source, int attribute, [In] ref float values);
+        #endregion alSourcefv(int source, int attribute, float[] values)
+
+        #region alSourcefv(int source, int attribute, [In] float[] values)
+        /// <summary>
+        ///     Sets a floating point-vector property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being set.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute being set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     A pointer to the vector to set the attribute to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourcefv(ALuint source, ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcefv(int source, int attribute, [In] float[] values);
+        #endregion alSourcefv(int source, int attribute, [In] float[] values)
+
+        #region alSourcefv(int source, int attribute, [In] IntPtr values)
+        /// <summary>
+        ///     Sets a floating point-vector property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being set.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute being set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     A pointer to the vector to set the attribute to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourcefv(ALuint source, ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcefv(int source, int attribute, [In] IntPtr values);
+        #endregion alSourcefv(int source, int attribute, [In] IntPtr values)
+
+        #region alSourcefv(int source, int attribute, [In] float *values)
+        /// <summary>
+        ///     Sets a floating point-vector property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being set.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute being set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     A pointer to the vector to set the attribute to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourcefv(ALuint source, ALenum param, ALfloat* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alSourcefv(int source, int attribute, [In] float* values);
+        #endregion alSourcefv(int source, int attribute, [In] float *values)
+
+        #region alSourcei(int source, int attribute, int val)
+        /// <summary>
+        ///     Sets an integer property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being set.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_SOURCE_RELATIVE" /></item>
+        ///             <item><see cref="AL_CONE_INNER_ANGLE" /></item>
+        ///             <item><see cref="AL_CONE_OUTER_ANGLE" /></item>
+        ///             <item><see cref="AL_LOOPING" /></item>
+        ///             <item><see cref="AL_BUFFER" /></item>
+        ///             <item><see cref="AL_SOURCE_STATE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="val">
+        ///     The value to set the attribute to.
+        /// </param>
+        /// <remarks>
+        ///     The buffer name zero is reserved as a �Null Buffer" and is accepted by
+        ///     <b>alSourcei(�, Al.AL_BUFFER, �)</b> as a valid buffer of zero length.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcei(ALuint source, ALenum param, ALint value);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcei(int source, int attribute, int val);
+        #endregion alSourcei(int source, int attribute, int val)
+
+        #region alSourceiv(int source, int attribute, [In] int *values)
+        /// <summary>
+        ///     Sets a integer-vector property of a source.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being set.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute being set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="values">
+        ///     A pointer to the vector to set the attribute to.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourceiv(ALuint source, ALenum param, ALint* values);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alSourceiv(int source, int attribute, [In] int* values);
+        #endregion alSourceiv(int source, int attribute, [In] int *values)
+
+        #region alSource3i(int source, int attribute, int value1, int value2, int value3)
+        /// <summary>
+        ///     Sets a source property requiring three integer values.
+        /// </summary>
+        /// <param name="source">
+        ///     Source name whose attribute is being set.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         The name of the attribute to set:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_POSITION" /></item>
+        ///             <item><see cref="AL_VELOCITY" /></item>
+        ///             <item><see cref="AL_DIRECTION" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="value1">
+        ///     The int values which the attribute will be set to.
+        /// </param>
+        /// <param name="value2">
+        ///     The int values which the attribute will be set to.
+        /// </param>
+        /// <param name="value3">
+        ///     The int values which the attribute will be set to.
+        /// </param>
+        /// <remarks>
+        ///     This function is an alternative to <see cref="alSourceiv" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSource3i(ALuint source, ALenum param, ALint v1, ALint v2, ALint v3);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSource3i(int source, int attribute, int value1, int value2, int value3);
+        #endregion void alSource3i(int source, int attribute, int value1, int value2, int value3)
+
+        #region alSourcePause(int source)
+        /// <summary>
+        ///     Pauses a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to be paused.
+        /// </param>
+        /// <remarks>
+        ///     The paused source will have its state changed to <see cref="AL_PAUSED" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcePause(ALuint source);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcePause(int source);
+        #endregion alSourcePause(int source)
+
+        #region alSourcePausev(int number, [In] ref int source)
+        /// <summary>
+        ///     Pauses a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be paused.
+        /// </param>
+        /// <param name="source">
+        ///     A pointer to an array of sources to be paused.
+        /// </param>
+        /// <remarks>
+        ///     The paused sources will have their state changed to <see cref="AL_PAUSED" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcePausev(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcePausev(int number, [In] ref int source);
+        #endregion alSourcePausev(int number, [In] ref int source)
+
+        #region alSourcePausev(int number, [In] int[] sources)
+        /// <summary>
+        ///     Pauses a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be paused.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be paused.
+        /// </param>
+        /// <remarks>
+        ///     The paused sources will have their state changed to <see cref="AL_PAUSED" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcePausev(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcePausev(int number, [In] int[] sources);
+        #endregion alSourcePausev(int number, [In] int[] sources)
+
+        #region alSourcePausev(int number, [In] IntPtr sources)
+        /// <summary>
+        ///     Pauses a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be paused.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be paused.
+        /// </param>
+        /// <remarks>
+        ///     The paused sources will have their state changed to <see cref="AL_PAUSED" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcePausev(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcePausev(int number, [In] IntPtr sources);
+        #endregion alSourcePausev(int number, [In] IntPtr sources)
+
+        #region alSourcePausev(int number, [In] int *sources)
+        /// <summary>
+        ///     Pauses a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be paused.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be paused.
+        /// </param>
+        /// <remarks>
+        ///     The paused sources will have their state changed to <see cref="AL_PAUSED" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcePausev(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alSourcePausev(int number, [In] int* sources);
+        #endregion alSourcePausev(int number, [In] int *sources)
+
+        #region alSourcePlay(int source)
+        /// <summary>
+        ///     Plays a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to be played.
+        /// </param>
+        /// <remarks>
+        ///     The playing source will have its state changed to <see cref="AL_PLAYING" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcePlay(ALuint source);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcePlay(int source);
+        #endregion alSourcePlay(int source)
+
+        #region alSourcePlayv(int number, [In] ref int source)
+        /// <summary>
+        ///     Plays a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be played.
+        /// </param>
+        /// <param name="source">
+        ///     A pointer to an array of sources to be played.
+        /// </param>
+        /// <remarks>
+        ///     The playing sources will have their state changed to <see cref="AL_PLAYING" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcePlayv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcePlayv(int number, [In] ref int source);
+        #endregion alSourcePlayv(int number, [In] ref int source)
+
+        #region alSourcePlayv(int number, [In] int[] sources)
+        /// <summary>
+        ///     Plays a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be played.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be played.
+        /// </param>
+        /// <remarks>
+        ///     The playing sources will have their state changed to <see cref="AL_PLAYING" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcePlayv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcePlayv(int number, [In] int[] sources);
+        #endregion alSourcePlayv(int number, [In] int[] sources)
+
+        #region alSourcePlayv(int number, [In] IntPtr sources)
+        /// <summary>
+        ///     Plays a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be played.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be played.
+        /// </param>
+        /// <remarks>
+        ///     The playing sources will have their state changed to <see cref="AL_PLAYING" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcePlayv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourcePlayv(int number, [In] IntPtr sources);
+        #endregion alSourcePlayv(int number, [In] IntPtr sources)
+
+        #region alSourcePlayv(int number, [In] int *sources)
+        /// <summary>
+        ///     Plays a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be played.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be played.
+        /// </param>
+        /// <remarks>
+        ///     The playing sources will have their state changed to <see cref="AL_PLAYING" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourcePlayv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alSourcePlayv(int number, [In] int* sources);
+        #endregion alSourcePlayv(int number, [In] int *sources)
+
+        #region alSourceQueueBuffers(int source, int number, [In] ref int buffer)
+        /// <summary>
+        ///     Queues a set of buffers on a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to queue buffers onto.
+        /// </param>
+        /// <param name="number">
+        ///     The number of buffers to be queued.
+        /// </param>
+        /// <param name="buffer">
+        ///     A pointer to an array of buffer names to be queued.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourceQueueBuffers(ALuint source, ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceQueueBuffers(int source, int number, [In] ref int buffer);
+        #endregion alSourceQueueBuffers(int source, int number, [In] ref int buffer)
+
+        #region alSourceQueueBuffers(int source, int number, [In] int[] buffers)
+        /// <summary>
+        ///     Queues a set of buffers on a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to queue buffers onto.
+        /// </param>
+        /// <param name="number">
+        ///     The number of buffers to be queued.
+        /// </param>
+        /// <param name="buffers">
+        ///     A pointer to an array of buffer names to be queued.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourceQueueBuffers(ALuint source, ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceQueueBuffers(int source, int number, [In] int[] buffers);
+        #endregion alSourceQueueBuffers(int source, int number, [In] int[] buffers)
+
+        #region alSourceQueueBuffers(int source, int number, [In] IntPtr buffers)
+        /// <summary>
+        ///     Queues a set of buffers on a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to queue buffers onto.
+        /// </param>
+        /// <param name="number">
+        ///     The number of buffers to be queued.
+        /// </param>
+        /// <param name="buffers">
+        ///     A pointer to an array of buffer names to be queued.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourceQueueBuffers(ALuint source, ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceQueueBuffers(int source, int number, [In] IntPtr buffers);
+        #endregion alSourceQueueBuffers(int source, int number, [In] IntPtr buffers)
+
+        #region alSourceQueueBuffers(int source, int number, [In] int *buffers)
+        /// <summary>
+        ///     Queues a set of buffers on a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to queue buffers onto.
+        /// </param>
+        /// <param name="number">
+        ///     The number of buffers to be queued.
+        /// </param>
+        /// <param name="buffers">
+        ///     A pointer to an array of buffer names to be queued.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourceQueueBuffers(ALuint source, ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alSourceQueueBuffers(int source, int number, [In] int* buffers);
+        #endregion alSourceQueueBuffers(int source, int number, [In] int *buffers)
+
+        #region alSourceRewind(int source)
+        /// <summary>
+        ///     Stops the source and sets its state to <see cref="AL_INITIAL" />.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to be rewound.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourceRewind(ALuint source);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceRewind(int source);
+        #endregion alSourceRewind(int source)
+
+        #region alSourceRewindv(int number, [In] ref int source)
+        /// <summary>
+        ///     Stops a set of sources and sets all their states to <see cref="AL_INITIAL" />.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be rewound.
+        /// </param>
+        /// <param name="source">
+        ///     A pointer to an array of sources to be rewound.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourceRewindv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceRewindv(int number, [In] ref int source);
+        #endregion alSourceRewindv(int number, [In] ref int source)
+
+        #region alSourceRewindv(int number, [In] int[] sources)
+        /// <summary>
+        ///     Stops a set of sources and sets all their states to <see cref="AL_INITIAL" />.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be rewound.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be rewound.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourceRewindv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceRewindv(int number, [In] int[] sources);
+        #endregion alSourceRewindv(int number, [In] int[] sources)
+
+        #region alSourceRewindv(int number, [In] IntPtr sources)
+        /// <summary>
+        ///     Stops a set of sources and sets all their states to <see cref="AL_INITIAL" />.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be rewound.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be rewound.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourceRewindv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceRewindv(int number, [In] IntPtr sources);
+        #endregion alSourceRewindv(int number, [In] IntPtr sources)
+
+        #region alSourceRewindv(int number, [In] int *sources)
+        /// <summary>
+        ///     Stops a set of sources and sets all their states to <see cref="AL_INITIAL" />.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to be rewound.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be rewound.
+        /// </param>
+        // ALAPI ALvoid ALAPIENTRY alSourceRewindv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alSourceRewindv(int number, [In] int* sources);
+        #endregion alSourceRewindv(int number, [In] int *sources)
+
+        #region alSourceStop(int source)
+        /// <summary>
+        ///     Stops a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to be stopped.
+        /// </param>
+        /// <remarks>
+        ///     The stopped source will have its state changed to <see cref="AL_STOPPED" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourceStop(ALuint source);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceStop(int source);
+        #endregion alSourceStop(int source)
+
+        #region alSourceStopv(int number, [In] ref int source)
+        /// <summary>
+        ///     Stops a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to stop.
+        /// </param>
+        /// <param name="source">
+        ///     A pointer to an array of sources to be stopped.
+        /// </param>
+        /// <remarks>
+        ///     The stopped sources will have their state changed to <see cref="AL_STOPPED" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourceStopv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceStopv(int number, [In] ref int source);
+        #endregion alSourceStopv(int number, [In] ref int source)
+
+        #region alSourceStopv(int number, [In] int[] sources)
+        /// <summary>
+        ///     Stops a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to stop.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be stopped.
+        /// </param>
+        /// <remarks>
+        ///     The stopped sources will have their state changed to <see cref="AL_STOPPED" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourceStopv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceStopv(int number, [In] int[] sources);
+        #endregion alSourceStopv(int number, [In] int[] sources)
+
+        #region alSourceStopv(int number, [In] IntPtr sources)
+        /// <summary>
+        ///     Stops a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to stop.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be stopped.
+        /// </param>
+        /// <remarks>
+        ///     The stopped sources will have their state changed to <see cref="AL_STOPPED" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourceStopv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceStopv(int number, [In] IntPtr sources);
+        #endregion alSourceStopv(int number, [In] IntPtr sources)
+
+        #region alSourceStopv(int number, [In] int *sources)
+        /// <summary>
+        ///     Stops a set of sources.
+        /// </summary>
+        /// <param name="number">
+        ///     The number of sources to stop.
+        /// </param>
+        /// <param name="sources">
+        ///     A pointer to an array of sources to be stopped.
+        /// </param>
+        /// <remarks>
+        ///     The stopped sources will have their state changed to <see cref="AL_STOPPED" />.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourceStopv(ALsizei n, ALuint *sources);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alSourceStopv(int number, [In] int* sources);
+        #endregion alSourceStopv(int number, [In] int *sources)
+
+        #region alSourceUnqueueBuffers(int source, int number, [In] ref int buffer)
+        /// <summary>
+        ///     Unqueues a set of buffers attached to a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to unqueue buffers from.
+        /// </param>
+        /// <param name="number">
+        ///     The number of buffers to be unqueued.
+        /// </param>
+        /// <param name="buffer">
+        ///     A pointer to an array of buffer names that were removed.
+        /// </param>
+        /// <remarks>
+        ///     The unqueue operation will only take place if all <i>number</i> buffers can be
+        ///     removed from the queue.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceUnqueueBuffers(int source, int number, [In] ref int buffer);
+        #endregion alSourceUnqueueBuffers(int source, int number, [In] ref int buffer)
+
+        #region alSourceUnqueueBuffers(int source, int number, [In] int[] buffers)
+        /// <summary>
+        ///     Unqueues a set of buffers attached to a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to unqueue buffers from.
+        /// </param>
+        /// <param name="number">
+        ///     The number of buffers to be unqueued.
+        /// </param>
+        /// <param name="buffers">
+        ///     A pointer to an array of buffer names that were removed.
+        /// </param>
+        /// <remarks>
+        ///     The unqueue operation will only take place if all <i>number</i> buffers can be
+        ///     removed from the queue.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceUnqueueBuffers(int source, int number, [In] int[] buffers);
+        #endregion alSourceUnqueueBuffers(int source, int number, [In] int[] buffers)
+
+        #region alSourceUnqueueBuffers(int source, int number, [In] IntPtr buffers)
+        /// <summary>
+        ///     Unqueues a set of buffers attached to a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to unqueue buffers from.
+        /// </param>
+        /// <param name="number">
+        ///     The number of buffers to be unqueued.
+        /// </param>
+        /// <param name="buffers">
+        ///     A pointer to an array of buffer names that were removed.
+        /// </param>
+        /// <remarks>
+        ///     The unqueue operation will only take place if all <i>number</i> buffers can be
+        ///     removed from the queue.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alSourceUnqueueBuffers(int source, int number, [In] IntPtr buffers);
+        #endregion alSourceUnqueueBuffers(int source, int number, [In] IntPtr buffers)
+
+        #region alSourceUnqueueBuffers(int source, int number, [In] int *buffers)
+        /// <summary>
+        ///     Unqueues a set of buffers attached to a source.
+        /// </summary>
+        /// <param name="source">
+        ///     The name of the source to unqueue buffers from.
+        /// </param>
+        /// <param name="number">
+        ///     The number of buffers to be unqueued.
+        /// </param>
+        /// <param name="buffers">
+        ///     A pointer to an array of buffer names that were removed.
+        /// </param>
+        /// <remarks>
+        ///     The unqueue operation will only take place if all <i>number</i> buffers can be
+        ///     removed from the queue.
+        /// </remarks>
+        // ALAPI ALvoid ALAPIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei n, ALuint* buffers);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alSourceUnqueueBuffers(int source, int number, [In] int* buffers);
+        #endregion alSourceUnqueueBuffers(int source, int number, [In] int *buffers)
+        #endregion Public OpenAL 1.1 Methods
+
+        #region Public IASIG Methods
+        #region int alGenEnvironmentIASIG(int number, out int environments)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="number">
+        ///     Unknown.
+        /// </param>
+        /// <param name="environments">
+        ///     Unknown.
+        /// </param>
+        /// <returns>
+        ///     Unknown.
+        /// </returns>
+        // ALAPI ALsizei ALAPIENTRY alGenEnvironmentIASIG(ALsizei n, ALuint* environs);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alGenEnvironmentIASIG(int number, out int environments);
+        #endregion int alGenEnvironmentIASIG(int number, out int environments)
+
+        #region int alGenEnvironmentIASIG(int number, [Out] int[] environments)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="number">
+        ///     Unknown.
+        /// </param>
+        /// <param name="environments">
+        ///     Unknown.
+        /// </param>
+        /// <returns>
+        ///     Unknown.
+        /// </returns>
+        // ALAPI ALsizei ALAPIENTRY alGenEnvironmentIASIG(ALsizei n, ALuint* environs);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alGenEnvironmentIASIG(int number, [Out] int[] environments);
+        #endregion int alGenEnvironmentIASIG(int number, [Out] int[] environments)
+
+        #region int alGenEnvironmentIASIG(int number, [Out] IntPtr environments)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="number">
+        ///     Unknown.
+        /// </param>
+        /// <param name="environments">
+        ///     Unknown.
+        /// </param>
+        /// <returns>
+        ///     Unknown.
+        /// </returns>
+        // ALAPI ALsizei ALAPIENTRY alGenEnvironmentIASIG(ALsizei n, ALuint* environs);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alGenEnvironmentIASIG(int number, [Out] IntPtr environments);
+        #endregion int alGenEnvironmentIASIG(int number, [Out] IntPtr environments)
+
+        #region int alGenEnvironmentIASIG(int number, [Out] int *environments)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="number">
+        ///     Unknown.
+        /// </param>
+        /// <param name="environments">
+        ///     Unknown.
+        /// </param>
+        /// <returns>
+        ///     Unknown.
+        /// </returns>
+        // ALAPI ALsizei ALAPIENTRY alGenEnvironmentIASIG(ALsizei n, ALuint* environs);
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern int alGenEnvironmentIASIG(int number, [Out] int* environments);
+        #endregion int alGenEnvironmentIASIG(int number, [Out] int *environments)
+
+        #region alDeleteEnvironmentIASIG(int number, [In] ref int environments)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="number">
+        ///     Unknown.
+        /// </param>
+        /// <param name="environments">
+        ///     Unknown.
+        /// </param>
+        // ALAPI void ALAPIENTRY alDeleteEnvironmentIASIG( ALsizei n, ALuint* environs );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDeleteEnvironmentIASIG(int number, [In] ref int environments);
+        #endregion alDeleteEnvironmentIASIG(int number, [In] ref int environments)
+
+        #region alDeleteEnvironmentIASIG(int number, [In] int[] environments)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="number">
+        ///     Unknown.
+        /// </param>
+        /// <param name="environments">
+        ///     Unknown.
+        /// </param>
+        // ALAPI void ALAPIENTRY alDeleteEnvironmentIASIG( ALsizei n, ALuint* environs );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDeleteEnvironmentIASIG(int number, [In] int[] environments);
+        #endregion alDeleteEnvironmentIASIG(int number, [In] int[] environments)
+
+        #region alDeleteEnvironmentIASIG(int number, [In] IntPtr environments)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="number">
+        ///     Unknown.
+        /// </param>
+        /// <param name="environments">
+        ///     Unknown.
+        /// </param>
+        // ALAPI void ALAPIENTRY alDeleteEnvironmentIASIG( ALsizei n, ALuint* environs );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alDeleteEnvironmentIASIG(int number, [In] IntPtr environments);
+        #endregion alDeleteEnvironmentIASIG(int number, [In] IntPtr environments)
+
+        #region alDeleteEnvironmentIASIG(int number, [In] int *environments)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="number">
+        ///     Unknown.
+        /// </param>
+        /// <param name="environments">
+        ///     Unknown.
+        /// </param>
+        // ALAPI void ALAPIENTRY alDeleteEnvironmentIASIG( ALsizei n, ALuint* environs );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alDeleteEnvironmentIASIG(int number, [In] int* environments);
+        #endregion alDeleteEnvironmentIASIG(int number, [In] int *environments)
+
+        #region int alIsEnvironmentIASIG(int environment)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="environment">
+        ///     Unknown.
+        /// </param>
+        /// <returns>
+        ///     Unknown.
+        /// </returns>
+        // ALAPI ALboolean ALAPIENTRY alIsEnvironmentIASIG( ALuint environ );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alIsEnvironmentIASIG(int environment);
+        #endregion int alIsEnvironmentIASIG(int environment)
+
+        #region alEnvironmentiIASIG(int environmentId, int attribute, int val)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="environmentId">
+        ///     Unknown.
+        /// </param>
+        /// <param name="attribute">
+        ///     Unknown.
+        /// </param>
+        /// <param name="val">
+        ///     Unknown.
+        /// </param>
+        // ALAPI void ALAPIENTRY alEnvironmentiIASIG( ALuint eid, ALenum param, ALint value );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alEnvironmentiIASIG(int environmentId, int attribute, int val);
+        #endregion alEnvironmentiIASIG(int environmentId, int attribute, int val)
+
+        #region alEnvironmentfIASIG(int environmentId, int attribute, int val)
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        /// <param name="environmentId">
+        ///     Unknown.
+        /// </param>
+        /// <param name="attribute">
+        ///     Unknown.
+        /// </param>
+        /// <param name="val">
+        ///     Unknown.
+        /// </param>
+        // ALAPI void ALAPIENTRY alEnvironmentfIASIG( ALuint eid, ALenum param, ALuint value );
+        [DllImport(AL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alEnvironmentfIASIG(int environmentId, int attribute, int val);
+        #endregion alEnvironmentfIASIG(int environmentId, int attribute, int val)
+        #endregion Public IASIG Methods
+
+        #region Public OpenAL Extension Methods
+        #region X-RAM Methods
+        #region EAXSetBufferMode
+        /// <summary>
+        ///     Sets the X-RAM mode for the specified buffers.
+        /// </summary>
+        /// <param name="n">
+        ///     The number of buffers to set.
+        /// </param>
+        /// <param name="buffers">
+        ///     A pointer to an array of buffers to set.
+        /// </param>
+        /// <param name="mode">
+        ///     <para>
+        ///         The X-RAM buffer mode for the specified buffers.
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_STORAGE_AUTOMATIC" /></item>
+        ///             <item><see cref="AL_STORAGE_HARDWARE" /></item>
+        ///             <item><see cref="AL_STORAGE_ACCESSIBLE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        [CLSCompliant(false)]
+        public unsafe static void EAXSetBufferMode(int n, int* buffers, int mode)
+        {
+            Delegates.EAXSetBufferMode(n, buffers, mode);
+        }
+
+        /// <summary>
+        ///     Sets the X-RAM mode for the specified buffers.
+        /// </summary>
+        /// <param name="n">
+        ///     The number of buffers to set.
+        /// </param>
+        /// <param name="buffers">
+        ///     An array of buffers to set, with minimum n elements.
+        /// </param>
+        /// <param name="mode">
+        ///     <para>
+        ///         The X-RAM buffer mode for the specified buffers.
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_STORAGE_AUTOMATIC" /></item>
+        ///             <item><see cref="AL_STORAGE_HARDWARE" /></item>
+        ///             <item><see cref="AL_STORAGE_ACCESSIBLE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        public static void EAXSetBufferMode(int n, int[] buffers, int mode)
+        {
+            unsafe
+            {
+                fixed (int* ptr = buffers)
+                {
+                    Delegates.EAXSetBufferMode(n, ptr, mode);
+                }
+            }
+        }
+        /// <summary>
+        ///     Sets the X-RAM mode for the specified buffers.
+        /// </summary>
+        /// <param name="n">
+        ///     The number of buffers to set.
+        /// </param>
+        /// <param name="buffers">
+        ///     A pointer to an array of buffers to set.
+        /// </param>
+        /// <param name="mode">
+        ///     <para>
+        ///         The X-RAM buffer mode for the specified buffers.
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_STORAGE_AUTOMATIC" /></item>
+        ///             <item><see cref="AL_STORAGE_HARDWARE" /></item>
+        ///             <item><see cref="AL_STORAGE_ACCESSIBLE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        public static void EAXSetBufferMode(int n, ref int buffers, int mode)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &buffers)
+                {
+                    Delegates.EAXSetBufferMode(n, ptr, mode);
+                }
+            }
+        }
+        #endregion EAXSetBufferMode
+
+        #region EAXGetBufferMode
+        /// <summary>
+        ///     Gets the X-RAM mode for the specified buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer to retreive the property for.
+        /// </param>
+        /// <param name="reserved">
+        /// Not used yet.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         One of the following values:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_STORAGE_AUTOMATIC" /></item>
+        ///             <item><see cref="AL_STORAGE_HARDWARE" /></item>
+        ///             <item><see cref="AL_STORAGE_ACCESSIBLE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </returns>
+        [CLSCompliant(false)]
+        public unsafe static int EAXGetBufferMode(int buffer, int* reserved)
+        {
+            return Delegates.EAXGetBufferMode(buffer, reserved);
+        }
+        /// <summary>
+        ///     Gets the X-RAM mode for the specified buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer to retreive the property for.
+        /// </param>
+        /// <param name="reserved">
+        /// Not used yet.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         One of the following values:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_STORAGE_AUTOMATIC" /></item>
+        ///             <item><see cref="AL_STORAGE_HARDWARE" /></item>
+        ///             <item><see cref="AL_STORAGE_ACCESSIBLE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </returns>
+        public static int EAXGetBufferMode(int buffer, int[] reserved)
+        {
+            unsafe
+            {
+                fixed (int* ptr = reserved)
+                {
+                    return Delegates.EAXGetBufferMode(buffer, ptr);
+                }
+            }
+        }
+        /// <summary>
+        ///     Gets the X-RAM mode for the specified buffer.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Buffer to retreive the property for.
+        /// </param>
+        /// <param name="reserved">
+        /// Not used yet.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         One of the following values:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="AL_STORAGE_AUTOMATIC" /></item>
+        ///             <item><see cref="AL_STORAGE_HARDWARE" /></item>
+        ///             <item><see cref="AL_STORAGE_ACCESSIBLE" /></item>
+        ///         </list>
+        ///     </para>
+        /// </returns>
+        public static int EAXGetBufferMode(int buffer, ref int reserved)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &reserved)
+                {
+                    return Delegates.EAXGetBufferMode(buffer, ptr);
+                }
+            }
+        }
+        #endregion EAXGetBufferMode
+        #endregion X-RAM Methods
+
+        #region EFX_EXT Methods
+        #region alEffect
+        public static void alGenEffects(int size, int[] effects)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &effects[0])
+                {
+                    Delegates.alGenEffects(size, ptr);
+                }
+            }
+        }
+
+        public static void alGenEffects(int size, out int effect)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &effect)
+                {
+                    Delegates.alGenEffects(size, ptr);
+                }
+            }
+        }
+
+        public static void alDeleteEffects(int size, int[] effects)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &effects[0])
+                {
+                    Delegates.alDeleteEffects(size, ptr);
+                }
+            }
+        }
+
+        public static void alDeleteEffects(int size, int effect)
+        {
+            unsafe
+            {
+                Delegates.alDeleteEffects(size, &effect);
+            }
+        }
+
+        public static bool alIsEffect(int effect)
+        {
+            return Delegates.alIsEffect(effect);
+        }
+
+        public static void alEffecti(int effect, int param, int value)
+        {
+            Delegates.alEffecti(effect, param, value);
+        }
+
+        public static void alEffectiv(int effect, int param, int[] value)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &value[0])
+                {
+                    Delegates.alEffectiv(effect, param, ptr);
+                }
+            }
+        }
+
+        public static void alEffectf(int effect, int param, float value)
+        {
+            Delegates.alEffectf(effect, param, value);
+        }
+
+        public static void alEffectfv(int effect, int param, float[] value)
+        {
+            unsafe
+            {
+                fixed (float* ptr = &value[0])
+                {
+                    Delegates.alEffectfv(effect, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetEffecti(int effect, int param, out int value)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &value)
+                {
+                    Delegates.alGetEffecti(effect, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetEffectiv(int effect, int param, int[] value)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &value[0])
+                {
+                    Delegates.alGetEffectiv(effect, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetEffectf(int effect, int param, out float value)
+        {
+            unsafe
+            {
+                fixed (float* ptr = &value)
+                {
+                    Delegates.alGetEffectf(effect, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetEffectfv(int effect, int param, float[] value)
+        {
+            unsafe
+            {
+                fixed (float* ptr = &value[0])
+                {
+                    Delegates.alGetEffectfv(effect, param, ptr);
+                }
+            }
+        }
+        #endregion
+
+        #region alFilter
+        public static void alGenFilters(int size, int[] Filters)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &Filters[0])
+                {
+                    Delegates.alGenFilters(size, ptr);
+                }
+            }
+        }
+
+        public static void alGenFilters(int size, out int Filter)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &Filter)
+                {
+                    Delegates.alGenFilters(size, ptr);
+                }
+            }
+        }
+
+        public static void alDeleteFilters(int size, int[] Filters)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &Filters[0])
+                {
+                    Delegates.alDeleteFilters(size, ptr);
+                }
+            }
+        }
+
+        public static void alDeleteFilters(int size, int Filter)
+        {
+            unsafe
+            {
+                Delegates.alDeleteFilters(size, &Filter);
+            }
+        }
+
+        public static bool alIsFilter(int Filter)
+        {
+            return Delegates.alIsFilter(Filter);
+        }
+
+        public static void alFilteri(int Filter, int param, int value)
+        {
+            Delegates.alFilteri(Filter, param, value);
+        }
+
+        public static void alFilteriv(int Filter, int param, int[] value)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &value[0])
+                {
+                    Delegates.alFilteriv(Filter, param, ptr);
+                }
+            }
+        }
+
+        public static void alFilterf(int Filter, int param, float value)
+        {
+            Delegates.alFilterf(Filter, param, value);
+        }
+
+        public static void alFilterfv(int Filter, int param, float[] value)
+        {
+            unsafe
+            {
+                fixed (float* ptr = &value[0])
+                {
+                    Delegates.alFilterfv(Filter, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetFilteri(int Filter, int param, out int value)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &value)
+                {
+                    Delegates.alGetFilteri(Filter, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetFilteriv(int Filter, int param, int[] value)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &value[0])
+                {
+                    Delegates.alGetFilteriv(Filter, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetFilterf(int Filter, int param, out float value)
+        {
+            unsafe
+            {
+                fixed (float* ptr = &value)
+                {
+                    Delegates.alGetFilterf(Filter, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetFilterfv(int Filter, int param, float[] value)
+        {
+            unsafe
+            {
+                fixed (float* ptr = &value[0])
+                {
+                    Delegates.alGetFilterfv(Filter, param, ptr);
+                }
+            }
+        }
+        #endregion
+
+        #region alAuxiliaryEffectSlot
+        public static void alGenAuxiliaryEffectSlots(int size, int[] AuxiliaryEffectSlots)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &AuxiliaryEffectSlots[0])
+                {
+                    Delegates.alGenAuxiliaryEffectSlots(size, ptr);
+                }
+            }
+        }
+
+        public static void alGenAuxiliaryEffectSlots(int size, out int AuxiliaryEffectSlot)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &AuxiliaryEffectSlot)
+                {
+                    Delegates.alGenAuxiliaryEffectSlots(size, ptr);
+                }
+            }
+        }
+
+        public static void alDeleteAuxiliaryEffectSlots(int size, int[] AuxiliaryEffectSlots)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &AuxiliaryEffectSlots[0])
+                {
+                    Delegates.alDeleteAuxiliaryEffectSlots(size, ptr);
+                }
+            }
+        }
+
+        public static void alDeleteAuxiliaryEffectSlots(int size, int AuxiliaryEffectSlot)
+        {
+            unsafe
+            {
+                Delegates.alDeleteAuxiliaryEffectSlots(size, &AuxiliaryEffectSlot);
+            }
+        }
+
+        public static bool alIsAuxiliaryEffectSlot(int AuxiliaryEffectSlot)
+        {
+            return Delegates.alIsAuxiliaryEffectSlot(AuxiliaryEffectSlot);
+        }
+
+        public static void alAuxiliaryEffectSloti(int AuxiliaryEffectSlot, int param, int value)
+        {
+            Delegates.alAuxiliaryEffectSloti(AuxiliaryEffectSlot, param, value);
+        }
+
+        public static void alAuxiliaryEffectSlotiv(int AuxiliaryEffectSlot, int param, int[] value)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &value[0])
+                {
+                    Delegates.alAuxiliaryEffectSlotiv(AuxiliaryEffectSlot, param, ptr);
+                }
+            }
+        }
+
+        public static void alAuxiliaryEffectSlotf(int AuxiliaryEffectSlot, int param, float value)
+        {
+            Delegates.alAuxiliaryEffectSlotf(AuxiliaryEffectSlot, param, value);
+        }
+
+        public static void alAuxiliaryEffectSlotfv(int AuxiliaryEffectSlot, int param, float[] value)
+        {
+            unsafe
+            {
+                fixed (float* ptr = &value[0])
+                {
+                    Delegates.alAuxiliaryEffectSlotfv(AuxiliaryEffectSlot, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetAuxiliaryEffectSloti(int AuxiliaryEffectSlot, int param, out int value)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &value)
+                {
+                    Delegates.alGetAuxiliaryEffectSloti(AuxiliaryEffectSlot, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetAuxiliaryEffectSlotiv(int AuxiliaryEffectSlot, int param, int[] value)
+        {
+            unsafe
+            {
+                fixed (int* ptr = &value[0])
+                {
+                    Delegates.alGetAuxiliaryEffectSlotiv(AuxiliaryEffectSlot, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetAuxiliaryEffectSlotf(int AuxiliaryEffectSlot, int param, out float value)
+        {
+            unsafe
+            {
+                fixed (float* ptr = &value)
+                {
+                    Delegates.alGetAuxiliaryEffectSlotf(AuxiliaryEffectSlot, param, ptr);
+                }
+            }
+        }
+
+        public static void alGetAuxiliaryEffectSlotfv(int AuxiliaryEffectSlot, int param, float[] value)
+        {
+            unsafe
+            {
+                fixed (float* ptr = &value[0])
+                {
+                    Delegates.alGetAuxiliaryEffectSlotfv(AuxiliaryEffectSlot, param, ptr);
+                }
+            }
+        }
+        #endregion
+        #endregion
+        #endregion Public OpenAL Extension Methods
+
+        #region Public Delegates
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALENABLEDelegate(int capability);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALDISABLEDelegate(int capability);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALISENABLEDDelegate(int capability);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate string LPALGETSTRINGDelegate(int param);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETBOOLEANVDelegate(int param, out int data);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETINTEGERVDelegate(int param, out int data);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETFLOATVDelegate(int param, out float data);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETDOUBLEVDelegate(int param, out double data);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALGETBOOLEANDelegate(int param);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALGETINTEGERDelegate(int param);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate float LPALGETFLOATDelegate(int param);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate double LPALGETDOUBLEDelegate(int param);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALGETERRORDelegate();
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALISEXTENSIONPRESENTDelegate(string extname);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate IntPtr LPALGETPROCADDRESSDelegate(string fname);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALGETENUMVALUEDelegate(string ename);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALLISTENERFDelegate(int param, float val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALLISTENER3FDelegate(int param, float value1, float value2, float value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALLISTENERFVDelegate(int param, [In] ref float values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALLISTENERIDelegate(int param, int val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALLISTENER3IDelegate(int param, int value1, int value2, int value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALLISTENERIVDelegate(int param, [In] ref int values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETLISTENERFDelegate(int param, out float val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETLISTENER3FDelegate(int param, out float value1, out float value2, out float value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETLISTENERFVDelegate(int param, out float values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETLISTENERIDelegate(int param, out int val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETLISTENER3IDelegate(int param, out int value1, out int value2, out int value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETLISTENERIVDelegate(int param, out int values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGENSOURCESDelegate(int n, out int sources);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALDELETESOURCESDelegate(int n, out int sources);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALISSOURCEDelegate(int sid);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEFDelegate(int sid, int param, float val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCE3FDelegate(int sid, int param, float value1, float value2, float value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEFVDelegate(int sid, int param, out float values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEIDelegate(int sid, int param, int val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCE3IDelegate(int sid, int param, int value1, int value2, int value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEIVDelegate(int sid, int param, out int values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETSOURCEFDelegate(int sid, int param, out float val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETSOURCE3FDelegate(int sid, int param, out float value1, out float value2, out float value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETSOURCEFVDelegate(int sid, int param, out float values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETSOURCEIDelegate(int sid, int param, out int val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETSOURCE3IDelegate(int sid, int param, out int value1, out int value2, out int value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETSOURCEIVDelegate(int sid, int param, out int values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEPLAYVDelegate(int ns, out int sids);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCESTOPVDelegate(int ns, out int sids);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEREWINDVDelegate(int ns, out int sids);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEPAUSEVDelegate(int ns, out int sids);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEPLAYDelegate(int sid);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCESTOPDelegate(int sid);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEREWINDDelegate(int sid);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEPAUSEDelegate(int sid);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEQUEUEBUFFERSDelegate(int sid, int numEntries, out int bids);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSOURCEUNQUEUEBUFFERSDelegate(int sid, int numEntries, out int bids);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGENBUFFERSDelegate(int n, out int buffers);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALDELETEBUFFERSDelegate(int n, out int buffers);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALISBUFFERDelegate(int bid);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALBUFFERDATADelegate(int bid, int format, IntPtr data, int size, int freq);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALBUFFERFDelegate(int bid, int param, float val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALBUFFER3FDelegate(int bid, int param, float value1, float value2, float value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALBUFFERFVDelegate(int bid, int param, out float values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALBUFFERIDelegate(int bid, int param, int val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALBUFFER3IDelegate(int bid, int param, int value1, int value2, int value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALBUFFERIVDelegate(int bid, int param, out int values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETBUFFERFDelegate(int bid, int param, out float val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETBUFFER3FDelegate(int bid, int param, out float value1, out float value2, out float value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETBUFFERFVDelegate(int bid, int param, out float values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETBUFFERIDelegate(int bid, int param, out int val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETBUFFER3IDelegate(int bid, int param, out int value1, out int value2, out int value3);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALGETBUFFERIVDelegate(int bid, int param, out int values);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALDOPPLERFACTORDelegate(float val);
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALDOPPLERVELOCITYDelegate(float val);
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALSPEEDOFSOUNDDelegate(float val);
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALDISTANCEMODELDelegate(int distanceModel);
+        #endregion Public Delegates
+
+        #region Extension Support
+        /// <summary>
+        /// Reloads OpenAL extension functions.
+        /// </summary>
+        /// <remarks>
+        /// <para>
+        /// Call this function to reload context-dependent extension OpenAL entry points. This should be done 
+        /// whenever you change the current OpenAL context, or in the case you cannot (or do not want)
+        /// to use the automatic initialisation.
+        /// </para>
+        /// <para>
+        /// Calling this function before the automatic initialisation has taken place will result
+        /// in the Al class being initialised twice. This is harmless, but, given the choice, 
+        /// the automatic initialisation should be preferred.
+        /// </para>
+        /// </remarks>
+        public static void ReloadFunctions()
+        {
+            Assembly asm = Assembly.Load("Tao.OpenAl");
+            Type delegates_class = asm.GetType("Tao.OpenAl.Delegates");
+
+            FieldInfo[] v = delegates_class.GetFields();
+            foreach (FieldInfo f in v)
+            {
+                f.SetValue(null, Delegates.GetDelegateForExtensionMethod(f.Name, f.FieldType));
+            }
+        }
+        #endregion
+    }
+}
diff --git a/src/Tao.OpenAl/Alc.cs b/src/Tao.OpenAl/Alc.cs
new file mode 100644
index 0000000..08332f4
--- /dev/null
+++ b/src/Tao.OpenAl/Alc.cs
@@ -0,0 +1,1004 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+// Disable missing XML comment warnings
+#pragma warning disable 1591 
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tao.OpenAl
+{
+    #region Class Documentation
+    /// <summary>
+    ///     OpenAL binding for .NET, implementing ALC 1.1.
+    /// </summary>
+    /// <remarks>
+    ///     Binds functions and definitions in OpenAL32.dll or libAL.so.
+    /// </remarks>
+    #endregion Class Documentation
+    public static class Alc
+    {
+        // --- Fields ---
+        #region Private Constants
+        #region string ALC_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies OpenAl's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies OpenAl32.dll everywhere; will be mapped via .config for mono.
+        /// </remarks>
+        private const string ALC_NATIVE_LIBRARY = "OpenAL32.dll";
+        #endregion string ALC_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Cdecl" />.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+
+        #region Public OpenAL 1.1 Constants
+        #region ALC_INVALID
+        /// <summary>
+        ///     Bad value.
+        /// </summary>
+        // #define ALC_INVALID (0)
+        public const int ALC_INVALID = (0);
+        #endregion ALC_INVALID
+
+        #region ALC_FALSE
+        /// <summary>
+        ///     bool false.
+        /// </summary>
+        // #define ALC_FALSE 0
+        public const int ALC_FALSE = 0;
+        #endregion ALC_FALSE
+
+        #region ALC_TRUE
+        /// <summary>
+        ///     bool true.
+        /// </summary>
+        // #define ALC_TRUE 1
+        public const int ALC_TRUE = 1;
+        #endregion ALC_TRUE
+
+        #region ALC_NO_ERROR
+        /// <summary>
+        ///     No error.
+        /// </summary>
+        // #define ALC_NO_ERROR ALC_FALSE
+        public const int ALC_NO_ERROR = ALC_FALSE;
+        #endregion ALC_NO_ERROR
+
+        #region ALC_MAJOR_VERSION
+        /// <summary>
+        ///     Major version.
+        /// </summary>
+        // #define ALC_MAJOR_VERSION 0x1000
+        public const int ALC_MAJOR_VERSION = 0x1000;
+        #endregion ALC_MAJOR_VERSION
+
+        #region ALC_MINOR_VERSION
+        /// <summary>
+        ///     Minor version.
+        /// </summary>
+        // #define ALC_MINOR_VERSION 0x1001
+        public const int ALC_MINOR_VERSION = 0x1001;
+        #endregion ALC_MINOR_VERSION
+
+        #region ALC_ATTRIBUTES_SIZE
+        /// <summary>
+        ///     Attributes size.
+        /// </summary>
+        // #define ALC_ATTRIBUTES_SIZE 0x1002
+        public const int ALC_ATTRIBUTES_SIZE = 0x1002;
+        #endregion ALC_ATTRIBUTES_SIZE
+
+        #region ALC_ALL_ATTRIBUTES
+        /// <summary>
+        ///     All attributes.
+        /// </summary>
+        // #define ALC_ALL_ATTRIBUTES 0x1003
+        public const int ALC_ALL_ATTRIBUTES = 0x1003;
+        #endregion ALC_ALL_ATTRIBUTES
+
+        #region ALC_CAPTURE_DEVICE_SPECIFIER
+        /// <summary>
+        ///     Capture device specifier.
+        /// </summary>
+        // #define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
+        public const int ALC_CAPTURE_DEVICE_SPECIFIER = 0x310;
+        #endregion ALC_CAPTURE_DEVICE_SPECIFIER
+
+        #region ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+        /// <summary>
+        ///     Capture default device specifier.
+        /// </summary>
+        // #define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311
+        public const int ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER = 0x311;
+        #endregion ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+
+        #region ALC_CAPTURE_SAMPLES
+        /// <summary>
+        ///     Capture samples.
+        /// </summary>
+        // #define ALC_CAPTURE_SAMPLES 0x312
+        public const int ALC_CAPTURE_SAMPLES = 0x312;
+        #endregion ALC_CAPTURE_SAMPLES
+
+        #region ALC_DEFAULT_DEVICE_SPECIFIER
+        /// <summary>
+        ///     Default device specifier.
+        /// </summary>
+        // #define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004
+        public const int ALC_DEFAULT_DEVICE_SPECIFIER = 0x1004;
+        #endregion ALC_DEFAULT_DEVICE_SPECIFIER
+
+        #region ALC_DEVICE_SPECIFIER
+        /// <summary>
+        ///     Device specifier.
+        /// </summary>
+        // #define ALC_DEVICE_SPECIFIER 0x1005
+        public const int ALC_DEVICE_SPECIFIER = 0x1005;
+        #endregion ALC_DEVICE_SPECIFIER
+
+        #region ALC_EXTENSIONS
+        /// <summary>
+        ///     Extensions.
+        /// </summary>
+        // #define ALC_EXTENSIONS 0x1006
+        public const int ALC_EXTENSIONS = 0x1006;
+        #endregion ALC_EXTENSIONS
+
+        #region ALC_FREQUENCY
+        /// <summary>
+        ///     Frequency.
+        /// </summary>
+        // #define ALC_FREQUENCY 0x1007
+        public const int ALC_FREQUENCY = 0x1007;
+        #endregion ALC_FREQUENCY
+
+        #region ALC_REFRESH
+        /// <summary>
+        ///     Refresh.
+        /// </summary>
+        // #define ALC_REFRESH 0x1008
+        public const int ALC_REFRESH = 0x1008;
+        #endregion ALC_REFRESH
+
+        #region ALC_SYNC
+        /// <summary>
+        ///     Sync.
+        /// </summary>
+        // #define ALC_SYNC 0x1009
+        public const int ALC_SYNC = 0x1009;
+        #endregion ALC_SYNC
+
+        #region ALC_MONO_SOURCES
+        /// <summary>
+        ///     Num of requested Mono (3D) Sources
+        /// </summary>
+        // #define ALC_MONO_SOURCES 0x1010
+        public const int ALC_MONO_SOURCES = 0x1010;
+        #endregion ALC_MONO_SOURCES
+
+        #region ALC_STEREO_SOURCES
+        /// <summary>
+        ///     Num of requested Stereo Sources
+        /// </summary>
+        // #define ALC_STEREO_SOURCES 0x1011
+        public const int ALC_STEREO_SOURCES = 0x1011;
+        #endregion ALC_STEREO_SOURCES
+
+        #region ALC_INVALID_DEVICE
+        /// <summary>
+        ///     The device argument does not name a valid device.
+        /// </summary>
+        // #define ALC_INVALID_DEVICE 0xA001
+        public const int ALC_INVALID_DEVICE = 0xA001;
+        #endregion ALC_INVALID_DEVICE
+
+        #region ALC_INVALID_CONTEXT
+        /// <summary>
+        ///     The context argument does not name a valid context.
+        /// </summary>
+        // #define ALC_INVALID_CONTEXT 0xA002
+        public const int ALC_INVALID_CONTEXT = 0xA002;
+        #endregion ALC_INVALID_CONTEXT
+
+        #region ALC_INVALID_ENUM
+        /// <summary>
+        ///     A function was called at inappropriate time, or in an inappropriate way, causing
+        ///     an illegal state.  This can be an incompatible value, object ID, and/or function.
+        /// </summary>
+        // #define ALC_INVALID_ENUM 0xA003
+        public const int ALC_INVALID_ENUM = 0xA003;
+        #endregion ALC_INVALID_ENUM
+
+        #region ALC_INVALID_VALUE
+        /// <summary>
+        ///     Illegal value passed as an argument to an AL call.  Applies to parameter values,
+        ///     but not to enumerations.
+        /// </summary>
+        // #define ALC_INVALID_VALUE 0xA004
+        public const int ALC_INVALID_VALUE = 0xA004;
+        #endregion ALC_INVALID_VALUE
+
+        #region ALC_OUT_OF_MEMORY
+        /// <summary>
+        ///     A function could not be completed, because there is not enough memory available.
+        /// </summary>
+        // #define ALC_OUT_OF_MEMORY 0xA005
+        public const int ALC_OUT_OF_MEMORY = 0xA005;
+        #endregion ALC_OUT_OF_MEMORY
+
+        #region ALC_ENUMERATE_ALL_EXT
+        public const int ALC_DEFAULT_ALL_DEVICES_SPECIFIER = 0x1012;
+        public const int ALC_ALL_DEVICES_SPECIFIER = 0x1013;
+        #endregion
+
+        #region ALC_EFX_EXT
+        public const string ALC_EXT_EFX_NAME = "ALC_EXT_EFX";
+        public const int ALC_EFX_MAJOR_VERSION = 0x20001;
+        public const int ALC_EFX_MINOR_VERSION = 0x20002;
+        public const int ALC_MAX_AUXILIARY_SENDS = 0x20003;
+        #endregion
+
+        #endregion Public OpenAL 1.0 Constants
+
+        // --- Public Externs ---
+        #region Public OpenAL 1.1 Methods
+        #region alcCloseDevice([In] IntPtr device)
+        /// <summary>
+        ///     Closes a device.
+        /// </summary>
+        /// <param name="device">
+        ///     A pointer to an opened device.
+        /// </param>
+        // ALCAPI ALCvoid ALCAPIENTRY alcCloseDevice(ALCdevice *device);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alcCloseDevice([In] IntPtr device);
+        #endregion alcCloseDevice([In] IntPtr device)
+
+        #region IntPtr alcCreateContext([In] IntPtr device, [In] ref int attribute)
+        /// <summary>
+        ///     Creates a context using a specified device.
+        /// </summary>
+        /// <param name="device">
+        ///     A pointer to a device.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         A pointer to a set of attributes:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="ALC_FREQUENCY" /></item>
+        ///             <item><see cref="ALC_REFRESH" /></item>
+        ///             <item><see cref="ALC_SYNC" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns a pointer to the new context (IntPtr.Zero on failure).
+        /// </returns>
+        // ALCAPI ALCcontext* ALCAPIENTRY alcCreateContext(ALCdevice *device, ALCint *attrList);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr alcCreateContext([In] IntPtr device, [In] ref int attribute);
+        #endregion IntPtr alcCreateContext([In] IntPtr device, [In] ref int attribute)
+
+        #region IntPtr alcCreateContext([In] IntPtr device, [In] int[] attribute)
+        /// <summary>
+        ///     Creates a context using a specified device.
+        /// </summary>
+        /// <param name="device">
+        ///     A pointer to a device.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         A pointer to a set of attributes:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="ALC_FREQUENCY" /></item>
+        ///             <item><see cref="ALC_REFRESH" /></item>
+        ///             <item><see cref="ALC_SYNC" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns a pointer to the new context (IntPtr.Zero on failure).
+        /// </returns>
+        // ALCAPI ALCcontext* ALCAPIENTRY alcCreateContext(ALCdevice *device, ALCint *attrList);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr alcCreateContext([In] IntPtr device, [In] int[] attribute);
+        #endregion IntPtr alcCreateContext([In] IntPtr device, [In] int[] attribute)
+
+        #region IntPtr alcCreateContext([In] IntPtr device, [In] IntPtr attribute)
+        /// <summary>
+        ///     Creates a context using a specified device.
+        /// </summary>
+        /// <param name="device">
+        ///     A pointer to a device.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         A pointer to a set of attributes:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="ALC_FREQUENCY" /></item>
+        ///             <item><see cref="ALC_REFRESH" /></item>
+        ///             <item><see cref="ALC_SYNC" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns a pointer to the new context (IntPtr.Zero on failure).
+        /// </returns>
+        // ALCAPI ALCcontext* ALCAPIENTRY alcCreateContext(ALCdevice *device, ALCint *attrList);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr alcCreateContext([In] IntPtr device, [In] IntPtr attribute);
+        #endregion IntPtr alcCreateContext([In] IntPtr device, [In] IntPtr attribute)
+
+        #region IntPtr alcCreateContext([In] IntPtr device, [In] int *attribute)
+        /// <summary>
+        ///     Creates a context using a specified device.
+        /// </summary>
+        /// <param name="device">
+        ///     A pointer to a device.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         A pointer to a set of attributes:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="ALC_FREQUENCY" /></item>
+        ///             <item><see cref="ALC_REFRESH" /></item>
+        ///             <item><see cref="ALC_SYNC" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns a pointer to the new context (IntPtr.Zero on failure).
+        /// </returns>
+        // ALCAPI ALCcontext* ALCAPIENTRY alcCreateContext(ALCdevice *device, ALCint *attrList);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern IntPtr alcCreateContext([In] IntPtr device, [In] int* attribute);
+        #endregion IntPtr alcCreateContext([In] IntPtr device, [In] int *attribute)
+
+        #region alcDestroyContext([In] IntPtr context)
+        /// <summary>
+        ///     Destroys a context.
+        /// </summary>
+        /// <param name="context">
+        ///     Pointer to the context to be destroyed.
+        /// </param>
+        // ALCAPI ALCvoid ALCAPIENTRY alcDestroyContext(ALCcontext *context);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alcDestroyContext([In] IntPtr context);
+        #endregion alcDestroyContext([In] IntPtr context)
+
+        #region IntPtr alcGetContextsDevice([In] IntPtr context)
+        /// <summary>
+        ///     Gets the device for a context.
+        /// </summary>
+        /// <param name="context">
+        ///     The context to query.
+        /// </param>
+        /// <returns>
+        ///     A pointer to a device or IntPtr.Zero on failue.
+        /// </returns>
+        // ALCAPI ALCdevice* ALCAPIENTRY alcGetContextsDevice(ALCcontext *context);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr alcGetContextsDevice([In] IntPtr context);
+        #endregion IntPtr alcGetContextsDevice([In] IntPtr context)
+
+        #region IntPtr alcGetCurrentContext()
+        /// <summary>
+        ///     Retrieves the current context.
+        /// </summary>
+        /// <returns>
+        ///     Returns a pointer to the current context or IntPtr.Zero on failure.
+        /// </returns>
+        // ALCAPI ALCcontext* ALCAPIENTRY alcGetCurrentContext(ALCvoid);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr alcGetCurrentContext();
+        #endregion IntPtr alcGetCurrentContext()
+
+        #region int alcGetEnumValue([In] IntPtr device, string enumName)
+        /// <summary>
+        ///     Retrieves the enum value for a specified enumeration name.
+        /// </summary>
+        /// <param name="device">
+        ///     The device to be queried.
+        /// </param>
+        /// <param name="enumName">
+        ///     A null terminated string describing the enum value.
+        /// </param>
+        /// <returns>
+        ///     Returns the enum value described by the <i>enumName</i> string.
+        /// </returns>
+        // ALCAPI ALCenum ALCAPIENTRY alcGetEnumValue(ALCdevice *device, ALCubyte *enumName);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, CharSet = CharSet.Ansi), SuppressUnmanagedCodeSecurity]
+        public static extern int alcGetEnumValue([In] IntPtr device, string enumName);
+        #endregion int alcGetEnumValue([In] IntPtr device, string enumName)
+
+        #region int alcGetError([In] IntPtr device)
+        /// <summary>
+        ///     Retrieves the current context error state.
+        /// </summary>
+        /// <param name="device">
+        ///     The device to query.
+        /// </param>
+        /// <returns>
+        ///     The current context error state will be returned.
+        /// </returns>
+        // ALCAPI ALCenum ALCAPIENTRY alcGetError(ALCdevice *device);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alcGetError([In] IntPtr device);
+        #endregion int alcGetError([In] IntPtr device)
+
+        #region alcGetIntegerv([In] IntPtr device, int attribute, int size, out int data)
+        /// <summary>
+        ///     Returns integers related to the context.
+        /// </summary>
+        /// <param name="device">
+        ///     The device to be queried.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         An attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="ALC_MAJOR_VERSION" /></item>
+        ///             <item><see cref="ALC_MINOR_VERSION" /></item>
+        ///             <item><see cref="ALC_ATTRIBUTES_SIZE" /></item>
+        ///             <item><see cref="ALC_ALL_ATTRIBUTES" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="size">
+        ///     The size of the destination buffer provided.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to the data to be returned.
+        /// </param>
+        // ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *data);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alcGetIntegerv([In] IntPtr device, int attribute, int size, out int data);
+        #endregion alcGetIntegerv([In] IntPtr device, int attribute, int size, out int data)
+
+        #region alcGetIntegerv([In] IntPtr device, int attribute, int size, [Out] int[] data)
+        /// <summary>
+        ///     Returns integers related to the context.
+        /// </summary>
+        /// <param name="device">
+        ///     The device to be queried.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         An attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="ALC_MAJOR_VERSION" /></item>
+        ///             <item><see cref="ALC_MINOR_VERSION" /></item>
+        ///             <item><see cref="ALC_ATTRIBUTES_SIZE" /></item>
+        ///             <item><see cref="ALC_ALL_ATTRIBUTES" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="size">
+        ///     The size of the destination buffer provided.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to the data to be returned.
+        /// </param>
+        // ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *data);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alcGetIntegerv([In] IntPtr device, int attribute, int size, [Out] int[] data);
+        #endregion alcGetIntegerv([In] IntPtr device, int attribute, int size, [Out] int[] data)
+
+        #region alcGetIntegerv([In] IntPtr device, int attribute, int size, [Out] IntPtr data)
+        /// <summary>
+        ///     Returns integers related to the context.
+        /// </summary>
+        /// <param name="device">
+        ///     The device to be queried.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         An attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="ALC_MAJOR_VERSION" /></item>
+        ///             <item><see cref="ALC_MINOR_VERSION" /></item>
+        ///             <item><see cref="ALC_ATTRIBUTES_SIZE" /></item>
+        ///             <item><see cref="ALC_ALL_ATTRIBUTES" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="size">
+        ///     The size of the destination buffer provided.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to the data to be returned.
+        /// </param>
+        // ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *data);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alcGetIntegerv([In] IntPtr device, int attribute, int size, [Out] IntPtr data);
+        #endregion alcGetIntegerv([In] IntPtr device, int attribute, int size, [Out] IntPtr data)
+
+        #region alcGetIntegerv([In] IntPtr device, int attribute, int size, [Out] int *data)
+        /// <summary>
+        ///     Returns integers related to the context.
+        /// </summary>
+        /// <param name="device">
+        ///     The device to be queried.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         An attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="ALC_MAJOR_VERSION" /></item>
+        ///             <item><see cref="ALC_MINOR_VERSION" /></item>
+        ///             <item><see cref="ALC_ATTRIBUTES_SIZE" /></item>
+        ///             <item><see cref="ALC_ALL_ATTRIBUTES" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="size">
+        ///     The size of the destination buffer provided.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to the data to be returned.
+        /// </param>
+        // ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *data);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void alcGetIntegerv([In] IntPtr device, int attribute, int size, [Out] int* data);
+        #endregion alcGetIntegerv([In] IntPtr device, int attribute, int size, [Out] int *data)
+
+        #region IntPtr alcGetProcAddress([In] IntPtr device, string functionName)
+        /// <summary>
+        ///     Retrieves the address of a specified context extension function.
+        /// </summary>
+        /// <param name="device">
+        ///     The device to be queried for the function.
+        /// </param>
+        /// <param name="functionName">
+        ///     A null terminated string describing the function.
+        /// </param>
+        /// <returns>
+        ///     Returns the address of the function, or IntPtr.Zero if it is not found.
+        /// </returns>
+        // ALCAPI ALCvoid* ALCAPIENTRY alcGetProcAddress(ALCdevice *device, ALCubyte *funcName);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, CharSet = CharSet.Ansi), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr alcGetProcAddress([In] IntPtr device, string functionName);
+        #endregion IntPtr alcGetProcAddress([In] IntPtr device, string functionName)
+
+        #region string alcGetString([In] IntPtr device, int attribute)
+        /// <summary>
+        ///     Returns strings related to the context.
+        /// </summary>
+        /// <param name="device">
+        ///     The device to be queried.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         An attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="ALC_DEFAULT_DEVICE_SPECIFIER" /></item>
+        ///             <item><see cref="ALC_DEVICE_SPECIFIER" /></item>
+        ///             <item><see cref="ALC_EXTENSIONS" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns a pointer to a string.
+        /// </returns>
+        // ALCAPI ALCubyte* ALCAPIENTRY alcGetString(ALCdevice *device, ALCenum param);
+        //[DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, CharSet = CharSet.Ansi, EntryPoint = "alcGetString"), SuppressUnmanagedCodeSecurity]
+        //public static extern string alcGetString([In] IntPtr device, int attribute);
+        public static string alcGetString([In] IntPtr device, int attribute)
+        {
+            return Marshal.PtrToStringAnsi(alcGetStringInternal(device, attribute));
+        }
+
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, CharSet = CharSet.Ansi, EntryPoint = "alcGetString"), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr alcGetStringInternal([In] IntPtr device, int attribute);
+
+        /// <summary>
+        ///     Returns strings related to the context.
+        /// </summary>
+        /// <param name="device">
+        ///     The device to be queried.
+        /// </param>
+        /// <param name="attribute">
+        ///     <para>
+        ///         An attribute to be retrieved:
+        ///     </para>
+        ///     <para>
+        ///         <list type="bullet">
+        ///             <item><see cref="ALC_DEFAULT_DEVICE_SPECIFIER" /></item>
+        ///             <item><see cref="ALC_DEVICE_SPECIFIER" /></item>
+        ///             <item><see cref="ALC_EXTENSIONS" /></item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns a pointer to a string.
+        /// </returns>
+        public static string[] alcGetStringv([In] IntPtr device, int attribute)
+        {
+            return GetStringArray(alcGetStringInternal(device, attribute));
+        }
+
+        private static string[] GetStringArray(IntPtr ptr)
+        {
+            if (ptr == IntPtr.Zero)
+            {
+                return null;
+            }
+            List<string> rv = new List<string>();
+            StringBuilder builder = new StringBuilder();
+            for (int index = 0; ; index++)
+            {
+                char ch = (char)Marshal.ReadByte(ptr, index);
+                if (ch == '\0')
+                {
+                    if (builder.Length == 0)
+                    {
+                        break;
+                    }
+                    else
+                    {
+                        rv.Add(builder.ToString());
+                        builder.Length = 0;
+                    }
+                }
+                else
+                {
+                    builder.Append(ch);
+                }
+            }
+            return rv.ToArray();
+        }
+        #endregion string alcGetString([In] IntPtr device, int attribute)
+
+        #region int alcIsExtensionPresent([In] IntPtr device, string extensionName)
+        /// <summary>
+        ///     Queries if a specified context extension is available.
+        /// </summary>
+        /// <param name="device">
+        ///     The device to be queried for an extension.
+        /// </param>
+        /// <param name="extensionName">
+        ///     A null terminated string describing the extension.
+        /// </param>
+        /// <returns>
+        ///     Returns <see cref="ALC_TRUE" /> if the extension is available,
+        ///     <see cref="ALC_FALSE" /> if the extension is not available.
+        /// </returns>
+        // ALCAPI ALCboolean ALCAPIENTRY alcIsExtensionPresent(ALCdevice *device, ALCubyte *extName);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, CharSet = CharSet.Ansi), SuppressUnmanagedCodeSecurity]
+        public static extern int alcIsExtensionPresent([In] IntPtr device, string extensionName);
+        #endregion int alcIsExtensionPresent([In] IntPtr device, string extensionName)
+
+        #region int alcMakeContextCurrent([In] IntPtr context)
+        /// <summary>
+        ///     Makes a specified context the current context.
+        /// </summary>
+        /// <param name="context">
+        ///     Pointer to the new context.
+        /// </param>
+        /// <returns>
+        ///     Returns an error code on failure.
+        /// </returns>
+        // ALCAPI ALCboolean ALCAPIENTRY alcMakeContextCurrent(ALCcontext *context);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alcMakeContextCurrent([In] IntPtr context);
+        #endregion int alcMakeContextCurrent([In] IntPtr context)
+
+        #region IntPtr alcOpenDevice(string deviceName)
+        /// <summary>
+        ///     Opens a device by name.
+        /// </summary>
+        /// <param name="deviceName">
+        ///     A null-terminated string describing a device.
+        /// </param>
+        /// <returns>
+        ///     Returns a pointer to the opened device.
+        /// </returns>
+        // ALCAPI ALCdevice* ALCAPIENTRY alcOpenDevice(ALCubyte *deviceName);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, CharSet = CharSet.Ansi), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr alcOpenDevice(string deviceName);
+        #endregion IntPtr alcOpenDevice(string deviceName)
+
+        #region alcProcessContext([In] IntPtr context)
+        /// <summary>
+        ///     Tells a context to begin processing.
+        /// </summary>
+        /// <param name="context">
+        ///     Pointer to the new context.
+        /// </param>
+        // ALCAPI ALCvoid ALCAPIENTRY alcProcessContext(ALCcontext *context);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alcProcessContext([In] IntPtr context);
+        #endregion alcProcessContext([In] IntPtr context)
+
+        #region alcSuspendContext([In] IntPtr context)
+        /// <summary>
+        ///     Suspends processing on a specified context.
+        /// </summary>
+        /// <param name="context">
+        ///     A pointer to the context to be suspended.
+        /// </param>
+        // ALCAPI ALCvoid ALCAPIENTRY alcSuspendContext(ALCcontext *context);
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alcSuspendContext([In] IntPtr context);
+        #endregion alcSuspendContext([In] IntPtr context)
+
+        #region IntPtr alcCaptureOpenDevice(string devicename, int frequency, int format, int buffersize)
+        /// <summary>
+        ///     
+        /// </summary>
+        /// <returns>
+        ///     The Open Device will be captured
+        /// </returns>
+        // ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice( const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize );
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr alcCaptureOpenDevice(string devicename, int frequency, int format, int buffersize);
+        #endregion IntPtr alcCaptureOpenDevice(string devicename, int frequency, int format, int buffersize)
+
+        #region int alcCaptureCloseDevice([In] IntPtr device)
+        /// <summary>
+        ///     
+        /// </summary>
+        /// <returns>
+        ///     
+        /// </returns>
+        // ALC_API ALCboolean ALC_APIENTRY alcCaptureStart( ALCdevice *device );
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int alcCaptureCloseDevice([In] IntPtr device);
+        #endregion int alcCaptureCloseDevice([In] IntPtr device)
+
+        #region void alcCaptureStart([In] IntPtr device)
+        /// <summary>
+        ///     
+        /// </summary>
+        /// <returns>
+        ///     
+        /// </returns>
+        // ALC_API ALCboolean ALC_APIENTRY alcCaptureStart( ALCdevice *device );
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alcCaptureStart([In] IntPtr device);
+        #endregion void alcCaptureStart([In] IntPtr device)
+
+        #region void alcCaptureStop([In] IntPtr device)
+        /// <summary>
+        ///     
+        /// </summary>
+        /// <returns>
+        ///     
+        /// </returns>
+        // ALC_API ALCboolean ALC_APIENTRY alcCaptureStop( ALCdevice *device );
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alcCaptureStop([In] IntPtr device);
+        #endregion void alcCaptureStop([In] IntPtr device)
+
+        #region void alcCaptureSamples([In] IntPtr device, [In] IntPtr buffer, int samples)
+        /// <summary>
+        ///     
+        /// </summary>
+        /// <returns>
+        ///     
+        /// </returns>
+        // ALC_API ALCboolean ALC_APIENTRY alcCaptureSamples( ALCdevice *device, ALCvoid *buffer, ALCsizei samples );
+        [DllImport(ALC_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void alcCaptureSamples([In] IntPtr device, [In] IntPtr buffer, int samples);
+        #endregion void alcCaptureSamples([In] IntPtr device, [In] IntPtr buffer, int samples)
+        #endregion Public OpenAL 1.1 Methods
+
+        #region Public OpenAL 1.1 Delegates
+        #region IntPtr LPALCCREATECONTEXTDelegate([In] IntPtr device, [In] ref int attrlist)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate IntPtr LPALCCREATECONTEXTDelegate([In] IntPtr device, [In] ref int attrlist);
+        #endregion IntPtr LPALCCREATECONTEXTDelegate([In] IntPtr device, [In] ref int attrlist)
+
+        #region int LPALCMAKECONTEXTCURRENTDelegate([In] IntPtr context)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALCMAKECONTEXTCURRENTDelegate([In] IntPtr context);
+        #endregion int LPALCMAKECONTEXTCURRENTDelegate([In] IntPtr context)
+
+        #region void LPALCPROCESSCONTEXTDelegate([In] IntPtr context)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALCPROCESSCONTEXTDelegate([In] IntPtr context);
+        #endregion void LPALCPROCESSCONTEXTDelegate([In] IntPtr context)
+
+        #region void LPALCSUSPENDCONTEXTDelegate([In] IntPtr context)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALCSUSPENDCONTEXTDelegate([In] IntPtr context);
+        #endregion void LPALCSUSPENDCONTEXTDelegate([In] IntPtr context)
+
+        #region void LPALCDESTROYCONTEXTDelegate([In] IntPtr context)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALCDESTROYCONTEXTDelegate([In] IntPtr context);
+        #endregion void LPALCDESTROYCONTEXTDelegate([In] IntPtr context)
+
+        #region IntPtr LPALCGETCURRENTECONTEXTDelegate()
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate IntPtr LPALCGETCURRENTECONTEXTDelegate();
+        #endregion IntPtr LPALCGETCURRENTECONTEXTDelegate()
+
+        #region IntPtr LPALCCONTEXTSDEVICEDelegate([In] IntPtr context)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate IntPtr LPALCGETCONTEXTSDEVICEDelegate([In] IntPtr context);
+        #endregion IntPtr LPALCGETCONTEXTSDEVICEDelegate([In] IntPtr context)
+
+        #region IntPtr LPALCOPENDEVICEDelegate(string devicename)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate IntPtr LPALCOPENDEVICEDelegate(string devicename);
+        #endregion IntPtr LPALCOPENDEVICEDelegate(string devicename)
+
+        #region int LPALCCLOSEDEVICEDelegate([In] IntPtr device)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALCCLOSEDEVICEDelegate([In] IntPtr device);
+        #endregion int LPALCCLOSEDEVICEDelegate([In] IntPtr device)
+
+        #region int LPALCCLOSEDEVICEDelegate([In] IntPtr device)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALCGETERRORDelegate([In] IntPtr device);
+        #endregion int LPALCCLOSEDEVICEDelegate([In] IntPtr device)
+
+        #region int LPALCISEXTENSIONPRESENTDelegate([In] IntPtr device, string extname)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALCISEXTENSIONPRESENTDelegate([In] IntPtr device, string extname);
+        #endregion int LPALCISEXTENSIONPRESENTDelegate([In] IntPtr device, string extname)
+
+        #region IntPtr LPALCGETPROCADDRESSDelegate([In] IntPtr device, string funcname)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate IntPtr LPALCGETPROCADDRESSDelegate([In] IntPtr device, string funcname);
+        #endregion IntPtr LPALCGETPROCADDRESSDelegate([In] IntPtr device, string funcname)
+
+        #region int  LPALCGETENUMVALUEDelegate([In] IntPtr device, string enumname)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALCGETENUMVALUEDelegate([In] IntPtr device, string enumname);
+        #endregion int LPALCGETENUMVALUEDelegate([In] IntPtr device, string enumname)
+
+        #region string LPALCGETSTRINGDelegate([In] IntPtr device, string enumname)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate string LPALCGETSTRINGDelegate([In] IntPtr device, string enumname);
+        #endregion string LPALCGETSTRINGDelegate([In] IntPtr device, string enumname)
+
+        #region void LPALCGETINTEGERVDelegate([In] IntPtr context, int param, int size, out int data)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALCGETINTEGERVDelegate([In] IntPtr context, int param, int size, out int data);
+        #endregion void LPALCGETINTEGERVDelegate([In] IntPtr context, int param, int size, out int data)
+
+        #region void LPALCCAPTUREOPENDEVICEDelegate(string devicename, int frequency, int format, int buffersize)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALCCAPTUREOPENDEVICEDelegate(string devicename, int frequency, int format, int buffersize);
+        #endregion void LPALCCAPTUREOPENDEVICEDelegate(string devicename, int frequency, int format, int buffersize)
+
+        #region int LPALCCAPTURECLOSEDEVICEDelegate([In] IntPtr device)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int LPALCCAPTURECLOSEDEVICEDelegate([In] IntPtr device);
+        #endregion int LPALCCAPTURECLOSEDEVICEDelegate([In] IntPtr device)
+
+        #region void LPALCCAPTURESTARTDelegate([In] IntPtr device)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALCCAPTURESTARTDelegate([In] IntPtr device);
+        #endregion void LPALCCAPTURESTARTDelegate([In] IntPtr device)
+
+        #region void LPALCCAPTURESTOPDelegate([In] IntPtr device)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALCCAPTURESTOPDelegate([In] IntPtr device);
+        #endregion void LPALCCAPTURESTOPDelegate([In] IntPtr device)
+
+        #region void LPALCCAPTURESAMPLESDelegate([In] IntPtr device, [In] IntPtr buffer, int samples)
+        /// <summary>
+        /// 
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void LPALCCAPTURESAMPLESDelegate([In] IntPtr device, [In] IntPtr buffer, int samples);
+        #endregion void LPALCCAPTURESAMPLESDelegate([In] IntPtr device, [In] IntPtr buffer, int samples)
+        #endregion Public OpenAL 1.1 Delegates
+    }
+}
diff --git a/src/Tao.OpenAl/Alut.cs b/src/Tao.OpenAl/Alut.cs
new file mode 100644
index 0000000..498cb3a
--- /dev/null
+++ b/src/Tao.OpenAl/Alut.cs
@@ -0,0 +1,736 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.IO;
+using System.Security;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace Tao.OpenAl
+{
+	#region Class Documentation
+	/// <summary>
+	/// OpenAL binding for .NET, implementing ALUT 1.1.
+	/// </summary>
+	/// <remarks>
+	/// ALUT is non-standard.
+	/// </remarks>
+	#endregion Class Documentation
+    public static class Alut
+	{
+		// --- Fields ---
+		#region Private Constants
+		#region string ALUT_NATIVE_LIBRARY
+		/// <summary>
+		/// Specifies OpenAl's native library archive.
+		/// </summary>
+		/// <remarks>
+		/// Specifies OpenAl32.dll everywhere; will be mapped via .config for mono.
+		/// </remarks>
+		private const string ALUT_NATIVE_LIBRARY = "alut.dll";
+		#endregion string ALUT_NATIVE_LIBRARY
+
+		#region CallingConvention CALLING_CONVENTION
+		/// <summary>
+		/// Specifies the calling convention.
+		/// </summary>
+		/// <remarks>
+		/// Specifies <see cref="CallingConvention.Cdecl" />.
+		/// </remarks>
+		private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+		#endregion CallingConvention CALLING_CONVENTION
+		#endregion Private Constants
+
+		#region Public OpenAL 1.1 Constants
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_API_MAJOR_VERSION = 1;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_API_MINOR_VERSION = 1;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_NO_ERROR = 0;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_OUT_OF_MEMORY = 0x200;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_INVALID_ENUM = 0x201;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_INVALID_VALUE = 0x202;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_INVALID_OPERATION = 0x203;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_NO_CURRENT_CONTEXT = 0x204;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_AL_ERROR_ON_ENTRY = 0x205;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_ALC_ERROR_ON_ENTRY = 0x206;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_OPEN_DEVICE = 0x207;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_CLOSE_DEVICE = 0x208;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_CREATE_CONTEXT = 0x209;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_MAKE_CONTEXT_CURRENT = 0x20A;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_DESTROY_CONTEXT = 0x20B;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_GEN_BUFFERS = 0x20C;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_BUFFER_DATA = 0x20D;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_IO_ERROR = 0x20E;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_UNSUPPORTED_FILE_TYPE = 0x20F;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_UNSUPPORTED_FILE_SUBTYPE = 0x210;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_ERROR_CORRUPT_OR_TRUNCATED_DATA = 0x211;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_WAVEFORM_SINE = 0x100;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_WAVEFORM_SQUARE = 0x101;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_WAVEFORM_SAWTOOTH = 0x102;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_WAVEFORM_WHITENOISE = 0x103;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_WAVEFORM_IMPULSE = 0x104;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_LOADER_BUFFER = 0x300;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int ALUT_LOADER_MEMORY = 0x301;
+		#endregion Public OpenAL 1.1 Constants
+
+		// --- Public Methods ---		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="argcp"></param>
+		/// <param name="argv"></param>
+		/// <returns></returns>
+		//		ALUT_API ALboolean ALUT_APIENTRY alutInit (int *argcp, char **argv);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutInit(int[] argcp, string[] argv);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		public static int alutInit()
+		{
+			return alutInit(null, null);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="argcp"></param>
+		/// <param name="argv"></param>
+		/// <returns></returns>
+		//		ALUT_API ALboolean ALUT_APIENTRY alutInitWithoutContext (int *argcp, char **argv);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutInitWithoutContext(int[] argcp, string[] argv);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		//		ALUT_API ALboolean ALUT_APIENTRY alutExit (void);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutExit();
+
+		/// <summary>
+		/// 
+		/// </summary>
+		//		ALUT_API ALenum ALUT_APIENTRY alutGetError (void);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutGetError();
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		//		ALUT_API const char *ALUT_APIENTRY alutGetErrorString (ALenum error);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string alutGetErrorString(int error);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="fileName"></param>
+		/// <returns></returns>
+		//		ALUT_API ALuint ALUT_APIENTRY alutCreateBufferFromFile (const char *fileName);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutCreateBufferFromFile(string fileName);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="data"></param>
+		/// <param name="length"></param>
+		/// <returns></returns>
+		//		ALUT_API ALuint ALUT_APIENTRY alutCreateBufferFromFileImage (const ALvoid *data, ALsizei length);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutCreateBufferFromFileImage(IntPtr data, int length);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		//		ALUT_API ALuint ALUT_APIENTRY alutCreateBufferHelloWorld (void);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutCreateBufferHelloWorld();
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="waveshape"></param>
+		/// <param name="frequency"></param>
+		/// <param name="phase"></param>
+		/// <param name="duration"></param>
+		/// <returns></returns>
+		//		ALUT_API ALuint ALUT_APIENTRY alutCreateBufferWaveform (ALenum waveshape, ALfloat frequency, ALfloat phase, ALfloat duration);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutCreateBufferWaveform(int waveshape, float frequency, float phase, float duration);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="fileName"></param>
+		/// <param name="format"></param>
+		/// <param name="size"></param>
+		/// <param name="frequency"></param>
+		/// <returns></returns>
+		//		ALUT_API ALvoid *ALUT_APIENTRY alutLoadMemoryFromFile (const char *fileName, ALenum *format, ALsizei *size, ALfloat *frequency);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr alutLoadMemoryFromFile(string fileName, out int format, out int size, out float frequency);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="data"></param>
+		/// <param name="length"></param>
+		/// <param name="format"></param>
+		/// <param name="size"></param>
+		/// <param name="frequency"></param>
+		/// <returns></returns>
+		//		ALUT_API ALvoid *ALUT_APIENTRY alutLoadMemoryFromFileImage (const ALvoid *data, ALsizei length, ALenum *format, ALsizei *size, ALfloat *frequency);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr alutLoadMemoryFromFileImage(IntPtr data, int length, out int format, out int size, out float frequency);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="format"></param>
+		/// <param name="size"></param>
+		/// <param name="frequency"></param>
+		/// <returns></returns>
+		//		ALUT_API ALvoid *ALUT_APIENTRY alutLoadMemoryHelloWorld (ALenum *format, ALsizei *size, ALfloat *frequency);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr alutLoadMemoryHelloWorld(out int format, out int size, out float frequency);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="waveshape"></param>
+		/// <param name="frequency"></param>
+		/// <param name="phase"></param>
+		/// <param name="duration"></param>
+		/// <param name="format"></param>
+		/// <param name="size"></param>
+		/// <param name="freq"></param>
+		/// <returns></returns>
+		//		ALUT_API ALvoid *ALUT_APIENTRY alutLoadMemoryWaveform (ALenum waveshape, ALfloat frequency, ALfloat phase, ALfloat duration, ALenum *format, ALsizei *size, ALfloat *freq);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr alutLoadMemoryWaveform(int waveshape, float frequency, float phase, float duration, out int format, out int size, out float freq);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="loader"></param>
+		/// <returns></returns>
+		//		ALUT_API const char *ALUT_APIENTRY alutGetMIMETypes (ALenum loader);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string alutGetMIMETypes(int loader);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		//		ALUT_API ALint ALUT_APIENTRY alutGetMajorVersion (void);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutGetMajorVersion();
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		//		ALUT_API ALint ALUT_APIENTRY alutGetMinorVersion (void);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutGetMinorVersion();
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="duration"></param>
+		/// <returns></returns>
+		//		ALUT_API ALboolean ALUT_APIENTRY alutSleep (ALfloat duration);
+		[DllImport(ALUT_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int alutSleep(float duration);
+
+		#region DEPRECATED
+
+//		#region InitializeAlut()
+//		/// <summary>
+//		/// Initializes OpenAL device and context.
+//		/// </summary>
+//		private static void InitializeAlut()
+//		{
+//#if WIN32
+//			IntPtr device = Alc.alcOpenDevice("DirectSound3D");
+//#else
+//IntPtr device = Alc.alcOpenDevice(null);
+//#endif
+//			IntPtr context = Alc.alcCreateContext(device, IntPtr.Zero);
+//			Alc.alcMakeContextCurrent(context);
+//		}
+//		#endregion InitializeAlut()
+//
+//		#region ReadWavFile(Stream stream, out int format, out byte[] data, out int size, out int frequency, out int loop)
+//		/// <summary>
+//		/// Reads a WAV file.
+//		/// </summary>
+//		/// <param name="stream">
+//		/// The stream to be read.
+//		/// </param>
+//		/// <param name="format">
+//		/// The format of the WAV file.
+//		/// </param>
+//		/// <param name="data">
+//		/// The WAV file data.
+//		/// </param>
+//		/// <param name="size">
+//		/// The size of the WAV file data.
+//		/// </param>
+//		/// <param name="frequency">
+//		/// The frequency of the WAV file.
+//		/// </param>
+//		/// <param name="loop">
+//		/// Does the WAV file loop?
+//		/// </param>
+//		private static void ReadWavFile(Stream stream, out int format, out byte[] data, out int size, out int frequency, out int loop)
+//		{
+//			bool success = true;
+//			format = Al.AL_FORMAT_MONO16;
+//			data = null;
+//			size = 0;
+//			frequency = 22050;
+//			loop = Al.AL_FALSE;
+//
+//			BinaryReader reader = new BinaryReader(stream, System.Text.Encoding.ASCII);
+//
+//			try
+//			{
+//				WavFileHeader fileHeader = new WavFileHeader();
+//				WavChunkHeader chunkHeader = new WavChunkHeader();
+//				WavFormatChunk formatChunk = new WavFormatChunk();
+//
+//				// Read WAV file header
+//				fileHeader.Id = reader.ReadChars(4);
+//				fileHeader.Length = reader.ReadInt32();
+//				fileHeader.Type = reader.ReadChars(4);
+//
+//				if(new string(fileHeader.Id) != "RIFF" && fileHeader.Length <= 0 && new string(fileHeader.Type) != "WAVE")
+//				{
+//					success = false;
+//				}
+//				else
+//				{
+//					while(fileHeader.Length > 8)
+//					{
+//						// Read WAV chunk header
+//						chunkHeader.Id = reader.ReadChars(4);
+//						chunkHeader.Length = reader.ReadInt32();
+//
+//						// Determine chunk action
+//						if(new string(chunkHeader.Id) == "fmt ")
+//						{
+//							// Read WAV format header
+//							formatChunk.Format = reader.ReadInt16();
+//							formatChunk.Channels = reader.ReadInt16();
+//							formatChunk.SamplesPerSecond = reader.ReadInt32();
+//							formatChunk.BytesPerSecond = reader.ReadInt32();
+//							formatChunk.BytesPerSample = reader.ReadInt16();
+//							formatChunk.BitsPerSample = reader.ReadInt16();
+//
+//							if(chunkHeader.Length > 16)
+//							{
+//								formatChunk.ExtraBytesLength = reader.ReadInt16();
+//								formatChunk.ExtraBytes = reader.ReadBytes(formatChunk.ExtraBytesLength);
+//							}
+//							else
+//							{
+//								formatChunk.ExtraBytesLength = 0;
+//								formatChunk.ExtraBytes = null;
+//							}
+//
+//							if(formatChunk.Format == 0x0001)
+//							{
+//								if(formatChunk.Channels == 1)
+//								{
+//									if(formatChunk.BitsPerSample == 8)
+//									{
+//										format = Al.AL_FORMAT_MONO8;
+//									}
+//									else
+//									{
+//										format = Al.AL_FORMAT_MONO16;
+//									}
+//								}
+//								else
+//								{
+//									if(formatChunk.BitsPerSample == 8)
+//									{
+//										format = Al.AL_FORMAT_STEREO8;
+//									}
+//									else
+//									{
+//										format = Al.AL_FORMAT_STEREO16;
+//									}
+//								}
+//							}
+//							frequency = formatChunk.SamplesPerSecond;
+//						}
+//						else if(new string(chunkHeader.Id) == "data")
+//						{
+//							if(formatChunk.Format == 0x0001)
+//							{
+//								size = chunkHeader.Length - 8;
+//								data = reader.ReadBytes(size);
+//							}
+//						}
+//						else
+//						{
+//							if(chunkHeader.Length <= fileHeader.Length && chunkHeader.Length > 0)
+//							{
+//								reader.ReadBytes(chunkHeader.Length);
+//							}
+//						}
+//
+//						if(chunkHeader.Length <= fileHeader.Length && chunkHeader.Length > 0)
+//						{
+//							fileHeader.Length -= chunkHeader.Length;
+//						}
+//						else
+//						{
+//							fileHeader.Length = 0;
+//						}
+//					}
+//				}
+//				success = true;
+//			}
+//			catch
+//			{
+//				success = false;
+//			}
+//			finally
+//			{
+//				reader.Close();
+//			}
+//
+//			if(!success)
+//			{
+//				format = -1;
+//				data = null;
+//				size = -1;
+//				frequency = -1;
+//				loop = -1;
+//			}
+//		}
+//		#endregion ReadWavFile(string fileName, out int format, out byte[] data, out int size, out int frequency, out int loop)
+
+		//		#region alutExit()
+		//		/// <summary>
+		//		/// Destroys OpenAL context and device.
+		//		/// </summary>
+		//		// ALUTAPI ALvoid ALUTAPIENTRY alutExit(ALvoid);
+		//		public static void alutExit()
+		//		{
+		//			IntPtr context = Alc.alcGetCurrentContext();
+		//			IntPtr device = Alc.alcGetContextsDevice(context);
+		//			Alc.alcMakeContextCurrent(IntPtr.Zero);
+		//			Alc.alcDestroyContext(context);
+		//			Alc.alcCloseDevice(device);
+		//			context = IntPtr.Zero;
+		//			device = IntPtr.Zero;
+		//		}
+		//		#endregion alutExit()
+
+//		#region alutInit()
+//		/// <summary>
+//		/// Initializes an OpenAL device and context.
+//		/// </summary>
+//		// ALUTAPI ALvoid ALUTAPIENTRY alutInit(ALint *argc, ALbyte **argv);
+//		public static void alutInit()
+//		{
+//			InitializeAlut();
+//		}
+//		#endregion alutInit()
+//
+//		#region alutInit(int argc, StringBuilder argv)
+//		/// <summary>
+//		/// Initializes an OpenAL device and context.
+//		/// </summary>
+//		/// <param name="argc">
+//		/// Number of commandline arguments.
+//		/// </param>
+//		/// <param name="argv">
+//		/// The commandline arguments.
+//		/// </param>
+//		// ALUTAPI ALvoid ALUTAPIENTRY alutInit(ALint *argc, ALbyte **argv);
+//		public static void alutInit(int argc, StringBuilder argv)
+//		{
+//			InitializeAlut();
+//		}
+//		#endregion alutInit(int argc, StringBuilder argv)
+
+//		#region Private Structs
+//		#region WavFileHeader
+//		/// <summary>
+//		/// WAV file header.
+//		/// </summary>
+//		// 12 bytes total
+//		[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
+//			private struct WavFileHeader
+//		{
+//			[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]
+//			public char[] Id;
+//			public int Length;
+//			[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]
+//			public char[] Type;
+//		}
+//		#endregion WavFileHeader
+//
+//		#region WavChunkHeader
+//		/// <summary>
+//		/// WAV chunk header.
+//		/// </summary>
+//		// 8 bytes total
+//		[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
+//			private struct WavChunkHeader
+//		{
+//			[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]
+//			public char[] Id;
+//			public int Length;
+//		}
+//		#endregion WavChunkHeader
+//
+//		#region WavFormatChunk
+//		/// <summary>
+//		/// WAV format chunk.
+//		/// </summary>
+//		// 16 bytes total
+//		[StructLayout(LayoutKind.Sequential)]
+//			private struct WavFormatChunk
+//		{
+//			public short Format;
+//			public short Channels;
+//			public int SamplesPerSecond;
+//			public int BytesPerSecond;
+//			public short BytesPerSample;
+//			public short BitsPerSample;
+//			public short ExtraBytesLength;
+//			public byte[] ExtraBytes;
+//		}
+//		#endregion WavFormatChunk
+//		#endregion Private Structs
+
+//		#region alutLoadWAVFile(string fileName, out int format, out byte[] data, out int size, out int frequency, out int loop)
+//		/// <summary>
+//		/// Loads a WAV file.
+//		/// </summary>
+//		/// <param name="fileName">
+//		/// The filename to be loaded.
+//		/// </param>
+//		/// <param name="format">
+//		/// The format of the WAV file.
+//		/// </param>
+//		/// <param name="data">
+//		/// The WAV file data.
+//		/// </param>
+//		/// <param name="size">
+//		/// The size of the WAV file data.
+//		/// </param>
+//		/// <param name="frequency">
+//		/// The WAV file frequency.
+//		/// </param>
+//		/// <param name="loop">
+//		/// Does the WAV file loop?
+//		/// </param>
+//		// ALUTAPI ALvoid ALUTAPIENTRY alutLoadWAVFile(ALbyte *file, ALenum *format, ALvoid **data, ALsizei *size, ALsizei *freq, ALboolean *loop);
+//		public static void alutLoadWAVFile(string fileName, out int format, out byte[] data, out int size, out int frequency, out int loop)
+//		{
+//			if(File.Exists(fileName))
+//			{
+//				FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
+//				ReadWavFile(stream, out format, out data, out size, out frequency, out loop);
+//				stream.Close();
+//				stream = null;
+//			}
+//			else
+//			{
+//				format = -1;
+//				data = null;
+//				size = -1;
+//				frequency = -1;
+//				loop = -1;
+//			}
+//		}
+//		#endregion alutLoadWAVFile(string fileName, out int format, out byte[] data, out int size, out int frequency, out int loop)
+//
+//		#region alutLoadWAVMemory([In] byte[] memory, out int format, out byte[] data, out int size, out int frequency, out int loop)
+//		/// <summary>
+//		/// Loads a WAV file from memory.
+//		/// </summary>
+//		/// <param name="memory">
+//		/// The WAV memory to be loaded.
+//		/// </param>
+//		/// <param name="format">
+//		/// The format of the WAV file.
+//		/// </param>
+//		/// <param name="data">
+//		/// The WAV file data.
+//		/// </param>
+//		/// <param name="size">
+//		/// The size of the WAV file data.
+//		/// </param>
+//		/// <param name="frequency">
+//		/// The WAV file frequency.
+//		/// </param>
+//		/// <param name="loop">
+//		/// Does the WAV file loop?
+//		/// </param>
+//		// ALUTAPI ALvoid ALUTAPIENTRY alutLoadWAVMemory(ALbyte *memory, ALenum *format, ALvoid **data, ALsizei *size, ALsizei *freq, ALboolean *loop);
+//		public static void alutLoadWAVMemory([In] byte[] memory, out int format, out byte[] data, out int size, out int frequency, out int loop)
+//		{
+//			if(memory != null)
+//			{
+//				MemoryStream stream = new MemoryStream(memory, 0, memory.Length);
+//				ReadWavFile(stream, out format, out data, out size, out frequency, out loop);
+//				stream.Close();
+//				stream = null;
+//			}
+//			else
+//			{
+//				format = -1;
+//				data = null;
+//				size = -1;
+//				frequency = -1;
+//				loop = -1;
+//			}
+//		}
+//		#endregion alutLoadWAVMemory([In] byte[] memory, out int format, out byte[] data, out int size, out int frequency, out int loop)
+//
+//		#region alutUnloadWAV(int format, out byte[] data, int size, int frequency)
+//		/// <summary>
+//		/// Unloads a WAV file.
+//		/// </summary>
+//		/// <param name="format">
+//		/// The format of the WAV file.
+//		/// </param>
+//		/// <param name="data">
+//		/// The data of the WAV file.
+//		/// </param>
+//		/// <param name="size">
+//		/// The size of the WAV file's data.
+//		/// </param>
+//		/// <param name="frequency">
+//		/// The frequency of the WAV file.
+//		/// </param>
+//		// ALUTAPI ALvoid ALUTAPIENTRY alutUnloadWAV(ALenum format, ALvoid *data, ALsizei size, ALsizei freq);
+//		public static void alutUnloadWAV(int format, out byte[] data, int size, int frequency)
+//		{
+//			data = null;
+//		}
+//		#endregion alutUnloadWAV(int format, out byte[] data, int size, int frequency)
+	#endregion DEPRECATED
+	}
+}
diff --git a/src/Tao.OpenAl/COPYING b/src/Tao.OpenAl/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.OpenAl/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.OpenAl/ChangeLog b/src/Tao.OpenAl/ChangeLog
new file mode 100644
index 0000000..3d008e0
--- /dev/null
+++ b/src/Tao.OpenAl/ChangeLog
@@ -0,0 +1,2 @@
+2006-11-03T15:50  C.J. Adams-Collier  <cjcollier at colliertech.org>
+        * added a prebuild.xml file
\ No newline at end of file
diff --git a/src/Tao.OpenAl/INSTALL b/src/Tao.OpenAl/INSTALL
new file mode 100644
index 0000000..1d12c75
--- /dev/null
+++ b/src/Tao.OpenAl/INSTALL
@@ -0,0 +1 @@
+link /usr/share/automake-1.9/INSTALL
\ No newline at end of file
diff --git a/src/Tao.OpenAl/Makefile.am b/src/Tao.OpenAl/Makefile.am
new file mode 100644
index 0000000..a85133f
--- /dev/null
+++ b/src/Tao.OpenAl/Makefile.am
@@ -0,0 +1,21 @@
+
+ASSEMBLY = Tao.OpenAl
+SHORTNAME = tao-openal
+VERSION = @TAOOPENAL_VERSION@
+MAJOR = @TAOOPENAL_MAJOR@
+
+PACKAGES =
+BINARY_LIBS =
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        Al.cs \
+	Alc.cs \
+	Alut.cs \
+	ALDelegates.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.OpenAl/Makefile.in b/src/Tao.OpenAl/Makefile.in
new file mode 100644
index 0000000..0844811
--- /dev/null
+++ b/src/Tao.OpenAl/Makefile.in
@@ -0,0 +1,417 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-openal.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.OpenAl
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-openal.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOOPENAL_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.OpenAl
+SHORTNAME = tao-openal
+MAJOR = @TAOOPENAL_MAJOR@
+PACKAGES = 
+BINARY_LIBS = 
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        Al.cs \
+	Alc.cs \
+	Alut.cs \
+	ALDelegates.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.OpenAl/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.OpenAl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-openal.pc: $(top_builddir)/config.status $(srcdir)/tao-openal.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.OpenAl/NEWS b/src/Tao.OpenAl/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.OpenAl/Properties/AssemblyInfo.cs b/src/Tao.OpenAl/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..6666756
--- /dev/null
+++ b/src/Tao.OpenAl/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright (c)2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright (c)2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.OpenAl")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework Tao.OpenAl Binding For .NET")]
+[assembly: AssemblyFileVersion("1.1.0.1")]
+[assembly: AssemblyInformationalVersion("1.1.0.1")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.OpenAl.dll")]
+[assembly: AssemblyTitle("Tao Framework Tao.OpenAl Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.1.0.1")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.OpenAl/README b/src/Tao.OpenAl/README
new file mode 100644
index 0000000..67aae5e
--- /dev/null
+++ b/src/Tao.OpenAl/README
@@ -0,0 +1,15 @@
+Tao.OpenAl 1.0.0.2
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.OpenAl is an OpenAL API binding for .NET, implementing OpenAL 1.0.
+
+
+Change Log:
+
+1.1.0.0 - June 2006:
+    Updated to OpenAl 1.1 by David Hudson
+
+1.0.0.0 - April 20, 2004:
+    Initial release.
diff --git a/src/Tao.OpenAl/Tao.OpenAl.csproj b/src/Tao.OpenAl/Tao.OpenAl.csproj
new file mode 100644
index 0000000..c02d749
--- /dev/null
+++ b/src/Tao.OpenAl/Tao.OpenAl.csproj
@@ -0,0 +1,105 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7B619BB0-3AB4-4DC9-BA37-BC5B461BEF17}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.OpenAl</AssemblyName>
+    <AssemblyOriginatorKeyFile>../Tao.OpenAl/Tao.OpenAl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.OpenAl</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.OpenAl.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.OpenAl.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Al.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Alc.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ALDelegates.cs" />
+    <Compile Include="Alut.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.OpenAl.dll.config" />
+    <None Include="Tao.OpenAl.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.OpenAl/Tao.OpenAl.dll.config b/src/Tao.OpenAl/Tao.OpenAl.dll.config
new file mode 100644
index 0000000..e9acf3c
--- /dev/null
+++ b/src/Tao.OpenAl/Tao.OpenAl.dll.config
@@ -0,0 +1,9 @@
+<configuration>
+    <dllmap dll="OpenAL32.dll" os="windows" target="OpenAL32.dll" />
+    <dllmap dll="OpenAL32.dll" os="osx" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
+    <dllmap dll="OpenAL32.dll" os="!windows,osx" target="libopenal.so.1" />
+
+    <dllmap dll="alut.dll" os="windows" target="alut.dll" />
+    <dllmap dll="alut.dll" os="osx" target="libalut.so.0" />
+    <dllmap dll="alut.dll" os="!windows,osx" target="libalut.so.0" />
+</configuration>
diff --git a/src/Tao.OpenAl/Tao.OpenAl.snk b/src/Tao.OpenAl/Tao.OpenAl.snk
new file mode 100644
index 0000000..7b341f4
Binary files /dev/null and b/src/Tao.OpenAl/Tao.OpenAl.snk differ
diff --git a/src/Tao.OpenAl/tao-openal.pc.in b/src/Tao.OpenAl/tao-openal.pc.in
new file mode 100644
index 0000000..1ea4b19
--- /dev/null
+++ b/src/Tao.OpenAl/tao-openal.pc.in
@@ -0,0 +1,8 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.OpenAl
+Description: OpenAl portion of Tao framework
+Version: @TAOOPENAL_VERSION@
+Libs:  -r:${libdir}/mono/tao-openal- at TAOOPENAL_MAJOR@/Tao.OpenAl.dll
diff --git a/src/Tao.OpenGl/AUTHORS b/src/Tao.OpenGl/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.OpenGl/COPYING b/src/Tao.OpenGl/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.OpenGl/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.OpenGl/ChangeLog b/src/Tao.OpenGl/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.OpenGl/GLCore.cs b/src/Tao.OpenGl/GLCore.cs
new file mode 100644
index 0000000..049c47a
--- /dev/null
+++ b/src/Tao.OpenGl/GLCore.cs
@@ -0,0 +1,1763 @@
+namespace Tao.OpenGl
+{
+    using System;
+    using System.Runtime.InteropServices;
+
+    partial class Gl
+    {
+
+        internal static partial class Imports
+        {
+
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNewList", ExactSpelling = true)]
+            internal extern static void NewList(UInt32 list, int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEndList", ExactSpelling = true)]
+            internal extern static void EndList();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCallList", ExactSpelling = true)]
+            internal extern static void CallList(UInt32 list);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCallLists", ExactSpelling = true)]
+            internal extern static void CallLists(Int32 n, int type, IntPtr lists);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDeleteLists", ExactSpelling = true)]
+            internal extern static void DeleteLists(UInt32 list, Int32 range);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGenLists", ExactSpelling = true)]
+            internal extern static Int32 GenLists(Int32 range);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glListBase", ExactSpelling = true)]
+            internal extern static void ListBase(UInt32 @base);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBegin", ExactSpelling = true)]
+            internal extern static void Begin(int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBitmap", ExactSpelling = true)]
+            internal extern static unsafe void Bitmap(Int32 width, Int32 height, Single xorig, Single yorig, Single xmove, Single ymove, Byte* bitmap);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3b", ExactSpelling = true)]
+            internal extern static void Color3b(SByte red, SByte green, SByte blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3bv", ExactSpelling = true)]
+            internal extern static unsafe void Color3bv(SByte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3d", ExactSpelling = true)]
+            internal extern static void Color3d(Double red, Double green, Double blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3dv", ExactSpelling = true)]
+            internal extern static unsafe void Color3dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3f", ExactSpelling = true)]
+            internal extern static void Color3f(Single red, Single green, Single blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3fv", ExactSpelling = true)]
+            internal extern static unsafe void Color3fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3i", ExactSpelling = true)]
+            internal extern static void Color3i(Int32 red, Int32 green, Int32 blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3iv", ExactSpelling = true)]
+            internal extern static unsafe void Color3iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3s", ExactSpelling = true)]
+            internal extern static void Color3s(Int16 red, Int16 green, Int16 blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3sv", ExactSpelling = true)]
+            internal extern static unsafe void Color3sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3ub", ExactSpelling = true)]
+            internal extern static void Color3ub(Byte red, Byte green, Byte blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3ubv", ExactSpelling = true)]
+            internal extern static unsafe void Color3ubv(Byte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3ui", ExactSpelling = true)]
+            internal extern static void Color3ui(UInt32 red, UInt32 green, UInt32 blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3uiv", ExactSpelling = true)]
+            internal extern static unsafe void Color3uiv(UInt32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3us", ExactSpelling = true)]
+            internal extern static void Color3us(UInt16 red, UInt16 green, UInt16 blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor3usv", ExactSpelling = true)]
+            internal extern static unsafe void Color3usv(UInt16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4b", ExactSpelling = true)]
+            internal extern static void Color4b(SByte red, SByte green, SByte blue, SByte alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4bv", ExactSpelling = true)]
+            internal extern static unsafe void Color4bv(SByte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4d", ExactSpelling = true)]
+            internal extern static void Color4d(Double red, Double green, Double blue, Double alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4dv", ExactSpelling = true)]
+            internal extern static unsafe void Color4dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4f", ExactSpelling = true)]
+            internal extern static void Color4f(Single red, Single green, Single blue, Single alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4fv", ExactSpelling = true)]
+            internal extern static unsafe void Color4fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4i", ExactSpelling = true)]
+            internal extern static void Color4i(Int32 red, Int32 green, Int32 blue, Int32 alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4iv", ExactSpelling = true)]
+            internal extern static unsafe void Color4iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4s", ExactSpelling = true)]
+            internal extern static void Color4s(Int16 red, Int16 green, Int16 blue, Int16 alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4sv", ExactSpelling = true)]
+            internal extern static unsafe void Color4sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4ub", ExactSpelling = true)]
+            internal extern static void Color4ub(Byte red, Byte green, Byte blue, Byte alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4ubv", ExactSpelling = true)]
+            internal extern static unsafe void Color4ubv(Byte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4ui", ExactSpelling = true)]
+            internal extern static void Color4ui(UInt32 red, UInt32 green, UInt32 blue, UInt32 alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4uiv", ExactSpelling = true)]
+            internal extern static unsafe void Color4uiv(UInt32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4us", ExactSpelling = true)]
+            internal extern static void Color4us(UInt16 red, UInt16 green, UInt16 blue, UInt16 alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColor4usv", ExactSpelling = true)]
+            internal extern static unsafe void Color4usv(UInt16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEdgeFlag", ExactSpelling = true)]
+            internal extern static void EdgeFlag(bool flag);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEdgeFlagv", ExactSpelling = true)]
+            internal extern static unsafe void EdgeFlagv(bool* flag);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEnd", ExactSpelling = true)]
+            internal extern static void End();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexd", ExactSpelling = true)]
+            internal extern static void Indexd(Double c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexdv", ExactSpelling = true)]
+            internal extern static unsafe void Indexdv(Double* c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexf", ExactSpelling = true)]
+            internal extern static void Indexf(Single c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexfv", ExactSpelling = true)]
+            internal extern static unsafe void Indexfv(Single* c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexi", ExactSpelling = true)]
+            internal extern static void Indexi(Int32 c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexiv", ExactSpelling = true)]
+            internal extern static unsafe void Indexiv(Int32* c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexs", ExactSpelling = true)]
+            internal extern static void Indexs(Int16 c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexsv", ExactSpelling = true)]
+            internal extern static unsafe void Indexsv(Int16* c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormal3b", ExactSpelling = true)]
+            internal extern static void Normal3b(SByte nx, SByte ny, SByte nz);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormal3bv", ExactSpelling = true)]
+            internal extern static unsafe void Normal3bv(SByte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormal3d", ExactSpelling = true)]
+            internal extern static void Normal3d(Double nx, Double ny, Double nz);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormal3dv", ExactSpelling = true)]
+            internal extern static unsafe void Normal3dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormal3f", ExactSpelling = true)]
+            internal extern static void Normal3f(Single nx, Single ny, Single nz);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormal3fv", ExactSpelling = true)]
+            internal extern static unsafe void Normal3fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormal3i", ExactSpelling = true)]
+            internal extern static void Normal3i(Int32 nx, Int32 ny, Int32 nz);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormal3iv", ExactSpelling = true)]
+            internal extern static unsafe void Normal3iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormal3s", ExactSpelling = true)]
+            internal extern static void Normal3s(Int16 nx, Int16 ny, Int16 nz);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormal3sv", ExactSpelling = true)]
+            internal extern static unsafe void Normal3sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos2d", ExactSpelling = true)]
+            internal extern static void RasterPos2d(Double x, Double y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos2dv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos2dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos2f", ExactSpelling = true)]
+            internal extern static void RasterPos2f(Single x, Single y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos2fv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos2fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos2i", ExactSpelling = true)]
+            internal extern static void RasterPos2i(Int32 x, Int32 y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos2iv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos2iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos2s", ExactSpelling = true)]
+            internal extern static void RasterPos2s(Int16 x, Int16 y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos2sv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos2sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos3d", ExactSpelling = true)]
+            internal extern static void RasterPos3d(Double x, Double y, Double z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos3dv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos3dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos3f", ExactSpelling = true)]
+            internal extern static void RasterPos3f(Single x, Single y, Single z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos3fv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos3fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos3i", ExactSpelling = true)]
+            internal extern static void RasterPos3i(Int32 x, Int32 y, Int32 z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos3iv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos3iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos3s", ExactSpelling = true)]
+            internal extern static void RasterPos3s(Int16 x, Int16 y, Int16 z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos3sv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos3sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos4d", ExactSpelling = true)]
+            internal extern static void RasterPos4d(Double x, Double y, Double z, Double w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos4dv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos4dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos4f", ExactSpelling = true)]
+            internal extern static void RasterPos4f(Single x, Single y, Single z, Single w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos4fv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos4fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos4i", ExactSpelling = true)]
+            internal extern static void RasterPos4i(Int32 x, Int32 y, Int32 z, Int32 w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos4iv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos4iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos4s", ExactSpelling = true)]
+            internal extern static void RasterPos4s(Int16 x, Int16 y, Int16 z, Int16 w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRasterPos4sv", ExactSpelling = true)]
+            internal extern static unsafe void RasterPos4sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRectd", ExactSpelling = true)]
+            internal extern static void Rectd(Double x1, Double y1, Double x2, Double y2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRectdv", ExactSpelling = true)]
+            internal extern static unsafe void Rectdv(Double* v1, Double* v2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRectf", ExactSpelling = true)]
+            internal extern static void Rectf(Single x1, Single y1, Single x2, Single y2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRectfv", ExactSpelling = true)]
+            internal extern static unsafe void Rectfv(Single* v1, Single* v2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRecti", ExactSpelling = true)]
+            internal extern static void Recti(Int32 x1, Int32 y1, Int32 x2, Int32 y2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRectiv", ExactSpelling = true)]
+            internal extern static unsafe void Rectiv(Int32* v1, Int32* v2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRects", ExactSpelling = true)]
+            internal extern static void Rects(Int16 x1, Int16 y1, Int16 x2, Int16 y2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRectsv", ExactSpelling = true)]
+            internal extern static unsafe void Rectsv(Int16* v1, Int16* v2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord1d", ExactSpelling = true)]
+            internal extern static void TexCoord1d(Double s);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord1dv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord1dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord1f", ExactSpelling = true)]
+            internal extern static void TexCoord1f(Single s);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord1fv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord1fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord1i", ExactSpelling = true)]
+            internal extern static void TexCoord1i(Int32 s);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord1iv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord1iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord1s", ExactSpelling = true)]
+            internal extern static void TexCoord1s(Int16 s);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord1sv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord1sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord2d", ExactSpelling = true)]
+            internal extern static void TexCoord2d(Double s, Double t);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord2dv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord2dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord2f", ExactSpelling = true)]
+            internal extern static void TexCoord2f(Single s, Single t);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord2fv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord2fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord2i", ExactSpelling = true)]
+            internal extern static void TexCoord2i(Int32 s, Int32 t);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord2iv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord2iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord2s", ExactSpelling = true)]
+            internal extern static void TexCoord2s(Int16 s, Int16 t);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord2sv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord2sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord3d", ExactSpelling = true)]
+            internal extern static void TexCoord3d(Double s, Double t, Double r);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord3dv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord3dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord3f", ExactSpelling = true)]
+            internal extern static void TexCoord3f(Single s, Single t, Single r);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord3fv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord3fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord3i", ExactSpelling = true)]
+            internal extern static void TexCoord3i(Int32 s, Int32 t, Int32 r);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord3iv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord3iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord3s", ExactSpelling = true)]
+            internal extern static void TexCoord3s(Int16 s, Int16 t, Int16 r);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord3sv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord3sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord4d", ExactSpelling = true)]
+            internal extern static void TexCoord4d(Double s, Double t, Double r, Double q);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord4dv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord4dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord4f", ExactSpelling = true)]
+            internal extern static void TexCoord4f(Single s, Single t, Single r, Single q);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord4fv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord4fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord4i", ExactSpelling = true)]
+            internal extern static void TexCoord4i(Int32 s, Int32 t, Int32 r, Int32 q);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord4iv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord4iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord4s", ExactSpelling = true)]
+            internal extern static void TexCoord4s(Int16 s, Int16 t, Int16 r, Int16 q);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoord4sv", ExactSpelling = true)]
+            internal extern static unsafe void TexCoord4sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex2d", ExactSpelling = true)]
+            internal extern static void Vertex2d(Double x, Double y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex2dv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex2dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex2f", ExactSpelling = true)]
+            internal extern static void Vertex2f(Single x, Single y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex2fv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex2fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex2i", ExactSpelling = true)]
+            internal extern static void Vertex2i(Int32 x, Int32 y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex2iv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex2iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex2s", ExactSpelling = true)]
+            internal extern static void Vertex2s(Int16 x, Int16 y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex2sv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex2sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex3d", ExactSpelling = true)]
+            internal extern static void Vertex3d(Double x, Double y, Double z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex3dv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex3dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex3f", ExactSpelling = true)]
+            internal extern static void Vertex3f(Single x, Single y, Single z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex3fv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex3fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex3i", ExactSpelling = true)]
+            internal extern static void Vertex3i(Int32 x, Int32 y, Int32 z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex3iv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex3iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex3s", ExactSpelling = true)]
+            internal extern static void Vertex3s(Int16 x, Int16 y, Int16 z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex3sv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex3sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex4d", ExactSpelling = true)]
+            internal extern static void Vertex4d(Double x, Double y, Double z, Double w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex4dv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex4dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex4f", ExactSpelling = true)]
+            internal extern static void Vertex4f(Single x, Single y, Single z, Single w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex4fv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex4fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex4i", ExactSpelling = true)]
+            internal extern static void Vertex4i(Int32 x, Int32 y, Int32 z, Int32 w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex4iv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex4iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex4s", ExactSpelling = true)]
+            internal extern static void Vertex4s(Int16 x, Int16 y, Int16 z, Int16 w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertex4sv", ExactSpelling = true)]
+            internal extern static unsafe void Vertex4sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glClipPlane", ExactSpelling = true)]
+            internal extern static unsafe void ClipPlane(int plane, Double* equation);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColorMaterial", ExactSpelling = true)]
+            internal extern static void ColorMaterial(int face, int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCullFace", ExactSpelling = true)]
+            internal extern static void CullFace(int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFogf", ExactSpelling = true)]
+            internal extern static void Fogf(int pname, Single param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFogfv", ExactSpelling = true)]
+            internal extern static unsafe void Fogfv(int pname, Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFogi", ExactSpelling = true)]
+            internal extern static void Fogi(int pname, Int32 param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFogiv", ExactSpelling = true)]
+            internal extern static unsafe void Fogiv(int pname, Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFrontFace", ExactSpelling = true)]
+            internal extern static void FrontFace(int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glHint", ExactSpelling = true)]
+            internal extern static void Hint(int target, int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLightf", ExactSpelling = true)]
+            internal extern static void Lightf(int light, int pname, Single param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLightfv", ExactSpelling = true)]
+            internal extern static unsafe void Lightfv(int light, int pname, Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLighti", ExactSpelling = true)]
+            internal extern static void Lighti(int light, int pname, Int32 param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLightiv", ExactSpelling = true)]
+            internal extern static unsafe void Lightiv(int light, int pname, Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLightModelf", ExactSpelling = true)]
+            internal extern static void LightModelf(int pname, Single param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLightModelfv", ExactSpelling = true)]
+            internal extern static unsafe void LightModelfv(int pname, Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLightModeli", ExactSpelling = true)]
+            internal extern static void LightModeli(int pname, Int32 param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLightModeliv", ExactSpelling = true)]
+            internal extern static unsafe void LightModeliv(int pname, Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLineStipple", ExactSpelling = true)]
+            internal extern static void LineStipple(Int32 factor, UInt16 pattern);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLineWidth", ExactSpelling = true)]
+            internal extern static void LineWidth(Single width);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMaterialf", ExactSpelling = true)]
+            internal extern static void Materialf(int face, int pname, Single param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMaterialfv", ExactSpelling = true)]
+            internal extern static unsafe void Materialfv(int face, int pname, Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMateriali", ExactSpelling = true)]
+            internal extern static void Materiali(int face, int pname, Int32 param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMaterialiv", ExactSpelling = true)]
+            internal extern static unsafe void Materialiv(int face, int pname, Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPointSize", ExactSpelling = true)]
+            internal extern static void PointSize(Single size);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPolygonMode", ExactSpelling = true)]
+            internal extern static void PolygonMode(int face, int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPolygonStipple", ExactSpelling = true)]
+            internal extern static unsafe void PolygonStipple(Byte* mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glScissor", ExactSpelling = true)]
+            internal extern static void Scissor(Int32 x, Int32 y, Int32 width, Int32 height);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glShadeModel", ExactSpelling = true)]
+            internal extern static void ShadeModel(int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexParameterf", ExactSpelling = true)]
+            internal extern static void TexParameterf(int target, int pname, Single param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexParameterfv", ExactSpelling = true)]
+            internal extern static unsafe void TexParameterfv(int target, int pname, Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexParameteri", ExactSpelling = true)]
+            internal extern static void TexParameteri(int target, int pname, Int32 param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void TexParameteriv(int target, int pname, Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexImage1D", ExactSpelling = true)]
+            internal extern static void TexImage1D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 border, int format, int type, IntPtr pixels);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexImage2D", ExactSpelling = true)]
+            internal extern static void TexImage2D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 height, Int32 border, int format, int type, IntPtr pixels);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexEnvf", ExactSpelling = true)]
+            internal extern static void TexEnvf(int target, int pname, Single param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexEnvfv", ExactSpelling = true)]
+            internal extern static unsafe void TexEnvfv(int target, int pname, Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexEnvi", ExactSpelling = true)]
+            internal extern static void TexEnvi(int target, int pname, Int32 param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexEnviv", ExactSpelling = true)]
+            internal extern static unsafe void TexEnviv(int target, int pname, Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexGend", ExactSpelling = true)]
+            internal extern static void TexGend(int coord, int pname, Double param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexGendv", ExactSpelling = true)]
+            internal extern static unsafe void TexGendv(int coord, int pname, Double* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexGenf", ExactSpelling = true)]
+            internal extern static void TexGenf(int coord, int pname, Single param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexGenfv", ExactSpelling = true)]
+            internal extern static unsafe void TexGenfv(int coord, int pname, Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexGeni", ExactSpelling = true)]
+            internal extern static void TexGeni(int coord, int pname, Int32 param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexGeniv", ExactSpelling = true)]
+            internal extern static unsafe void TexGeniv(int coord, int pname, Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFeedbackBuffer", ExactSpelling = true)]
+            internal extern static unsafe void FeedbackBuffer(Int32 size, int type, [Out] Single* buffer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSelectBuffer", ExactSpelling = true)]
+            internal extern static unsafe void SelectBuffer(Int32 size, [Out] UInt32* buffer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRenderMode", ExactSpelling = true)]
+            internal extern static Int32 RenderMode(int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glInitNames", ExactSpelling = true)]
+            internal extern static void InitNames();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLoadName", ExactSpelling = true)]
+            internal extern static void LoadName(UInt32 name);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPassThrough", ExactSpelling = true)]
+            internal extern static void PassThrough(Single token);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPopName", ExactSpelling = true)]
+            internal extern static void PopName();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPushName", ExactSpelling = true)]
+            internal extern static void PushName(UInt32 name);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDrawBuffer", ExactSpelling = true)]
+            internal extern static void DrawBuffer(int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glClear", ExactSpelling = true)]
+            internal extern static void Clear(int mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glClearAccum", ExactSpelling = true)]
+            internal extern static void ClearAccum(Single red, Single green, Single blue, Single alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glClearIndex", ExactSpelling = true)]
+            internal extern static void ClearIndex(Single c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glClearColor", ExactSpelling = true)]
+            internal extern static void ClearColor(Single red, Single green, Single blue, Single alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glClearStencil", ExactSpelling = true)]
+            internal extern static void ClearStencil(Int32 s);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glClearDepth", ExactSpelling = true)]
+            internal extern static void ClearDepth(Double depth);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glStencilMask", ExactSpelling = true)]
+            internal extern static void StencilMask(UInt32 mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColorMask", ExactSpelling = true)]
+            internal extern static void ColorMask(bool red, bool green, bool blue, bool alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDepthMask", ExactSpelling = true)]
+            internal extern static void DepthMask(bool flag);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexMask", ExactSpelling = true)]
+            internal extern static void IndexMask(UInt32 mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glAccum", ExactSpelling = true)]
+            internal extern static void Accum(int op, Single value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDisable", ExactSpelling = true)]
+            internal extern static void Disable(int cap);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEnable", ExactSpelling = true)]
+            internal extern static void Enable(int cap);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFinish", ExactSpelling = true)]
+            internal extern static void Finish();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFlush", ExactSpelling = true)]
+            internal extern static void Flush();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPopAttrib", ExactSpelling = true)]
+            internal extern static void PopAttrib();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPushAttrib", ExactSpelling = true)]
+            internal extern static void PushAttrib(int mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMap1d", ExactSpelling = true)]
+            internal extern static unsafe void Map1d(int target, Double u1, Double u2, Int32 stride, Int32 order, Double* points);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMap1f", ExactSpelling = true)]
+            internal extern static unsafe void Map1f(int target, Single u1, Single u2, Int32 stride, Int32 order, Single* points);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMap2d", ExactSpelling = true)]
+            internal extern static unsafe void Map2d(int target, Double u1, Double u2, Int32 ustride, Int32 uorder, Double v1, Double v2, Int32 vstride, Int32 vorder, Double* points);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMap2f", ExactSpelling = true)]
+            internal extern static unsafe void Map2f(int target, Single u1, Single u2, Int32 ustride, Int32 uorder, Single v1, Single v2, Int32 vstride, Int32 vorder, Single* points);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMapGrid1d", ExactSpelling = true)]
+            internal extern static void MapGrid1d(Int32 un, Double u1, Double u2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMapGrid1f", ExactSpelling = true)]
+            internal extern static void MapGrid1f(Int32 un, Single u1, Single u2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMapGrid2d", ExactSpelling = true)]
+            internal extern static void MapGrid2d(Int32 un, Double u1, Double u2, Int32 vn, Double v1, Double v2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMapGrid2f", ExactSpelling = true)]
+            internal extern static void MapGrid2f(Int32 un, Single u1, Single u2, Int32 vn, Single v1, Single v2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalCoord1d", ExactSpelling = true)]
+            internal extern static void EvalCoord1d(Double u);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalCoord1dv", ExactSpelling = true)]
+            internal extern static unsafe void EvalCoord1dv(Double* u);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalCoord1f", ExactSpelling = true)]
+            internal extern static void EvalCoord1f(Single u);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalCoord1fv", ExactSpelling = true)]
+            internal extern static unsafe void EvalCoord1fv(Single* u);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalCoord2d", ExactSpelling = true)]
+            internal extern static void EvalCoord2d(Double u, Double v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalCoord2dv", ExactSpelling = true)]
+            internal extern static unsafe void EvalCoord2dv(Double* u);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalCoord2f", ExactSpelling = true)]
+            internal extern static void EvalCoord2f(Single u, Single v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalCoord2fv", ExactSpelling = true)]
+            internal extern static unsafe void EvalCoord2fv(Single* u);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalMesh1", ExactSpelling = true)]
+            internal extern static void EvalMesh1(int mode, Int32 i1, Int32 i2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalPoint1", ExactSpelling = true)]
+            internal extern static void EvalPoint1(Int32 i);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalMesh2", ExactSpelling = true)]
+            internal extern static void EvalMesh2(int mode, Int32 i1, Int32 i2, Int32 j1, Int32 j2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEvalPoint2", ExactSpelling = true)]
+            internal extern static void EvalPoint2(Int32 i, Int32 j);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glAlphaFunc", ExactSpelling = true)]
+            internal extern static void AlphaFunc(int func, Single @ref);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBlendFunc", ExactSpelling = true)]
+            internal extern static void BlendFunc(int sfactor, int dfactor);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLogicOp", ExactSpelling = true)]
+            internal extern static void LogicOp(int opcode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glStencilFunc", ExactSpelling = true)]
+            internal extern static void StencilFunc(int func, Int32 @ref, UInt32 mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glStencilOp", ExactSpelling = true)]
+            internal extern static void StencilOp(int fail, int zfail, int zpass);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDepthFunc", ExactSpelling = true)]
+            internal extern static void DepthFunc(int func);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPixelZoom", ExactSpelling = true)]
+            internal extern static void PixelZoom(Single xfactor, Single yfactor);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPixelTransferf", ExactSpelling = true)]
+            internal extern static void PixelTransferf(int pname, Single param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPixelTransferi", ExactSpelling = true)]
+            internal extern static void PixelTransferi(int pname, Int32 param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPixelStoref", ExactSpelling = true)]
+            internal extern static void PixelStoref(int pname, Single param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPixelStorei", ExactSpelling = true)]
+            internal extern static void PixelStorei(int pname, Int32 param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPixelMapfv", ExactSpelling = true)]
+            internal extern static unsafe void PixelMapfv(int map, Int32 mapsize, Single* values);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPixelMapuiv", ExactSpelling = true)]
+            internal extern static unsafe void PixelMapuiv(int map, Int32 mapsize, UInt32* values);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPixelMapusv", ExactSpelling = true)]
+            internal extern static unsafe void PixelMapusv(int map, Int32 mapsize, UInt16* values);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glReadBuffer", ExactSpelling = true)]
+            internal extern static void ReadBuffer(int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCopyPixels", ExactSpelling = true)]
+            internal extern static void CopyPixels(Int32 x, Int32 y, Int32 width, Int32 height, int type);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glReadPixels", ExactSpelling = true)]
+            internal extern static void ReadPixels(Int32 x, Int32 y, Int32 width, Int32 height, int format, int type, [Out] IntPtr pixels);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDrawPixels", ExactSpelling = true)]
+            internal extern static void DrawPixels(Int32 width, Int32 height, int format, int type, IntPtr pixels);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetBooleanv", ExactSpelling = true)]
+            internal extern static unsafe void GetBooleanv(int pname, [Out] bool* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetClipPlane", ExactSpelling = true)]
+            internal extern static unsafe void GetClipPlane(int plane, [Out] Double* equation);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetDoublev", ExactSpelling = true)]
+            internal extern static unsafe void GetDoublev(int pname, [Out] Double* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetError", ExactSpelling = true)]
+            internal extern static int GetError();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetFloatv", ExactSpelling = true)]
+            internal extern static unsafe void GetFloatv(int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetIntegerv", ExactSpelling = true)]
+            internal extern static unsafe void GetIntegerv(int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetLightfv", ExactSpelling = true)]
+            internal extern static unsafe void GetLightfv(int light, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetLightiv", ExactSpelling = true)]
+            internal extern static unsafe void GetLightiv(int light, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetMapdv", ExactSpelling = true)]
+            internal extern static unsafe void GetMapdv(int target, int query, [Out] Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetMapfv", ExactSpelling = true)]
+            internal extern static unsafe void GetMapfv(int target, int query, [Out] Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetMapiv", ExactSpelling = true)]
+            internal extern static unsafe void GetMapiv(int target, int query, [Out] Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetMaterialfv", ExactSpelling = true)]
+            internal extern static unsafe void GetMaterialfv(int face, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetMaterialiv", ExactSpelling = true)]
+            internal extern static unsafe void GetMaterialiv(int face, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetPixelMapfv", ExactSpelling = true)]
+            internal extern static unsafe void GetPixelMapfv(int map, [Out] Single* values);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetPixelMapuiv", ExactSpelling = true)]
+            internal extern static unsafe void GetPixelMapuiv(int map, [Out] UInt32* values);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetPixelMapusv", ExactSpelling = true)]
+            internal extern static unsafe void GetPixelMapusv(int map, [Out] UInt16* values);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetPolygonStipple", ExactSpelling = true)]
+            internal extern static unsafe void GetPolygonStipple([Out] Byte* mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetString", ExactSpelling = true)]
+            internal extern static IntPtr GetString(int name);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetTexEnvfv", ExactSpelling = true)]
+            internal extern static unsafe void GetTexEnvfv(int target, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetTexEnviv", ExactSpelling = true)]
+            internal extern static unsafe void GetTexEnviv(int target, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetTexGendv", ExactSpelling = true)]
+            internal extern static unsafe void GetTexGendv(int coord, int pname, [Out] Double* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetTexGenfv", ExactSpelling = true)]
+            internal extern static unsafe void GetTexGenfv(int coord, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetTexGeniv", ExactSpelling = true)]
+            internal extern static unsafe void GetTexGeniv(int coord, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetTexImage", ExactSpelling = true)]
+            internal extern static void GetTexImage(int target, Int32 level, int format, int type, [Out] IntPtr pixels);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetTexParameterfv", ExactSpelling = true)]
+            internal extern static unsafe void GetTexParameterfv(int target, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetTexParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void GetTexParameteriv(int target, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetTexLevelParameterfv", ExactSpelling = true)]
+            internal extern static unsafe void GetTexLevelParameterfv(int target, Int32 level, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetTexLevelParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void GetTexLevelParameteriv(int target, Int32 level, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIsEnabled", ExactSpelling = true)]
+            internal extern static bool IsEnabled(int cap);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIsList", ExactSpelling = true)]
+            internal extern static bool IsList(UInt32 list);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDepthRange", ExactSpelling = true)]
+            internal extern static void DepthRange(Double near, Double far);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFrustum", ExactSpelling = true)]
+            internal extern static void Frustum(Double left, Double right, Double bottom, Double top, Double zNear, Double zFar);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLoadIdentity", ExactSpelling = true)]
+            internal extern static void LoadIdentity();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLoadMatrixf", ExactSpelling = true)]
+            internal extern static unsafe void LoadMatrixf(Single* m);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLoadMatrixd", ExactSpelling = true)]
+            internal extern static unsafe void LoadMatrixd(Double* m);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMatrixMode", ExactSpelling = true)]
+            internal extern static void MatrixMode(int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultMatrixf", ExactSpelling = true)]
+            internal extern static unsafe void MultMatrixf(Single* m);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultMatrixd", ExactSpelling = true)]
+            internal extern static unsafe void MultMatrixd(Double* m);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glOrtho", ExactSpelling = true)]
+            internal extern static void Ortho(Double left, Double right, Double bottom, Double top, Double zNear, Double zFar);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPopMatrix", ExactSpelling = true)]
+            internal extern static void PopMatrix();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPushMatrix", ExactSpelling = true)]
+            internal extern static void PushMatrix();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRotated", ExactSpelling = true)]
+            internal extern static void Rotated(Double angle, Double x, Double y, Double z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glRotatef", ExactSpelling = true)]
+            internal extern static void Rotatef(Single angle, Single x, Single y, Single z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glScaled", ExactSpelling = true)]
+            internal extern static void Scaled(Double x, Double y, Double z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glScalef", ExactSpelling = true)]
+            internal extern static void Scalef(Single x, Single y, Single z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTranslated", ExactSpelling = true)]
+            internal extern static void Translated(Double x, Double y, Double z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTranslatef", ExactSpelling = true)]
+            internal extern static void Translatef(Single x, Single y, Single z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glViewport", ExactSpelling = true)]
+            internal extern static void Viewport(Int32 x, Int32 y, Int32 width, Int32 height);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glArrayElement", ExactSpelling = true)]
+            internal extern static void ArrayElement(Int32 i);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColorPointer", ExactSpelling = true)]
+            internal extern static void ColorPointer(Int32 size, int type, Int32 stride, IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDisableClientState", ExactSpelling = true)]
+            internal extern static void DisableClientState(int array);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDrawArrays", ExactSpelling = true)]
+            internal extern static void DrawArrays(int mode, Int32 first, Int32 count);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDrawElements", ExactSpelling = true)]
+            internal extern static void DrawElements(int mode, Int32 count, int type, IntPtr indices);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEdgeFlagPointer", ExactSpelling = true)]
+            internal extern static void EdgeFlagPointer(Int32 stride, IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEnableClientState", ExactSpelling = true)]
+            internal extern static void EnableClientState(int array);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetPointerv", ExactSpelling = true)]
+            internal extern static void GetPointerv(int pname, [Out] IntPtr @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexPointer", ExactSpelling = true)]
+            internal extern static void IndexPointer(int type, Int32 stride, IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glInterleavedArrays", ExactSpelling = true)]
+            internal extern static void InterleavedArrays(int format, Int32 stride, IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glNormalPointer", ExactSpelling = true)]
+            internal extern static void NormalPointer(int type, Int32 stride, IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexCoordPointer", ExactSpelling = true)]
+            internal extern static void TexCoordPointer(Int32 size, int type, Int32 stride, IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexPointer", ExactSpelling = true)]
+            internal extern static void VertexPointer(Int32 size, int type, Int32 stride, IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPolygonOffset", ExactSpelling = true)]
+            internal extern static void PolygonOffset(Single factor, Single units);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCopyTexImage1D", ExactSpelling = true)]
+            internal extern static void CopyTexImage1D(int target, Int32 level, int internalformat, Int32 x, Int32 y, Int32 width, Int32 border);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCopyTexImage2D", ExactSpelling = true)]
+            internal extern static void CopyTexImage2D(int target, Int32 level, int internalformat, Int32 x, Int32 y, Int32 width, Int32 height, Int32 border);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCopyTexSubImage1D", ExactSpelling = true)]
+            internal extern static void CopyTexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 x, Int32 y, Int32 width);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCopyTexSubImage2D", ExactSpelling = true)]
+            internal extern static void CopyTexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 x, Int32 y, Int32 width, Int32 height);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexSubImage1D", ExactSpelling = true)]
+            internal extern static void TexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 width, int format, int type, IntPtr pixels);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexSubImage2D", ExactSpelling = true)]
+            internal extern static void TexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, int type, IntPtr pixels);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glAreTexturesResident", ExactSpelling = true)]
+            internal extern static unsafe bool AreTexturesResident(Int32 n, UInt32* textures, [Out] bool* residences);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBindTexture", ExactSpelling = true)]
+            internal extern static void BindTexture(int target, UInt32 texture);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDeleteTextures", ExactSpelling = true)]
+            internal extern static unsafe void DeleteTextures(Int32 n, UInt32* textures);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGenTextures", ExactSpelling = true)]
+            internal extern static unsafe void GenTextures(Int32 n, [Out] UInt32* textures);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIsTexture", ExactSpelling = true)]
+            internal extern static bool IsTexture(UInt32 texture);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPrioritizeTextures", ExactSpelling = true)]
+            internal extern static unsafe void PrioritizeTextures(Int32 n, UInt32* textures, Single* priorities);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexub", ExactSpelling = true)]
+            internal extern static void Indexub(Byte c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIndexubv", ExactSpelling = true)]
+            internal extern static unsafe void Indexubv(Byte* c);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPopClientAttrib", ExactSpelling = true)]
+            internal extern static void PopClientAttrib();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPushClientAttrib", ExactSpelling = true)]
+            internal extern static void PushClientAttrib(int mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBlendColor", ExactSpelling = true)]
+            internal extern static void BlendColor(Single red, Single green, Single blue, Single alpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBlendEquation", ExactSpelling = true)]
+            internal extern static void BlendEquation(int mode);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDrawRangeElements", ExactSpelling = true)]
+            internal extern static void DrawRangeElements(int mode, UInt32 start, UInt32 end, Int32 count, int type, IntPtr indices);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColorTable", ExactSpelling = true)]
+            internal extern static void ColorTable(int target, int internalformat, Int32 width, int format, int type, IntPtr table);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColorTableParameterfv", ExactSpelling = true)]
+            internal extern static unsafe void ColorTableParameterfv(int target, int pname, Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColorTableParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void ColorTableParameteriv(int target, int pname, Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCopyColorTable", ExactSpelling = true)]
+            internal extern static void CopyColorTable(int target, int internalformat, Int32 x, Int32 y, Int32 width);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetColorTable", ExactSpelling = true)]
+            internal extern static void GetColorTable(int target, int format, int type, [Out] IntPtr table);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetColorTableParameterfv", ExactSpelling = true)]
+            internal extern static unsafe void GetColorTableParameterfv(int target, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetColorTableParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void GetColorTableParameteriv(int target, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glColorSubTable", ExactSpelling = true)]
+            internal extern static void ColorSubTable(int target, Int32 start, Int32 count, int format, int type, IntPtr data);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCopyColorSubTable", ExactSpelling = true)]
+            internal extern static void CopyColorSubTable(int target, Int32 start, Int32 x, Int32 y, Int32 width);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glConvolutionFilter1D", ExactSpelling = true)]
+            internal extern static void ConvolutionFilter1D(int target, int internalformat, Int32 width, int format, int type, IntPtr image);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glConvolutionFilter2D", ExactSpelling = true)]
+            internal extern static void ConvolutionFilter2D(int target, int internalformat, Int32 width, Int32 height, int format, int type, IntPtr image);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glConvolutionParameterf", ExactSpelling = true)]
+            internal extern static void ConvolutionParameterf(int target, int pname, Single @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glConvolutionParameterfv", ExactSpelling = true)]
+            internal extern static unsafe void ConvolutionParameterfv(int target, int pname, Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glConvolutionParameteri", ExactSpelling = true)]
+            internal extern static void ConvolutionParameteri(int target, int pname, Int32 @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glConvolutionParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void ConvolutionParameteriv(int target, int pname, Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCopyConvolutionFilter1D", ExactSpelling = true)]
+            internal extern static void CopyConvolutionFilter1D(int target, int internalformat, Int32 x, Int32 y, Int32 width);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCopyConvolutionFilter2D", ExactSpelling = true)]
+            internal extern static void CopyConvolutionFilter2D(int target, int internalformat, Int32 x, Int32 y, Int32 width, Int32 height);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetConvolutionFilter", ExactSpelling = true)]
+            internal extern static void GetConvolutionFilter(int target, int format, int type, [Out] IntPtr image);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetConvolutionParameterfv", ExactSpelling = true)]
+            internal extern static unsafe void GetConvolutionParameterfv(int target, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetConvolutionParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void GetConvolutionParameteriv(int target, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetSeparableFilter", ExactSpelling = true)]
+            internal extern static void GetSeparableFilter(int target, int format, int type, [Out] IntPtr row, [Out] IntPtr column, [Out] IntPtr span);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSeparableFilter2D", ExactSpelling = true)]
+            internal extern static void SeparableFilter2D(int target, int internalformat, Int32 width, Int32 height, int format, int type, IntPtr row, IntPtr column);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetHistogram", ExactSpelling = true)]
+            internal extern static void GetHistogram(int target, bool reset, int format, int type, [Out] IntPtr values);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetHistogramParameterfv", ExactSpelling = true)]
+            internal extern static unsafe void GetHistogramParameterfv(int target, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetHistogramParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void GetHistogramParameteriv(int target, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetMinmax", ExactSpelling = true)]
+            internal extern static void GetMinmax(int target, bool reset, int format, int type, [Out] IntPtr values);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetMinmaxParameterfv", ExactSpelling = true)]
+            internal extern static unsafe void GetMinmaxParameterfv(int target, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetMinmaxParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void GetMinmaxParameteriv(int target, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glHistogram", ExactSpelling = true)]
+            internal extern static void Histogram(int target, Int32 width, int internalformat, bool sink);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMinmax", ExactSpelling = true)]
+            internal extern static void Minmax(int target, int internalformat, bool sink);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glResetHistogram", ExactSpelling = true)]
+            internal extern static void ResetHistogram(int target);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glResetMinmax", ExactSpelling = true)]
+            internal extern static void ResetMinmax(int target);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexImage3D", ExactSpelling = true)]
+            internal extern static void TexImage3D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, int format, int type, IntPtr pixels);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glTexSubImage3D", ExactSpelling = true)]
+            internal extern static void TexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, int type, IntPtr pixels);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCopyTexSubImage3D", ExactSpelling = true)]
+            internal extern static void CopyTexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 x, Int32 y, Int32 width, Int32 height);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glActiveTexture", ExactSpelling = true)]
+            internal extern static void ActiveTexture(int texture);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glClientActiveTexture", ExactSpelling = true)]
+            internal extern static void ClientActiveTexture(int texture);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord1d", ExactSpelling = true)]
+            internal extern static void MultiTexCoord1d(int target, Double s);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord1dv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord1dv(int target, Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord1f", ExactSpelling = true)]
+            internal extern static void MultiTexCoord1f(int target, Single s);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord1fv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord1fv(int target, Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord1i", ExactSpelling = true)]
+            internal extern static void MultiTexCoord1i(int target, Int32 s);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord1iv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord1iv(int target, Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord1s", ExactSpelling = true)]
+            internal extern static void MultiTexCoord1s(int target, Int16 s);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord1sv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord1sv(int target, Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord2d", ExactSpelling = true)]
+            internal extern static void MultiTexCoord2d(int target, Double s, Double t);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord2dv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord2dv(int target, Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord2f", ExactSpelling = true)]
+            internal extern static void MultiTexCoord2f(int target, Single s, Single t);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord2fv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord2fv(int target, Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord2i", ExactSpelling = true)]
+            internal extern static void MultiTexCoord2i(int target, Int32 s, Int32 t);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord2iv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord2iv(int target, Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord2s", ExactSpelling = true)]
+            internal extern static void MultiTexCoord2s(int target, Int16 s, Int16 t);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord2sv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord2sv(int target, Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord3d", ExactSpelling = true)]
+            internal extern static void MultiTexCoord3d(int target, Double s, Double t, Double r);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord3dv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord3dv(int target, Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord3f", ExactSpelling = true)]
+            internal extern static void MultiTexCoord3f(int target, Single s, Single t, Single r);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord3fv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord3fv(int target, Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord3i", ExactSpelling = true)]
+            internal extern static void MultiTexCoord3i(int target, Int32 s, Int32 t, Int32 r);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord3iv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord3iv(int target, Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord3s", ExactSpelling = true)]
+            internal extern static void MultiTexCoord3s(int target, Int16 s, Int16 t, Int16 r);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord3sv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord3sv(int target, Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord4d", ExactSpelling = true)]
+            internal extern static void MultiTexCoord4d(int target, Double s, Double t, Double r, Double q);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord4dv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord4dv(int target, Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord4f", ExactSpelling = true)]
+            internal extern static void MultiTexCoord4f(int target, Single s, Single t, Single r, Single q);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord4fv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord4fv(int target, Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord4i", ExactSpelling = true)]
+            internal extern static void MultiTexCoord4i(int target, Int32 s, Int32 t, Int32 r, Int32 q);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord4iv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord4iv(int target, Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord4s", ExactSpelling = true)]
+            internal extern static void MultiTexCoord4s(int target, Int16 s, Int16 t, Int16 r, Int16 q);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiTexCoord4sv", ExactSpelling = true)]
+            internal extern static unsafe void MultiTexCoord4sv(int target, Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLoadTransposeMatrixf", ExactSpelling = true)]
+            internal extern static unsafe void LoadTransposeMatrixf(Single* m);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLoadTransposeMatrixd", ExactSpelling = true)]
+            internal extern static unsafe void LoadTransposeMatrixd(Double* m);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultTransposeMatrixf", ExactSpelling = true)]
+            internal extern static unsafe void MultTransposeMatrixf(Single* m);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultTransposeMatrixd", ExactSpelling = true)]
+            internal extern static unsafe void MultTransposeMatrixd(Double* m);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSampleCoverage", ExactSpelling = true)]
+            internal extern static void SampleCoverage(Single value, bool invert);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCompressedTexImage3D", ExactSpelling = true)]
+            internal extern static void CompressedTexImage3D(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, Int32 imageSize, IntPtr data);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCompressedTexImage2D", ExactSpelling = true)]
+            internal extern static void CompressedTexImage2D(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 border, Int32 imageSize, IntPtr data);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCompressedTexImage1D", ExactSpelling = true)]
+            internal extern static void CompressedTexImage1D(int target, Int32 level, int internalformat, Int32 width, Int32 border, Int32 imageSize, IntPtr data);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCompressedTexSubImage3D", ExactSpelling = true)]
+            internal extern static void CompressedTexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, Int32 imageSize, IntPtr data);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCompressedTexSubImage2D", ExactSpelling = true)]
+            internal extern static void CompressedTexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, Int32 imageSize, IntPtr data);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCompressedTexSubImage1D", ExactSpelling = true)]
+            internal extern static void CompressedTexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 width, int format, Int32 imageSize, IntPtr data);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetCompressedTexImage", ExactSpelling = true)]
+            internal extern static void GetCompressedTexImage(int target, Int32 level, [Out] IntPtr img);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBlendFuncSeparate", ExactSpelling = true)]
+            internal extern static void BlendFuncSeparate(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFogCoordf", ExactSpelling = true)]
+            internal extern static void FogCoordf(Single coord);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFogCoordfv", ExactSpelling = true)]
+            internal extern static unsafe void FogCoordfv(Single* coord);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFogCoordd", ExactSpelling = true)]
+            internal extern static void FogCoordd(Double coord);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFogCoorddv", ExactSpelling = true)]
+            internal extern static unsafe void FogCoorddv(Double* coord);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glFogCoordPointer", ExactSpelling = true)]
+            internal extern static void FogCoordPointer(int type, Int32 stride, IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiDrawArrays", ExactSpelling = true)]
+            internal extern static unsafe void MultiDrawArrays(int mode, [Out] Int32* first, [Out] Int32* count, Int32 primcount);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMultiDrawElements", ExactSpelling = true)]
+            internal extern static unsafe void MultiDrawElements(int mode, Int32* count, int type, IntPtr indices, Int32 primcount);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPointParameterf", ExactSpelling = true)]
+            internal extern static void PointParameterf(int pname, Single param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPointParameterfv", ExactSpelling = true)]
+            internal extern static unsafe void PointParameterfv(int pname, Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPointParameteri", ExactSpelling = true)]
+            internal extern static void PointParameteri(int pname, Int32 param);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glPointParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void PointParameteriv(int pname, Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3b", ExactSpelling = true)]
+            internal extern static void SecondaryColor3b(SByte red, SByte green, SByte blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3bv", ExactSpelling = true)]
+            internal extern static unsafe void SecondaryColor3bv(SByte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3d", ExactSpelling = true)]
+            internal extern static void SecondaryColor3d(Double red, Double green, Double blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3dv", ExactSpelling = true)]
+            internal extern static unsafe void SecondaryColor3dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3f", ExactSpelling = true)]
+            internal extern static void SecondaryColor3f(Single red, Single green, Single blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3fv", ExactSpelling = true)]
+            internal extern static unsafe void SecondaryColor3fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3i", ExactSpelling = true)]
+            internal extern static void SecondaryColor3i(Int32 red, Int32 green, Int32 blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3iv", ExactSpelling = true)]
+            internal extern static unsafe void SecondaryColor3iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3s", ExactSpelling = true)]
+            internal extern static void SecondaryColor3s(Int16 red, Int16 green, Int16 blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3sv", ExactSpelling = true)]
+            internal extern static unsafe void SecondaryColor3sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3ub", ExactSpelling = true)]
+            internal extern static void SecondaryColor3ub(Byte red, Byte green, Byte blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3ubv", ExactSpelling = true)]
+            internal extern static unsafe void SecondaryColor3ubv(Byte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3ui", ExactSpelling = true)]
+            internal extern static void SecondaryColor3ui(UInt32 red, UInt32 green, UInt32 blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3uiv", ExactSpelling = true)]
+            internal extern static unsafe void SecondaryColor3uiv(UInt32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3us", ExactSpelling = true)]
+            internal extern static void SecondaryColor3us(UInt16 red, UInt16 green, UInt16 blue);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColor3usv", ExactSpelling = true)]
+            internal extern static unsafe void SecondaryColor3usv(UInt16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glSecondaryColorPointer", ExactSpelling = true)]
+            internal extern static void SecondaryColorPointer(Int32 size, int type, Int32 stride, IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos2d", ExactSpelling = true)]
+            internal extern static void WindowPos2d(Double x, Double y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos2dv", ExactSpelling = true)]
+            internal extern static unsafe void WindowPos2dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos2f", ExactSpelling = true)]
+            internal extern static void WindowPos2f(Single x, Single y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos2fv", ExactSpelling = true)]
+            internal extern static unsafe void WindowPos2fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos2i", ExactSpelling = true)]
+            internal extern static void WindowPos2i(Int32 x, Int32 y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos2iv", ExactSpelling = true)]
+            internal extern static unsafe void WindowPos2iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos2s", ExactSpelling = true)]
+            internal extern static void WindowPos2s(Int16 x, Int16 y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos2sv", ExactSpelling = true)]
+            internal extern static unsafe void WindowPos2sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos3d", ExactSpelling = true)]
+            internal extern static void WindowPos3d(Double x, Double y, Double z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos3dv", ExactSpelling = true)]
+            internal extern static unsafe void WindowPos3dv(Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos3f", ExactSpelling = true)]
+            internal extern static void WindowPos3f(Single x, Single y, Single z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos3fv", ExactSpelling = true)]
+            internal extern static unsafe void WindowPos3fv(Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos3i", ExactSpelling = true)]
+            internal extern static void WindowPos3i(Int32 x, Int32 y, Int32 z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos3iv", ExactSpelling = true)]
+            internal extern static unsafe void WindowPos3iv(Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos3s", ExactSpelling = true)]
+            internal extern static void WindowPos3s(Int16 x, Int16 y, Int16 z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glWindowPos3sv", ExactSpelling = true)]
+            internal extern static unsafe void WindowPos3sv(Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGenQueries", ExactSpelling = true)]
+            internal extern static unsafe void GenQueries(Int32 n, [Out] UInt32* ids);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDeleteQueries", ExactSpelling = true)]
+            internal extern static unsafe void DeleteQueries(Int32 n, UInt32* ids);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIsQuery", ExactSpelling = true)]
+            internal extern static bool IsQuery(UInt32 id);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBeginQuery", ExactSpelling = true)]
+            internal extern static void BeginQuery(int target, UInt32 id);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEndQuery", ExactSpelling = true)]
+            internal extern static void EndQuery(int target);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetQueryiv", ExactSpelling = true)]
+            internal extern static unsafe void GetQueryiv(int target, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetQueryObjectiv", ExactSpelling = true)]
+            internal extern static unsafe void GetQueryObjectiv(UInt32 id, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetQueryObjectuiv", ExactSpelling = true)]
+            internal extern static unsafe void GetQueryObjectuiv(UInt32 id, int pname, [Out] UInt32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBindBuffer", ExactSpelling = true)]
+            internal extern static void BindBuffer(int target, UInt32 buffer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDeleteBuffers", ExactSpelling = true)]
+            internal extern static unsafe void DeleteBuffers(Int32 n, UInt32* buffers);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGenBuffers", ExactSpelling = true)]
+            internal extern static unsafe void GenBuffers(Int32 n, [Out] UInt32* buffers);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIsBuffer", ExactSpelling = true)]
+            internal extern static bool IsBuffer(UInt32 buffer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBufferData", ExactSpelling = true)]
+            internal extern static void BufferData(int target, IntPtr size, IntPtr data, int usage);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBufferSubData", ExactSpelling = true)]
+            internal extern static void BufferSubData(int target, IntPtr offset, IntPtr size, IntPtr data);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetBufferSubData", ExactSpelling = true)]
+            internal extern static void GetBufferSubData(int target, IntPtr offset, IntPtr size, [Out] IntPtr data);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glMapBuffer", ExactSpelling = true)]
+            internal extern static unsafe IntPtr MapBuffer(int target, int access);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUnmapBuffer", ExactSpelling = true)]
+            internal extern static bool UnmapBuffer(int target);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetBufferParameteriv", ExactSpelling = true)]
+            internal extern static unsafe void GetBufferParameteriv(int target, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetBufferPointerv", ExactSpelling = true)]
+            internal extern static void GetBufferPointerv(int target, int pname, [Out] IntPtr @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBlendEquationSeparate", ExactSpelling = true)]
+            internal extern static void BlendEquationSeparate(int modeRGB, int modeAlpha);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDrawBuffers", ExactSpelling = true)]
+            internal extern static unsafe void DrawBuffers(Int32 n, int* bufs);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glStencilOpSeparate", ExactSpelling = true)]
+            internal extern static void StencilOpSeparate(int face, int sfail, int dpfail, int dppass);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glStencilFuncSeparate", ExactSpelling = true)]
+            internal extern static void StencilFuncSeparate(int frontfunc, int backfunc, Int32 @ref, UInt32 mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glStencilMaskSeparate", ExactSpelling = true)]
+            internal extern static void StencilMaskSeparate(int face, UInt32 mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glAttachShader", ExactSpelling = true)]
+            internal extern static void AttachShader(UInt32 program, UInt32 shader);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glBindAttribLocation", ExactSpelling = true)]
+            internal extern static void BindAttribLocation(UInt32 program, UInt32 index, System.String name);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCompileShader", ExactSpelling = true)]
+            internal extern static void CompileShader(UInt32 shader);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCreateProgram", ExactSpelling = true)]
+            internal extern static Int32 CreateProgram();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glCreateShader", ExactSpelling = true)]
+            internal extern static Int32 CreateShader(int type);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDeleteProgram", ExactSpelling = true)]
+            internal extern static void DeleteProgram(UInt32 program);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDeleteShader", ExactSpelling = true)]
+            internal extern static void DeleteShader(UInt32 shader);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDetachShader", ExactSpelling = true)]
+            internal extern static void DetachShader(UInt32 program, UInt32 shader);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glDisableVertexAttribArray", ExactSpelling = true)]
+            internal extern static void DisableVertexAttribArray(UInt32 index);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glEnableVertexAttribArray", ExactSpelling = true)]
+            internal extern static void EnableVertexAttribArray(UInt32 index);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetActiveAttrib", ExactSpelling = true)]
+            internal extern static unsafe void GetActiveAttrib(UInt32 program, UInt32 index, Int32 bufSize, [Out] Int32* length, [Out] Int32* size, [Out] int* type, [Out] System.Text.StringBuilder name);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetActiveUniform", ExactSpelling = true)]
+            internal extern static unsafe void GetActiveUniform(UInt32 program, UInt32 index, Int32 bufSize, [Out] Int32* length, [Out] Int32* size, [Out] int* type, [Out] System.Text.StringBuilder name);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetAttachedShaders", ExactSpelling = true)]
+            internal extern static unsafe void GetAttachedShaders(UInt32 program, Int32 maxCount, [Out] Int32* count, [Out] UInt32* obj);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetAttribLocation", ExactSpelling = true)]
+            internal extern static Int32 GetAttribLocation(UInt32 program, System.String name);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetProgramiv", ExactSpelling = true)]
+            internal extern static unsafe void GetProgramiv(UInt32 program, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetProgramInfoLog", ExactSpelling = true)]
+            internal extern static unsafe void GetProgramInfoLog(UInt32 program, Int32 bufSize, [Out] Int32* length, [Out] System.Text.StringBuilder infoLog);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetShaderiv", ExactSpelling = true)]
+            internal extern static unsafe void GetShaderiv(UInt32 shader, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetShaderInfoLog", ExactSpelling = true)]
+            internal extern static unsafe void GetShaderInfoLog(UInt32 shader, Int32 bufSize, [Out] Int32* length, [Out] System.Text.StringBuilder infoLog);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetShaderSource", ExactSpelling = true)]
+            internal extern static unsafe void GetShaderSource(UInt32 shader, Int32 bufSize, [Out] Int32* length, [Out] System.Text.StringBuilder[] source);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetUniformLocation", ExactSpelling = true)]
+            internal extern static Int32 GetUniformLocation(UInt32 program, System.String name);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetUniformfv", ExactSpelling = true)]
+            internal extern static unsafe void GetUniformfv(UInt32 program, Int32 location, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetUniformiv", ExactSpelling = true)]
+            internal extern static unsafe void GetUniformiv(UInt32 program, Int32 location, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetVertexAttribdv", ExactSpelling = true)]
+            internal extern static unsafe void GetVertexAttribdv(UInt32 index, int pname, [Out] Double* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetVertexAttribfv", ExactSpelling = true)]
+            internal extern static unsafe void GetVertexAttribfv(UInt32 index, int pname, [Out] Single* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetVertexAttribiv", ExactSpelling = true)]
+            internal extern static unsafe void GetVertexAttribiv(UInt32 index, int pname, [Out] Int32* @params);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glGetVertexAttribPointerv", ExactSpelling = true)]
+            internal extern static void GetVertexAttribPointerv(UInt32 index, int pname, [Out] IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIsProgram", ExactSpelling = true)]
+            internal extern static bool IsProgram(UInt32 program);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glIsShader", ExactSpelling = true)]
+            internal extern static bool IsShader(UInt32 shader);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glLinkProgram", ExactSpelling = true)]
+            internal extern static void LinkProgram(UInt32 program);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glShaderSource", ExactSpelling = true)]
+            internal extern static unsafe void ShaderSource(UInt32 shader, Int32 count, System.String[] @string, Int32* length);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUseProgram", ExactSpelling = true)]
+            internal extern static void UseProgram(UInt32 program);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform1f", ExactSpelling = true)]
+            internal extern static void Uniform1f(Int32 location, Single v0);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform2f", ExactSpelling = true)]
+            internal extern static void Uniform2f(Int32 location, Single v0, Single v1);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform3f", ExactSpelling = true)]
+            internal extern static void Uniform3f(Int32 location, Single v0, Single v1, Single v2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform4f", ExactSpelling = true)]
+            internal extern static void Uniform4f(Int32 location, Single v0, Single v1, Single v2, Single v3);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform1i", ExactSpelling = true)]
+            internal extern static void Uniform1i(Int32 location, Int32 v0);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform2i", ExactSpelling = true)]
+            internal extern static void Uniform2i(Int32 location, Int32 v0, Int32 v1);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform3i", ExactSpelling = true)]
+            internal extern static void Uniform3i(Int32 location, Int32 v0, Int32 v1, Int32 v2);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform4i", ExactSpelling = true)]
+            internal extern static void Uniform4i(Int32 location, Int32 v0, Int32 v1, Int32 v2, Int32 v3);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform1fv", ExactSpelling = true)]
+            internal extern static unsafe void Uniform1fv(Int32 location, Int32 count, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform2fv", ExactSpelling = true)]
+            internal extern static unsafe void Uniform2fv(Int32 location, Int32 count, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform3fv", ExactSpelling = true)]
+            internal extern static unsafe void Uniform3fv(Int32 location, Int32 count, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform4fv", ExactSpelling = true)]
+            internal extern static unsafe void Uniform4fv(Int32 location, Int32 count, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform1iv", ExactSpelling = true)]
+            internal extern static unsafe void Uniform1iv(Int32 location, Int32 count, Int32* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform2iv", ExactSpelling = true)]
+            internal extern static unsafe void Uniform2iv(Int32 location, Int32 count, Int32* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform3iv", ExactSpelling = true)]
+            internal extern static unsafe void Uniform3iv(Int32 location, Int32 count, Int32* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniform4iv", ExactSpelling = true)]
+            internal extern static unsafe void Uniform4iv(Int32 location, Int32 count, Int32* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniformMatrix2fv", ExactSpelling = true)]
+            internal extern static unsafe void UniformMatrix2fv(Int32 location, Int32 count, bool transpose, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniformMatrix3fv", ExactSpelling = true)]
+            internal extern static unsafe void UniformMatrix3fv(Int32 location, Int32 count, bool transpose, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniformMatrix4fv", ExactSpelling = true)]
+            internal extern static unsafe void UniformMatrix4fv(Int32 location, Int32 count, bool transpose, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glValidateProgram", ExactSpelling = true)]
+            internal extern static void ValidateProgram(UInt32 program);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib1d", ExactSpelling = true)]
+            internal extern static void VertexAttrib1d(UInt32 index, Double x);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib1dv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib1dv(UInt32 index, Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib1f", ExactSpelling = true)]
+            internal extern static void VertexAttrib1f(UInt32 index, Single x);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib1fv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib1fv(UInt32 index, Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib1s", ExactSpelling = true)]
+            internal extern static void VertexAttrib1s(UInt32 index, Int16 x);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib1sv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib1sv(UInt32 index, Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib2d", ExactSpelling = true)]
+            internal extern static void VertexAttrib2d(UInt32 index, Double x, Double y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib2dv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib2dv(UInt32 index, Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib2f", ExactSpelling = true)]
+            internal extern static void VertexAttrib2f(UInt32 index, Single x, Single y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib2fv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib2fv(UInt32 index, Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib2s", ExactSpelling = true)]
+            internal extern static void VertexAttrib2s(UInt32 index, Int16 x, Int16 y);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib2sv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib2sv(UInt32 index, Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib3d", ExactSpelling = true)]
+            internal extern static void VertexAttrib3d(UInt32 index, Double x, Double y, Double z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib3dv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib3dv(UInt32 index, Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib3f", ExactSpelling = true)]
+            internal extern static void VertexAttrib3f(UInt32 index, Single x, Single y, Single z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib3fv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib3fv(UInt32 index, Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib3s", ExactSpelling = true)]
+            internal extern static void VertexAttrib3s(UInt32 index, Int16 x, Int16 y, Int16 z);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib3sv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib3sv(UInt32 index, Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4Nbv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4Nbv(UInt32 index, SByte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4Niv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4Niv(UInt32 index, Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4Nsv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4Nsv(UInt32 index, Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4Nub", ExactSpelling = true)]
+            internal extern static void VertexAttrib4Nub(UInt32 index, Byte x, Byte y, Byte z, Byte w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4Nubv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4Nubv(UInt32 index, Byte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4Nuiv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4Nuiv(UInt32 index, UInt32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4Nusv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4Nusv(UInt32 index, UInt16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4bv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4bv(UInt32 index, SByte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4d", ExactSpelling = true)]
+            internal extern static void VertexAttrib4d(UInt32 index, Double x, Double y, Double z, Double w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4dv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4dv(UInt32 index, Double* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4f", ExactSpelling = true)]
+            internal extern static void VertexAttrib4f(UInt32 index, Single x, Single y, Single z, Single w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4fv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4fv(UInt32 index, Single* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4iv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4iv(UInt32 index, Int32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4s", ExactSpelling = true)]
+            internal extern static void VertexAttrib4s(UInt32 index, Int16 x, Int16 y, Int16 z, Int16 w);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4sv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4sv(UInt32 index, Int16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4ubv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4ubv(UInt32 index, Byte* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4uiv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4uiv(UInt32 index, UInt32* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttrib4usv", ExactSpelling = true)]
+            internal extern static unsafe void VertexAttrib4usv(UInt32 index, UInt16* v);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glVertexAttribPointer", ExactSpelling = true)]
+            internal extern static void VertexAttribPointer(UInt32 index, Int32 size, int type, bool normalized, Int32 stride, IntPtr pointer);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniformMatrix2x3fv", ExactSpelling = true)]
+            internal extern static unsafe void UniformMatrix2x3fv(Int32 location, Int32 count, bool transpose, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniformMatrix3x2fv", ExactSpelling = true)]
+            internal extern static unsafe void UniformMatrix3x2fv(Int32 location, Int32 count, bool transpose, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniformMatrix2x4fv", ExactSpelling = true)]
+            internal extern static unsafe void UniformMatrix2x4fv(Int32 location, Int32 count, bool transpose, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniformMatrix4x2fv", ExactSpelling = true)]
+            internal extern static unsafe void UniformMatrix4x2fv(Int32 location, Int32 count, bool transpose, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniformMatrix3x4fv", ExactSpelling = true)]
+            internal extern static unsafe void UniformMatrix3x4fv(Int32 location, Int32 count, bool transpose, Single* value);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Gl.Library, EntryPoint = "glUniformMatrix4x3fv", ExactSpelling = true)]
+            internal extern static unsafe void UniformMatrix4x3fv(Int32 location, Int32 count, bool transpose, Single* value);
+        }
+    }
+}
diff --git a/src/Tao.OpenGl/GLDelegates.cs b/src/Tao.OpenGl/GLDelegates.cs
new file mode 100644
index 0000000..2f22d9d
--- /dev/null
+++ b/src/Tao.OpenGl/GLDelegates.cs
@@ -0,0 +1,4601 @@
+namespace Tao.OpenGl
+{
+    using System;
+    using System.Runtime.InteropServices;
+    #pragma warning disable 0649
+
+    partial class Gl
+    {
+        internal static partial class Delegates
+        {
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void NewList(UInt32 list, int mode);
+            internal static NewList glNewList;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EndList();
+            internal static EndList glEndList;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CallList(UInt32 list);
+            internal static CallList glCallList;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CallLists(Int32 n, int type, IntPtr lists);
+            internal static CallLists glCallLists;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DeleteLists(UInt32 list, Int32 range);
+            internal static DeleteLists glDeleteLists;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GenLists(Int32 range);
+            internal static GenLists glGenLists;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ListBase(UInt32 @base);
+            internal static ListBase glListBase;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Begin(int mode);
+            internal static Begin glBegin;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Bitmap(Int32 width, Int32 height, Single xorig, Single yorig, Single xmove, Single ymove, Byte* bitmap);
+            internal unsafe static Bitmap glBitmap;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color3b(SByte red, SByte green, SByte blue);
+            internal static Color3b glColor3b;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color3bv(SByte* v);
+            internal unsafe static Color3bv glColor3bv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color3d(Double red, Double green, Double blue);
+            internal static Color3d glColor3d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color3dv(Double* v);
+            internal unsafe static Color3dv glColor3dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color3f(Single red, Single green, Single blue);
+            internal static Color3f glColor3f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color3fv(Single* v);
+            internal unsafe static Color3fv glColor3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color3i(Int32 red, Int32 green, Int32 blue);
+            internal static Color3i glColor3i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color3iv(Int32* v);
+            internal unsafe static Color3iv glColor3iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color3s(Int16 red, Int16 green, Int16 blue);
+            internal static Color3s glColor3s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color3sv(Int16* v);
+            internal unsafe static Color3sv glColor3sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color3ub(Byte red, Byte green, Byte blue);
+            internal static Color3ub glColor3ub;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color3ubv(Byte* v);
+            internal unsafe static Color3ubv glColor3ubv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color3ui(UInt32 red, UInt32 green, UInt32 blue);
+            internal static Color3ui glColor3ui;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color3uiv(UInt32* v);
+            internal unsafe static Color3uiv glColor3uiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color3us(UInt16 red, UInt16 green, UInt16 blue);
+            internal static Color3us glColor3us;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color3usv(UInt16* v);
+            internal unsafe static Color3usv glColor3usv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4b(SByte red, SByte green, SByte blue, SByte alpha);
+            internal static Color4b glColor4b;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4bv(SByte* v);
+            internal unsafe static Color4bv glColor4bv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4d(Double red, Double green, Double blue, Double alpha);
+            internal static Color4d glColor4d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4dv(Double* v);
+            internal unsafe static Color4dv glColor4dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4f(Single red, Single green, Single blue, Single alpha);
+            internal static Color4f glColor4f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4fv(Single* v);
+            internal unsafe static Color4fv glColor4fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4i(Int32 red, Int32 green, Int32 blue, Int32 alpha);
+            internal static Color4i glColor4i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4iv(Int32* v);
+            internal unsafe static Color4iv glColor4iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4s(Int16 red, Int16 green, Int16 blue, Int16 alpha);
+            internal static Color4s glColor4s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4sv(Int16* v);
+            internal unsafe static Color4sv glColor4sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4ub(Byte red, Byte green, Byte blue, Byte alpha);
+            internal static Color4ub glColor4ub;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4ubv(Byte* v);
+            internal unsafe static Color4ubv glColor4ubv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4ui(UInt32 red, UInt32 green, UInt32 blue, UInt32 alpha);
+            internal static Color4ui glColor4ui;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4uiv(UInt32* v);
+            internal unsafe static Color4uiv glColor4uiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4us(UInt16 red, UInt16 green, UInt16 blue, UInt16 alpha);
+            internal static Color4us glColor4us;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4usv(UInt16* v);
+            internal unsafe static Color4usv glColor4usv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EdgeFlag(bool flag);
+            internal static EdgeFlag glEdgeFlag;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void EdgeFlagv(bool* flag);
+            internal unsafe static EdgeFlagv glEdgeFlagv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void End();
+            internal static End glEnd;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Indexd(Double c);
+            internal static Indexd glIndexd;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Indexdv(Double* c);
+            internal unsafe static Indexdv glIndexdv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Indexf(Single c);
+            internal static Indexf glIndexf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Indexfv(Single* c);
+            internal unsafe static Indexfv glIndexfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Indexi(Int32 c);
+            internal static Indexi glIndexi;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Indexiv(Int32* c);
+            internal unsafe static Indexiv glIndexiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Indexs(Int16 c);
+            internal static Indexs glIndexs;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Indexsv(Int16* c);
+            internal unsafe static Indexsv glIndexsv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Normal3b(SByte nx, SByte ny, SByte nz);
+            internal static Normal3b glNormal3b;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Normal3bv(SByte* v);
+            internal unsafe static Normal3bv glNormal3bv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Normal3d(Double nx, Double ny, Double nz);
+            internal static Normal3d glNormal3d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Normal3dv(Double* v);
+            internal unsafe static Normal3dv glNormal3dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Normal3f(Single nx, Single ny, Single nz);
+            internal static Normal3f glNormal3f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Normal3fv(Single* v);
+            internal unsafe static Normal3fv glNormal3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Normal3i(Int32 nx, Int32 ny, Int32 nz);
+            internal static Normal3i glNormal3i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Normal3iv(Int32* v);
+            internal unsafe static Normal3iv glNormal3iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Normal3s(Int16 nx, Int16 ny, Int16 nz);
+            internal static Normal3s glNormal3s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Normal3sv(Int16* v);
+            internal unsafe static Normal3sv glNormal3sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos2d(Double x, Double y);
+            internal static RasterPos2d glRasterPos2d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos2dv(Double* v);
+            internal unsafe static RasterPos2dv glRasterPos2dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos2f(Single x, Single y);
+            internal static RasterPos2f glRasterPos2f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos2fv(Single* v);
+            internal unsafe static RasterPos2fv glRasterPos2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos2i(Int32 x, Int32 y);
+            internal static RasterPos2i glRasterPos2i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos2iv(Int32* v);
+            internal unsafe static RasterPos2iv glRasterPos2iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos2s(Int16 x, Int16 y);
+            internal static RasterPos2s glRasterPos2s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos2sv(Int16* v);
+            internal unsafe static RasterPos2sv glRasterPos2sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos3d(Double x, Double y, Double z);
+            internal static RasterPos3d glRasterPos3d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos3dv(Double* v);
+            internal unsafe static RasterPos3dv glRasterPos3dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos3f(Single x, Single y, Single z);
+            internal static RasterPos3f glRasterPos3f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos3fv(Single* v);
+            internal unsafe static RasterPos3fv glRasterPos3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos3i(Int32 x, Int32 y, Int32 z);
+            internal static RasterPos3i glRasterPos3i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos3iv(Int32* v);
+            internal unsafe static RasterPos3iv glRasterPos3iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos3s(Int16 x, Int16 y, Int16 z);
+            internal static RasterPos3s glRasterPos3s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos3sv(Int16* v);
+            internal unsafe static RasterPos3sv glRasterPos3sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos4d(Double x, Double y, Double z, Double w);
+            internal static RasterPos4d glRasterPos4d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos4dv(Double* v);
+            internal unsafe static RasterPos4dv glRasterPos4dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos4f(Single x, Single y, Single z, Single w);
+            internal static RasterPos4f glRasterPos4f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos4fv(Single* v);
+            internal unsafe static RasterPos4fv glRasterPos4fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos4i(Int32 x, Int32 y, Int32 z, Int32 w);
+            internal static RasterPos4i glRasterPos4i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos4iv(Int32* v);
+            internal unsafe static RasterPos4iv glRasterPos4iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RasterPos4s(Int16 x, Int16 y, Int16 z, Int16 w);
+            internal static RasterPos4s glRasterPos4s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RasterPos4sv(Int16* v);
+            internal unsafe static RasterPos4sv glRasterPos4sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Rectd(Double x1, Double y1, Double x2, Double y2);
+            internal static Rectd glRectd;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Rectdv(Double* v1, Double* v2);
+            internal unsafe static Rectdv glRectdv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Rectf(Single x1, Single y1, Single x2, Single y2);
+            internal static Rectf glRectf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Rectfv(Single* v1, Single* v2);
+            internal unsafe static Rectfv glRectfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Recti(Int32 x1, Int32 y1, Int32 x2, Int32 y2);
+            internal static Recti glRecti;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Rectiv(Int32* v1, Int32* v2);
+            internal unsafe static Rectiv glRectiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Rects(Int16 x1, Int16 y1, Int16 x2, Int16 y2);
+            internal static Rects glRects;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Rectsv(Int16* v1, Int16* v2);
+            internal unsafe static Rectsv glRectsv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord1d(Double s);
+            internal static TexCoord1d glTexCoord1d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord1dv(Double* v);
+            internal unsafe static TexCoord1dv glTexCoord1dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord1f(Single s);
+            internal static TexCoord1f glTexCoord1f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord1fv(Single* v);
+            internal unsafe static TexCoord1fv glTexCoord1fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord1i(Int32 s);
+            internal static TexCoord1i glTexCoord1i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord1iv(Int32* v);
+            internal unsafe static TexCoord1iv glTexCoord1iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord1s(Int16 s);
+            internal static TexCoord1s glTexCoord1s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord1sv(Int16* v);
+            internal unsafe static TexCoord1sv glTexCoord1sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord2d(Double s, Double t);
+            internal static TexCoord2d glTexCoord2d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord2dv(Double* v);
+            internal unsafe static TexCoord2dv glTexCoord2dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord2f(Single s, Single t);
+            internal static TexCoord2f glTexCoord2f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord2fv(Single* v);
+            internal unsafe static TexCoord2fv glTexCoord2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord2i(Int32 s, Int32 t);
+            internal static TexCoord2i glTexCoord2i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord2iv(Int32* v);
+            internal unsafe static TexCoord2iv glTexCoord2iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord2s(Int16 s, Int16 t);
+            internal static TexCoord2s glTexCoord2s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord2sv(Int16* v);
+            internal unsafe static TexCoord2sv glTexCoord2sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord3d(Double s, Double t, Double r);
+            internal static TexCoord3d glTexCoord3d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord3dv(Double* v);
+            internal unsafe static TexCoord3dv glTexCoord3dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord3f(Single s, Single t, Single r);
+            internal static TexCoord3f glTexCoord3f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord3fv(Single* v);
+            internal unsafe static TexCoord3fv glTexCoord3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord3i(Int32 s, Int32 t, Int32 r);
+            internal static TexCoord3i glTexCoord3i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord3iv(Int32* v);
+            internal unsafe static TexCoord3iv glTexCoord3iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord3s(Int16 s, Int16 t, Int16 r);
+            internal static TexCoord3s glTexCoord3s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord3sv(Int16* v);
+            internal unsafe static TexCoord3sv glTexCoord3sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord4d(Double s, Double t, Double r, Double q);
+            internal static TexCoord4d glTexCoord4d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord4dv(Double* v);
+            internal unsafe static TexCoord4dv glTexCoord4dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord4f(Single s, Single t, Single r, Single q);
+            internal static TexCoord4f glTexCoord4f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord4fv(Single* v);
+            internal unsafe static TexCoord4fv glTexCoord4fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord4i(Int32 s, Int32 t, Int32 r, Int32 q);
+            internal static TexCoord4i glTexCoord4i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord4iv(Int32* v);
+            internal unsafe static TexCoord4iv glTexCoord4iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord4s(Int16 s, Int16 t, Int16 r, Int16 q);
+            internal static TexCoord4s glTexCoord4s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord4sv(Int16* v);
+            internal unsafe static TexCoord4sv glTexCoord4sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex2d(Double x, Double y);
+            internal static Vertex2d glVertex2d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex2dv(Double* v);
+            internal unsafe static Vertex2dv glVertex2dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex2f(Single x, Single y);
+            internal static Vertex2f glVertex2f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex2fv(Single* v);
+            internal unsafe static Vertex2fv glVertex2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex2i(Int32 x, Int32 y);
+            internal static Vertex2i glVertex2i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex2iv(Int32* v);
+            internal unsafe static Vertex2iv glVertex2iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex2s(Int16 x, Int16 y);
+            internal static Vertex2s glVertex2s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex2sv(Int16* v);
+            internal unsafe static Vertex2sv glVertex2sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex3d(Double x, Double y, Double z);
+            internal static Vertex3d glVertex3d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex3dv(Double* v);
+            internal unsafe static Vertex3dv glVertex3dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex3f(Single x, Single y, Single z);
+            internal static Vertex3f glVertex3f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex3fv(Single* v);
+            internal unsafe static Vertex3fv glVertex3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex3i(Int32 x, Int32 y, Int32 z);
+            internal static Vertex3i glVertex3i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex3iv(Int32* v);
+            internal unsafe static Vertex3iv glVertex3iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex3s(Int16 x, Int16 y, Int16 z);
+            internal static Vertex3s glVertex3s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex3sv(Int16* v);
+            internal unsafe static Vertex3sv glVertex3sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex4d(Double x, Double y, Double z, Double w);
+            internal static Vertex4d glVertex4d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex4dv(Double* v);
+            internal unsafe static Vertex4dv glVertex4dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex4f(Single x, Single y, Single z, Single w);
+            internal static Vertex4f glVertex4f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex4fv(Single* v);
+            internal unsafe static Vertex4fv glVertex4fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex4i(Int32 x, Int32 y, Int32 z, Int32 w);
+            internal static Vertex4i glVertex4i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex4iv(Int32* v);
+            internal unsafe static Vertex4iv glVertex4iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex4s(Int16 x, Int16 y, Int16 z, Int16 w);
+            internal static Vertex4s glVertex4s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex4sv(Int16* v);
+            internal unsafe static Vertex4sv glVertex4sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ClipPlane(int plane, Double* equation);
+            internal unsafe static ClipPlane glClipPlane;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorMaterial(int face, int mode);
+            internal static ColorMaterial glColorMaterial;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CullFace(int mode);
+            internal static CullFace glCullFace;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Fogf(int pname, Single param);
+            internal static Fogf glFogf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Fogfv(int pname, Single* @params);
+            internal unsafe static Fogfv glFogfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Fogi(int pname, Int32 param);
+            internal static Fogi glFogi;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Fogiv(int pname, Int32* @params);
+            internal unsafe static Fogiv glFogiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FrontFace(int mode);
+            internal static FrontFace glFrontFace;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Hint(int target, int mode);
+            internal static Hint glHint;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Lightf(int light, int pname, Single param);
+            internal static Lightf glLightf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Lightfv(int light, int pname, Single* @params);
+            internal unsafe static Lightfv glLightfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Lighti(int light, int pname, Int32 param);
+            internal static Lighti glLighti;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Lightiv(int light, int pname, Int32* @params);
+            internal unsafe static Lightiv glLightiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LightModelf(int pname, Single param);
+            internal static LightModelf glLightModelf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void LightModelfv(int pname, Single* @params);
+            internal unsafe static LightModelfv glLightModelfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LightModeli(int pname, Int32 param);
+            internal static LightModeli glLightModeli;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void LightModeliv(int pname, Int32* @params);
+            internal unsafe static LightModeliv glLightModeliv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LineStipple(Int32 factor, UInt16 pattern);
+            internal static LineStipple glLineStipple;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LineWidth(Single width);
+            internal static LineWidth glLineWidth;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Materialf(int face, int pname, Single param);
+            internal static Materialf glMaterialf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Materialfv(int face, int pname, Single* @params);
+            internal unsafe static Materialfv glMaterialfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Materiali(int face, int pname, Int32 param);
+            internal static Materiali glMateriali;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Materialiv(int face, int pname, Int32* @params);
+            internal unsafe static Materialiv glMaterialiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PointSize(Single size);
+            internal static PointSize glPointSize;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PolygonMode(int face, int mode);
+            internal static PolygonMode glPolygonMode;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PolygonStipple(Byte* mask);
+            internal unsafe static PolygonStipple glPolygonStipple;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Scissor(Int32 x, Int32 y, Int32 width, Int32 height);
+            internal static Scissor glScissor;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ShadeModel(int mode);
+            internal static ShadeModel glShadeModel;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexParameterf(int target, int pname, Single param);
+            internal static TexParameterf glTexParameterf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexParameterfv(int target, int pname, Single* @params);
+            internal unsafe static TexParameterfv glTexParameterfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexParameteri(int target, int pname, Int32 param);
+            internal static TexParameteri glTexParameteri;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexParameteriv(int target, int pname, Int32* @params);
+            internal unsafe static TexParameteriv glTexParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexImage1D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 border, int format, int type, IntPtr pixels);
+            internal static TexImage1D glTexImage1D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexImage2D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 height, Int32 border, int format, int type, IntPtr pixels);
+            internal static TexImage2D glTexImage2D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexEnvf(int target, int pname, Single param);
+            internal static TexEnvf glTexEnvf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexEnvfv(int target, int pname, Single* @params);
+            internal unsafe static TexEnvfv glTexEnvfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexEnvi(int target, int pname, Int32 param);
+            internal static TexEnvi glTexEnvi;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexEnviv(int target, int pname, Int32* @params);
+            internal unsafe static TexEnviv glTexEnviv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexGend(int coord, int pname, Double param);
+            internal static TexGend glTexGend;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexGendv(int coord, int pname, Double* @params);
+            internal unsafe static TexGendv glTexGendv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexGenf(int coord, int pname, Single param);
+            internal static TexGenf glTexGenf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexGenfv(int coord, int pname, Single* @params);
+            internal unsafe static TexGenfv glTexGenfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexGeni(int coord, int pname, Int32 param);
+            internal static TexGeni glTexGeni;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexGeniv(int coord, int pname, Int32* @params);
+            internal unsafe static TexGeniv glTexGeniv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FeedbackBuffer(Int32 size, int type, [Out] Single* buffer);
+            internal unsafe static FeedbackBuffer glFeedbackBuffer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SelectBuffer(Int32 size, [Out] UInt32* buffer);
+            internal unsafe static SelectBuffer glSelectBuffer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 RenderMode(int mode);
+            internal static RenderMode glRenderMode;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void InitNames();
+            internal static InitNames glInitNames;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LoadName(UInt32 name);
+            internal static LoadName glLoadName;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PassThrough(Single token);
+            internal static PassThrough glPassThrough;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PopName();
+            internal static PopName glPopName;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PushName(UInt32 name);
+            internal static PushName glPushName;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawBuffer(int mode);
+            internal static DrawBuffer glDrawBuffer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Clear(int mask);
+            internal static Clear glClear;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClearAccum(Single red, Single green, Single blue, Single alpha);
+            internal static ClearAccum glClearAccum;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClearIndex(Single c);
+            internal static ClearIndex glClearIndex;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClearColor(Single red, Single green, Single blue, Single alpha);
+            internal static ClearColor glClearColor;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClearStencil(Int32 s);
+            internal static ClearStencil glClearStencil;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClearDepth(Double depth);
+            internal static ClearDepth glClearDepth;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StencilMask(UInt32 mask);
+            internal static StencilMask glStencilMask;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorMask(bool red, bool green, bool blue, bool alpha);
+            internal static ColorMask glColorMask;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DepthMask(bool flag);
+            internal static DepthMask glDepthMask;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void IndexMask(UInt32 mask);
+            internal static IndexMask glIndexMask;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Accum(int op, Single value);
+            internal static Accum glAccum;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Disable(int cap);
+            internal static Disable glDisable;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Enable(int cap);
+            internal static Enable glEnable;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Finish();
+            internal static Finish glFinish;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Flush();
+            internal static Flush glFlush;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PopAttrib();
+            internal static PopAttrib glPopAttrib;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PushAttrib(int mask);
+            internal static PushAttrib glPushAttrib;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Map1d(int target, Double u1, Double u2, Int32 stride, Int32 order, Double* points);
+            internal unsafe static Map1d glMap1d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Map1f(int target, Single u1, Single u2, Int32 stride, Int32 order, Single* points);
+            internal unsafe static Map1f glMap1f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Map2d(int target, Double u1, Double u2, Int32 ustride, Int32 uorder, Double v1, Double v2, Int32 vstride, Int32 vorder, Double* points);
+            internal unsafe static Map2d glMap2d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Map2f(int target, Single u1, Single u2, Int32 ustride, Int32 uorder, Single v1, Single v2, Int32 vstride, Int32 vorder, Single* points);
+            internal unsafe static Map2f glMap2f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MapGrid1d(Int32 un, Double u1, Double u2);
+            internal static MapGrid1d glMapGrid1d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MapGrid1f(Int32 un, Single u1, Single u2);
+            internal static MapGrid1f glMapGrid1f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MapGrid2d(Int32 un, Double u1, Double u2, Int32 vn, Double v1, Double v2);
+            internal static MapGrid2d glMapGrid2d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MapGrid2f(Int32 un, Single u1, Single u2, Int32 vn, Single v1, Single v2);
+            internal static MapGrid2f glMapGrid2f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EvalCoord1d(Double u);
+            internal static EvalCoord1d glEvalCoord1d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void EvalCoord1dv(Double* u);
+            internal unsafe static EvalCoord1dv glEvalCoord1dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EvalCoord1f(Single u);
+            internal static EvalCoord1f glEvalCoord1f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void EvalCoord1fv(Single* u);
+            internal unsafe static EvalCoord1fv glEvalCoord1fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EvalCoord2d(Double u, Double v);
+            internal static EvalCoord2d glEvalCoord2d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void EvalCoord2dv(Double* u);
+            internal unsafe static EvalCoord2dv glEvalCoord2dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EvalCoord2f(Single u, Single v);
+            internal static EvalCoord2f glEvalCoord2f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void EvalCoord2fv(Single* u);
+            internal unsafe static EvalCoord2fv glEvalCoord2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EvalMesh1(int mode, Int32 i1, Int32 i2);
+            internal static EvalMesh1 glEvalMesh1;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EvalPoint1(Int32 i);
+            internal static EvalPoint1 glEvalPoint1;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EvalMesh2(int mode, Int32 i1, Int32 i2, Int32 j1, Int32 j2);
+            internal static EvalMesh2 glEvalMesh2;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EvalPoint2(Int32 i, Int32 j);
+            internal static EvalPoint2 glEvalPoint2;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void AlphaFunc(int func, Single @ref);
+            internal static AlphaFunc glAlphaFunc;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlendFunc(int sfactor, int dfactor);
+            internal static BlendFunc glBlendFunc;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LogicOp(int opcode);
+            internal static LogicOp glLogicOp;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StencilFunc(int func, Int32 @ref, UInt32 mask);
+            internal static StencilFunc glStencilFunc;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StencilOp(int fail, int zfail, int zpass);
+            internal static StencilOp glStencilOp;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DepthFunc(int func);
+            internal static DepthFunc glDepthFunc;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelZoom(Single xfactor, Single yfactor);
+            internal static PixelZoom glPixelZoom;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelTransferf(int pname, Single param);
+            internal static PixelTransferf glPixelTransferf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelTransferi(int pname, Int32 param);
+            internal static PixelTransferi glPixelTransferi;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelStoref(int pname, Single param);
+            internal static PixelStoref glPixelStoref;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelStorei(int pname, Int32 param);
+            internal static PixelStorei glPixelStorei;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PixelMapfv(int map, Int32 mapsize, Single* values);
+            internal unsafe static PixelMapfv glPixelMapfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PixelMapuiv(int map, Int32 mapsize, UInt32* values);
+            internal unsafe static PixelMapuiv glPixelMapuiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PixelMapusv(int map, Int32 mapsize, UInt16* values);
+            internal unsafe static PixelMapusv glPixelMapusv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReadBuffer(int mode);
+            internal static ReadBuffer glReadBuffer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyPixels(Int32 x, Int32 y, Int32 width, Int32 height, int type);
+            internal static CopyPixels glCopyPixels;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReadPixels(Int32 x, Int32 y, Int32 width, Int32 height, int format, int type, [Out] IntPtr pixels);
+            internal static ReadPixels glReadPixels;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawPixels(Int32 width, Int32 height, int format, int type, IntPtr pixels);
+            internal static DrawPixels glDrawPixels;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetBooleanv(int pname, [Out] bool* @params);
+            internal unsafe static GetBooleanv glGetBooleanv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetClipPlane(int plane, [Out] Double* equation);
+            internal unsafe static GetClipPlane glGetClipPlane;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetDoublev(int pname, [Out] Double* @params);
+            internal unsafe static GetDoublev glGetDoublev;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate int GetError();
+            internal static GetError glGetError;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetFloatv(int pname, [Out] Single* @params);
+            internal unsafe static GetFloatv glGetFloatv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetIntegerv(int pname, [Out] Int32* @params);
+            internal unsafe static GetIntegerv glGetIntegerv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetLightfv(int light, int pname, [Out] Single* @params);
+            internal unsafe static GetLightfv glGetLightfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetLightiv(int light, int pname, [Out] Int32* @params);
+            internal unsafe static GetLightiv glGetLightiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMapdv(int target, int query, [Out] Double* v);
+            internal unsafe static GetMapdv glGetMapdv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMapfv(int target, int query, [Out] Single* v);
+            internal unsafe static GetMapfv glGetMapfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMapiv(int target, int query, [Out] Int32* v);
+            internal unsafe static GetMapiv glGetMapiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMaterialfv(int face, int pname, [Out] Single* @params);
+            internal unsafe static GetMaterialfv glGetMaterialfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMaterialiv(int face, int pname, [Out] Int32* @params);
+            internal unsafe static GetMaterialiv glGetMaterialiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetPixelMapfv(int map, [Out] Single* values);
+            internal unsafe static GetPixelMapfv glGetPixelMapfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetPixelMapuiv(int map, [Out] UInt32* values);
+            internal unsafe static GetPixelMapuiv glGetPixelMapuiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetPixelMapusv(int map, [Out] UInt16* values);
+            internal unsafe static GetPixelMapusv glGetPixelMapusv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetPolygonStipple([Out] Byte* mask);
+            internal unsafe static GetPolygonStipple glGetPolygonStipple;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetString(int name);
+            internal static GetString glGetString;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexEnvfv(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetTexEnvfv glGetTexEnvfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexEnviv(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetTexEnviv glGetTexEnviv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexGendv(int coord, int pname, [Out] Double* @params);
+            internal unsafe static GetTexGendv glGetTexGendv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexGenfv(int coord, int pname, [Out] Single* @params);
+            internal unsafe static GetTexGenfv glGetTexGenfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexGeniv(int coord, int pname, [Out] Int32* @params);
+            internal unsafe static GetTexGeniv glGetTexGeniv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetTexImage(int target, Int32 level, int format, int type, [Out] IntPtr pixels);
+            internal static GetTexImage glGetTexImage;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexParameterfv(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetTexParameterfv glGetTexParameterfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexParameteriv(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetTexParameteriv glGetTexParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexLevelParameterfv(int target, Int32 level, int pname, [Out] Single* @params);
+            internal unsafe static GetTexLevelParameterfv glGetTexLevelParameterfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexLevelParameteriv(int target, Int32 level, int pname, [Out] Int32* @params);
+            internal unsafe static GetTexLevelParameteriv glGetTexLevelParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsEnabled(int cap);
+            internal static IsEnabled glIsEnabled;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsList(UInt32 list);
+            internal static IsList glIsList;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DepthRange(Double near, Double far);
+            internal static DepthRange glDepthRange;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Frustum(Double left, Double right, Double bottom, Double top, Double zNear, Double zFar);
+            internal static Frustum glFrustum;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LoadIdentity();
+            internal static LoadIdentity glLoadIdentity;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void LoadMatrixf(Single* m);
+            internal unsafe static LoadMatrixf glLoadMatrixf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void LoadMatrixd(Double* m);
+            internal unsafe static LoadMatrixd glLoadMatrixd;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MatrixMode(int mode);
+            internal static MatrixMode glMatrixMode;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultMatrixf(Single* m);
+            internal unsafe static MultMatrixf glMultMatrixf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultMatrixd(Double* m);
+            internal unsafe static MultMatrixd glMultMatrixd;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Ortho(Double left, Double right, Double bottom, Double top, Double zNear, Double zFar);
+            internal static Ortho glOrtho;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PopMatrix();
+            internal static PopMatrix glPopMatrix;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PushMatrix();
+            internal static PushMatrix glPushMatrix;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Rotated(Double angle, Double x, Double y, Double z);
+            internal static Rotated glRotated;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Rotatef(Single angle, Single x, Single y, Single z);
+            internal static Rotatef glRotatef;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Scaled(Double x, Double y, Double z);
+            internal static Scaled glScaled;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Scalef(Single x, Single y, Single z);
+            internal static Scalef glScalef;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Translated(Double x, Double y, Double z);
+            internal static Translated glTranslated;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Translatef(Single x, Single y, Single z);
+            internal static Translatef glTranslatef;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Viewport(Int32 x, Int32 y, Int32 width, Int32 height);
+            internal static Viewport glViewport;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ArrayElement(Int32 i);
+            internal static ArrayElement glArrayElement;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorPointer(Int32 size, int type, Int32 stride, IntPtr pointer);
+            internal static ColorPointer glColorPointer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DisableClientState(int array);
+            internal static DisableClientState glDisableClientState;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawArrays(int mode, Int32 first, Int32 count);
+            internal static DrawArrays glDrawArrays;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawElements(int mode, Int32 count, int type, IntPtr indices);
+            internal static DrawElements glDrawElements;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EdgeFlagPointer(Int32 stride, IntPtr pointer);
+            internal static EdgeFlagPointer glEdgeFlagPointer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EnableClientState(int array);
+            internal static EnableClientState glEnableClientState;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetPointerv(int pname, [Out] IntPtr @params);
+            internal static GetPointerv glGetPointerv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void IndexPointer(int type, Int32 stride, IntPtr pointer);
+            internal static IndexPointer glIndexPointer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void InterleavedArrays(int format, Int32 stride, IntPtr pointer);
+            internal static InterleavedArrays glInterleavedArrays;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void NormalPointer(int type, Int32 stride, IntPtr pointer);
+            internal static NormalPointer glNormalPointer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoordPointer(Int32 size, int type, Int32 stride, IntPtr pointer);
+            internal static TexCoordPointer glTexCoordPointer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexPointer(Int32 size, int type, Int32 stride, IntPtr pointer);
+            internal static VertexPointer glVertexPointer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PolygonOffset(Single factor, Single units);
+            internal static PolygonOffset glPolygonOffset;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyTexImage1D(int target, Int32 level, int internalformat, Int32 x, Int32 y, Int32 width, Int32 border);
+            internal static CopyTexImage1D glCopyTexImage1D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyTexImage2D(int target, Int32 level, int internalformat, Int32 x, Int32 y, Int32 width, Int32 height, Int32 border);
+            internal static CopyTexImage2D glCopyTexImage2D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyTexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 x, Int32 y, Int32 width);
+            internal static CopyTexSubImage1D glCopyTexSubImage1D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyTexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 x, Int32 y, Int32 width, Int32 height);
+            internal static CopyTexSubImage2D glCopyTexSubImage2D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 width, int format, int type, IntPtr pixels);
+            internal static TexSubImage1D glTexSubImage1D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, int type, IntPtr pixels);
+            internal static TexSubImage2D glTexSubImage2D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate bool AreTexturesResident(Int32 n, UInt32* textures, [Out] bool* residences);
+            internal unsafe static AreTexturesResident glAreTexturesResident;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindTexture(int target, UInt32 texture);
+            internal static BindTexture glBindTexture;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteTextures(Int32 n, UInt32* textures);
+            internal unsafe static DeleteTextures glDeleteTextures;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenTextures(Int32 n, [Out] UInt32* textures);
+            internal unsafe static GenTextures glGenTextures;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsTexture(UInt32 texture);
+            internal static IsTexture glIsTexture;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PrioritizeTextures(Int32 n, UInt32* textures, Single* priorities);
+            internal unsafe static PrioritizeTextures glPrioritizeTextures;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Indexub(Byte c);
+            internal static Indexub glIndexub;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Indexubv(Byte* c);
+            internal unsafe static Indexubv glIndexubv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PopClientAttrib();
+            internal static PopClientAttrib glPopClientAttrib;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PushClientAttrib(int mask);
+            internal static PushClientAttrib glPushClientAttrib;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlendColor(Single red, Single green, Single blue, Single alpha);
+            internal static BlendColor glBlendColor;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlendEquation(int mode);
+            internal static BlendEquation glBlendEquation;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawRangeElements(int mode, UInt32 start, UInt32 end, Int32 count, int type, IntPtr indices);
+            internal static DrawRangeElements glDrawRangeElements;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorTable(int target, int internalformat, Int32 width, int format, int type, IntPtr table);
+            internal static ColorTable glColorTable;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ColorTableParameterfv(int target, int pname, Single* @params);
+            internal unsafe static ColorTableParameterfv glColorTableParameterfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ColorTableParameteriv(int target, int pname, Int32* @params);
+            internal unsafe static ColorTableParameteriv glColorTableParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyColorTable(int target, int internalformat, Int32 x, Int32 y, Int32 width);
+            internal static CopyColorTable glCopyColorTable;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetColorTable(int target, int format, int type, [Out] IntPtr table);
+            internal static GetColorTable glGetColorTable;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetColorTableParameterfv(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetColorTableParameterfv glGetColorTableParameterfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetColorTableParameteriv(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetColorTableParameteriv glGetColorTableParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorSubTable(int target, Int32 start, Int32 count, int format, int type, IntPtr data);
+            internal static ColorSubTable glColorSubTable;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyColorSubTable(int target, Int32 start, Int32 x, Int32 y, Int32 width);
+            internal static CopyColorSubTable glCopyColorSubTable;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ConvolutionFilter1D(int target, int internalformat, Int32 width, int format, int type, IntPtr image);
+            internal static ConvolutionFilter1D glConvolutionFilter1D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ConvolutionFilter2D(int target, int internalformat, Int32 width, Int32 height, int format, int type, IntPtr image);
+            internal static ConvolutionFilter2D glConvolutionFilter2D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ConvolutionParameterf(int target, int pname, Single @params);
+            internal static ConvolutionParameterf glConvolutionParameterf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ConvolutionParameterfv(int target, int pname, Single* @params);
+            internal unsafe static ConvolutionParameterfv glConvolutionParameterfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ConvolutionParameteri(int target, int pname, Int32 @params);
+            internal static ConvolutionParameteri glConvolutionParameteri;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ConvolutionParameteriv(int target, int pname, Int32* @params);
+            internal unsafe static ConvolutionParameteriv glConvolutionParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyConvolutionFilter1D(int target, int internalformat, Int32 x, Int32 y, Int32 width);
+            internal static CopyConvolutionFilter1D glCopyConvolutionFilter1D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyConvolutionFilter2D(int target, int internalformat, Int32 x, Int32 y, Int32 width, Int32 height);
+            internal static CopyConvolutionFilter2D glCopyConvolutionFilter2D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetConvolutionFilter(int target, int format, int type, [Out] IntPtr image);
+            internal static GetConvolutionFilter glGetConvolutionFilter;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetConvolutionParameterfv(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetConvolutionParameterfv glGetConvolutionParameterfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetConvolutionParameteriv(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetConvolutionParameteriv glGetConvolutionParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetSeparableFilter(int target, int format, int type, [Out] IntPtr row, [Out] IntPtr column, [Out] IntPtr span);
+            internal static GetSeparableFilter glGetSeparableFilter;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SeparableFilter2D(int target, int internalformat, Int32 width, Int32 height, int format, int type, IntPtr row, IntPtr column);
+            internal static SeparableFilter2D glSeparableFilter2D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetHistogram(int target, bool reset, int format, int type, [Out] IntPtr values);
+            internal static GetHistogram glGetHistogram;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetHistogramParameterfv(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetHistogramParameterfv glGetHistogramParameterfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetHistogramParameteriv(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetHistogramParameteriv glGetHistogramParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetMinmax(int target, bool reset, int format, int type, [Out] IntPtr values);
+            internal static GetMinmax glGetMinmax;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMinmaxParameterfv(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetMinmaxParameterfv glGetMinmaxParameterfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMinmaxParameteriv(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetMinmaxParameteriv glGetMinmaxParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Histogram(int target, Int32 width, int internalformat, bool sink);
+            internal static Histogram glHistogram;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Minmax(int target, int internalformat, bool sink);
+            internal static Minmax glMinmax;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ResetHistogram(int target);
+            internal static ResetHistogram glResetHistogram;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ResetMinmax(int target);
+            internal static ResetMinmax glResetMinmax;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexImage3D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, int format, int type, IntPtr pixels);
+            internal static TexImage3D glTexImage3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, int type, IntPtr pixels);
+            internal static TexSubImage3D glTexSubImage3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyTexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 x, Int32 y, Int32 width, Int32 height);
+            internal static CopyTexSubImage3D glCopyTexSubImage3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ActiveTexture(int texture);
+            internal static ActiveTexture glActiveTexture;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClientActiveTexture(int texture);
+            internal static ClientActiveTexture glClientActiveTexture;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord1d(int target, Double s);
+            internal static MultiTexCoord1d glMultiTexCoord1d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord1dv(int target, Double* v);
+            internal unsafe static MultiTexCoord1dv glMultiTexCoord1dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord1f(int target, Single s);
+            internal static MultiTexCoord1f glMultiTexCoord1f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord1fv(int target, Single* v);
+            internal unsafe static MultiTexCoord1fv glMultiTexCoord1fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord1i(int target, Int32 s);
+            internal static MultiTexCoord1i glMultiTexCoord1i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord1iv(int target, Int32* v);
+            internal unsafe static MultiTexCoord1iv glMultiTexCoord1iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord1s(int target, Int16 s);
+            internal static MultiTexCoord1s glMultiTexCoord1s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord1sv(int target, Int16* v);
+            internal unsafe static MultiTexCoord1sv glMultiTexCoord1sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord2d(int target, Double s, Double t);
+            internal static MultiTexCoord2d glMultiTexCoord2d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord2dv(int target, Double* v);
+            internal unsafe static MultiTexCoord2dv glMultiTexCoord2dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord2f(int target, Single s, Single t);
+            internal static MultiTexCoord2f glMultiTexCoord2f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord2fv(int target, Single* v);
+            internal unsafe static MultiTexCoord2fv glMultiTexCoord2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord2i(int target, Int32 s, Int32 t);
+            internal static MultiTexCoord2i glMultiTexCoord2i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord2iv(int target, Int32* v);
+            internal unsafe static MultiTexCoord2iv glMultiTexCoord2iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord2s(int target, Int16 s, Int16 t);
+            internal static MultiTexCoord2s glMultiTexCoord2s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord2sv(int target, Int16* v);
+            internal unsafe static MultiTexCoord2sv glMultiTexCoord2sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord3d(int target, Double s, Double t, Double r);
+            internal static MultiTexCoord3d glMultiTexCoord3d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord3dv(int target, Double* v);
+            internal unsafe static MultiTexCoord3dv glMultiTexCoord3dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord3f(int target, Single s, Single t, Single r);
+            internal static MultiTexCoord3f glMultiTexCoord3f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord3fv(int target, Single* v);
+            internal unsafe static MultiTexCoord3fv glMultiTexCoord3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord3i(int target, Int32 s, Int32 t, Int32 r);
+            internal static MultiTexCoord3i glMultiTexCoord3i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord3iv(int target, Int32* v);
+            internal unsafe static MultiTexCoord3iv glMultiTexCoord3iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord3s(int target, Int16 s, Int16 t, Int16 r);
+            internal static MultiTexCoord3s glMultiTexCoord3s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord3sv(int target, Int16* v);
+            internal unsafe static MultiTexCoord3sv glMultiTexCoord3sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord4d(int target, Double s, Double t, Double r, Double q);
+            internal static MultiTexCoord4d glMultiTexCoord4d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord4dv(int target, Double* v);
+            internal unsafe static MultiTexCoord4dv glMultiTexCoord4dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord4f(int target, Single s, Single t, Single r, Single q);
+            internal static MultiTexCoord4f glMultiTexCoord4f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord4fv(int target, Single* v);
+            internal unsafe static MultiTexCoord4fv glMultiTexCoord4fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord4i(int target, Int32 s, Int32 t, Int32 r, Int32 q);
+            internal static MultiTexCoord4i glMultiTexCoord4i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord4iv(int target, Int32* v);
+            internal unsafe static MultiTexCoord4iv glMultiTexCoord4iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord4s(int target, Int16 s, Int16 t, Int16 r, Int16 q);
+            internal static MultiTexCoord4s glMultiTexCoord4s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord4sv(int target, Int16* v);
+            internal unsafe static MultiTexCoord4sv glMultiTexCoord4sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void LoadTransposeMatrixf(Single* m);
+            internal unsafe static LoadTransposeMatrixf glLoadTransposeMatrixf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void LoadTransposeMatrixd(Double* m);
+            internal unsafe static LoadTransposeMatrixd glLoadTransposeMatrixd;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultTransposeMatrixf(Single* m);
+            internal unsafe static MultTransposeMatrixf glMultTransposeMatrixf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultTransposeMatrixd(Double* m);
+            internal unsafe static MultTransposeMatrixd glMultTransposeMatrixd;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SampleCoverage(Single value, bool invert);
+            internal static SampleCoverage glSampleCoverage;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexImage3D(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, Int32 imageSize, IntPtr data);
+            internal static CompressedTexImage3D glCompressedTexImage3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexImage2D(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 border, Int32 imageSize, IntPtr data);
+            internal static CompressedTexImage2D glCompressedTexImage2D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexImage1D(int target, Int32 level, int internalformat, Int32 width, Int32 border, Int32 imageSize, IntPtr data);
+            internal static CompressedTexImage1D glCompressedTexImage1D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, Int32 imageSize, IntPtr data);
+            internal static CompressedTexSubImage3D glCompressedTexSubImage3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, Int32 imageSize, IntPtr data);
+            internal static CompressedTexSubImage2D glCompressedTexSubImage2D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 width, int format, Int32 imageSize, IntPtr data);
+            internal static CompressedTexSubImage1D glCompressedTexSubImage1D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetCompressedTexImage(int target, Int32 level, [Out] IntPtr img);
+            internal static GetCompressedTexImage glGetCompressedTexImage;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlendFuncSeparate(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha);
+            internal static BlendFuncSeparate glBlendFuncSeparate;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FogCoordf(Single coord);
+            internal static FogCoordf glFogCoordf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FogCoordfv(Single* coord);
+            internal unsafe static FogCoordfv glFogCoordfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FogCoordd(Double coord);
+            internal static FogCoordd glFogCoordd;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FogCoorddv(Double* coord);
+            internal unsafe static FogCoorddv glFogCoorddv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FogCoordPointer(int type, Int32 stride, IntPtr pointer);
+            internal static FogCoordPointer glFogCoordPointer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiDrawArrays(int mode, [Out] Int32* first, [Out] Int32* count, Int32 primcount);
+            internal unsafe static MultiDrawArrays glMultiDrawArrays;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiDrawElements(int mode, Int32* count, int type, IntPtr indices, Int32 primcount);
+            internal unsafe static MultiDrawElements glMultiDrawElements;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PointParameterf(int pname, Single param);
+            internal static PointParameterf glPointParameterf;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PointParameterfv(int pname, Single* @params);
+            internal unsafe static PointParameterfv glPointParameterfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PointParameteri(int pname, Int32 param);
+            internal static PointParameteri glPointParameteri;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PointParameteriv(int pname, Int32* @params);
+            internal unsafe static PointParameteriv glPointParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3b(SByte red, SByte green, SByte blue);
+            internal static SecondaryColor3b glSecondaryColor3b;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3bv(SByte* v);
+            internal unsafe static SecondaryColor3bv glSecondaryColor3bv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3d(Double red, Double green, Double blue);
+            internal static SecondaryColor3d glSecondaryColor3d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3dv(Double* v);
+            internal unsafe static SecondaryColor3dv glSecondaryColor3dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3f(Single red, Single green, Single blue);
+            internal static SecondaryColor3f glSecondaryColor3f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3fv(Single* v);
+            internal unsafe static SecondaryColor3fv glSecondaryColor3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3i(Int32 red, Int32 green, Int32 blue);
+            internal static SecondaryColor3i glSecondaryColor3i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3iv(Int32* v);
+            internal unsafe static SecondaryColor3iv glSecondaryColor3iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3s(Int16 red, Int16 green, Int16 blue);
+            internal static SecondaryColor3s glSecondaryColor3s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3sv(Int16* v);
+            internal unsafe static SecondaryColor3sv glSecondaryColor3sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3ub(Byte red, Byte green, Byte blue);
+            internal static SecondaryColor3ub glSecondaryColor3ub;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3ubv(Byte* v);
+            internal unsafe static SecondaryColor3ubv glSecondaryColor3ubv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3ui(UInt32 red, UInt32 green, UInt32 blue);
+            internal static SecondaryColor3ui glSecondaryColor3ui;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3uiv(UInt32* v);
+            internal unsafe static SecondaryColor3uiv glSecondaryColor3uiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3us(UInt16 red, UInt16 green, UInt16 blue);
+            internal static SecondaryColor3us glSecondaryColor3us;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3usv(UInt16* v);
+            internal unsafe static SecondaryColor3usv glSecondaryColor3usv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColorPointer(Int32 size, int type, Int32 stride, IntPtr pointer);
+            internal static SecondaryColorPointer glSecondaryColorPointer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2d(Double x, Double y);
+            internal static WindowPos2d glWindowPos2d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2dv(Double* v);
+            internal unsafe static WindowPos2dv glWindowPos2dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2f(Single x, Single y);
+            internal static WindowPos2f glWindowPos2f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2fv(Single* v);
+            internal unsafe static WindowPos2fv glWindowPos2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2i(Int32 x, Int32 y);
+            internal static WindowPos2i glWindowPos2i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2iv(Int32* v);
+            internal unsafe static WindowPos2iv glWindowPos2iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2s(Int16 x, Int16 y);
+            internal static WindowPos2s glWindowPos2s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2sv(Int16* v);
+            internal unsafe static WindowPos2sv glWindowPos2sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3d(Double x, Double y, Double z);
+            internal static WindowPos3d glWindowPos3d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3dv(Double* v);
+            internal unsafe static WindowPos3dv glWindowPos3dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3f(Single x, Single y, Single z);
+            internal static WindowPos3f glWindowPos3f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3fv(Single* v);
+            internal unsafe static WindowPos3fv glWindowPos3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3i(Int32 x, Int32 y, Int32 z);
+            internal static WindowPos3i glWindowPos3i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3iv(Int32* v);
+            internal unsafe static WindowPos3iv glWindowPos3iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3s(Int16 x, Int16 y, Int16 z);
+            internal static WindowPos3s glWindowPos3s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3sv(Int16* v);
+            internal unsafe static WindowPos3sv glWindowPos3sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenQueries(Int32 n, [Out] UInt32* ids);
+            internal unsafe static GenQueries glGenQueries;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteQueries(Int32 n, UInt32* ids);
+            internal unsafe static DeleteQueries glDeleteQueries;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsQuery(UInt32 id);
+            internal static IsQuery glIsQuery;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BeginQuery(int target, UInt32 id);
+            internal static BeginQuery glBeginQuery;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EndQuery(int target);
+            internal static EndQuery glEndQuery;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetQueryiv(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetQueryiv glGetQueryiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetQueryObjectiv(UInt32 id, int pname, [Out] Int32* @params);
+            internal unsafe static GetQueryObjectiv glGetQueryObjectiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetQueryObjectuiv(UInt32 id, int pname, [Out] UInt32* @params);
+            internal unsafe static GetQueryObjectuiv glGetQueryObjectuiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindBuffer(int target, UInt32 buffer);
+            internal static BindBuffer glBindBuffer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteBuffers(Int32 n, UInt32* buffers);
+            internal unsafe static DeleteBuffers glDeleteBuffers;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenBuffers(Int32 n, [Out] UInt32* buffers);
+            internal unsafe static GenBuffers glGenBuffers;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsBuffer(UInt32 buffer);
+            internal static IsBuffer glIsBuffer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BufferData(int target, IntPtr size, IntPtr data, int usage);
+            internal static BufferData glBufferData;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BufferSubData(int target, IntPtr offset, IntPtr size, IntPtr data);
+            internal static BufferSubData glBufferSubData;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetBufferSubData(int target, IntPtr offset, IntPtr size, [Out] IntPtr data);
+            internal static GetBufferSubData glGetBufferSubData;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate IntPtr MapBuffer(int target, int access);
+            internal unsafe static MapBuffer glMapBuffer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool UnmapBuffer(int target);
+            internal static UnmapBuffer glUnmapBuffer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetBufferParameteriv(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetBufferParameteriv glGetBufferParameteriv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetBufferPointerv(int target, int pname, [Out] IntPtr @params);
+            internal static GetBufferPointerv glGetBufferPointerv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlendEquationSeparate(int modeRGB, int modeAlpha);
+            internal static BlendEquationSeparate glBlendEquationSeparate;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DrawBuffers(Int32 n, int* bufs);
+            internal unsafe static DrawBuffers glDrawBuffers;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StencilOpSeparate(int face, int sfail, int dpfail, int dppass);
+            internal static StencilOpSeparate glStencilOpSeparate;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StencilFuncSeparate(int frontfunc, int backfunc, Int32 @ref, UInt32 mask);
+            internal static StencilFuncSeparate glStencilFuncSeparate;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StencilMaskSeparate(int face, UInt32 mask);
+            internal static StencilMaskSeparate glStencilMaskSeparate;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void AttachShader(UInt32 program, UInt32 shader);
+            internal static AttachShader glAttachShader;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindAttribLocation(UInt32 program, UInt32 index, System.String name);
+            internal static BindAttribLocation glBindAttribLocation;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompileShader(UInt32 shader);
+            internal static CompileShader glCompileShader;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 CreateProgram();
+            internal static CreateProgram glCreateProgram;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 CreateShader(int type);
+            internal static CreateShader glCreateShader;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DeleteProgram(UInt32 program);
+            internal static DeleteProgram glDeleteProgram;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DeleteShader(UInt32 shader);
+            internal static DeleteShader glDeleteShader;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DetachShader(UInt32 program, UInt32 shader);
+            internal static DetachShader glDetachShader;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DisableVertexAttribArray(UInt32 index);
+            internal static DisableVertexAttribArray glDisableVertexAttribArray;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EnableVertexAttribArray(UInt32 index);
+            internal static EnableVertexAttribArray glEnableVertexAttribArray;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetActiveAttrib(UInt32 program, UInt32 index, Int32 bufSize, [Out] Int32* length, [Out] Int32* size, [Out] int* type, [Out] System.Text.StringBuilder name);
+            internal unsafe static GetActiveAttrib glGetActiveAttrib;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetActiveUniform(UInt32 program, UInt32 index, Int32 bufSize, [Out] Int32* length, [Out] Int32* size, [Out] int* type, [Out] System.Text.StringBuilder name);
+            internal unsafe static GetActiveUniform glGetActiveUniform;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetAttachedShaders(UInt32 program, Int32 maxCount, [Out] Int32* count, [Out] UInt32* obj);
+            internal unsafe static GetAttachedShaders glGetAttachedShaders;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GetAttribLocation(UInt32 program, System.String name);
+            internal static GetAttribLocation glGetAttribLocation;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramiv(UInt32 program, int pname, [Out] Int32* @params);
+            internal unsafe static GetProgramiv glGetProgramiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramInfoLog(UInt32 program, Int32 bufSize, [Out] Int32* length, [Out] System.Text.StringBuilder infoLog);
+            internal unsafe static GetProgramInfoLog glGetProgramInfoLog;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetShaderiv(UInt32 shader, int pname, [Out] Int32* @params);
+            internal unsafe static GetShaderiv glGetShaderiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetShaderInfoLog(UInt32 shader, Int32 bufSize, [Out] Int32* length, [Out] System.Text.StringBuilder infoLog);
+            internal unsafe static GetShaderInfoLog glGetShaderInfoLog;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetShaderSource(UInt32 shader, Int32 bufSize, [Out] Int32* length, [Out] System.Text.StringBuilder[] source);
+            internal unsafe static GetShaderSource glGetShaderSource;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GetUniformLocation(UInt32 program, System.String name);
+            internal static GetUniformLocation glGetUniformLocation;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetUniformfv(UInt32 program, Int32 location, [Out] Single* @params);
+            internal unsafe static GetUniformfv glGetUniformfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetUniformiv(UInt32 program, Int32 location, [Out] Int32* @params);
+            internal unsafe static GetUniformiv glGetUniformiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribdv(UInt32 index, int pname, [Out] Double* @params);
+            internal unsafe static GetVertexAttribdv glGetVertexAttribdv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribfv(UInt32 index, int pname, [Out] Single* @params);
+            internal unsafe static GetVertexAttribfv glGetVertexAttribfv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribiv(UInt32 index, int pname, [Out] Int32* @params);
+            internal unsafe static GetVertexAttribiv glGetVertexAttribiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetVertexAttribPointerv(UInt32 index, int pname, [Out] IntPtr pointer);
+            internal static GetVertexAttribPointerv glGetVertexAttribPointerv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsProgram(UInt32 program);
+            internal static IsProgram glIsProgram;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsShader(UInt32 shader);
+            internal static IsShader glIsShader;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LinkProgram(UInt32 program);
+            internal static LinkProgram glLinkProgram;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ShaderSource(UInt32 shader, Int32 count, System.String[] @string, Int32* length);
+            internal unsafe static ShaderSource glShaderSource;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void UseProgram(UInt32 program);
+            internal static UseProgram glUseProgram;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform1f(Int32 location, Single v0);
+            internal static Uniform1f glUniform1f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform2f(Int32 location, Single v0, Single v1);
+            internal static Uniform2f glUniform2f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform3f(Int32 location, Single v0, Single v1, Single v2);
+            internal static Uniform3f glUniform3f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform4f(Int32 location, Single v0, Single v1, Single v2, Single v3);
+            internal static Uniform4f glUniform4f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform1i(Int32 location, Int32 v0);
+            internal static Uniform1i glUniform1i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform2i(Int32 location, Int32 v0, Int32 v1);
+            internal static Uniform2i glUniform2i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform3i(Int32 location, Int32 v0, Int32 v1, Int32 v2);
+            internal static Uniform3i glUniform3i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform4i(Int32 location, Int32 v0, Int32 v1, Int32 v2, Int32 v3);
+            internal static Uniform4i glUniform4i;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform1fv(Int32 location, Int32 count, Single* value);
+            internal unsafe static Uniform1fv glUniform1fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform2fv(Int32 location, Int32 count, Single* value);
+            internal unsafe static Uniform2fv glUniform2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform3fv(Int32 location, Int32 count, Single* value);
+            internal unsafe static Uniform3fv glUniform3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform4fv(Int32 location, Int32 count, Single* value);
+            internal unsafe static Uniform4fv glUniform4fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform1iv(Int32 location, Int32 count, Int32* value);
+            internal unsafe static Uniform1iv glUniform1iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform2iv(Int32 location, Int32 count, Int32* value);
+            internal unsafe static Uniform2iv glUniform2iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform3iv(Int32 location, Int32 count, Int32* value);
+            internal unsafe static Uniform3iv glUniform3iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform4iv(Int32 location, Int32 count, Int32* value);
+            internal unsafe static Uniform4iv glUniform4iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix2fv(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix2fv glUniformMatrix2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix3fv(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix3fv glUniformMatrix3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix4fv(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix4fv glUniformMatrix4fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ValidateProgram(UInt32 program);
+            internal static ValidateProgram glValidateProgram;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib1d(UInt32 index, Double x);
+            internal static VertexAttrib1d glVertexAttrib1d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib1dv(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib1dv glVertexAttrib1dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib1f(UInt32 index, Single x);
+            internal static VertexAttrib1f glVertexAttrib1f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib1fv(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib1fv glVertexAttrib1fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib1s(UInt32 index, Int16 x);
+            internal static VertexAttrib1s glVertexAttrib1s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib1sv(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib1sv glVertexAttrib1sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib2d(UInt32 index, Double x, Double y);
+            internal static VertexAttrib2d glVertexAttrib2d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib2dv(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib2dv glVertexAttrib2dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib2f(UInt32 index, Single x, Single y);
+            internal static VertexAttrib2f glVertexAttrib2f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib2fv(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib2fv glVertexAttrib2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib2s(UInt32 index, Int16 x, Int16 y);
+            internal static VertexAttrib2s glVertexAttrib2s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib2sv(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib2sv glVertexAttrib2sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib3d(UInt32 index, Double x, Double y, Double z);
+            internal static VertexAttrib3d glVertexAttrib3d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib3dv(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib3dv glVertexAttrib3dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib3f(UInt32 index, Single x, Single y, Single z);
+            internal static VertexAttrib3f glVertexAttrib3f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib3fv(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib3fv glVertexAttrib3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib3s(UInt32 index, Int16 x, Int16 y, Int16 z);
+            internal static VertexAttrib3s glVertexAttrib3s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib3sv(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib3sv glVertexAttrib3sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4Nbv(UInt32 index, SByte* v);
+            internal unsafe static VertexAttrib4Nbv glVertexAttrib4Nbv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4Niv(UInt32 index, Int32* v);
+            internal unsafe static VertexAttrib4Niv glVertexAttrib4Niv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4Nsv(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib4Nsv glVertexAttrib4Nsv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4Nub(UInt32 index, Byte x, Byte y, Byte z, Byte w);
+            internal static VertexAttrib4Nub glVertexAttrib4Nub;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4Nubv(UInt32 index, Byte* v);
+            internal unsafe static VertexAttrib4Nubv glVertexAttrib4Nubv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4Nuiv(UInt32 index, UInt32* v);
+            internal unsafe static VertexAttrib4Nuiv glVertexAttrib4Nuiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4Nusv(UInt32 index, UInt16* v);
+            internal unsafe static VertexAttrib4Nusv glVertexAttrib4Nusv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4bv(UInt32 index, SByte* v);
+            internal unsafe static VertexAttrib4bv glVertexAttrib4bv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4d(UInt32 index, Double x, Double y, Double z, Double w);
+            internal static VertexAttrib4d glVertexAttrib4d;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4dv(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib4dv glVertexAttrib4dv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4f(UInt32 index, Single x, Single y, Single z, Single w);
+            internal static VertexAttrib4f glVertexAttrib4f;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4fv(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib4fv glVertexAttrib4fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4iv(UInt32 index, Int32* v);
+            internal unsafe static VertexAttrib4iv glVertexAttrib4iv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4s(UInt32 index, Int16 x, Int16 y, Int16 z, Int16 w);
+            internal static VertexAttrib4s glVertexAttrib4s;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4sv(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib4sv glVertexAttrib4sv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4ubv(UInt32 index, Byte* v);
+            internal unsafe static VertexAttrib4ubv glVertexAttrib4ubv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4uiv(UInt32 index, UInt32* v);
+            internal unsafe static VertexAttrib4uiv glVertexAttrib4uiv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4usv(UInt32 index, UInt16* v);
+            internal unsafe static VertexAttrib4usv glVertexAttrib4usv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribPointer(UInt32 index, Int32 size, int type, bool normalized, Int32 stride, IntPtr pointer);
+            internal static VertexAttribPointer glVertexAttribPointer;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix2x3fv(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix2x3fv glUniformMatrix2x3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix3x2fv(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix3x2fv glUniformMatrix3x2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix2x4fv(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix2x4fv glUniformMatrix2x4fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix4x2fv(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix4x2fv glUniformMatrix4x2fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix3x4fv(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix3x4fv glUniformMatrix3x4fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix4x3fv(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix4x3fv glUniformMatrix4x3fv;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ActiveTextureARB(int texture);
+            internal static ActiveTextureARB glActiveTextureARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClientActiveTextureARB(int texture);
+            internal static ClientActiveTextureARB glClientActiveTextureARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord1dARB(int target, Double s);
+            internal static MultiTexCoord1dARB glMultiTexCoord1dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord1dvARB(int target, Double* v);
+            internal unsafe static MultiTexCoord1dvARB glMultiTexCoord1dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord1fARB(int target, Single s);
+            internal static MultiTexCoord1fARB glMultiTexCoord1fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord1fvARB(int target, Single* v);
+            internal unsafe static MultiTexCoord1fvARB glMultiTexCoord1fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord1iARB(int target, Int32 s);
+            internal static MultiTexCoord1iARB glMultiTexCoord1iARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord1ivARB(int target, Int32* v);
+            internal unsafe static MultiTexCoord1ivARB glMultiTexCoord1ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord1sARB(int target, Int16 s);
+            internal static MultiTexCoord1sARB glMultiTexCoord1sARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord1svARB(int target, Int16* v);
+            internal unsafe static MultiTexCoord1svARB glMultiTexCoord1svARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord2dARB(int target, Double s, Double t);
+            internal static MultiTexCoord2dARB glMultiTexCoord2dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord2dvARB(int target, Double* v);
+            internal unsafe static MultiTexCoord2dvARB glMultiTexCoord2dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord2fARB(int target, Single s, Single t);
+            internal static MultiTexCoord2fARB glMultiTexCoord2fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord2fvARB(int target, Single* v);
+            internal unsafe static MultiTexCoord2fvARB glMultiTexCoord2fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord2iARB(int target, Int32 s, Int32 t);
+            internal static MultiTexCoord2iARB glMultiTexCoord2iARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord2ivARB(int target, Int32* v);
+            internal unsafe static MultiTexCoord2ivARB glMultiTexCoord2ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord2sARB(int target, Int16 s, Int16 t);
+            internal static MultiTexCoord2sARB glMultiTexCoord2sARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord2svARB(int target, Int16* v);
+            internal unsafe static MultiTexCoord2svARB glMultiTexCoord2svARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord3dARB(int target, Double s, Double t, Double r);
+            internal static MultiTexCoord3dARB glMultiTexCoord3dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord3dvARB(int target, Double* v);
+            internal unsafe static MultiTexCoord3dvARB glMultiTexCoord3dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord3fARB(int target, Single s, Single t, Single r);
+            internal static MultiTexCoord3fARB glMultiTexCoord3fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord3fvARB(int target, Single* v);
+            internal unsafe static MultiTexCoord3fvARB glMultiTexCoord3fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord3iARB(int target, Int32 s, Int32 t, Int32 r);
+            internal static MultiTexCoord3iARB glMultiTexCoord3iARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord3ivARB(int target, Int32* v);
+            internal unsafe static MultiTexCoord3ivARB glMultiTexCoord3ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord3sARB(int target, Int16 s, Int16 t, Int16 r);
+            internal static MultiTexCoord3sARB glMultiTexCoord3sARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord3svARB(int target, Int16* v);
+            internal unsafe static MultiTexCoord3svARB glMultiTexCoord3svARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord4dARB(int target, Double s, Double t, Double r, Double q);
+            internal static MultiTexCoord4dARB glMultiTexCoord4dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord4dvARB(int target, Double* v);
+            internal unsafe static MultiTexCoord4dvARB glMultiTexCoord4dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord4fARB(int target, Single s, Single t, Single r, Single q);
+            internal static MultiTexCoord4fARB glMultiTexCoord4fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord4fvARB(int target, Single* v);
+            internal unsafe static MultiTexCoord4fvARB glMultiTexCoord4fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord4iARB(int target, Int32 s, Int32 t, Int32 r, Int32 q);
+            internal static MultiTexCoord4iARB glMultiTexCoord4iARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord4ivARB(int target, Int32* v);
+            internal unsafe static MultiTexCoord4ivARB glMultiTexCoord4ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord4sARB(int target, Int16 s, Int16 t, Int16 r, Int16 q);
+            internal static MultiTexCoord4sARB glMultiTexCoord4sARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord4svARB(int target, Int16* v);
+            internal unsafe static MultiTexCoord4svARB glMultiTexCoord4svARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void LoadTransposeMatrixfARB(Single* m);
+            internal unsafe static LoadTransposeMatrixfARB glLoadTransposeMatrixfARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void LoadTransposeMatrixdARB(Double* m);
+            internal unsafe static LoadTransposeMatrixdARB glLoadTransposeMatrixdARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultTransposeMatrixfARB(Single* m);
+            internal unsafe static MultTransposeMatrixfARB glMultTransposeMatrixfARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultTransposeMatrixdARB(Double* m);
+            internal unsafe static MultTransposeMatrixdARB glMultTransposeMatrixdARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SampleCoverageARB(Single value, bool invert);
+            internal static SampleCoverageARB glSampleCoverageARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexImage3DARB(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, Int32 imageSize, IntPtr data);
+            internal static CompressedTexImage3DARB glCompressedTexImage3DARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexImage2DARB(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 border, Int32 imageSize, IntPtr data);
+            internal static CompressedTexImage2DARB glCompressedTexImage2DARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexImage1DARB(int target, Int32 level, int internalformat, Int32 width, Int32 border, Int32 imageSize, IntPtr data);
+            internal static CompressedTexImage1DARB glCompressedTexImage1DARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexSubImage3DARB(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, Int32 imageSize, IntPtr data);
+            internal static CompressedTexSubImage3DARB glCompressedTexSubImage3DARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexSubImage2DARB(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, Int32 imageSize, IntPtr data);
+            internal static CompressedTexSubImage2DARB glCompressedTexSubImage2DARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompressedTexSubImage1DARB(int target, Int32 level, Int32 xoffset, Int32 width, int format, Int32 imageSize, IntPtr data);
+            internal static CompressedTexSubImage1DARB glCompressedTexSubImage1DARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetCompressedTexImageARB(int target, Int32 level, [Out] IntPtr img);
+            internal static GetCompressedTexImageARB glGetCompressedTexImageARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PointParameterfARB(int pname, Single param);
+            internal static PointParameterfARB glPointParameterfARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PointParameterfvARB(int pname, Single* @params);
+            internal unsafe static PointParameterfvARB glPointParameterfvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WeightbvARB(Int32 size, SByte* weights);
+            internal unsafe static WeightbvARB glWeightbvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WeightsvARB(Int32 size, Int16* weights);
+            internal unsafe static WeightsvARB glWeightsvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WeightivARB(Int32 size, Int32* weights);
+            internal unsafe static WeightivARB glWeightivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WeightfvARB(Int32 size, Single* weights);
+            internal unsafe static WeightfvARB glWeightfvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WeightdvARB(Int32 size, Double* weights);
+            internal unsafe static WeightdvARB glWeightdvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WeightubvARB(Int32 size, Byte* weights);
+            internal unsafe static WeightubvARB glWeightubvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WeightusvARB(Int32 size, UInt16* weights);
+            internal unsafe static WeightusvARB glWeightusvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WeightuivARB(Int32 size, UInt32* weights);
+            internal unsafe static WeightuivARB glWeightuivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WeightPointerARB(Int32 size, int type, Int32 stride, IntPtr pointer);
+            internal static WeightPointerARB glWeightPointerARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexBlendARB(Int32 count);
+            internal static VertexBlendARB glVertexBlendARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CurrentPaletteMatrixARB(Int32 index);
+            internal static CurrentPaletteMatrixARB glCurrentPaletteMatrixARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MatrixIndexubvARB(Int32 size, Byte* indices);
+            internal unsafe static MatrixIndexubvARB glMatrixIndexubvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MatrixIndexusvARB(Int32 size, UInt16* indices);
+            internal unsafe static MatrixIndexusvARB glMatrixIndexusvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MatrixIndexuivARB(Int32 size, UInt32* indices);
+            internal unsafe static MatrixIndexuivARB glMatrixIndexuivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MatrixIndexPointerARB(Int32 size, int type, Int32 stride, IntPtr pointer);
+            internal static MatrixIndexPointerARB glMatrixIndexPointerARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2dARB(Double x, Double y);
+            internal static WindowPos2dARB glWindowPos2dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2dvARB(Double* v);
+            internal unsafe static WindowPos2dvARB glWindowPos2dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2fARB(Single x, Single y);
+            internal static WindowPos2fARB glWindowPos2fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2fvARB(Single* v);
+            internal unsafe static WindowPos2fvARB glWindowPos2fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2iARB(Int32 x, Int32 y);
+            internal static WindowPos2iARB glWindowPos2iARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2ivARB(Int32* v);
+            internal unsafe static WindowPos2ivARB glWindowPos2ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2sARB(Int16 x, Int16 y);
+            internal static WindowPos2sARB glWindowPos2sARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2svARB(Int16* v);
+            internal unsafe static WindowPos2svARB glWindowPos2svARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3dARB(Double x, Double y, Double z);
+            internal static WindowPos3dARB glWindowPos3dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3dvARB(Double* v);
+            internal unsafe static WindowPos3dvARB glWindowPos3dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3fARB(Single x, Single y, Single z);
+            internal static WindowPos3fARB glWindowPos3fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3fvARB(Single* v);
+            internal unsafe static WindowPos3fvARB glWindowPos3fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3iARB(Int32 x, Int32 y, Int32 z);
+            internal static WindowPos3iARB glWindowPos3iARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3ivARB(Int32* v);
+            internal unsafe static WindowPos3ivARB glWindowPos3ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3sARB(Int16 x, Int16 y, Int16 z);
+            internal static WindowPos3sARB glWindowPos3sARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3svARB(Int16* v);
+            internal unsafe static WindowPos3svARB glWindowPos3svARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib1dARB(UInt32 index, Double x);
+            internal static VertexAttrib1dARB glVertexAttrib1dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib1dvARB(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib1dvARB glVertexAttrib1dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib1fARB(UInt32 index, Single x);
+            internal static VertexAttrib1fARB glVertexAttrib1fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib1fvARB(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib1fvARB glVertexAttrib1fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib1sARB(UInt32 index, Int16 x);
+            internal static VertexAttrib1sARB glVertexAttrib1sARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib1svARB(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib1svARB glVertexAttrib1svARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib2dARB(UInt32 index, Double x, Double y);
+            internal static VertexAttrib2dARB glVertexAttrib2dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib2dvARB(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib2dvARB glVertexAttrib2dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib2fARB(UInt32 index, Single x, Single y);
+            internal static VertexAttrib2fARB glVertexAttrib2fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib2fvARB(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib2fvARB glVertexAttrib2fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib2sARB(UInt32 index, Int16 x, Int16 y);
+            internal static VertexAttrib2sARB glVertexAttrib2sARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib2svARB(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib2svARB glVertexAttrib2svARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib3dARB(UInt32 index, Double x, Double y, Double z);
+            internal static VertexAttrib3dARB glVertexAttrib3dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib3dvARB(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib3dvARB glVertexAttrib3dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib3fARB(UInt32 index, Single x, Single y, Single z);
+            internal static VertexAttrib3fARB glVertexAttrib3fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib3fvARB(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib3fvARB glVertexAttrib3fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib3sARB(UInt32 index, Int16 x, Int16 y, Int16 z);
+            internal static VertexAttrib3sARB glVertexAttrib3sARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib3svARB(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib3svARB glVertexAttrib3svARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4NbvARB(UInt32 index, SByte* v);
+            internal unsafe static VertexAttrib4NbvARB glVertexAttrib4NbvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4NivARB(UInt32 index, Int32* v);
+            internal unsafe static VertexAttrib4NivARB glVertexAttrib4NivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4NsvARB(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib4NsvARB glVertexAttrib4NsvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4NubARB(UInt32 index, Byte x, Byte y, Byte z, Byte w);
+            internal static VertexAttrib4NubARB glVertexAttrib4NubARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4NubvARB(UInt32 index, Byte* v);
+            internal unsafe static VertexAttrib4NubvARB glVertexAttrib4NubvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4NuivARB(UInt32 index, UInt32* v);
+            internal unsafe static VertexAttrib4NuivARB glVertexAttrib4NuivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4NusvARB(UInt32 index, UInt16* v);
+            internal unsafe static VertexAttrib4NusvARB glVertexAttrib4NusvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4bvARB(UInt32 index, SByte* v);
+            internal unsafe static VertexAttrib4bvARB glVertexAttrib4bvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4dARB(UInt32 index, Double x, Double y, Double z, Double w);
+            internal static VertexAttrib4dARB glVertexAttrib4dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4dvARB(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib4dvARB glVertexAttrib4dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4fARB(UInt32 index, Single x, Single y, Single z, Single w);
+            internal static VertexAttrib4fARB glVertexAttrib4fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4fvARB(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib4fvARB glVertexAttrib4fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4ivARB(UInt32 index, Int32* v);
+            internal unsafe static VertexAttrib4ivARB glVertexAttrib4ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4sARB(UInt32 index, Int16 x, Int16 y, Int16 z, Int16 w);
+            internal static VertexAttrib4sARB glVertexAttrib4sARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4svARB(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib4svARB glVertexAttrib4svARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4ubvARB(UInt32 index, Byte* v);
+            internal unsafe static VertexAttrib4ubvARB glVertexAttrib4ubvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4uivARB(UInt32 index, UInt32* v);
+            internal unsafe static VertexAttrib4uivARB glVertexAttrib4uivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4usvARB(UInt32 index, UInt16* v);
+            internal unsafe static VertexAttrib4usvARB glVertexAttrib4usvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribPointerARB(UInt32 index, Int32 size, int type, bool normalized, Int32 stride, IntPtr pointer);
+            internal static VertexAttribPointerARB glVertexAttribPointerARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EnableVertexAttribArrayARB(UInt32 index);
+            internal static EnableVertexAttribArrayARB glEnableVertexAttribArrayARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DisableVertexAttribArrayARB(UInt32 index);
+            internal static DisableVertexAttribArrayARB glDisableVertexAttribArrayARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramStringARB(int target, int format, Int32 len, IntPtr @string);
+            internal static ProgramStringARB glProgramStringARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindProgramARB(int target, UInt32 program);
+            internal static BindProgramARB glBindProgramARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteProgramsARB(Int32 n, UInt32* programs);
+            internal unsafe static DeleteProgramsARB glDeleteProgramsARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenProgramsARB(Int32 n, [Out] UInt32* programs);
+            internal unsafe static GenProgramsARB glGenProgramsARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramEnvParameter4dARB(int target, UInt32 index, Double x, Double y, Double z, Double w);
+            internal static ProgramEnvParameter4dARB glProgramEnvParameter4dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramEnvParameter4dvARB(int target, UInt32 index, Double* @params);
+            internal unsafe static ProgramEnvParameter4dvARB glProgramEnvParameter4dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramEnvParameter4fARB(int target, UInt32 index, Single x, Single y, Single z, Single w);
+            internal static ProgramEnvParameter4fARB glProgramEnvParameter4fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramEnvParameter4fvARB(int target, UInt32 index, Single* @params);
+            internal unsafe static ProgramEnvParameter4fvARB glProgramEnvParameter4fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramLocalParameter4dARB(int target, UInt32 index, Double x, Double y, Double z, Double w);
+            internal static ProgramLocalParameter4dARB glProgramLocalParameter4dARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramLocalParameter4dvARB(int target, UInt32 index, Double* @params);
+            internal unsafe static ProgramLocalParameter4dvARB glProgramLocalParameter4dvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramLocalParameter4fARB(int target, UInt32 index, Single x, Single y, Single z, Single w);
+            internal static ProgramLocalParameter4fARB glProgramLocalParameter4fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramLocalParameter4fvARB(int target, UInt32 index, Single* @params);
+            internal unsafe static ProgramLocalParameter4fvARB glProgramLocalParameter4fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramEnvParameterdvARB(int target, UInt32 index, [Out] Double* @params);
+            internal unsafe static GetProgramEnvParameterdvARB glGetProgramEnvParameterdvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramEnvParameterfvARB(int target, UInt32 index, [Out] Single* @params);
+            internal unsafe static GetProgramEnvParameterfvARB glGetProgramEnvParameterfvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramLocalParameterdvARB(int target, UInt32 index, [Out] Double* @params);
+            internal unsafe static GetProgramLocalParameterdvARB glGetProgramLocalParameterdvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramLocalParameterfvARB(int target, UInt32 index, [Out] Single* @params);
+            internal unsafe static GetProgramLocalParameterfvARB glGetProgramLocalParameterfvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramivARB(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetProgramivARB glGetProgramivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetProgramStringARB(int target, int pname, [Out] IntPtr @string);
+            internal static GetProgramStringARB glGetProgramStringARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribdvARB(UInt32 index, int pname, [Out] Double* @params);
+            internal unsafe static GetVertexAttribdvARB glGetVertexAttribdvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribfvARB(UInt32 index, int pname, [Out] Single* @params);
+            internal unsafe static GetVertexAttribfvARB glGetVertexAttribfvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribivARB(UInt32 index, int pname, [Out] Int32* @params);
+            internal unsafe static GetVertexAttribivARB glGetVertexAttribivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetVertexAttribPointervARB(UInt32 index, int pname, [Out] IntPtr pointer);
+            internal static GetVertexAttribPointervARB glGetVertexAttribPointervARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsProgramARB(UInt32 program);
+            internal static IsProgramARB glIsProgramARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindBufferARB(int target, UInt32 buffer);
+            internal static BindBufferARB glBindBufferARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteBuffersARB(Int32 n, UInt32* buffers);
+            internal unsafe static DeleteBuffersARB glDeleteBuffersARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenBuffersARB(Int32 n, [Out] UInt32* buffers);
+            internal unsafe static GenBuffersARB glGenBuffersARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsBufferARB(UInt32 buffer);
+            internal static IsBufferARB glIsBufferARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BufferDataARB(int target, IntPtr size, IntPtr data, int usage);
+            internal static BufferDataARB glBufferDataARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BufferSubDataARB(int target, IntPtr offset, IntPtr size, IntPtr data);
+            internal static BufferSubDataARB glBufferSubDataARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetBufferSubDataARB(int target, IntPtr offset, IntPtr size, [Out] IntPtr data);
+            internal static GetBufferSubDataARB glGetBufferSubDataARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate IntPtr MapBufferARB(int target, int access);
+            internal unsafe static MapBufferARB glMapBufferARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool UnmapBufferARB(int target);
+            internal static UnmapBufferARB glUnmapBufferARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetBufferParameterivARB(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetBufferParameterivARB glGetBufferParameterivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetBufferPointervARB(int target, int pname, [Out] IntPtr @params);
+            internal static GetBufferPointervARB glGetBufferPointervARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenQueriesARB(Int32 n, [Out] UInt32* ids);
+            internal unsafe static GenQueriesARB glGenQueriesARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteQueriesARB(Int32 n, UInt32* ids);
+            internal unsafe static DeleteQueriesARB glDeleteQueriesARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsQueryARB(UInt32 id);
+            internal static IsQueryARB glIsQueryARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BeginQueryARB(int target, UInt32 id);
+            internal static BeginQueryARB glBeginQueryARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EndQueryARB(int target);
+            internal static EndQueryARB glEndQueryARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetQueryivARB(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetQueryivARB glGetQueryivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetQueryObjectivARB(UInt32 id, int pname, [Out] Int32* @params);
+            internal unsafe static GetQueryObjectivARB glGetQueryObjectivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetQueryObjectuivARB(UInt32 id, int pname, [Out] UInt32* @params);
+            internal unsafe static GetQueryObjectuivARB glGetQueryObjectuivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DeleteObjectARB(UInt32 obj);
+            internal static DeleteObjectARB glDeleteObjectARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GetHandleARB(int pname);
+            internal static GetHandleARB glGetHandleARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DetachObjectARB(UInt32 containerObj, UInt32 attachedObj);
+            internal static DetachObjectARB glDetachObjectARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 CreateShaderObjectARB(int shaderType);
+            internal static CreateShaderObjectARB glCreateShaderObjectARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ShaderSourceARB(UInt32 shaderObj, Int32 count, System.String[] @string, Int32* length);
+            internal unsafe static ShaderSourceARB glShaderSourceARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CompileShaderARB(UInt32 shaderObj);
+            internal static CompileShaderARB glCompileShaderARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 CreateProgramObjectARB();
+            internal static CreateProgramObjectARB glCreateProgramObjectARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void AttachObjectARB(UInt32 containerObj, UInt32 obj);
+            internal static AttachObjectARB glAttachObjectARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LinkProgramARB(UInt32 programObj);
+            internal static LinkProgramARB glLinkProgramARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void UseProgramObjectARB(UInt32 programObj);
+            internal static UseProgramObjectARB glUseProgramObjectARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ValidateProgramARB(UInt32 programObj);
+            internal static ValidateProgramARB glValidateProgramARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform1fARB(Int32 location, Single v0);
+            internal static Uniform1fARB glUniform1fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform2fARB(Int32 location, Single v0, Single v1);
+            internal static Uniform2fARB glUniform2fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform3fARB(Int32 location, Single v0, Single v1, Single v2);
+            internal static Uniform3fARB glUniform3fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform4fARB(Int32 location, Single v0, Single v1, Single v2, Single v3);
+            internal static Uniform4fARB glUniform4fARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform1iARB(Int32 location, Int32 v0);
+            internal static Uniform1iARB glUniform1iARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform2iARB(Int32 location, Int32 v0, Int32 v1);
+            internal static Uniform2iARB glUniform2iARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform3iARB(Int32 location, Int32 v0, Int32 v1, Int32 v2);
+            internal static Uniform3iARB glUniform3iARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform4iARB(Int32 location, Int32 v0, Int32 v1, Int32 v2, Int32 v3);
+            internal static Uniform4iARB glUniform4iARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform1fvARB(Int32 location, Int32 count, Single* value);
+            internal unsafe static Uniform1fvARB glUniform1fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform2fvARB(Int32 location, Int32 count, Single* value);
+            internal unsafe static Uniform2fvARB glUniform2fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform3fvARB(Int32 location, Int32 count, Single* value);
+            internal unsafe static Uniform3fvARB glUniform3fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform4fvARB(Int32 location, Int32 count, Single* value);
+            internal unsafe static Uniform4fvARB glUniform4fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform1ivARB(Int32 location, Int32 count, Int32* value);
+            internal unsafe static Uniform1ivARB glUniform1ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform2ivARB(Int32 location, Int32 count, Int32* value);
+            internal unsafe static Uniform2ivARB glUniform2ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform3ivARB(Int32 location, Int32 count, Int32* value);
+            internal unsafe static Uniform3ivARB glUniform3ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform4ivARB(Int32 location, Int32 count, Int32* value);
+            internal unsafe static Uniform4ivARB glUniform4ivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix2fvARB(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix2fvARB glUniformMatrix2fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix3fvARB(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix3fvARB glUniformMatrix3fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void UniformMatrix4fvARB(Int32 location, Int32 count, bool transpose, Single* value);
+            internal unsafe static UniformMatrix4fvARB glUniformMatrix4fvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetObjectParameterfvARB(UInt32 obj, int pname, [Out] Single* @params);
+            internal unsafe static GetObjectParameterfvARB glGetObjectParameterfvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetObjectParameterivARB(UInt32 obj, int pname, [Out] Int32* @params);
+            internal unsafe static GetObjectParameterivARB glGetObjectParameterivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetInfoLogARB(UInt32 obj, Int32 maxLength, [Out] Int32* length, [Out] System.Text.StringBuilder infoLog);
+            internal unsafe static GetInfoLogARB glGetInfoLogARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetAttachedObjectsARB(UInt32 containerObj, Int32 maxCount, [Out] Int32* count, [Out] UInt32* obj);
+            internal unsafe static GetAttachedObjectsARB glGetAttachedObjectsARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GetUniformLocationARB(UInt32 programObj, System.String name);
+            internal static GetUniformLocationARB glGetUniformLocationARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetActiveUniformARB(UInt32 programObj, UInt32 index, Int32 maxLength, [Out] Int32* length, [Out] Int32* size, [Out] int* type, [Out] System.Text.StringBuilder name);
+            internal unsafe static GetActiveUniformARB glGetActiveUniformARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetUniformfvARB(UInt32 programObj, Int32 location, [Out] Single* @params);
+            internal unsafe static GetUniformfvARB glGetUniformfvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetUniformivARB(UInt32 programObj, Int32 location, [Out] Int32* @params);
+            internal unsafe static GetUniformivARB glGetUniformivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetShaderSourceARB(UInt32 obj, Int32 maxLength, [Out] Int32* length, [Out] System.Text.StringBuilder[] source);
+            internal unsafe static GetShaderSourceARB glGetShaderSourceARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindAttribLocationARB(UInt32 programObj, UInt32 index, System.String name);
+            internal static BindAttribLocationARB glBindAttribLocationARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetActiveAttribARB(UInt32 programObj, UInt32 index, Int32 maxLength, [Out] Int32* length, [Out] Int32* size, [Out] int* type, [Out] System.Text.StringBuilder name);
+            internal unsafe static GetActiveAttribARB glGetActiveAttribARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GetAttribLocationARB(UInt32 programObj, System.String name);
+            internal static GetAttribLocationARB glGetAttribLocationARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DrawBuffersARB(Int32 n, int* bufs);
+            internal unsafe static DrawBuffersARB glDrawBuffersARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClampColorARB(int target, int clamp);
+            internal static ClampColorARB glClampColorARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlendColorEXT(Single red, Single green, Single blue, Single alpha);
+            internal static BlendColorEXT glBlendColorEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PolygonOffsetEXT(Single factor, Single bias);
+            internal static PolygonOffsetEXT glPolygonOffsetEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexImage3DEXT(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, int format, int type, IntPtr pixels);
+            internal static TexImage3DEXT glTexImage3DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexSubImage3DEXT(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, int type, IntPtr pixels);
+            internal static TexSubImage3DEXT glTexSubImage3DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexFilterFuncSGIS(int target, int filter, [Out] Single* weights);
+            internal unsafe static GetTexFilterFuncSGIS glGetTexFilterFuncSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexFilterFuncSGIS(int target, int filter, Int32 n, Single* weights);
+            internal unsafe static TexFilterFuncSGIS glTexFilterFuncSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexSubImage1DEXT(int target, Int32 level, Int32 xoffset, Int32 width, int format, int type, IntPtr pixels);
+            internal static TexSubImage1DEXT glTexSubImage1DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexSubImage2DEXT(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, int type, IntPtr pixels);
+            internal static TexSubImage2DEXT glTexSubImage2DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyTexImage1DEXT(int target, Int32 level, int internalformat, Int32 x, Int32 y, Int32 width, Int32 border);
+            internal static CopyTexImage1DEXT glCopyTexImage1DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyTexImage2DEXT(int target, Int32 level, int internalformat, Int32 x, Int32 y, Int32 width, Int32 height, Int32 border);
+            internal static CopyTexImage2DEXT glCopyTexImage2DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyTexSubImage1DEXT(int target, Int32 level, Int32 xoffset, Int32 x, Int32 y, Int32 width);
+            internal static CopyTexSubImage1DEXT glCopyTexSubImage1DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyTexSubImage2DEXT(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 x, Int32 y, Int32 width, Int32 height);
+            internal static CopyTexSubImage2DEXT glCopyTexSubImage2DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyTexSubImage3DEXT(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 x, Int32 y, Int32 width, Int32 height);
+            internal static CopyTexSubImage3DEXT glCopyTexSubImage3DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetHistogramEXT(int target, bool reset, int format, int type, [Out] IntPtr values);
+            internal static GetHistogramEXT glGetHistogramEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetHistogramParameterfvEXT(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetHistogramParameterfvEXT glGetHistogramParameterfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetHistogramParameterivEXT(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetHistogramParameterivEXT glGetHistogramParameterivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetMinmaxEXT(int target, bool reset, int format, int type, [Out] IntPtr values);
+            internal static GetMinmaxEXT glGetMinmaxEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMinmaxParameterfvEXT(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetMinmaxParameterfvEXT glGetMinmaxParameterfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMinmaxParameterivEXT(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetMinmaxParameterivEXT glGetMinmaxParameterivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void HistogramEXT(int target, Int32 width, int internalformat, bool sink);
+            internal static HistogramEXT glHistogramEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MinmaxEXT(int target, int internalformat, bool sink);
+            internal static MinmaxEXT glMinmaxEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ResetHistogramEXT(int target);
+            internal static ResetHistogramEXT glResetHistogramEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ResetMinmaxEXT(int target);
+            internal static ResetMinmaxEXT glResetMinmaxEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ConvolutionFilter1DEXT(int target, int internalformat, Int32 width, int format, int type, IntPtr image);
+            internal static ConvolutionFilter1DEXT glConvolutionFilter1DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ConvolutionFilter2DEXT(int target, int internalformat, Int32 width, Int32 height, int format, int type, IntPtr image);
+            internal static ConvolutionFilter2DEXT glConvolutionFilter2DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ConvolutionParameterfEXT(int target, int pname, Single @params);
+            internal static ConvolutionParameterfEXT glConvolutionParameterfEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ConvolutionParameterfvEXT(int target, int pname, Single* @params);
+            internal unsafe static ConvolutionParameterfvEXT glConvolutionParameterfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ConvolutionParameteriEXT(int target, int pname, Int32 @params);
+            internal static ConvolutionParameteriEXT glConvolutionParameteriEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ConvolutionParameterivEXT(int target, int pname, Int32* @params);
+            internal unsafe static ConvolutionParameterivEXT glConvolutionParameterivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyConvolutionFilter1DEXT(int target, int internalformat, Int32 x, Int32 y, Int32 width);
+            internal static CopyConvolutionFilter1DEXT glCopyConvolutionFilter1DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyConvolutionFilter2DEXT(int target, int internalformat, Int32 x, Int32 y, Int32 width, Int32 height);
+            internal static CopyConvolutionFilter2DEXT glCopyConvolutionFilter2DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetConvolutionFilterEXT(int target, int format, int type, [Out] IntPtr image);
+            internal static GetConvolutionFilterEXT glGetConvolutionFilterEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetConvolutionParameterfvEXT(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetConvolutionParameterfvEXT glGetConvolutionParameterfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetConvolutionParameterivEXT(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetConvolutionParameterivEXT glGetConvolutionParameterivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetSeparableFilterEXT(int target, int format, int type, [Out] IntPtr row, [Out] IntPtr column, [Out] IntPtr span);
+            internal static GetSeparableFilterEXT glGetSeparableFilterEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SeparableFilter2DEXT(int target, int internalformat, Int32 width, Int32 height, int format, int type, IntPtr row, IntPtr column);
+            internal static SeparableFilter2DEXT glSeparableFilter2DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorTableSGI(int target, int internalformat, Int32 width, int format, int type, IntPtr table);
+            internal static ColorTableSGI glColorTableSGI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ColorTableParameterfvSGI(int target, int pname, Single* @params);
+            internal unsafe static ColorTableParameterfvSGI glColorTableParameterfvSGI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ColorTableParameterivSGI(int target, int pname, Int32* @params);
+            internal unsafe static ColorTableParameterivSGI glColorTableParameterivSGI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyColorTableSGI(int target, int internalformat, Int32 x, Int32 y, Int32 width);
+            internal static CopyColorTableSGI glCopyColorTableSGI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetColorTableSGI(int target, int format, int type, [Out] IntPtr table);
+            internal static GetColorTableSGI glGetColorTableSGI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetColorTableParameterfvSGI(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetColorTableParameterfvSGI glGetColorTableParameterfvSGI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetColorTableParameterivSGI(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetColorTableParameterivSGI glGetColorTableParameterivSGI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelTexGenSGIX(int mode);
+            internal static PixelTexGenSGIX glPixelTexGenSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelTexGenParameteriSGIS(int pname, Int32 param);
+            internal static PixelTexGenParameteriSGIS glPixelTexGenParameteriSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PixelTexGenParameterivSGIS(int pname, Int32* @params);
+            internal unsafe static PixelTexGenParameterivSGIS glPixelTexGenParameterivSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelTexGenParameterfSGIS(int pname, Single param);
+            internal static PixelTexGenParameterfSGIS glPixelTexGenParameterfSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PixelTexGenParameterfvSGIS(int pname, Single* @params);
+            internal unsafe static PixelTexGenParameterfvSGIS glPixelTexGenParameterfvSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetPixelTexGenParameterivSGIS(int pname, [Out] Int32* @params);
+            internal unsafe static GetPixelTexGenParameterivSGIS glGetPixelTexGenParameterivSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetPixelTexGenParameterfvSGIS(int pname, [Out] Single* @params);
+            internal unsafe static GetPixelTexGenParameterfvSGIS glGetPixelTexGenParameterfvSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexImage4DSGIS(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 size4d, Int32 border, int format, int type, IntPtr pixels);
+            internal static TexImage4DSGIS glTexImage4DSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexSubImage4DSGIS(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 woffset, Int32 width, Int32 height, Int32 depth, Int32 size4d, int format, int type, IntPtr pixels);
+            internal static TexSubImage4DSGIS glTexSubImage4DSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate bool AreTexturesResidentEXT(Int32 n, UInt32* textures, [Out] bool* residences);
+            internal unsafe static AreTexturesResidentEXT glAreTexturesResidentEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindTextureEXT(int target, UInt32 texture);
+            internal static BindTextureEXT glBindTextureEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteTexturesEXT(Int32 n, UInt32* textures);
+            internal unsafe static DeleteTexturesEXT glDeleteTexturesEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenTexturesEXT(Int32 n, [Out] UInt32* textures);
+            internal unsafe static GenTexturesEXT glGenTexturesEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsTextureEXT(UInt32 texture);
+            internal static IsTextureEXT glIsTextureEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PrioritizeTexturesEXT(Int32 n, UInt32* textures, Single* priorities);
+            internal unsafe static PrioritizeTexturesEXT glPrioritizeTexturesEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DetailTexFuncSGIS(int target, Int32 n, Single* points);
+            internal unsafe static DetailTexFuncSGIS glDetailTexFuncSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetDetailTexFuncSGIS(int target, [Out] Single* points);
+            internal unsafe static GetDetailTexFuncSGIS glGetDetailTexFuncSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SharpenTexFuncSGIS(int target, Int32 n, Single* points);
+            internal unsafe static SharpenTexFuncSGIS glSharpenTexFuncSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetSharpenTexFuncSGIS(int target, [Out] Single* points);
+            internal unsafe static GetSharpenTexFuncSGIS glGetSharpenTexFuncSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SampleMaskSGIS(Single value, bool invert);
+            internal static SampleMaskSGIS glSampleMaskSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SamplePatternSGIS(int pattern);
+            internal static SamplePatternSGIS glSamplePatternSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ArrayElementEXT(Int32 i);
+            internal static ArrayElementEXT glArrayElementEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorPointerEXT(Int32 size, int type, Int32 stride, Int32 count, IntPtr pointer);
+            internal static ColorPointerEXT glColorPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawArraysEXT(int mode, Int32 first, Int32 count);
+            internal static DrawArraysEXT glDrawArraysEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void EdgeFlagPointerEXT(Int32 stride, Int32 count, bool* pointer);
+            internal unsafe static EdgeFlagPointerEXT glEdgeFlagPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetPointervEXT(int pname, [Out] IntPtr @params);
+            internal static GetPointervEXT glGetPointervEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void IndexPointerEXT(int type, Int32 stride, Int32 count, IntPtr pointer);
+            internal static IndexPointerEXT glIndexPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void NormalPointerEXT(int type, Int32 stride, Int32 count, IntPtr pointer);
+            internal static NormalPointerEXT glNormalPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoordPointerEXT(Int32 size, int type, Int32 stride, Int32 count, IntPtr pointer);
+            internal static TexCoordPointerEXT glTexCoordPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexPointerEXT(Int32 size, int type, Int32 stride, Int32 count, IntPtr pointer);
+            internal static VertexPointerEXT glVertexPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlendEquationEXT(int mode);
+            internal static BlendEquationEXT glBlendEquationEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SpriteParameterfSGIX(int pname, Single param);
+            internal static SpriteParameterfSGIX glSpriteParameterfSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SpriteParameterfvSGIX(int pname, Single* @params);
+            internal unsafe static SpriteParameterfvSGIX glSpriteParameterfvSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SpriteParameteriSGIX(int pname, Int32 param);
+            internal static SpriteParameteriSGIX glSpriteParameteriSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SpriteParameterivSGIX(int pname, Int32* @params);
+            internal unsafe static SpriteParameterivSGIX glSpriteParameterivSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PointParameterfEXT(int pname, Single param);
+            internal static PointParameterfEXT glPointParameterfEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PointParameterfvEXT(int pname, Single* @params);
+            internal unsafe static PointParameterfvEXT glPointParameterfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PointParameterfSGIS(int pname, Single param);
+            internal static PointParameterfSGIS glPointParameterfSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PointParameterfvSGIS(int pname, Single* @params);
+            internal unsafe static PointParameterfvSGIS glPointParameterfvSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GetInstrumentsSGIX();
+            internal static GetInstrumentsSGIX glGetInstrumentsSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void InstrumentsBufferSGIX(Int32 size, [Out] Int32* buffer);
+            internal unsafe static InstrumentsBufferSGIX glInstrumentsBufferSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Int32 PollInstrumentsSGIX([Out] Int32* marker_p);
+            internal unsafe static PollInstrumentsSGIX glPollInstrumentsSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReadInstrumentsSGIX(Int32 marker);
+            internal static ReadInstrumentsSGIX glReadInstrumentsSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StartInstrumentsSGIX();
+            internal static StartInstrumentsSGIX glStartInstrumentsSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StopInstrumentsSGIX(Int32 marker);
+            internal static StopInstrumentsSGIX glStopInstrumentsSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FrameZoomSGIX(Int32 factor);
+            internal static FrameZoomSGIX glFrameZoomSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TagSampleBufferSGIX();
+            internal static TagSampleBufferSGIX glTagSampleBufferSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeformationMap3dSGIX(int target, Double u1, Double u2, Int32 ustride, Int32 uorder, Double v1, Double v2, Int32 vstride, Int32 vorder, Double w1, Double w2, Int32 wstride, Int32 worder, Double* points);
+            internal unsafe static DeformationMap3dSGIX glDeformationMap3dSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeformationMap3fSGIX(int target, Single u1, Single u2, Int32 ustride, Int32 uorder, Single v1, Single v2, Int32 vstride, Int32 vorder, Single w1, Single w2, Int32 wstride, Int32 worder, Single* points);
+            internal unsafe static DeformationMap3fSGIX glDeformationMap3fSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DeformSGIX(int mask);
+            internal static DeformSGIX glDeformSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LoadIdentityDeformationMapSGIX(int mask);
+            internal static LoadIdentityDeformationMapSGIX glLoadIdentityDeformationMapSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReferencePlaneSGIX(Double* equation);
+            internal unsafe static ReferencePlaneSGIX glReferencePlaneSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FlushRasterSGIX();
+            internal static FlushRasterSGIX glFlushRasterSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FogFuncSGIS(Int32 n, Single* points);
+            internal unsafe static FogFuncSGIS glFogFuncSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetFogFuncSGIS([Out] Single* points);
+            internal unsafe static GetFogFuncSGIS glGetFogFuncSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ImageTransformParameteriHP(int target, int pname, Int32 param);
+            internal static ImageTransformParameteriHP glImageTransformParameteriHP;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ImageTransformParameterfHP(int target, int pname, Single param);
+            internal static ImageTransformParameterfHP glImageTransformParameterfHP;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ImageTransformParameterivHP(int target, int pname, Int32* @params);
+            internal unsafe static ImageTransformParameterivHP glImageTransformParameterivHP;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ImageTransformParameterfvHP(int target, int pname, Single* @params);
+            internal unsafe static ImageTransformParameterfvHP glImageTransformParameterfvHP;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetImageTransformParameterivHP(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetImageTransformParameterivHP glGetImageTransformParameterivHP;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetImageTransformParameterfvHP(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetImageTransformParameterfvHP glGetImageTransformParameterfvHP;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorSubTableEXT(int target, Int32 start, Int32 count, int format, int type, IntPtr data);
+            internal static ColorSubTableEXT glColorSubTableEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CopyColorSubTableEXT(int target, Int32 start, Int32 x, Int32 y, Int32 width);
+            internal static CopyColorSubTableEXT glCopyColorSubTableEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void HintPGI(int target, Int32 mode);
+            internal static HintPGI glHintPGI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorTableEXT(int target, int internalFormat, Int32 width, int format, int type, IntPtr table);
+            internal static ColorTableEXT glColorTableEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetColorTableEXT(int target, int format, int type, [Out] IntPtr data);
+            internal static GetColorTableEXT glGetColorTableEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetColorTableParameterivEXT(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetColorTableParameterivEXT glGetColorTableParameterivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetColorTableParameterfvEXT(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetColorTableParameterfvEXT glGetColorTableParameterfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetListParameterfvSGIX(UInt32 list, int pname, [Out] Single* @params);
+            internal unsafe static GetListParameterfvSGIX glGetListParameterfvSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetListParameterivSGIX(UInt32 list, int pname, [Out] Int32* @params);
+            internal unsafe static GetListParameterivSGIX glGetListParameterivSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ListParameterfSGIX(UInt32 list, int pname, Single param);
+            internal static ListParameterfSGIX glListParameterfSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ListParameterfvSGIX(UInt32 list, int pname, Single* @params);
+            internal unsafe static ListParameterfvSGIX glListParameterfvSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ListParameteriSGIX(UInt32 list, int pname, Int32 param);
+            internal static ListParameteriSGIX glListParameteriSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ListParameterivSGIX(UInt32 list, int pname, Int32* @params);
+            internal unsafe static ListParameterivSGIX glListParameterivSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void IndexMaterialEXT(int face, int mode);
+            internal static IndexMaterialEXT glIndexMaterialEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void IndexFuncEXT(int func, Single @ref);
+            internal static IndexFuncEXT glIndexFuncEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LockArraysEXT(Int32 first, Int32 count);
+            internal static LockArraysEXT glLockArraysEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void UnlockArraysEXT();
+            internal static UnlockArraysEXT glUnlockArraysEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void CullParameterdvEXT(int pname, [Out] Double* @params);
+            internal unsafe static CullParameterdvEXT glCullParameterdvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void CullParameterfvEXT(int pname, [Out] Single* @params);
+            internal unsafe static CullParameterfvEXT glCullParameterfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FragmentColorMaterialSGIX(int face, int mode);
+            internal static FragmentColorMaterialSGIX glFragmentColorMaterialSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FragmentLightfSGIX(int light, int pname, Single param);
+            internal static FragmentLightfSGIX glFragmentLightfSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FragmentLightfvSGIX(int light, int pname, Single* @params);
+            internal unsafe static FragmentLightfvSGIX glFragmentLightfvSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FragmentLightiSGIX(int light, int pname, Int32 param);
+            internal static FragmentLightiSGIX glFragmentLightiSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FragmentLightivSGIX(int light, int pname, Int32* @params);
+            internal unsafe static FragmentLightivSGIX glFragmentLightivSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FragmentLightModelfSGIX(int pname, Single param);
+            internal static FragmentLightModelfSGIX glFragmentLightModelfSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FragmentLightModelfvSGIX(int pname, Single* @params);
+            internal unsafe static FragmentLightModelfvSGIX glFragmentLightModelfvSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FragmentLightModeliSGIX(int pname, Int32 param);
+            internal static FragmentLightModeliSGIX glFragmentLightModeliSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FragmentLightModelivSGIX(int pname, Int32* @params);
+            internal unsafe static FragmentLightModelivSGIX glFragmentLightModelivSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FragmentMaterialfSGIX(int face, int pname, Single param);
+            internal static FragmentMaterialfSGIX glFragmentMaterialfSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FragmentMaterialfvSGIX(int face, int pname, Single* @params);
+            internal unsafe static FragmentMaterialfvSGIX glFragmentMaterialfvSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FragmentMaterialiSGIX(int face, int pname, Int32 param);
+            internal static FragmentMaterialiSGIX glFragmentMaterialiSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FragmentMaterialivSGIX(int face, int pname, Int32* @params);
+            internal unsafe static FragmentMaterialivSGIX glFragmentMaterialivSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetFragmentLightfvSGIX(int light, int pname, [Out] Single* @params);
+            internal unsafe static GetFragmentLightfvSGIX glGetFragmentLightfvSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetFragmentLightivSGIX(int light, int pname, [Out] Int32* @params);
+            internal unsafe static GetFragmentLightivSGIX glGetFragmentLightivSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetFragmentMaterialfvSGIX(int face, int pname, [Out] Single* @params);
+            internal unsafe static GetFragmentMaterialfvSGIX glGetFragmentMaterialfvSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetFragmentMaterialivSGIX(int face, int pname, [Out] Int32* @params);
+            internal unsafe static GetFragmentMaterialivSGIX glGetFragmentMaterialivSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void LightEnviSGIX(int pname, Int32 param);
+            internal static LightEnviSGIX glLightEnviSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawRangeElementsEXT(int mode, UInt32 start, UInt32 end, Int32 count, int type, IntPtr indices);
+            internal static DrawRangeElementsEXT glDrawRangeElementsEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ApplyTextureEXT(int mode);
+            internal static ApplyTextureEXT glApplyTextureEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TextureLightEXT(int pname);
+            internal static TextureLightEXT glTextureLightEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TextureMaterialEXT(int face, int mode);
+            internal static TextureMaterialEXT glTextureMaterialEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void AsyncMarkerSGIX(UInt32 marker);
+            internal static AsyncMarkerSGIX glAsyncMarkerSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Int32 FinishAsyncSGIX([Out] UInt32* markerp);
+            internal unsafe static FinishAsyncSGIX glFinishAsyncSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Int32 PollAsyncSGIX([Out] UInt32* markerp);
+            internal unsafe static PollAsyncSGIX glPollAsyncSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GenAsyncMarkersSGIX(Int32 range);
+            internal static GenAsyncMarkersSGIX glGenAsyncMarkersSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DeleteAsyncMarkersSGIX(UInt32 marker, Int32 range);
+            internal static DeleteAsyncMarkersSGIX glDeleteAsyncMarkersSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsAsyncMarkerSGIX(UInt32 marker);
+            internal static IsAsyncMarkerSGIX glIsAsyncMarkerSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexPointervINTEL(Int32 size, int type, IntPtr pointer);
+            internal static VertexPointervINTEL glVertexPointervINTEL;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void NormalPointervINTEL(int type, IntPtr pointer);
+            internal static NormalPointervINTEL glNormalPointervINTEL;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorPointervINTEL(Int32 size, int type, IntPtr pointer);
+            internal static ColorPointervINTEL glColorPointervINTEL;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoordPointervINTEL(Int32 size, int type, IntPtr pointer);
+            internal static TexCoordPointervINTEL glTexCoordPointervINTEL;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelTransformParameteriEXT(int target, int pname, Int32 param);
+            internal static PixelTransformParameteriEXT glPixelTransformParameteriEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelTransformParameterfEXT(int target, int pname, Single param);
+            internal static PixelTransformParameterfEXT glPixelTransformParameterfEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PixelTransformParameterivEXT(int target, int pname, Int32* @params);
+            internal unsafe static PixelTransformParameterivEXT glPixelTransformParameterivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PixelTransformParameterfvEXT(int target, int pname, Single* @params);
+            internal unsafe static PixelTransformParameterfvEXT glPixelTransformParameterfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3bEXT(SByte red, SByte green, SByte blue);
+            internal static SecondaryColor3bEXT glSecondaryColor3bEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3bvEXT(SByte* v);
+            internal unsafe static SecondaryColor3bvEXT glSecondaryColor3bvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3dEXT(Double red, Double green, Double blue);
+            internal static SecondaryColor3dEXT glSecondaryColor3dEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3dvEXT(Double* v);
+            internal unsafe static SecondaryColor3dvEXT glSecondaryColor3dvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3fEXT(Single red, Single green, Single blue);
+            internal static SecondaryColor3fEXT glSecondaryColor3fEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3fvEXT(Single* v);
+            internal unsafe static SecondaryColor3fvEXT glSecondaryColor3fvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3iEXT(Int32 red, Int32 green, Int32 blue);
+            internal static SecondaryColor3iEXT glSecondaryColor3iEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3ivEXT(Int32* v);
+            internal unsafe static SecondaryColor3ivEXT glSecondaryColor3ivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3sEXT(Int16 red, Int16 green, Int16 blue);
+            internal static SecondaryColor3sEXT glSecondaryColor3sEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3svEXT(Int16* v);
+            internal unsafe static SecondaryColor3svEXT glSecondaryColor3svEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3ubEXT(Byte red, Byte green, Byte blue);
+            internal static SecondaryColor3ubEXT glSecondaryColor3ubEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3ubvEXT(Byte* v);
+            internal unsafe static SecondaryColor3ubvEXT glSecondaryColor3ubvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3uiEXT(UInt32 red, UInt32 green, UInt32 blue);
+            internal static SecondaryColor3uiEXT glSecondaryColor3uiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3uivEXT(UInt32* v);
+            internal unsafe static SecondaryColor3uivEXT glSecondaryColor3uivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3usEXT(UInt16 red, UInt16 green, UInt16 blue);
+            internal static SecondaryColor3usEXT glSecondaryColor3usEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3usvEXT(UInt16* v);
+            internal unsafe static SecondaryColor3usvEXT glSecondaryColor3usvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColorPointerEXT(Int32 size, int type, Int32 stride, IntPtr pointer);
+            internal static SecondaryColorPointerEXT glSecondaryColorPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TextureNormalEXT(int mode);
+            internal static TextureNormalEXT glTextureNormalEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiDrawArraysEXT(int mode, [Out] Int32* first, [Out] Int32* count, Int32 primcount);
+            internal unsafe static MultiDrawArraysEXT glMultiDrawArraysEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiDrawElementsEXT(int mode, Int32* count, int type, IntPtr indices, Int32 primcount);
+            internal unsafe static MultiDrawElementsEXT glMultiDrawElementsEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FogCoordfEXT(Single coord);
+            internal static FogCoordfEXT glFogCoordfEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FogCoordfvEXT(Single* coord);
+            internal unsafe static FogCoordfvEXT glFogCoordfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FogCoorddEXT(Double coord);
+            internal static FogCoorddEXT glFogCoorddEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FogCoorddvEXT(Double* coord);
+            internal unsafe static FogCoorddvEXT glFogCoorddvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FogCoordPointerEXT(int type, Int32 stride, IntPtr pointer);
+            internal static FogCoordPointerEXT glFogCoordPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Tangent3bEXT(SByte tx, SByte ty, SByte tz);
+            internal static Tangent3bEXT glTangent3bEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Tangent3bvEXT(SByte* v);
+            internal unsafe static Tangent3bvEXT glTangent3bvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Tangent3dEXT(Double tx, Double ty, Double tz);
+            internal static Tangent3dEXT glTangent3dEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Tangent3dvEXT(Double* v);
+            internal unsafe static Tangent3dvEXT glTangent3dvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Tangent3fEXT(Single tx, Single ty, Single tz);
+            internal static Tangent3fEXT glTangent3fEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Tangent3fvEXT(Single* v);
+            internal unsafe static Tangent3fvEXT glTangent3fvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Tangent3iEXT(Int32 tx, Int32 ty, Int32 tz);
+            internal static Tangent3iEXT glTangent3iEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Tangent3ivEXT(Int32* v);
+            internal unsafe static Tangent3ivEXT glTangent3ivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Tangent3sEXT(Int16 tx, Int16 ty, Int16 tz);
+            internal static Tangent3sEXT glTangent3sEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Tangent3svEXT(Int16* v);
+            internal unsafe static Tangent3svEXT glTangent3svEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Binormal3bEXT(SByte bx, SByte by, SByte bz);
+            internal static Binormal3bEXT glBinormal3bEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Binormal3bvEXT(SByte* v);
+            internal unsafe static Binormal3bvEXT glBinormal3bvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Binormal3dEXT(Double bx, Double by, Double bz);
+            internal static Binormal3dEXT glBinormal3dEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Binormal3dvEXT(Double* v);
+            internal unsafe static Binormal3dvEXT glBinormal3dvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Binormal3fEXT(Single bx, Single by, Single bz);
+            internal static Binormal3fEXT glBinormal3fEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Binormal3fvEXT(Single* v);
+            internal unsafe static Binormal3fvEXT glBinormal3fvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Binormal3iEXT(Int32 bx, Int32 by, Int32 bz);
+            internal static Binormal3iEXT glBinormal3iEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Binormal3ivEXT(Int32* v);
+            internal unsafe static Binormal3ivEXT glBinormal3ivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Binormal3sEXT(Int16 bx, Int16 by, Int16 bz);
+            internal static Binormal3sEXT glBinormal3sEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Binormal3svEXT(Int16* v);
+            internal unsafe static Binormal3svEXT glBinormal3svEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TangentPointerEXT(int type, Int32 stride, IntPtr pointer);
+            internal static TangentPointerEXT glTangentPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BinormalPointerEXT(int type, Int32 stride, IntPtr pointer);
+            internal static BinormalPointerEXT glBinormalPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FinishTextureSUNX();
+            internal static FinishTextureSUNX glFinishTextureSUNX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GlobalAlphaFactorbSUN(SByte factor);
+            internal static GlobalAlphaFactorbSUN glGlobalAlphaFactorbSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GlobalAlphaFactorsSUN(Int16 factor);
+            internal static GlobalAlphaFactorsSUN glGlobalAlphaFactorsSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GlobalAlphaFactoriSUN(Int32 factor);
+            internal static GlobalAlphaFactoriSUN glGlobalAlphaFactoriSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GlobalAlphaFactorfSUN(Single factor);
+            internal static GlobalAlphaFactorfSUN glGlobalAlphaFactorfSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GlobalAlphaFactordSUN(Double factor);
+            internal static GlobalAlphaFactordSUN glGlobalAlphaFactordSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GlobalAlphaFactorubSUN(Byte factor);
+            internal static GlobalAlphaFactorubSUN glGlobalAlphaFactorubSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GlobalAlphaFactorusSUN(UInt16 factor);
+            internal static GlobalAlphaFactorusSUN glGlobalAlphaFactorusSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GlobalAlphaFactoruiSUN(UInt32 factor);
+            internal static GlobalAlphaFactoruiSUN glGlobalAlphaFactoruiSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeuiSUN(UInt32 code);
+            internal static ReplacementCodeuiSUN glReplacementCodeuiSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeusSUN(UInt16 code);
+            internal static ReplacementCodeusSUN glReplacementCodeusSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeubSUN(Byte code);
+            internal static ReplacementCodeubSUN glReplacementCodeubSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeuivSUN(UInt32* code);
+            internal unsafe static ReplacementCodeuivSUN glReplacementCodeuivSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeusvSUN(UInt16* code);
+            internal unsafe static ReplacementCodeusvSUN glReplacementCodeusvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeubvSUN(Byte* code);
+            internal unsafe static ReplacementCodeubvSUN glReplacementCodeubvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodePointerSUN(int type, Int32 stride, IntPtr pointer);
+            internal static ReplacementCodePointerSUN glReplacementCodePointerSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4ubVertex2fSUN(Byte r, Byte g, Byte b, Byte a, Single x, Single y);
+            internal static Color4ubVertex2fSUN glColor4ubVertex2fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4ubVertex2fvSUN(Byte* c, Single* v);
+            internal unsafe static Color4ubVertex2fvSUN glColor4ubVertex2fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4ubVertex3fSUN(Byte r, Byte g, Byte b, Byte a, Single x, Single y, Single z);
+            internal static Color4ubVertex3fSUN glColor4ubVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4ubVertex3fvSUN(Byte* c, Single* v);
+            internal unsafe static Color4ubVertex3fvSUN glColor4ubVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color3fVertex3fSUN(Single r, Single g, Single b, Single x, Single y, Single z);
+            internal static Color3fVertex3fSUN glColor3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color3fVertex3fvSUN(Single* c, Single* v);
+            internal unsafe static Color3fVertex3fvSUN glColor3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Normal3fVertex3fSUN(Single nx, Single ny, Single nz, Single x, Single y, Single z);
+            internal static Normal3fVertex3fSUN glNormal3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Normal3fVertex3fvSUN(Single* n, Single* v);
+            internal unsafe static Normal3fVertex3fvSUN glNormal3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4fNormal3fVertex3fSUN(Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z);
+            internal static Color4fNormal3fVertex3fSUN glColor4fNormal3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4fNormal3fVertex3fvSUN(Single* c, Single* n, Single* v);
+            internal unsafe static Color4fNormal3fVertex3fvSUN glColor4fNormal3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord2fVertex3fSUN(Single s, Single t, Single x, Single y, Single z);
+            internal static TexCoord2fVertex3fSUN glTexCoord2fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord2fVertex3fvSUN(Single* tc, Single* v);
+            internal unsafe static TexCoord2fVertex3fvSUN glTexCoord2fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord4fVertex4fSUN(Single s, Single t, Single p, Single q, Single x, Single y, Single z, Single w);
+            internal static TexCoord4fVertex4fSUN glTexCoord4fVertex4fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord4fVertex4fvSUN(Single* tc, Single* v);
+            internal unsafe static TexCoord4fVertex4fvSUN glTexCoord4fVertex4fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord2fColor4ubVertex3fSUN(Single s, Single t, Byte r, Byte g, Byte b, Byte a, Single x, Single y, Single z);
+            internal static TexCoord2fColor4ubVertex3fSUN glTexCoord2fColor4ubVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord2fColor4ubVertex3fvSUN(Single* tc, Byte* c, Single* v);
+            internal unsafe static TexCoord2fColor4ubVertex3fvSUN glTexCoord2fColor4ubVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord2fColor3fVertex3fSUN(Single s, Single t, Single r, Single g, Single b, Single x, Single y, Single z);
+            internal static TexCoord2fColor3fVertex3fSUN glTexCoord2fColor3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord2fColor3fVertex3fvSUN(Single* tc, Single* c, Single* v);
+            internal unsafe static TexCoord2fColor3fVertex3fvSUN glTexCoord2fColor3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord2fNormal3fVertex3fSUN(Single s, Single t, Single nx, Single ny, Single nz, Single x, Single y, Single z);
+            internal static TexCoord2fNormal3fVertex3fSUN glTexCoord2fNormal3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord2fNormal3fVertex3fvSUN(Single* tc, Single* n, Single* v);
+            internal unsafe static TexCoord2fNormal3fVertex3fvSUN glTexCoord2fNormal3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord2fColor4fNormal3fVertex3fSUN(Single s, Single t, Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z);
+            internal static TexCoord2fColor4fNormal3fVertex3fSUN glTexCoord2fColor4fNormal3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord2fColor4fNormal3fVertex3fvSUN(Single* tc, Single* c, Single* n, Single* v);
+            internal unsafe static TexCoord2fColor4fNormal3fVertex3fvSUN glTexCoord2fColor4fNormal3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord4fColor4fNormal3fVertex4fSUN(Single s, Single t, Single p, Single q, Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z, Single w);
+            internal static TexCoord4fColor4fNormal3fVertex4fSUN glTexCoord4fColor4fNormal3fVertex4fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord4fColor4fNormal3fVertex4fvSUN(Single* tc, Single* c, Single* n, Single* v);
+            internal unsafe static TexCoord4fColor4fNormal3fVertex4fvSUN glTexCoord4fColor4fNormal3fVertex4fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeuiVertex3fSUN(UInt32 rc, Single x, Single y, Single z);
+            internal static ReplacementCodeuiVertex3fSUN glReplacementCodeuiVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeuiVertex3fvSUN(UInt32* rc, Single* v);
+            internal unsafe static ReplacementCodeuiVertex3fvSUN glReplacementCodeuiVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeuiColor4ubVertex3fSUN(UInt32 rc, Byte r, Byte g, Byte b, Byte a, Single x, Single y, Single z);
+            internal static ReplacementCodeuiColor4ubVertex3fSUN glReplacementCodeuiColor4ubVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeuiColor4ubVertex3fvSUN(UInt32* rc, Byte* c, Single* v);
+            internal unsafe static ReplacementCodeuiColor4ubVertex3fvSUN glReplacementCodeuiColor4ubVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeuiColor3fVertex3fSUN(UInt32 rc, Single r, Single g, Single b, Single x, Single y, Single z);
+            internal static ReplacementCodeuiColor3fVertex3fSUN glReplacementCodeuiColor3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeuiColor3fVertex3fvSUN(UInt32* rc, Single* c, Single* v);
+            internal unsafe static ReplacementCodeuiColor3fVertex3fvSUN glReplacementCodeuiColor3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeuiNormal3fVertex3fSUN(UInt32 rc, Single nx, Single ny, Single nz, Single x, Single y, Single z);
+            internal static ReplacementCodeuiNormal3fVertex3fSUN glReplacementCodeuiNormal3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeuiNormal3fVertex3fvSUN(UInt32* rc, Single* n, Single* v);
+            internal unsafe static ReplacementCodeuiNormal3fVertex3fvSUN glReplacementCodeuiNormal3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeuiColor4fNormal3fVertex3fSUN(UInt32 rc, Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z);
+            internal static ReplacementCodeuiColor4fNormal3fVertex3fSUN glReplacementCodeuiColor4fNormal3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeuiColor4fNormal3fVertex3fvSUN(UInt32* rc, Single* c, Single* n, Single* v);
+            internal unsafe static ReplacementCodeuiColor4fNormal3fVertex3fvSUN glReplacementCodeuiColor4fNormal3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeuiTexCoord2fVertex3fSUN(UInt32 rc, Single s, Single t, Single x, Single y, Single z);
+            internal static ReplacementCodeuiTexCoord2fVertex3fSUN glReplacementCodeuiTexCoord2fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeuiTexCoord2fVertex3fvSUN(UInt32* rc, Single* tc, Single* v);
+            internal unsafe static ReplacementCodeuiTexCoord2fVertex3fvSUN glReplacementCodeuiTexCoord2fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(UInt32 rc, Single s, Single t, Single nx, Single ny, Single nz, Single x, Single y, Single z);
+            internal static ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(UInt32* rc, Single* tc, Single* n, Single* v);
+            internal unsafe static ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(UInt32 rc, Single s, Single t, Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z);
+            internal static ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(UInt32* rc, Single* tc, Single* c, Single* n, Single* v);
+            internal unsafe static ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlendFuncSeparateEXT(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha);
+            internal static BlendFuncSeparateEXT glBlendFuncSeparateEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlendFuncSeparateINGR(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha);
+            internal static BlendFuncSeparateINGR glBlendFuncSeparateINGR;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexWeightfEXT(Single weight);
+            internal static VertexWeightfEXT glVertexWeightfEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexWeightfvEXT(Single* weight);
+            internal unsafe static VertexWeightfvEXT glVertexWeightfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexWeightPointerEXT(Int32 size, int type, Int32 stride, IntPtr pointer);
+            internal static VertexWeightPointerEXT glVertexWeightPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FlushVertexArrayRangeNV();
+            internal static FlushVertexArrayRangeNV glFlushVertexArrayRangeNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexArrayRangeNV(Int32 length, IntPtr pointer);
+            internal static VertexArrayRangeNV glVertexArrayRangeNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void CombinerParameterfvNV(int pname, Single* @params);
+            internal unsafe static CombinerParameterfvNV glCombinerParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CombinerParameterfNV(int pname, Single param);
+            internal static CombinerParameterfNV glCombinerParameterfNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void CombinerParameterivNV(int pname, Int32* @params);
+            internal unsafe static CombinerParameterivNV glCombinerParameterivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CombinerParameteriNV(int pname, Int32 param);
+            internal static CombinerParameteriNV glCombinerParameteriNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CombinerInputNV(int stage, int portion, int variable, int input, int mapping, int componentUsage);
+            internal static CombinerInputNV glCombinerInputNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void CombinerOutputNV(int stage, int portion, int abOutput, int cdOutput, int sumOutput, int scale, int bias, bool abDotProduct, bool cdDotProduct, bool muxSum);
+            internal static CombinerOutputNV glCombinerOutputNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FinalCombinerInputNV(int variable, int input, int mapping, int componentUsage);
+            internal static FinalCombinerInputNV glFinalCombinerInputNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetCombinerInputParameterfvNV(int stage, int portion, int variable, int pname, [Out] Single* @params);
+            internal unsafe static GetCombinerInputParameterfvNV glGetCombinerInputParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetCombinerInputParameterivNV(int stage, int portion, int variable, int pname, [Out] Int32* @params);
+            internal unsafe static GetCombinerInputParameterivNV glGetCombinerInputParameterivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetCombinerOutputParameterfvNV(int stage, int portion, int pname, [Out] Single* @params);
+            internal unsafe static GetCombinerOutputParameterfvNV glGetCombinerOutputParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetCombinerOutputParameterivNV(int stage, int portion, int pname, [Out] Int32* @params);
+            internal unsafe static GetCombinerOutputParameterivNV glGetCombinerOutputParameterivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetFinalCombinerInputParameterfvNV(int variable, int pname, [Out] Single* @params);
+            internal unsafe static GetFinalCombinerInputParameterfvNV glGetFinalCombinerInputParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetFinalCombinerInputParameterivNV(int variable, int pname, [Out] Int32* @params);
+            internal unsafe static GetFinalCombinerInputParameterivNV glGetFinalCombinerInputParameterivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ResizeBuffersMESA();
+            internal static ResizeBuffersMESA glResizeBuffersMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2dMESA(Double x, Double y);
+            internal static WindowPos2dMESA glWindowPos2dMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2dvMESA(Double* v);
+            internal unsafe static WindowPos2dvMESA glWindowPos2dvMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2fMESA(Single x, Single y);
+            internal static WindowPos2fMESA glWindowPos2fMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2fvMESA(Single* v);
+            internal unsafe static WindowPos2fvMESA glWindowPos2fvMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2iMESA(Int32 x, Int32 y);
+            internal static WindowPos2iMESA glWindowPos2iMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2ivMESA(Int32* v);
+            internal unsafe static WindowPos2ivMESA glWindowPos2ivMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos2sMESA(Int16 x, Int16 y);
+            internal static WindowPos2sMESA glWindowPos2sMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos2svMESA(Int16* v);
+            internal unsafe static WindowPos2svMESA glWindowPos2svMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3dMESA(Double x, Double y, Double z);
+            internal static WindowPos3dMESA glWindowPos3dMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3dvMESA(Double* v);
+            internal unsafe static WindowPos3dvMESA glWindowPos3dvMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3fMESA(Single x, Single y, Single z);
+            internal static WindowPos3fMESA glWindowPos3fMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3fvMESA(Single* v);
+            internal unsafe static WindowPos3fvMESA glWindowPos3fvMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3iMESA(Int32 x, Int32 y, Int32 z);
+            internal static WindowPos3iMESA glWindowPos3iMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3ivMESA(Int32* v);
+            internal unsafe static WindowPos3ivMESA glWindowPos3ivMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos3sMESA(Int16 x, Int16 y, Int16 z);
+            internal static WindowPos3sMESA glWindowPos3sMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos3svMESA(Int16* v);
+            internal unsafe static WindowPos3svMESA glWindowPos3svMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos4dMESA(Double x, Double y, Double z, Double w);
+            internal static WindowPos4dMESA glWindowPos4dMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos4dvMESA(Double* v);
+            internal unsafe static WindowPos4dvMESA glWindowPos4dvMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos4fMESA(Single x, Single y, Single z, Single w);
+            internal static WindowPos4fMESA glWindowPos4fMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos4fvMESA(Single* v);
+            internal unsafe static WindowPos4fvMESA glWindowPos4fvMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos4iMESA(Int32 x, Int32 y, Int32 z, Int32 w);
+            internal static WindowPos4iMESA glWindowPos4iMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos4ivMESA(Int32* v);
+            internal unsafe static WindowPos4ivMESA glWindowPos4ivMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WindowPos4sMESA(Int16 x, Int16 y, Int16 z, Int16 w);
+            internal static WindowPos4sMESA glWindowPos4sMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void WindowPos4svMESA(Int16* v);
+            internal unsafe static WindowPos4svMESA glWindowPos4svMESA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiModeDrawArraysIBM(int* mode, Int32* first, Int32* count, Int32 primcount, Int32 modestride);
+            internal unsafe static MultiModeDrawArraysIBM glMultiModeDrawArraysIBM;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiModeDrawElementsIBM(int* mode, Int32* count, int type, IntPtr indices, Int32 primcount, Int32 modestride);
+            internal unsafe static MultiModeDrawElementsIBM glMultiModeDrawElementsIBM;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorPointerListIBM(Int32 size, int type, Int32 stride, IntPtr pointer, Int32 ptrstride);
+            internal static ColorPointerListIBM glColorPointerListIBM;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColorPointerListIBM(Int32 size, int type, Int32 stride, IntPtr pointer, Int32 ptrstride);
+            internal static SecondaryColorPointerListIBM glSecondaryColorPointerListIBM;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void EdgeFlagPointerListIBM(Int32 stride, bool* pointer, Int32 ptrstride);
+            internal unsafe static EdgeFlagPointerListIBM glEdgeFlagPointerListIBM;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FogCoordPointerListIBM(int type, Int32 stride, IntPtr pointer, Int32 ptrstride);
+            internal static FogCoordPointerListIBM glFogCoordPointerListIBM;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void IndexPointerListIBM(int type, Int32 stride, IntPtr pointer, Int32 ptrstride);
+            internal static IndexPointerListIBM glIndexPointerListIBM;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void NormalPointerListIBM(int type, Int32 stride, IntPtr pointer, Int32 ptrstride);
+            internal static NormalPointerListIBM glNormalPointerListIBM;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoordPointerListIBM(Int32 size, int type, Int32 stride, IntPtr pointer, Int32 ptrstride);
+            internal static TexCoordPointerListIBM glTexCoordPointerListIBM;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexPointerListIBM(Int32 size, int type, Int32 stride, IntPtr pointer, Int32 ptrstride);
+            internal static VertexPointerListIBM glVertexPointerListIBM;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TbufferMask3DFX(UInt32 mask);
+            internal static TbufferMask3DFX glTbufferMask3DFX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SampleMaskEXT(Single value, bool invert);
+            internal static SampleMaskEXT glSampleMaskEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SamplePatternEXT(int pattern);
+            internal static SamplePatternEXT glSamplePatternEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TextureColorMaskSGIS(bool red, bool green, bool blue, bool alpha);
+            internal static TextureColorMaskSGIS glTextureColorMaskSGIS;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void IglooInterfaceSGIX(int pname, IntPtr @params);
+            internal static IglooInterfaceSGIX glIglooInterfaceSGIX;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteFencesNV(Int32 n, UInt32* fences);
+            internal unsafe static DeleteFencesNV glDeleteFencesNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenFencesNV(Int32 n, [Out] UInt32* fences);
+            internal unsafe static GenFencesNV glGenFencesNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsFenceNV(UInt32 fence);
+            internal static IsFenceNV glIsFenceNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool TestFenceNV(UInt32 fence);
+            internal static TestFenceNV glTestFenceNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetFenceivNV(UInt32 fence, int pname, [Out] Int32* @params);
+            internal unsafe static GetFenceivNV glGetFenceivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FinishFenceNV(UInt32 fence);
+            internal static FinishFenceNV glFinishFenceNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SetFenceNV(UInt32 fence, int condition);
+            internal static SetFenceNV glSetFenceNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MapControlPointsNV(int target, UInt32 index, int type, Int32 ustride, Int32 vstride, Int32 uorder, Int32 vorder, bool packed, IntPtr points);
+            internal static MapControlPointsNV glMapControlPointsNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MapParameterivNV(int target, int pname, Int32* @params);
+            internal unsafe static MapParameterivNV glMapParameterivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MapParameterfvNV(int target, int pname, Single* @params);
+            internal unsafe static MapParameterfvNV glMapParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetMapControlPointsNV(int target, UInt32 index, int type, Int32 ustride, Int32 vstride, bool packed, [Out] IntPtr points);
+            internal static GetMapControlPointsNV glGetMapControlPointsNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMapParameterivNV(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetMapParameterivNV glGetMapParameterivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMapParameterfvNV(int target, int pname, [Out] Single* @params);
+            internal unsafe static GetMapParameterfvNV glGetMapParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMapAttribParameterivNV(int target, UInt32 index, int pname, [Out] Int32* @params);
+            internal unsafe static GetMapAttribParameterivNV glGetMapAttribParameterivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetMapAttribParameterfvNV(int target, UInt32 index, int pname, [Out] Single* @params);
+            internal unsafe static GetMapAttribParameterfvNV glGetMapAttribParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EvalMapsNV(int target, int mode);
+            internal static EvalMapsNV glEvalMapsNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void CombinerStageParameterfvNV(int stage, int pname, Single* @params);
+            internal unsafe static CombinerStageParameterfvNV glCombinerStageParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetCombinerStageParameterfvNV(int stage, int pname, [Out] Single* @params);
+            internal unsafe static GetCombinerStageParameterfvNV glGetCombinerStageParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate bool AreProgramsResidentNV(Int32 n, UInt32* programs, [Out] bool* residences);
+            internal unsafe static AreProgramsResidentNV glAreProgramsResidentNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindProgramNV(int target, UInt32 id);
+            internal static BindProgramNV glBindProgramNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteProgramsNV(Int32 n, UInt32* programs);
+            internal unsafe static DeleteProgramsNV glDeleteProgramsNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ExecuteProgramNV(int target, UInt32 id, Single* @params);
+            internal unsafe static ExecuteProgramNV glExecuteProgramNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenProgramsNV(Int32 n, [Out] UInt32* programs);
+            internal unsafe static GenProgramsNV glGenProgramsNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramParameterdvNV(int target, UInt32 index, int pname, [Out] Double* @params);
+            internal unsafe static GetProgramParameterdvNV glGetProgramParameterdvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramParameterfvNV(int target, UInt32 index, int pname, [Out] Single* @params);
+            internal unsafe static GetProgramParameterfvNV glGetProgramParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramivNV(UInt32 id, int pname, [Out] Int32* @params);
+            internal unsafe static GetProgramivNV glGetProgramivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramStringNV(UInt32 id, int pname, [Out] Byte* program);
+            internal unsafe static GetProgramStringNV glGetProgramStringNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTrackMatrixivNV(int target, UInt32 address, int pname, [Out] Int32* @params);
+            internal unsafe static GetTrackMatrixivNV glGetTrackMatrixivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribdvNV(UInt32 index, int pname, [Out] Double* @params);
+            internal unsafe static GetVertexAttribdvNV glGetVertexAttribdvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribfvNV(UInt32 index, int pname, [Out] Single* @params);
+            internal unsafe static GetVertexAttribfvNV glGetVertexAttribfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribivNV(UInt32 index, int pname, [Out] Int32* @params);
+            internal unsafe static GetVertexAttribivNV glGetVertexAttribivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetVertexAttribPointervNV(UInt32 index, int pname, [Out] IntPtr pointer);
+            internal static GetVertexAttribPointervNV glGetVertexAttribPointervNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsProgramNV(UInt32 id);
+            internal static IsProgramNV glIsProgramNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void LoadProgramNV(int target, UInt32 id, Int32 len, Byte* program);
+            internal unsafe static LoadProgramNV glLoadProgramNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramParameter4dNV(int target, UInt32 index, Double x, Double y, Double z, Double w);
+            internal static ProgramParameter4dNV glProgramParameter4dNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramParameter4dvNV(int target, UInt32 index, Double* v);
+            internal unsafe static ProgramParameter4dvNV glProgramParameter4dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramParameter4fNV(int target, UInt32 index, Single x, Single y, Single z, Single w);
+            internal static ProgramParameter4fNV glProgramParameter4fNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramParameter4fvNV(int target, UInt32 index, Single* v);
+            internal unsafe static ProgramParameter4fvNV glProgramParameter4fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramParameters4dvNV(int target, UInt32 index, UInt32 count, Double* v);
+            internal unsafe static ProgramParameters4dvNV glProgramParameters4dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramParameters4fvNV(int target, UInt32 index, UInt32 count, Single* v);
+            internal unsafe static ProgramParameters4fvNV glProgramParameters4fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void RequestResidentProgramsNV(Int32 n, UInt32* programs);
+            internal unsafe static RequestResidentProgramsNV glRequestResidentProgramsNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TrackMatrixNV(int target, UInt32 address, int matrix, int transform);
+            internal static TrackMatrixNV glTrackMatrixNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribPointerNV(UInt32 index, Int32 fsize, int type, Int32 stride, IntPtr pointer);
+            internal static VertexAttribPointerNV glVertexAttribPointerNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib1dNV(UInt32 index, Double x);
+            internal static VertexAttrib1dNV glVertexAttrib1dNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib1dvNV(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib1dvNV glVertexAttrib1dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib1fNV(UInt32 index, Single x);
+            internal static VertexAttrib1fNV glVertexAttrib1fNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib1fvNV(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib1fvNV glVertexAttrib1fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib1sNV(UInt32 index, Int16 x);
+            internal static VertexAttrib1sNV glVertexAttrib1sNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib1svNV(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib1svNV glVertexAttrib1svNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib2dNV(UInt32 index, Double x, Double y);
+            internal static VertexAttrib2dNV glVertexAttrib2dNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib2dvNV(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib2dvNV glVertexAttrib2dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib2fNV(UInt32 index, Single x, Single y);
+            internal static VertexAttrib2fNV glVertexAttrib2fNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib2fvNV(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib2fvNV glVertexAttrib2fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib2sNV(UInt32 index, Int16 x, Int16 y);
+            internal static VertexAttrib2sNV glVertexAttrib2sNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib2svNV(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib2svNV glVertexAttrib2svNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib3dNV(UInt32 index, Double x, Double y, Double z);
+            internal static VertexAttrib3dNV glVertexAttrib3dNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib3dvNV(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib3dvNV glVertexAttrib3dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib3fNV(UInt32 index, Single x, Single y, Single z);
+            internal static VertexAttrib3fNV glVertexAttrib3fNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib3fvNV(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib3fvNV glVertexAttrib3fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib3sNV(UInt32 index, Int16 x, Int16 y, Int16 z);
+            internal static VertexAttrib3sNV glVertexAttrib3sNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib3svNV(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib3svNV glVertexAttrib3svNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4dNV(UInt32 index, Double x, Double y, Double z, Double w);
+            internal static VertexAttrib4dNV glVertexAttrib4dNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4dvNV(UInt32 index, Double* v);
+            internal unsafe static VertexAttrib4dvNV glVertexAttrib4dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4fNV(UInt32 index, Single x, Single y, Single z, Single w);
+            internal static VertexAttrib4fNV glVertexAttrib4fNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4fvNV(UInt32 index, Single* v);
+            internal unsafe static VertexAttrib4fvNV glVertexAttrib4fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4sNV(UInt32 index, Int16 x, Int16 y, Int16 z, Int16 w);
+            internal static VertexAttrib4sNV glVertexAttrib4sNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4svNV(UInt32 index, Int16* v);
+            internal unsafe static VertexAttrib4svNV glVertexAttrib4svNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4ubNV(UInt32 index, Byte x, Byte y, Byte z, Byte w);
+            internal static VertexAttrib4ubNV glVertexAttrib4ubNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4ubvNV(UInt32 index, Byte* v);
+            internal unsafe static VertexAttrib4ubvNV glVertexAttrib4ubvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs1dvNV(UInt32 index, Int32 count, Double* v);
+            internal unsafe static VertexAttribs1dvNV glVertexAttribs1dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs1fvNV(UInt32 index, Int32 count, Single* v);
+            internal unsafe static VertexAttribs1fvNV glVertexAttribs1fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs1svNV(UInt32 index, Int32 count, Int16* v);
+            internal unsafe static VertexAttribs1svNV glVertexAttribs1svNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs2dvNV(UInt32 index, Int32 count, Double* v);
+            internal unsafe static VertexAttribs2dvNV glVertexAttribs2dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs2fvNV(UInt32 index, Int32 count, Single* v);
+            internal unsafe static VertexAttribs2fvNV glVertexAttribs2fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs2svNV(UInt32 index, Int32 count, Int16* v);
+            internal unsafe static VertexAttribs2svNV glVertexAttribs2svNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs3dvNV(UInt32 index, Int32 count, Double* v);
+            internal unsafe static VertexAttribs3dvNV glVertexAttribs3dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs3fvNV(UInt32 index, Int32 count, Single* v);
+            internal unsafe static VertexAttribs3fvNV glVertexAttribs3fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs3svNV(UInt32 index, Int32 count, Int16* v);
+            internal unsafe static VertexAttribs3svNV glVertexAttribs3svNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs4dvNV(UInt32 index, Int32 count, Double* v);
+            internal unsafe static VertexAttribs4dvNV glVertexAttribs4dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs4fvNV(UInt32 index, Int32 count, Single* v);
+            internal unsafe static VertexAttribs4fvNV glVertexAttribs4fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs4svNV(UInt32 index, Int32 count, Int16* v);
+            internal unsafe static VertexAttribs4svNV glVertexAttribs4svNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs4ubvNV(UInt32 index, Int32 count, Byte* v);
+            internal unsafe static VertexAttribs4ubvNV glVertexAttribs4ubvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexBumpParameterivATI(int pname, Int32* param);
+            internal unsafe static TexBumpParameterivATI glTexBumpParameterivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexBumpParameterfvATI(int pname, Single* param);
+            internal unsafe static TexBumpParameterfvATI glTexBumpParameterfvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexBumpParameterivATI(int pname, [Out] Int32* param);
+            internal unsafe static GetTexBumpParameterivATI glGetTexBumpParameterivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexBumpParameterfvATI(int pname, [Out] Single* param);
+            internal unsafe static GetTexBumpParameterfvATI glGetTexBumpParameterfvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GenFragmentShadersATI(UInt32 range);
+            internal static GenFragmentShadersATI glGenFragmentShadersATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindFragmentShaderATI(UInt32 id);
+            internal static BindFragmentShaderATI glBindFragmentShaderATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DeleteFragmentShaderATI(UInt32 id);
+            internal static DeleteFragmentShaderATI glDeleteFragmentShaderATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BeginFragmentShaderATI();
+            internal static BeginFragmentShaderATI glBeginFragmentShaderATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EndFragmentShaderATI();
+            internal static EndFragmentShaderATI glEndFragmentShaderATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PassTexCoordATI(UInt32 dst, UInt32 coord, int swizzle);
+            internal static PassTexCoordATI glPassTexCoordATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SampleMapATI(UInt32 dst, UInt32 interp, int swizzle);
+            internal static SampleMapATI glSampleMapATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorFragmentOp1ATI(int op, UInt32 dst, UInt32 dstMask, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod);
+            internal static ColorFragmentOp1ATI glColorFragmentOp1ATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorFragmentOp2ATI(int op, UInt32 dst, UInt32 dstMask, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod, UInt32 arg2, UInt32 arg2Rep, UInt32 arg2Mod);
+            internal static ColorFragmentOp2ATI glColorFragmentOp2ATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorFragmentOp3ATI(int op, UInt32 dst, UInt32 dstMask, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod, UInt32 arg2, UInt32 arg2Rep, UInt32 arg2Mod, UInt32 arg3, UInt32 arg3Rep, UInt32 arg3Mod);
+            internal static ColorFragmentOp3ATI glColorFragmentOp3ATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void AlphaFragmentOp1ATI(int op, UInt32 dst, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod);
+            internal static AlphaFragmentOp1ATI glAlphaFragmentOp1ATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void AlphaFragmentOp2ATI(int op, UInt32 dst, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod, UInt32 arg2, UInt32 arg2Rep, UInt32 arg2Mod);
+            internal static AlphaFragmentOp2ATI glAlphaFragmentOp2ATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void AlphaFragmentOp3ATI(int op, UInt32 dst, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod, UInt32 arg2, UInt32 arg2Rep, UInt32 arg2Mod, UInt32 arg3, UInt32 arg3Rep, UInt32 arg3Mod);
+            internal static AlphaFragmentOp3ATI glAlphaFragmentOp3ATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SetFragmentShaderConstantATI(UInt32 dst, Single* value);
+            internal unsafe static SetFragmentShaderConstantATI glSetFragmentShaderConstantATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PNTrianglesiATI(int pname, Int32 param);
+            internal static PNTrianglesiATI glPNTrianglesiATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PNTrianglesfATI(int pname, Single param);
+            internal static PNTrianglesfATI glPNTrianglesfATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 NewObjectBufferATI(Int32 size, IntPtr pointer, int usage);
+            internal static NewObjectBufferATI glNewObjectBufferATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsObjectBufferATI(UInt32 buffer);
+            internal static IsObjectBufferATI glIsObjectBufferATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void UpdateObjectBufferATI(UInt32 buffer, UInt32 offset, Int32 size, IntPtr pointer, int preserve);
+            internal static UpdateObjectBufferATI glUpdateObjectBufferATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetObjectBufferfvATI(UInt32 buffer, int pname, [Out] Single* @params);
+            internal unsafe static GetObjectBufferfvATI glGetObjectBufferfvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetObjectBufferivATI(UInt32 buffer, int pname, [Out] Int32* @params);
+            internal unsafe static GetObjectBufferivATI glGetObjectBufferivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FreeObjectBufferATI(UInt32 buffer);
+            internal static FreeObjectBufferATI glFreeObjectBufferATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ArrayObjectATI(int array, Int32 size, int type, Int32 stride, UInt32 buffer, UInt32 offset);
+            internal static ArrayObjectATI glArrayObjectATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetArrayObjectfvATI(int array, int pname, [Out] Single* @params);
+            internal unsafe static GetArrayObjectfvATI glGetArrayObjectfvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetArrayObjectivATI(int array, int pname, [Out] Int32* @params);
+            internal unsafe static GetArrayObjectivATI glGetArrayObjectivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VariantArrayObjectATI(UInt32 id, int type, Int32 stride, UInt32 buffer, UInt32 offset);
+            internal static VariantArrayObjectATI glVariantArrayObjectATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVariantArrayObjectfvATI(UInt32 id, int pname, [Out] Single* @params);
+            internal unsafe static GetVariantArrayObjectfvATI glGetVariantArrayObjectfvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVariantArrayObjectivATI(UInt32 id, int pname, [Out] Int32* @params);
+            internal unsafe static GetVariantArrayObjectivATI glGetVariantArrayObjectivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BeginVertexShaderEXT();
+            internal static BeginVertexShaderEXT glBeginVertexShaderEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EndVertexShaderEXT();
+            internal static EndVertexShaderEXT glEndVertexShaderEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindVertexShaderEXT(UInt32 id);
+            internal static BindVertexShaderEXT glBindVertexShaderEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GenVertexShadersEXT(UInt32 range);
+            internal static GenVertexShadersEXT glGenVertexShadersEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DeleteVertexShaderEXT(UInt32 id);
+            internal static DeleteVertexShaderEXT glDeleteVertexShaderEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ShaderOp1EXT(int op, UInt32 res, UInt32 arg1);
+            internal static ShaderOp1EXT glShaderOp1EXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ShaderOp2EXT(int op, UInt32 res, UInt32 arg1, UInt32 arg2);
+            internal static ShaderOp2EXT glShaderOp2EXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ShaderOp3EXT(int op, UInt32 res, UInt32 arg1, UInt32 arg2, UInt32 arg3);
+            internal static ShaderOp3EXT glShaderOp3EXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SwizzleEXT(UInt32 res, UInt32 @in, int outX, int outY, int outZ, int outW);
+            internal static SwizzleEXT glSwizzleEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void WriteMaskEXT(UInt32 res, UInt32 @in, int outX, int outY, int outZ, int outW);
+            internal static WriteMaskEXT glWriteMaskEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void InsertComponentEXT(UInt32 res, UInt32 src, UInt32 num);
+            internal static InsertComponentEXT glInsertComponentEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ExtractComponentEXT(UInt32 res, UInt32 src, UInt32 num);
+            internal static ExtractComponentEXT glExtractComponentEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GenSymbolsEXT(int datatype, int storagetype, int range, UInt32 components);
+            internal static GenSymbolsEXT glGenSymbolsEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SetInvariantEXT(UInt32 id, int type, IntPtr addr);
+            internal static SetInvariantEXT glSetInvariantEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SetLocalConstantEXT(UInt32 id, int type, IntPtr addr);
+            internal static SetLocalConstantEXT glSetLocalConstantEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VariantbvEXT(UInt32 id, SByte* addr);
+            internal unsafe static VariantbvEXT glVariantbvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VariantsvEXT(UInt32 id, Int16* addr);
+            internal unsafe static VariantsvEXT glVariantsvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VariantivEXT(UInt32 id, Int32* addr);
+            internal unsafe static VariantivEXT glVariantivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VariantfvEXT(UInt32 id, Single* addr);
+            internal unsafe static VariantfvEXT glVariantfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VariantdvEXT(UInt32 id, Double* addr);
+            internal unsafe static VariantdvEXT glVariantdvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VariantubvEXT(UInt32 id, Byte* addr);
+            internal unsafe static VariantubvEXT glVariantubvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VariantusvEXT(UInt32 id, UInt16* addr);
+            internal unsafe static VariantusvEXT glVariantusvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VariantuivEXT(UInt32 id, UInt32* addr);
+            internal unsafe static VariantuivEXT glVariantuivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VariantPointerEXT(UInt32 id, int type, UInt32 stride, IntPtr addr);
+            internal static VariantPointerEXT glVariantPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EnableVariantClientStateEXT(UInt32 id);
+            internal static EnableVariantClientStateEXT glEnableVariantClientStateEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DisableVariantClientStateEXT(UInt32 id);
+            internal static DisableVariantClientStateEXT glDisableVariantClientStateEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 BindLightParameterEXT(int light, int value);
+            internal static BindLightParameterEXT glBindLightParameterEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 BindMaterialParameterEXT(int face, int value);
+            internal static BindMaterialParameterEXT glBindMaterialParameterEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 BindTexGenParameterEXT(int unit, int coord, int value);
+            internal static BindTexGenParameterEXT glBindTexGenParameterEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 BindTextureUnitParameterEXT(int unit, int value);
+            internal static BindTextureUnitParameterEXT glBindTextureUnitParameterEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 BindParameterEXT(int value);
+            internal static BindParameterEXT glBindParameterEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsVariantEnabledEXT(UInt32 id, int cap);
+            internal static IsVariantEnabledEXT glIsVariantEnabledEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVariantBooleanvEXT(UInt32 id, int value, [Out] bool* data);
+            internal unsafe static GetVariantBooleanvEXT glGetVariantBooleanvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVariantIntegervEXT(UInt32 id, int value, [Out] Int32* data);
+            internal unsafe static GetVariantIntegervEXT glGetVariantIntegervEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVariantFloatvEXT(UInt32 id, int value, [Out] Single* data);
+            internal unsafe static GetVariantFloatvEXT glGetVariantFloatvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GetVariantPointervEXT(UInt32 id, int value, [Out] IntPtr data);
+            internal static GetVariantPointervEXT glGetVariantPointervEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetInvariantBooleanvEXT(UInt32 id, int value, [Out] bool* data);
+            internal unsafe static GetInvariantBooleanvEXT glGetInvariantBooleanvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetInvariantIntegervEXT(UInt32 id, int value, [Out] Int32* data);
+            internal unsafe static GetInvariantIntegervEXT glGetInvariantIntegervEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetInvariantFloatvEXT(UInt32 id, int value, [Out] Single* data);
+            internal unsafe static GetInvariantFloatvEXT glGetInvariantFloatvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetLocalConstantBooleanvEXT(UInt32 id, int value, [Out] bool* data);
+            internal unsafe static GetLocalConstantBooleanvEXT glGetLocalConstantBooleanvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetLocalConstantIntegervEXT(UInt32 id, int value, [Out] Int32* data);
+            internal unsafe static GetLocalConstantIntegervEXT glGetLocalConstantIntegervEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetLocalConstantFloatvEXT(UInt32 id, int value, [Out] Single* data);
+            internal unsafe static GetLocalConstantFloatvEXT glGetLocalConstantFloatvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream1sATI(int stream, Int16 x);
+            internal static VertexStream1sATI glVertexStream1sATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream1svATI(int stream, Int16* coords);
+            internal unsafe static VertexStream1svATI glVertexStream1svATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream1iATI(int stream, Int32 x);
+            internal static VertexStream1iATI glVertexStream1iATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream1ivATI(int stream, Int32* coords);
+            internal unsafe static VertexStream1ivATI glVertexStream1ivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream1fATI(int stream, Single x);
+            internal static VertexStream1fATI glVertexStream1fATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream1fvATI(int stream, Single* coords);
+            internal unsafe static VertexStream1fvATI glVertexStream1fvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream1dATI(int stream, Double x);
+            internal static VertexStream1dATI glVertexStream1dATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream1dvATI(int stream, Double* coords);
+            internal unsafe static VertexStream1dvATI glVertexStream1dvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream2sATI(int stream, Int16 x, Int16 y);
+            internal static VertexStream2sATI glVertexStream2sATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream2svATI(int stream, Int16* coords);
+            internal unsafe static VertexStream2svATI glVertexStream2svATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream2iATI(int stream, Int32 x, Int32 y);
+            internal static VertexStream2iATI glVertexStream2iATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream2ivATI(int stream, Int32* coords);
+            internal unsafe static VertexStream2ivATI glVertexStream2ivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream2fATI(int stream, Single x, Single y);
+            internal static VertexStream2fATI glVertexStream2fATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream2fvATI(int stream, Single* coords);
+            internal unsafe static VertexStream2fvATI glVertexStream2fvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream2dATI(int stream, Double x, Double y);
+            internal static VertexStream2dATI glVertexStream2dATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream2dvATI(int stream, Double* coords);
+            internal unsafe static VertexStream2dvATI glVertexStream2dvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream3sATI(int stream, Int16 x, Int16 y, Int16 z);
+            internal static VertexStream3sATI glVertexStream3sATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream3svATI(int stream, Int16* coords);
+            internal unsafe static VertexStream3svATI glVertexStream3svATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream3iATI(int stream, Int32 x, Int32 y, Int32 z);
+            internal static VertexStream3iATI glVertexStream3iATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream3ivATI(int stream, Int32* coords);
+            internal unsafe static VertexStream3ivATI glVertexStream3ivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream3fATI(int stream, Single x, Single y, Single z);
+            internal static VertexStream3fATI glVertexStream3fATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream3fvATI(int stream, Single* coords);
+            internal unsafe static VertexStream3fvATI glVertexStream3fvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream3dATI(int stream, Double x, Double y, Double z);
+            internal static VertexStream3dATI glVertexStream3dATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream3dvATI(int stream, Double* coords);
+            internal unsafe static VertexStream3dvATI glVertexStream3dvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream4sATI(int stream, Int16 x, Int16 y, Int16 z, Int16 w);
+            internal static VertexStream4sATI glVertexStream4sATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream4svATI(int stream, Int16* coords);
+            internal unsafe static VertexStream4svATI glVertexStream4svATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream4iATI(int stream, Int32 x, Int32 y, Int32 z, Int32 w);
+            internal static VertexStream4iATI glVertexStream4iATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream4ivATI(int stream, Int32* coords);
+            internal unsafe static VertexStream4ivATI glVertexStream4ivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream4fATI(int stream, Single x, Single y, Single z, Single w);
+            internal static VertexStream4fATI glVertexStream4fATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream4fvATI(int stream, Single* coords);
+            internal unsafe static VertexStream4fvATI glVertexStream4fvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexStream4dATI(int stream, Double x, Double y, Double z, Double w);
+            internal static VertexStream4dATI glVertexStream4dATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexStream4dvATI(int stream, Double* coords);
+            internal unsafe static VertexStream4dvATI glVertexStream4dvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void NormalStream3bATI(int stream, SByte nx, SByte ny, SByte nz);
+            internal static NormalStream3bATI glNormalStream3bATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void NormalStream3bvATI(int stream, SByte* coords);
+            internal unsafe static NormalStream3bvATI glNormalStream3bvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void NormalStream3sATI(int stream, Int16 nx, Int16 ny, Int16 nz);
+            internal static NormalStream3sATI glNormalStream3sATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void NormalStream3svATI(int stream, Int16* coords);
+            internal unsafe static NormalStream3svATI glNormalStream3svATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void NormalStream3iATI(int stream, Int32 nx, Int32 ny, Int32 nz);
+            internal static NormalStream3iATI glNormalStream3iATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void NormalStream3ivATI(int stream, Int32* coords);
+            internal unsafe static NormalStream3ivATI glNormalStream3ivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void NormalStream3fATI(int stream, Single nx, Single ny, Single nz);
+            internal static NormalStream3fATI glNormalStream3fATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void NormalStream3fvATI(int stream, Single* coords);
+            internal unsafe static NormalStream3fvATI glNormalStream3fvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void NormalStream3dATI(int stream, Double nx, Double ny, Double nz);
+            internal static NormalStream3dATI glNormalStream3dATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void NormalStream3dvATI(int stream, Double* coords);
+            internal unsafe static NormalStream3dvATI glNormalStream3dvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClientActiveVertexStreamATI(int stream);
+            internal static ClientActiveVertexStreamATI glClientActiveVertexStreamATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexBlendEnviATI(int pname, Int32 param);
+            internal static VertexBlendEnviATI glVertexBlendEnviATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexBlendEnvfATI(int pname, Single param);
+            internal static VertexBlendEnvfATI glVertexBlendEnvfATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ElementPointerATI(int type, IntPtr pointer);
+            internal static ElementPointerATI glElementPointerATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawElementArrayATI(int mode, Int32 count);
+            internal static DrawElementArrayATI glDrawElementArrayATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawRangeElementArrayATI(int mode, UInt32 start, UInt32 end, Int32 count);
+            internal static DrawRangeElementArrayATI glDrawRangeElementArrayATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawMeshArraysSUN(int mode, Int32 first, Int32 count, Int32 width);
+            internal static DrawMeshArraysSUN glDrawMeshArraysSUN;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenOcclusionQueriesNV(Int32 n, [Out] UInt32* ids);
+            internal unsafe static GenOcclusionQueriesNV glGenOcclusionQueriesNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteOcclusionQueriesNV(Int32 n, UInt32* ids);
+            internal unsafe static DeleteOcclusionQueriesNV glDeleteOcclusionQueriesNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsOcclusionQueryNV(UInt32 id);
+            internal static IsOcclusionQueryNV glIsOcclusionQueryNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BeginOcclusionQueryNV(UInt32 id);
+            internal static BeginOcclusionQueryNV glBeginOcclusionQueryNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EndOcclusionQueryNV();
+            internal static EndOcclusionQueryNV glEndOcclusionQueryNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetOcclusionQueryivNV(UInt32 id, int pname, [Out] Int32* @params);
+            internal unsafe static GetOcclusionQueryivNV glGetOcclusionQueryivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetOcclusionQueryuivNV(UInt32 id, int pname, [Out] UInt32* @params);
+            internal unsafe static GetOcclusionQueryuivNV glGetOcclusionQueryuivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PointParameteriNV(int pname, Int32 param);
+            internal static PointParameteriNV glPointParameteriNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void PointParameterivNV(int pname, Int32* @params);
+            internal unsafe static PointParameterivNV glPointParameterivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ActiveStencilFaceEXT(int face);
+            internal static ActiveStencilFaceEXT glActiveStencilFaceEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ElementPointerAPPLE(int type, IntPtr pointer);
+            internal static ElementPointerAPPLE glElementPointerAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawElementArrayAPPLE(int mode, Int32 first, Int32 count);
+            internal static DrawElementArrayAPPLE glDrawElementArrayAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawRangeElementArrayAPPLE(int mode, UInt32 start, UInt32 end, Int32 first, Int32 count);
+            internal static DrawRangeElementArrayAPPLE glDrawRangeElementArrayAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiDrawElementArrayAPPLE(int mode, Int32* first, Int32* count, Int32 primcount);
+            internal unsafe static MultiDrawElementArrayAPPLE glMultiDrawElementArrayAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiDrawRangeElementArrayAPPLE(int mode, UInt32 start, UInt32 end, Int32* first, Int32* count, Int32 primcount);
+            internal unsafe static MultiDrawRangeElementArrayAPPLE glMultiDrawRangeElementArrayAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenFencesAPPLE(Int32 n, [Out] UInt32* fences);
+            internal unsafe static GenFencesAPPLE glGenFencesAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteFencesAPPLE(Int32 n, UInt32* fences);
+            internal unsafe static DeleteFencesAPPLE glDeleteFencesAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SetFenceAPPLE(UInt32 fence);
+            internal static SetFenceAPPLE glSetFenceAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsFenceAPPLE(UInt32 fence);
+            internal static IsFenceAPPLE glIsFenceAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool TestFenceAPPLE(UInt32 fence);
+            internal static TestFenceAPPLE glTestFenceAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FinishFenceAPPLE(UInt32 fence);
+            internal static FinishFenceAPPLE glFinishFenceAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool TestObjectAPPLE(int @object, UInt32 name);
+            internal static TestObjectAPPLE glTestObjectAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FinishObjectAPPLE(int @object, Int32 name);
+            internal static FinishObjectAPPLE glFinishObjectAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindVertexArrayAPPLE(UInt32 array);
+            internal static BindVertexArrayAPPLE glBindVertexArrayAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteVertexArraysAPPLE(Int32 n, UInt32* arrays);
+            internal unsafe static DeleteVertexArraysAPPLE glDeleteVertexArraysAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenVertexArraysAPPLE(Int32 n, [Out] UInt32* arrays);
+            internal unsafe static GenVertexArraysAPPLE glGenVertexArraysAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsVertexArrayAPPLE(UInt32 array);
+            internal static IsVertexArrayAPPLE glIsVertexArrayAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexArrayRangeAPPLE(Int32 length, [Out] IntPtr pointer);
+            internal static VertexArrayRangeAPPLE glVertexArrayRangeAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FlushVertexArrayRangeAPPLE(Int32 length, [Out] IntPtr pointer);
+            internal static FlushVertexArrayRangeAPPLE glFlushVertexArrayRangeAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexArrayParameteriAPPLE(int pname, Int32 param);
+            internal static VertexArrayParameteriAPPLE glVertexArrayParameteriAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DrawBuffersATI(Int32 n, int* bufs);
+            internal unsafe static DrawBuffersATI glDrawBuffersATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramNamedParameter4fNV(UInt32 id, Int32 len, Byte* name, Single x, Single y, Single z, Single w);
+            internal unsafe static ProgramNamedParameter4fNV glProgramNamedParameter4fNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramNamedParameter4dNV(UInt32 id, Int32 len, Byte* name, Double x, Double y, Double z, Double w);
+            internal unsafe static ProgramNamedParameter4dNV glProgramNamedParameter4dNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramNamedParameter4fvNV(UInt32 id, Int32 len, Byte* name, Single* v);
+            internal unsafe static ProgramNamedParameter4fvNV glProgramNamedParameter4fvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramNamedParameter4dvNV(UInt32 id, Int32 len, Byte* name, Double* v);
+            internal unsafe static ProgramNamedParameter4dvNV glProgramNamedParameter4dvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramNamedParameterfvNV(UInt32 id, Int32 len, Byte* name, [Out] Single* @params);
+            internal unsafe static GetProgramNamedParameterfvNV glGetProgramNamedParameterfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramNamedParameterdvNV(UInt32 id, Int32 len, Byte* name, [Out] Double* @params);
+            internal unsafe static GetProgramNamedParameterdvNV glGetProgramNamedParameterdvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex2hNV(UInt16 x, UInt16 y);
+            internal static Vertex2hNV glVertex2hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex2hvNV(UInt16* v);
+            internal unsafe static Vertex2hvNV glVertex2hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex3hNV(UInt16 x, UInt16 y, UInt16 z);
+            internal static Vertex3hNV glVertex3hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex3hvNV(UInt16* v);
+            internal unsafe static Vertex3hvNV glVertex3hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Vertex4hNV(UInt16 x, UInt16 y, UInt16 z, UInt16 w);
+            internal static Vertex4hNV glVertex4hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Vertex4hvNV(UInt16* v);
+            internal unsafe static Vertex4hvNV glVertex4hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Normal3hNV(UInt16 nx, UInt16 ny, UInt16 nz);
+            internal static Normal3hNV glNormal3hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Normal3hvNV(UInt16* v);
+            internal unsafe static Normal3hvNV glNormal3hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color3hNV(UInt16 red, UInt16 green, UInt16 blue);
+            internal static Color3hNV glColor3hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color3hvNV(UInt16* v);
+            internal unsafe static Color3hvNV glColor3hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Color4hNV(UInt16 red, UInt16 green, UInt16 blue, UInt16 alpha);
+            internal static Color4hNV glColor4hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Color4hvNV(UInt16* v);
+            internal unsafe static Color4hvNV glColor4hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord1hNV(UInt16 s);
+            internal static TexCoord1hNV glTexCoord1hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord1hvNV(UInt16* v);
+            internal unsafe static TexCoord1hvNV glTexCoord1hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord2hNV(UInt16 s, UInt16 t);
+            internal static TexCoord2hNV glTexCoord2hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord2hvNV(UInt16* v);
+            internal unsafe static TexCoord2hvNV glTexCoord2hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord3hNV(UInt16 s, UInt16 t, UInt16 r);
+            internal static TexCoord3hNV glTexCoord3hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord3hvNV(UInt16* v);
+            internal unsafe static TexCoord3hvNV glTexCoord3hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexCoord4hNV(UInt16 s, UInt16 t, UInt16 r, UInt16 q);
+            internal static TexCoord4hNV glTexCoord4hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexCoord4hvNV(UInt16* v);
+            internal unsafe static TexCoord4hvNV glTexCoord4hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord1hNV(int target, UInt16 s);
+            internal static MultiTexCoord1hNV glMultiTexCoord1hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord1hvNV(int target, UInt16* v);
+            internal unsafe static MultiTexCoord1hvNV glMultiTexCoord1hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord2hNV(int target, UInt16 s, UInt16 t);
+            internal static MultiTexCoord2hNV glMultiTexCoord2hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord2hvNV(int target, UInt16* v);
+            internal unsafe static MultiTexCoord2hvNV glMultiTexCoord2hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord3hNV(int target, UInt16 s, UInt16 t, UInt16 r);
+            internal static MultiTexCoord3hNV glMultiTexCoord3hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord3hvNV(int target, UInt16* v);
+            internal unsafe static MultiTexCoord3hvNV glMultiTexCoord3hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void MultiTexCoord4hNV(int target, UInt16 s, UInt16 t, UInt16 r, UInt16 q);
+            internal static MultiTexCoord4hNV glMultiTexCoord4hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void MultiTexCoord4hvNV(int target, UInt16* v);
+            internal unsafe static MultiTexCoord4hvNV glMultiTexCoord4hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FogCoordhNV(UInt16 fog);
+            internal static FogCoordhNV glFogCoordhNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FogCoordhvNV(UInt16* fog);
+            internal unsafe static FogCoordhvNV glFogCoordhvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void SecondaryColor3hNV(UInt16 red, UInt16 green, UInt16 blue);
+            internal static SecondaryColor3hNV glSecondaryColor3hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void SecondaryColor3hvNV(UInt16* v);
+            internal unsafe static SecondaryColor3hvNV glSecondaryColor3hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexWeighthNV(UInt16 weight);
+            internal static VertexWeighthNV glVertexWeighthNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexWeighthvNV(UInt16* weight);
+            internal unsafe static VertexWeighthvNV glVertexWeighthvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib1hNV(UInt32 index, UInt16 x);
+            internal static VertexAttrib1hNV glVertexAttrib1hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib1hvNV(UInt32 index, UInt16* v);
+            internal unsafe static VertexAttrib1hvNV glVertexAttrib1hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib2hNV(UInt32 index, UInt16 x, UInt16 y);
+            internal static VertexAttrib2hNV glVertexAttrib2hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib2hvNV(UInt32 index, UInt16* v);
+            internal unsafe static VertexAttrib2hvNV glVertexAttrib2hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib3hNV(UInt32 index, UInt16 x, UInt16 y, UInt16 z);
+            internal static VertexAttrib3hNV glVertexAttrib3hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib3hvNV(UInt32 index, UInt16* v);
+            internal unsafe static VertexAttrib3hvNV glVertexAttrib3hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttrib4hNV(UInt32 index, UInt16 x, UInt16 y, UInt16 z, UInt16 w);
+            internal static VertexAttrib4hNV glVertexAttrib4hNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttrib4hvNV(UInt32 index, UInt16* v);
+            internal unsafe static VertexAttrib4hvNV glVertexAttrib4hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs1hvNV(UInt32 index, Int32 n, UInt16* v);
+            internal unsafe static VertexAttribs1hvNV glVertexAttribs1hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs2hvNV(UInt32 index, Int32 n, UInt16* v);
+            internal unsafe static VertexAttribs2hvNV glVertexAttribs2hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs3hvNV(UInt32 index, Int32 n, UInt16* v);
+            internal unsafe static VertexAttribs3hvNV glVertexAttribs3hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribs4hvNV(UInt32 index, Int32 n, UInt16* v);
+            internal unsafe static VertexAttribs4hvNV glVertexAttribs4hvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PixelDataRangeNV(int target, Int32 length, [Out] IntPtr pointer);
+            internal static PixelDataRangeNV glPixelDataRangeNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FlushPixelDataRangeNV(int target);
+            internal static FlushPixelDataRangeNV glFlushPixelDataRangeNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PrimitiveRestartNV();
+            internal static PrimitiveRestartNV glPrimitiveRestartNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void PrimitiveRestartIndexNV(UInt32 index);
+            internal static PrimitiveRestartIndexNV glPrimitiveRestartIndexNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate IntPtr MapObjectBufferATI(UInt32 buffer);
+            internal unsafe static MapObjectBufferATI glMapObjectBufferATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void UnmapObjectBufferATI(UInt32 buffer);
+            internal static UnmapObjectBufferATI glUnmapObjectBufferATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StencilOpSeparateATI(int face, int sfail, int dpfail, int dppass);
+            internal static StencilOpSeparateATI glStencilOpSeparateATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StencilFuncSeparateATI(int frontfunc, int backfunc, Int32 @ref, UInt32 mask);
+            internal static StencilFuncSeparateATI glStencilFuncSeparateATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribArrayObjectATI(UInt32 index, Int32 size, int type, bool normalized, Int32 stride, UInt32 buffer, UInt32 offset);
+            internal static VertexAttribArrayObjectATI glVertexAttribArrayObjectATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribArrayObjectfvATI(UInt32 index, int pname, [Out] Single* @params);
+            internal unsafe static GetVertexAttribArrayObjectfvATI glGetVertexAttribArrayObjectfvATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribArrayObjectivATI(UInt32 index, int pname, [Out] Int32* @params);
+            internal unsafe static GetVertexAttribArrayObjectivATI glGetVertexAttribArrayObjectivATI;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DepthBoundsEXT(Double zmin, Double zmax);
+            internal static DepthBoundsEXT glDepthBoundsEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlendEquationSeparateEXT(int modeRGB, int modeAlpha);
+            internal static BlendEquationSeparateEXT glBlendEquationSeparateEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsRenderbufferEXT(UInt32 renderbuffer);
+            internal static IsRenderbufferEXT glIsRenderbufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindRenderbufferEXT(int target, UInt32 renderbuffer);
+            internal static BindRenderbufferEXT glBindRenderbufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteRenderbuffersEXT(Int32 n, UInt32* renderbuffers);
+            internal unsafe static DeleteRenderbuffersEXT glDeleteRenderbuffersEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenRenderbuffersEXT(Int32 n, [Out] UInt32* renderbuffers);
+            internal unsafe static GenRenderbuffersEXT glGenRenderbuffersEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RenderbufferStorageEXT(int target, int internalformat, Int32 width, Int32 height);
+            internal static RenderbufferStorageEXT glRenderbufferStorageEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetRenderbufferParameterivEXT(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetRenderbufferParameterivEXT glGetRenderbufferParameterivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsFramebufferEXT(UInt32 framebuffer);
+            internal static IsFramebufferEXT glIsFramebufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindFramebufferEXT(int target, UInt32 framebuffer);
+            internal static BindFramebufferEXT glBindFramebufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void DeleteFramebuffersEXT(Int32 n, UInt32* framebuffers);
+            internal unsafe static DeleteFramebuffersEXT glDeleteFramebuffersEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GenFramebuffersEXT(Int32 n, [Out] UInt32* framebuffers);
+            internal unsafe static GenFramebuffersEXT glGenFramebuffersEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate int CheckFramebufferStatusEXT(int target);
+            internal static CheckFramebufferStatusEXT glCheckFramebufferStatusEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FramebufferTexture1DEXT(int target, int attachment, int textarget, UInt32 texture, Int32 level);
+            internal static FramebufferTexture1DEXT glFramebufferTexture1DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FramebufferTexture2DEXT(int target, int attachment, int textarget, UInt32 texture, Int32 level);
+            internal static FramebufferTexture2DEXT glFramebufferTexture2DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FramebufferTexture3DEXT(int target, int attachment, int textarget, UInt32 texture, Int32 level, Int32 zoffset);
+            internal static FramebufferTexture3DEXT glFramebufferTexture3DEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FramebufferRenderbufferEXT(int target, int attachment, int renderbuffertarget, UInt32 renderbuffer);
+            internal static FramebufferRenderbufferEXT glFramebufferRenderbufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetFramebufferAttachmentParameterivEXT(int target, int attachment, int pname, [Out] Int32* @params);
+            internal unsafe static GetFramebufferAttachmentParameterivEXT glGetFramebufferAttachmentParameterivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void GenerateMipmapEXT(int target);
+            internal static GenerateMipmapEXT glGenerateMipmapEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StringMarkerGREMEDY(Int32 len, IntPtr @string);
+            internal static StringMarkerGREMEDY glStringMarkerGREMEDY;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void StencilClearTagEXT(Int32 stencilTagBits, UInt32 stencilClearTag);
+            internal static StencilClearTagEXT glStencilClearTagEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BlitFramebufferEXT(Int32 srcX0, Int32 srcY0, Int32 srcX1, Int32 srcY1, Int32 dstX0, Int32 dstY0, Int32 dstX1, Int32 dstY1, int mask, int filter);
+            internal static BlitFramebufferEXT glBlitFramebufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RenderbufferStorageMultisampleEXT(int target, Int32 samples, int internalformat, Int32 width, Int32 height);
+            internal static RenderbufferStorageMultisampleEXT glRenderbufferStorageMultisampleEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetQueryObjecti64vEXT(UInt32 id, int pname, [Out] Int64* @params);
+            internal unsafe static GetQueryObjecti64vEXT glGetQueryObjecti64vEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetQueryObjectui64vEXT(UInt32 id, int pname, [Out] UInt64* @params);
+            internal unsafe static GetQueryObjectui64vEXT glGetQueryObjectui64vEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramEnvParameters4fvEXT(int target, UInt32 index, Int32 count, Single* @params);
+            internal unsafe static ProgramEnvParameters4fvEXT glProgramEnvParameters4fvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramLocalParameters4fvEXT(int target, UInt32 index, Int32 count, Single* @params);
+            internal unsafe static ProgramLocalParameters4fvEXT glProgramLocalParameters4fvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BufferParameteriAPPLE(int target, int pname, Int32 param);
+            internal static BufferParameteriAPPLE glBufferParameteriAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FlushMappedBufferRangeAPPLE(int target, IntPtr offset, IntPtr size);
+            internal static FlushMappedBufferRangeAPPLE glFlushMappedBufferRangeAPPLE;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramLocalParameterI4iNV(int target, UInt32 index, Int32 x, Int32 y, Int32 z, Int32 w);
+            internal static ProgramLocalParameterI4iNV glProgramLocalParameterI4iNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramLocalParameterI4ivNV(int target, UInt32 index, Int32* @params);
+            internal unsafe static ProgramLocalParameterI4ivNV glProgramLocalParameterI4ivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramLocalParametersI4ivNV(int target, UInt32 index, Int32 count, Int32* @params);
+            internal unsafe static ProgramLocalParametersI4ivNV glProgramLocalParametersI4ivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramLocalParameterI4uiNV(int target, UInt32 index, UInt32 x, UInt32 y, UInt32 z, UInt32 w);
+            internal static ProgramLocalParameterI4uiNV glProgramLocalParameterI4uiNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramLocalParameterI4uivNV(int target, UInt32 index, UInt32* @params);
+            internal unsafe static ProgramLocalParameterI4uivNV glProgramLocalParameterI4uivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramLocalParametersI4uivNV(int target, UInt32 index, Int32 count, UInt32* @params);
+            internal unsafe static ProgramLocalParametersI4uivNV glProgramLocalParametersI4uivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramEnvParameterI4iNV(int target, UInt32 index, Int32 x, Int32 y, Int32 z, Int32 w);
+            internal static ProgramEnvParameterI4iNV glProgramEnvParameterI4iNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramEnvParameterI4ivNV(int target, UInt32 index, Int32* @params);
+            internal unsafe static ProgramEnvParameterI4ivNV glProgramEnvParameterI4ivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramEnvParametersI4ivNV(int target, UInt32 index, Int32 count, Int32* @params);
+            internal unsafe static ProgramEnvParametersI4ivNV glProgramEnvParametersI4ivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramEnvParameterI4uiNV(int target, UInt32 index, UInt32 x, UInt32 y, UInt32 z, UInt32 w);
+            internal static ProgramEnvParameterI4uiNV glProgramEnvParameterI4uiNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramEnvParameterI4uivNV(int target, UInt32 index, UInt32* @params);
+            internal unsafe static ProgramEnvParameterI4uivNV glProgramEnvParameterI4uivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramEnvParametersI4uivNV(int target, UInt32 index, Int32 count, UInt32* @params);
+            internal unsafe static ProgramEnvParametersI4uivNV glProgramEnvParametersI4uivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramLocalParameterIivNV(int target, UInt32 index, [Out] Int32* @params);
+            internal unsafe static GetProgramLocalParameterIivNV glGetProgramLocalParameterIivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramLocalParameterIuivNV(int target, UInt32 index, [Out] UInt32* @params);
+            internal unsafe static GetProgramLocalParameterIuivNV glGetProgramLocalParameterIuivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramEnvParameterIivNV(int target, UInt32 index, [Out] Int32* @params);
+            internal unsafe static GetProgramEnvParameterIivNV glGetProgramEnvParameterIivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetProgramEnvParameterIuivNV(int target, UInt32 index, [Out] UInt32* @params);
+            internal unsafe static GetProgramEnvParameterIuivNV glGetProgramEnvParameterIuivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramVertexLimitNV(int target, Int32 limit);
+            internal static ProgramVertexLimitNV glProgramVertexLimitNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FramebufferTextureEXT(int target, int attachment, UInt32 texture, Int32 level);
+            internal static FramebufferTextureEXT glFramebufferTextureEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FramebufferTextureLayerEXT(int target, int attachment, UInt32 texture, Int32 level, Int32 layer);
+            internal static FramebufferTextureLayerEXT glFramebufferTextureLayerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FramebufferTextureFaceEXT(int target, int attachment, UInt32 texture, Int32 level, int face);
+            internal static FramebufferTextureFaceEXT glFramebufferTextureFaceEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ProgramParameteriEXT(UInt32 program, int pname, Int32 value);
+            internal static ProgramParameteriEXT glProgramParameteriEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribI1iEXT(UInt32 index, Int32 x);
+            internal static VertexAttribI1iEXT glVertexAttribI1iEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribI2iEXT(UInt32 index, Int32 x, Int32 y);
+            internal static VertexAttribI2iEXT glVertexAttribI2iEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribI3iEXT(UInt32 index, Int32 x, Int32 y, Int32 z);
+            internal static VertexAttribI3iEXT glVertexAttribI3iEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribI4iEXT(UInt32 index, Int32 x, Int32 y, Int32 z, Int32 w);
+            internal static VertexAttribI4iEXT glVertexAttribI4iEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribI1uiEXT(UInt32 index, UInt32 x);
+            internal static VertexAttribI1uiEXT glVertexAttribI1uiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribI2uiEXT(UInt32 index, UInt32 x, UInt32 y);
+            internal static VertexAttribI2uiEXT glVertexAttribI2uiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribI3uiEXT(UInt32 index, UInt32 x, UInt32 y, UInt32 z);
+            internal static VertexAttribI3uiEXT glVertexAttribI3uiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribI4uiEXT(UInt32 index, UInt32 x, UInt32 y, UInt32 z, UInt32 w);
+            internal static VertexAttribI4uiEXT glVertexAttribI4uiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI1ivEXT(UInt32 index, Int32* v);
+            internal unsafe static VertexAttribI1ivEXT glVertexAttribI1ivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI2ivEXT(UInt32 index, Int32* v);
+            internal unsafe static VertexAttribI2ivEXT glVertexAttribI2ivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI3ivEXT(UInt32 index, Int32* v);
+            internal unsafe static VertexAttribI3ivEXT glVertexAttribI3ivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI4ivEXT(UInt32 index, Int32* v);
+            internal unsafe static VertexAttribI4ivEXT glVertexAttribI4ivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI1uivEXT(UInt32 index, UInt32* v);
+            internal unsafe static VertexAttribI1uivEXT glVertexAttribI1uivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI2uivEXT(UInt32 index, UInt32* v);
+            internal unsafe static VertexAttribI2uivEXT glVertexAttribI2uivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI3uivEXT(UInt32 index, UInt32* v);
+            internal unsafe static VertexAttribI3uivEXT glVertexAttribI3uivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI4uivEXT(UInt32 index, UInt32* v);
+            internal unsafe static VertexAttribI4uivEXT glVertexAttribI4uivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI4bvEXT(UInt32 index, SByte* v);
+            internal unsafe static VertexAttribI4bvEXT glVertexAttribI4bvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI4svEXT(UInt32 index, Int16* v);
+            internal unsafe static VertexAttribI4svEXT glVertexAttribI4svEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI4ubvEXT(UInt32 index, Byte* v);
+            internal unsafe static VertexAttribI4ubvEXT glVertexAttribI4ubvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void VertexAttribI4usvEXT(UInt32 index, UInt16* v);
+            internal unsafe static VertexAttribI4usvEXT glVertexAttribI4usvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void VertexAttribIPointerEXT(UInt32 index, Int32 size, int type, Int32 stride, IntPtr pointer);
+            internal static VertexAttribIPointerEXT glVertexAttribIPointerEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribIivEXT(UInt32 index, int pname, [Out] Int32* @params);
+            internal unsafe static GetVertexAttribIivEXT glGetVertexAttribIivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetVertexAttribIuivEXT(UInt32 index, int pname, [Out] UInt32* @params);
+            internal unsafe static GetVertexAttribIuivEXT glGetVertexAttribIuivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetUniformuivEXT(UInt32 program, Int32 location, [Out] UInt32* @params);
+            internal unsafe static GetUniformuivEXT glGetUniformuivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindFragDataLocationEXT(UInt32 program, UInt32 color, System.String name);
+            internal static BindFragDataLocationEXT glBindFragDataLocationEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GetFragDataLocationEXT(UInt32 program, System.String name);
+            internal static GetFragDataLocationEXT glGetFragDataLocationEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform1uiEXT(Int32 location, UInt32 v0);
+            internal static Uniform1uiEXT glUniform1uiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform2uiEXT(Int32 location, UInt32 v0, UInt32 v1);
+            internal static Uniform2uiEXT glUniform2uiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform3uiEXT(Int32 location, UInt32 v0, UInt32 v1, UInt32 v2);
+            internal static Uniform3uiEXT glUniform3uiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void Uniform4uiEXT(Int32 location, UInt32 v0, UInt32 v1, UInt32 v2, UInt32 v3);
+            internal static Uniform4uiEXT glUniform4uiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform1uivEXT(Int32 location, Int32 count, UInt32* value);
+            internal unsafe static Uniform1uivEXT glUniform1uivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform2uivEXT(Int32 location, Int32 count, UInt32* value);
+            internal unsafe static Uniform2uivEXT glUniform2uivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform3uivEXT(Int32 location, Int32 count, UInt32* value);
+            internal unsafe static Uniform3uivEXT glUniform3uivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void Uniform4uivEXT(Int32 location, Int32 count, UInt32* value);
+            internal unsafe static Uniform4uivEXT glUniform4uivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawArraysInstancedEXT(int mode, Int32 start, Int32 count, Int32 primcount);
+            internal static DrawArraysInstancedEXT glDrawArraysInstancedEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DrawElementsInstancedEXT(int mode, Int32 count, int type, IntPtr indices, Int32 primcount);
+            internal static DrawElementsInstancedEXT glDrawElementsInstancedEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void TexBufferEXT(int target, int internalformat, UInt32 buffer);
+            internal static TexBufferEXT glTexBufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DepthRangedNV(Double zNear, Double zFar);
+            internal static DepthRangedNV glDepthRangedNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClearDepthdNV(Double depth);
+            internal static ClearDepthdNV glClearDepthdNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DepthBoundsdNV(Double zmin, Double zmax);
+            internal static DepthBoundsdNV glDepthBoundsdNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void RenderbufferStorageMultisampleCoverageNV(int target, Int32 coverageSamples, Int32 colorSamples, int internalformat, Int32 width, Int32 height);
+            internal static RenderbufferStorageMultisampleCoverageNV glRenderbufferStorageMultisampleCoverageNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramBufferParametersfvNV(int target, UInt32 buffer, UInt32 index, Int32 count, Single* @params);
+            internal unsafe static ProgramBufferParametersfvNV glProgramBufferParametersfvNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramBufferParametersIivNV(int target, UInt32 buffer, UInt32 index, Int32 count, Int32* @params);
+            internal unsafe static ProgramBufferParametersIivNV glProgramBufferParametersIivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void ProgramBufferParametersIuivNV(int target, UInt32 buffer, UInt32 index, Int32 count, UInt32* @params);
+            internal unsafe static ProgramBufferParametersIuivNV glProgramBufferParametersIuivNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ColorMaskIndexedEXT(UInt32 index, bool r, bool g, bool b, bool a);
+            internal static ColorMaskIndexedEXT glColorMaskIndexedEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetBooleanIndexedvEXT(int target, UInt32 index, [Out] bool* data);
+            internal unsafe static GetBooleanIndexedvEXT glGetBooleanIndexedvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetIntegerIndexedvEXT(int target, UInt32 index, [Out] Int32* data);
+            internal unsafe static GetIntegerIndexedvEXT glGetIntegerIndexedvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EnableIndexedEXT(int target, UInt32 index);
+            internal static EnableIndexedEXT glEnableIndexedEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DisableIndexedEXT(int target, UInt32 index);
+            internal static DisableIndexedEXT glDisableIndexedEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool IsEnabledIndexedEXT(int target, UInt32 index);
+            internal static IsEnabledIndexedEXT glIsEnabledIndexedEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BeginTransformFeedbackNV(int primitiveMode);
+            internal static BeginTransformFeedbackNV glBeginTransformFeedbackNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void EndTransformFeedbackNV();
+            internal static EndTransformFeedbackNV glEndTransformFeedbackNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TransformFeedbackAttribsNV(UInt32 count, Int32* attribs, int bufferMode);
+            internal unsafe static TransformFeedbackAttribsNV glTransformFeedbackAttribsNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindBufferRangeNV(int target, UInt32 index, UInt32 buffer, IntPtr offset, IntPtr size);
+            internal static BindBufferRangeNV glBindBufferRangeNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindBufferOffsetNV(int target, UInt32 index, UInt32 buffer, IntPtr offset);
+            internal static BindBufferOffsetNV glBindBufferOffsetNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void BindBufferBaseNV(int target, UInt32 index, UInt32 buffer);
+            internal static BindBufferBaseNV glBindBufferBaseNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TransformFeedbackVaryingsNV(UInt32 program, Int32 count, Int32* locations, int bufferMode);
+            internal unsafe static TransformFeedbackVaryingsNV glTransformFeedbackVaryingsNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ActiveVaryingNV(UInt32 program, System.String name);
+            internal static ActiveVaryingNV glActiveVaryingNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GetVaryingLocationNV(UInt32 program, System.String name);
+            internal static GetVaryingLocationNV glGetVaryingLocationNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetActiveVaryingNV(UInt32 program, UInt32 index, Int32 bufSize, [Out] Int32* length, [Out] Int32* size, [Out] int* type, [Out] System.Text.StringBuilder name);
+            internal unsafe static GetActiveVaryingNV glGetActiveVaryingNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTransformFeedbackVaryingNV(UInt32 program, UInt32 index, [Out] Int32* location);
+            internal unsafe static GetTransformFeedbackVaryingNV glGetTransformFeedbackVaryingNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void UniformBufferEXT(UInt32 program, Int32 location, UInt32 buffer);
+            internal static UniformBufferEXT glUniformBufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int32 GetUniformBufferSizeEXT(UInt32 program, Int32 location);
+            internal static GetUniformBufferSizeEXT glGetUniformBufferSizeEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetUniformOffsetEXT(UInt32 program, Int32 location);
+            internal static GetUniformOffsetEXT glGetUniformOffsetEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexParameterIivEXT(int target, int pname, Int32* @params);
+            internal unsafe static TexParameterIivEXT glTexParameterIivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void TexParameterIuivEXT(int target, int pname, UInt32* @params);
+            internal unsafe static TexParameterIuivEXT glTexParameterIuivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexParameterIivEXT(int target, int pname, [Out] Int32* @params);
+            internal unsafe static GetTexParameterIivEXT glGetTexParameterIivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void GetTexParameterIuivEXT(int target, int pname, [Out] UInt32* @params);
+            internal unsafe static GetTexParameterIuivEXT glGetTexParameterIuivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClearColorIiEXT(Int32 red, Int32 green, Int32 blue, Int32 alpha);
+            internal static ClearColorIiEXT glClearColorIiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void ClearColorIuiEXT(UInt32 red, UInt32 green, UInt32 blue, UInt32 alpha);
+            internal static ClearColorIuiEXT glClearColorIuiEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void FrameTerminatorGREMEDY();
+            internal static FrameTerminatorGREMEDY glFrameTerminatorGREMEDY;
+        }
+    }
+    #pragma warning restore 0649
+}
diff --git a/src/Tao.OpenGl/GLEnums.cs b/src/Tao.OpenGl/GLEnums.cs
new file mode 100644
index 0000000..e02d773
--- /dev/null
+++ b/src/Tao.OpenGl/GLEnums.cs
@@ -0,0 +1,3246 @@
+namespace Tao.OpenGl
+{
+    public static partial class Gl
+    {
+        public const int GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT = ((int)0x8DE4);
+        public const int GL_T4F_V4F = ((int)0x2A28);
+        public const int GL_ONE_MINUS_DST_COLOR = ((int)0x0307);
+        public const int GL_ONE_MINUS_SRC_COLOR = ((int)0x0301);
+        public const int GL_NORMAL_ARRAY = ((int)0x8075);
+        public const int GL_IDENTITY_NV = ((int)0x862A);
+        public const int GL_LUMINANCE12_ALPHA4 = ((int)0x8046);
+        public const int GL_PIXEL_TILE_CACHE_SIZE_SGIX = ((int)0x8145);
+        public const int GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV = ((int)0x8C8A);
+        public const int GL_RGB16I = ((int)0x8D89);
+        public const int GL_CONSTANT_COLOR0_NV = ((int)0x852A);
+        public const int GL_MAX_TEXTURE_UNITS_ARB = ((int)0x84E2);
+        public const int GL_VERTEX_PROGRAM_ARB = ((int)0x8620);
+        public const int GL_GEOMETRY_INPUT_TYPE_EXT = ((int)0x8DDB);
+        public const int GL_MAX_GENERAL_COMBINERS_NV = ((int)0x854D);
+        public const int GL_SRC2_ALPHA = ((int)GL_SOURCE2_ALPHA);
+        public const int GL_MIRRORED_REPEAT_ARB = ((int)0x8370);
+        public const int GL_FOG_COORD_ARRAY_TYPE = ((int)GL_FOG_COORDINATE_ARRAY_TYPE);
+        public const int GL_VERTEX_SHADER_LOCALS_EXT = ((int)0x87D3);
+        public const int GL_DYNAMIC_DRAW = ((int)0x88E8);
+        public const int GL_SOURCE2_ALPHA_EXT = ((int)0x858A);
+        public const int GL_LOGIC_OP_MODE = ((int)0x0BF0);
+        public const int GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB = ((int)0x8B4C);
+        public const int GL_CURRENT_VERTEX_EXT = ((int)0x87E2);
+        public const int GL_NUM_EXTENSIONS = ((int)0x821D);
+        public const int GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV = ((int)0x8DA4);
+        public const int GL_MATRIX21_ARB = ((int)0x88D5);
+        public const int GL_DYNAMIC_READ_ARB = ((int)0x88E9);
+        public const int GL_RGB4_S3TC = ((int)0x83A1);
+        public const int GL_VERTEX_ATTRIB_ARRAY_ENABLED = ((int)0x8622);
+        public const int GL_LINEAR_DETAIL_COLOR_SGIS = ((int)0x8099);
+        public const int GL_SECONDARY_COLOR_ARRAY_STRIDE = ((int)0x845C);
+        public const int GL_CONSTANT_COLOR1_NV = ((int)0x852B);
+        public const int GL_PIXEL_TILE_GRID_WIDTH_SGIX = ((int)0x8142);
+        public const int GL_PROGRAM_POINT_SIZE_EXT = ((int)0x8642);
+        public const int GL_PREVIOUS = ((int)0x8578);
+        public const int GL_DITHER = ((int)0x0BD0);
+        public const int GL_CLIP_DISTANCE1 = ((int)GL_CLIP_PLANE1);
+        public const int GL_DUAL_INTENSITY8_SGIS = ((int)0x8119);
+        public const int GL_T4F_C4F_N3F_V4F = ((int)0x2A2D);
+        public const int GL_TEXTURE_MAX_CLAMP_T_SGIX = ((int)0x836A);
+        public const int GL_PACK_SUBSAMPLE_RATE_SGIX = ((int)0x85A0);
+        public const int GL_MAX_TEXTURE_COORDS = ((int)0x8871);
+        public const int GL_UNSIGNED_INT_SAMPLER_CUBE_EXT = ((int)0x8DD4);
+        public const int GL_ATTRIB_ARRAY_TYPE_NV = ((int)0x8625);
+        public const int GL_SECONDARY_COLOR_ARRAY_POINTER_EXT = ((int)0x845D);
+        public const int GL_MAX_PROGRAM_ATTRIBS_ARB = ((int)0x88AD);
+        public const int GL_TEXTURE_WRAP_Q_SGIS = ((int)0x8137);
+        public const int GL_OUTPUT_TEXTURE_COORD11_EXT = ((int)0x87A8);
+        public const int GL_EVAL_VERTEX_ATTRIB14_NV = ((int)0x86D4);
+        public const int GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING = ((int)0x889C);
+        public const int GL_SECONDARY_COLOR_ARRAY_EXT = ((int)0x845E);
+        public const int GL_HINT_BIT = ((int)0x00008000);
+        public const int GL_INT_VEC3_ARB = ((int)0x8B54);
+        public const int GL_POST_TEXTURE_FILTER_SCALE_SGIX = ((int)0x817A);
+        public const int GL_HISTOGRAM = ((int)0x8024);
+        public const int GL_VERSION = ((int)0x1F02);
+        public const int GL_RGB32I_EXT = ((int)0x8D83);
+        public const int GL_LIGHT0 = ((int)0x4000);
+        public const int GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB = ((int)0x88B4);
+        public const int GL_OP_CLAMP_EXT = ((int)0x878E);
+        public const int GL_REPLICATE_BORDER = ((int)0x8153);
+        public const int GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX = ((int)0x8403);
+        public const int GL_PIXEL_TEX_GEN_SGIX = ((int)0x8139);
+        public const int GL_REG_22_ATI = ((int)0x8937);
+        public const int GL_VERTEX_PROGRAM_POINT_SIZE_NV = ((int)0x8642);
+        public const int GL_INVALID_FRAMEBUFFER_OPERATION = ((int)0x0506);
+        public const int GL_UNPACK_CONSTANT_DATA_SUNX = ((int)0x81D5);
+        public const int GL_TIME_ELAPSED_EXT = ((int)0x88BF);
+        public const int GL_TEXTURE_LOD_BIAS_S_SGIX = ((int)0x818E);
+        public const int GL_LOAD = ((int)0x0101);
+        public const int GL_MULTISAMPLE_BIT_ARB = ((int)0x20000000);
+        public const int GL_COMBINER_CD_OUTPUT_NV = ((int)0x854B);
+        public const int GL_LIST_BASE = ((int)0x0B32);
+        public const int GL_BUMP_ROT_MATRIX_ATI = ((int)0x8775);
+        public const int GL_SPECULAR = ((int)0x1202);
+        public const int GL_LIST_MODE = ((int)0x0B30);
+        public const int GL_VERTEX_ARRAY_RANGE_NV = ((int)0x851D);
+        public const int GL_HILO_NV = ((int)0x86F4);
+        public const int GL_MAX_PROGRAM_LOOP_DEPTH_NV = ((int)0x88F7);
+        public const int GL_INTENSITY16F_ARB = ((int)0x881D);
+        public const int GL_INTERPOLATE_EXT = ((int)0x8575);
+        public const int GL_PIXEL_SUBSAMPLE_2424_SGIX = ((int)0x85A3);
+        public const int GL_TEXTURE_TOO_LARGE_EXT = ((int)0x8065);
+        public const int GL_INDEX_ARRAY_LIST_STRIDE_IBM = ((int)103083);
+        public const int GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB = ((int)0x88A3);
+        public const int GL_LUMINANCE32F_ARB = ((int)0x8818);
+        public const int GL_MAX_VARYING_FLOATS = ((int)0x8B4B);
+        public const int GL_SLICE_ACCUM_SUN = ((int)0x85CC);
+        public const int GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV = ((int)0x8908);
+        public const int GL_DRAW_BUFFER5 = ((int)0x882A);
+        public const int GL_FOG_COORDINATE_ARRAY = ((int)0x8457);
+        public const int GL_LUMINANCE_FLOAT32_ATI = ((int)0x8818);
+        public const int GL_PROXY_COLOR_TABLE_SGI = ((int)0x80D3);
+        public const int GL_POST_CONVOLUTION_BLUE_BIAS = ((int)0x8022);
+        public const int GL_LUMINANCE_ALPHA_INTEGER_EXT = ((int)0x8D9D);
+        public const int GL_TEXTURE_LOD_BIAS = ((int)0x8501);
+        public const int GL_VARIABLE_E_NV = ((int)0x8527);
+        public const int GL_REG_13_ATI = ((int)0x892E);
+        public const int GL_TRIANGLE_LIST_SUN = ((int)0x81D7);
+        public const int GL_OBJECT_PLANE = ((int)0x2501);
+        public const int GL_4PASS_2_EXT = ((int)0x80A6);
+        public const int GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB = ((int)0x8623);
+        public const int GL_PASS_THROUGH_NV = ((int)0x86E6);
+        public const int GL_SWIZZLE_STRQ_ATI = ((int)0x897A);
+        public const int GL_PRESERVE_ATI = ((int)0x8762);
+        public const int GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB = ((int)0x8B8B);
+        public const int GL_OUTPUT_TEXTURE_COORD3_EXT = ((int)0x87A0);
+        public const int GL_UNSIGNED_INT_5_9_9_9_REV = ((int)0x8C3E);
+        public const int GL_CLIENT_PIXEL_STORE_BIT = ((int)0x00000001);
+        public const int GL_FRAMEBUFFER_UNSUPPORTED = ((int)0x8CDD);
+        public const int GL_VERTEX_STREAM6_ATI = ((int)0x8772);
+        public const int GL_REPLACE_OLDEST_SUN = ((int)0x0003);
+        public const int GL_TEXTURE_DEPTH_EXT = ((int)0x8071);
+        public const int GL_ALPHA32F_ARB = ((int)0x8816);
+        public const int GL_INT_SAMPLER_2D_EXT = ((int)0x8DCA);
+        public const int GL_RIGHT = ((int)0x0407);
+        public const int GL_BOOL_ARB = ((int)0x8B56);
+        public const int GL_MAP_WRITE_BIT = ((int)0x0002);
+        public const int GL_DRAW_BUFFER13 = ((int)0x8832);
+        public const int GL_CONSTANT_COLOR_EXT = ((int)0x8001);
+        public const int GL_RG32F = ((int)0x8230);
+        public const int GL_RGB16_EXT = ((int)0x8054);
+        public const int GL_COMBINER_BIAS_NV = ((int)0x8549);
+        public const int GL_EVAL_VERTEX_ATTRIB6_NV = ((int)0x86CC);
+        public const int GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = ((int)0x83F3);
+        public const int GL_TEXTURE_ENV_BIAS_SGIX = ((int)0x80BE);
+        public const int GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP = ((int)0x8163);
+        public const int GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX = ((int)0x840A);
+        public const int GL_CLEAR = ((int)0x1500);
+        public const int GL_COMPRESSED_SRGB_ALPHA = ((int)0x8C49);
+        public const int GL_MAP1_VERTEX_ATTRIB6_4_NV = ((int)0x8666);
+        public const int GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT = ((int)0x8DBE);
+        public const int GL_UNSIGNED_INT_8_8_8_8 = ((int)0x8035);
+        public const int GL_DUAL_LUMINANCE12_SGIS = ((int)0x8116);
+        public const int GL_TEXTURE5_ARB = ((int)0x84C5);
+        public const int GL_DEPTH32F_STENCIL8_NV = ((int)0x8DAC);
+        public const int GL_TEXTURE_DEFORMATION_BIT_SGIX = ((int)0x00000001);
+        public const int GL_QUERY_NO_WAIT = ((int)0x8E14);
+        public const int GL_TEXTURE17_ARB = ((int)0x84D1);
+        public const int GL_MODELVIEW15_ARB = ((int)0x872F);
+        public const int GL_ALPHA_INTEGER_EXT = ((int)0x8D97);
+        public const int GL_MATRIX25_ARB = ((int)0x88D9);
+        public const int GL_TEXTURE_DEPTH_TYPE_ARB = ((int)0x8C16);
+        public const int GL_MAX_RENDERBUFFER_SIZE = ((int)0x84E8);
+        public const int GL_BLEND_COLOR_EXT = ((int)0x8005);
+        public const int GL_BUFFER_USAGE = ((int)0x8765);
+        public const int GL_COMPARE_REF_TO_TEXTURE = ((int)GL_COMPARE_R_TO_TEXTURE_ARB);
+        public const int GL_RGB16UI_EXT = ((int)0x8D77);
+        public const int GL_ACTIVE_STENCIL_FACE_EXT = ((int)0x8911);
+        public const int GL_BLEND_EQUATION_ALPHA = ((int)0x883D);
+        public const int GL_REPLACE_MIDDLE_SUN = ((int)0x0002);
+        public const int GL_CURRENT_TANGENT_EXT = ((int)0x843B);
+        public const int GL_CLIP_VOLUME_CLIPPING_HINT_EXT = ((int)0x80F0);
+        public const int GL_MAP_FLUSH_EXPLICIT_BIT = ((int)0x0010);
+        public const int GL_GLOBAL_ALPHA_FACTOR_SUN = ((int)0x81DA);
+        public const int GL_DRAW_BUFFER11 = ((int)0x8830);
+        public const int GL_CLIP_DISTANCE0 = ((int)GL_CLIP_PLANE0);
+        public const int GL_INT_SAMPLER_1D_EXT = ((int)0x8DC9);
+        public const int GL_SRC2_RGB = ((int)GL_SOURCE2_RGB);
+        public const int GL_ALPHA16UI_EXT = ((int)0x8D78);
+        public const int GL_RED_MAX_CLAMP_INGR = ((int)0x8564);
+        public const int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = ((int)0x8518);
+        public const int GL_TEXTURE_INTENSITY_SIZE = ((int)0x8061);
+        public const int GL_MAX_LIST_NESTING = ((int)0x0B31);
+        public const int GL_OUTPUT_TEXTURE_COORD15_EXT = ((int)0x87AC);
+        public const int GL_3_BYTES = ((int)0x1408);
+        public const int GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB = ((int)0x889B);
+        public const int GL_MATRIX1_ARB = ((int)0x88C1);
+        public const int GL_NORMAL_MAP_EXT = ((int)0x8511);
+        public const int GL_PIXEL_TEX_GEN_Q_CEILING_SGIX = ((int)0x8184);
+        public const int GL_LIGHT4 = ((int)0x4004);
+        public const int GL_MAP1_TANGENT_EXT = ((int)0x8444);
+        public const int GL_CURRENT_RASTER_POSITION = ((int)0x0B07);
+        public const int GL_IMAGE_CUBIC_WEIGHT_HP = ((int)0x815E);
+        public const int GL_SHADER_OBJECT_ARB = ((int)0x8B48);
+        public const int GL_FLOAT_32_UNSIGNED_INT_24_8_REV = ((int)0x8DAD);
+        public const int GL_NUM_COMPRESSED_TEXTURE_FORMATS = ((int)0x86A2);
+        public const int GL_SOURCE2_RGB = ((int)0x8582);
+        public const int GL_NEVER = ((int)0x0200);
+        public const int GL_MODELVIEW25_ARB = ((int)0x8739);
+        public const int GL_NORMAL_MAP = ((int)0x8511);
+        public const int GL_RENDERBUFFER_RED_SIZE = ((int)0x8D50);
+        public const int GL_DS_BIAS_NV = ((int)0x8716);
+        public const int GL_UNPACK_IMAGE_DEPTH_SGIS = ((int)0x8133);
+        public const int GL_EVAL_VERTEX_ATTRIB1_NV = ((int)0x86C7);
+        public const int GL_NOOP = ((int)0x1505);
+        public const int GL_MINMAX_FORMAT = ((int)0x802F);
+        public const int GL_DRAW_BUFFER12_ARB = ((int)0x8831);
+        public const int GL_COMPRESSED_SRGB = ((int)0x8C48);
+        public const int GL_RGB5_A1 = ((int)0x8057);
+        public const int GL_SOURCE1_RGB_EXT = ((int)0x8581);
+        public const int GL_FLOAT_MAT4x3 = ((int)0x8B6A);
+        public const int GL_TEXTURE25_ARB = ((int)0x84D9);
+        public const int GL_EYE_PLANE_ABSOLUTE_NV = ((int)0x855C);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT = ((int)0x8C85);
+        public const int GL_POINT_SIZE_GRANULARITY = ((int)0x0B13);
+        public const int GL_EYE_DISTANCE_TO_POINT_SGIS = ((int)0x81F0);
+        public const int GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT = ((int)0x850D);
+        public const int GL_COLOR_TABLE_FORMAT_SGI = ((int)0x80D8);
+        public const int GL_COLOR_TABLE_BLUE_SIZE_SGI = ((int)0x80DC);
+        public const int GL_UNSIGNED_INT_SAMPLER_2D = ((int)0x8DD2);
+        public const int GL_MATRIX_EXT = ((int)0x87C0);
+        public const int GL_TEXTURE30_ARB = ((int)0x84DE);
+        public const int GL_V3F = ((int)0x2A21);
+        public const int GL_EVAL_VERTEX_ATTRIB2_NV = ((int)0x86C8);
+        public const int GL_OFFSET_TEXTURE_BIAS_NV = ((int)0x86E3);
+        public const int GL_MAX_PROGRAM_GENERIC_RESULTS_NV = ((int)0x8DA6);
+        public const int GL_EDGE_FLAG_ARRAY_POINTER = ((int)0x8093);
+        public const int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV = ((int)0x8C8B);
+        public const int GL_TEXCOORD4_BIT_PGI = unchecked((int)0x80000000);
+        public const int GL_TEXTURE_DEPTH_SIZE_ARB = ((int)0x884A);
+        public const int GL_DRAW_BUFFER2 = ((int)0x8827);
+        public const int GL_SAMPLER_2D_RECT_SHADOW_ARB = ((int)0x8B64);
+        public const int GL_REG_17_ATI = ((int)0x8932);
+        public const int GL_BLEND_SRC = ((int)0x0BE1);
+        public const int GL_POLYGON_STIPPLE_BIT = ((int)0x00000010);
+        public const int GL_TEXTURE_COORD_ARRAY_POINTER = ((int)0x8092);
+        public const int GL_RGB4_EXT = ((int)0x804F);
+        public const int GL_FOG_COORD_ARRAY_POINTER = ((int)GL_FOG_COORDINATE_ARRAY_POINTER);
+        public const int GL_OUTPUT_TEXTURE_COORD17_EXT = ((int)0x87AE);
+        public const int GL_SOURCE0_RGB_EXT = ((int)0x8580);
+        public const int GL_ALPHA_TEST_FUNC = ((int)0x0BC1);
+        public const int GL_TEXTURE31 = ((int)0x84DF);
+        public const int GL_RESAMPLE_REPLICATE_SGIX = ((int)0x842E);
+        public const int GL_MAX_3D_TEXTURE_SIZE_EXT = ((int)0x8073);
+        public const int GL_TEXTURE0_ARB = ((int)0x84C0);
+        public const int GL_IMPLEMENTATION_COLOR_READ_TYPE_OES = ((int)0x8B9A);
+        public const int GL_SOURCE1_ALPHA_EXT = ((int)0x8589);
+        public const int GL_COMBINER4_NV = ((int)0x8554);
+        public const int GL_EVAL_VERTEX_ATTRIB7_NV = ((int)0x86CD);
+        public const int GL_REG_12_ATI = ((int)0x892D);
+        public const int GL_VERTEX_ATTRIB_ARRAY13_NV = ((int)0x865D);
+        public const int GL_UNSIGNED_NORMALIZED_ARB = ((int)0x8C17);
+        public const int GL_DRAW_BUFFER10 = ((int)0x882F);
+        public const int GL_INDEX_ARRAY_TYPE_EXT = ((int)0x8085);
+        public const int GL_NORMAL_MAP_NV = ((int)0x8511);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB = ((int)0x8DA9);
+        public const int GL_SIGNED_RGBA_NV = ((int)0x86FB);
+        public const int GL_MAX_COLOR_ATTACHMENTS = ((int)0x8CDF);
+        public const int GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = ((int)0x8C8A);
+        public const int GL_FRAGMENT_COLOR_MATERIAL_SGIX = ((int)0x8401);
+        public const int GL_TRANSPOSE_MODELVIEW_MATRIX = ((int)0x84E3);
+        public const int GL_ALPHA = ((int)0x1906);
+        public const int GL_PIXEL_UNPACK_BUFFER_BINDING = ((int)0x88EF);
+        public const int GL_PIXEL_PACK_BUFFER_BINDING_EXT = ((int)0x88ED);
+        public const int GL_DONT_CARE = ((int)0x1100);
+        public const int GL_ALPHA_FLOAT16_ATI = ((int)0x881C);
+        public const int GL_LINEAR_MIPMAP_LINEAR = ((int)0x2703);
+        public const int GL_MODELVIEW0_STACK_DEPTH_EXT = ((int)GL_MODELVIEW_STACK_DEPTH);
+        public const int GL_POINT_TOKEN = ((int)0x0701);
+        public const int GL_COMPRESSED_SRGB_EXT = ((int)0x8C48);
+        public const int GL_EVAL_VERTEX_ATTRIB0_NV = ((int)0x86C6);
+        public const int GL_RGB_INTEGER_EXT = ((int)0x8D98);
+        public const int GL_VERTEX_ATTRIB_ARRAY10_NV = ((int)0x865A);
+        public const int GL_RGB4 = ((int)0x804F);
+        public const int GL_MAP2_COLOR_4 = ((int)0x0DB0);
+        public const int GL_CON_4_ATI = ((int)0x8945);
+        public const int GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV = ((int)0x8520);
+        public const int GL_SIGNED_HILO16_NV = ((int)0x86FA);
+        public const int GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN = ((int)0x85C2);
+        public const int GL_MATRIX_INDEX_ARRAY_SIZE_ARB = ((int)0x8846);
+        public const int GL_MIRRORED_REPEAT = ((int)0x8370);
+        public const int GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI = ((int)0x8835);
+        public const int GL_COLOR_TABLE_SCALE_SGI = ((int)0x80D6);
+        public const int GL_REFLECTION_MAP = ((int)0x8512);
+        public const int GL_PACK_IMAGE_HEIGHT = ((int)0x806C);
+        public const int GL_AVERAGE_HP = ((int)0x8160);
+        public const int GL_FLOAT_RGBA32_NV = ((int)0x888B);
+        public const int GL_MATRIX29_ARB = ((int)0x88DD);
+        public const int GL_SLUMINANCE_ALPHA = ((int)0x8C44);
+        public const int GL_MAT_DIFFUSE_BIT_PGI = ((int)0x00400000);
+        public const int GL_MODELVIEW2_ARB = ((int)0x8722);
+        public const int GL_OFFSET_TEXTURE_MATRIX_NV = ((int)0x86E1);
+        public const int GL_COLOR_TABLE_FORMAT = ((int)0x80D8);
+        public const int GL_STATIC_DRAW_ARB = ((int)0x88E4);
+        public const int GL_MATRIX31_ARB = ((int)0x88DF);
+        public const int GL_MAX_CLIP_PLANES = ((int)0x0D32);
+        public const int GL_POST_COLOR_MATRIX_BLUE_BIAS = ((int)0x80BA);
+        public const int GL_SMOOTH_LINE_WIDTH_GRANULARITY = ((int)0x0B23);
+        public const int GL_STENCIL_BACK_FAIL = ((int)0x8801);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = ((int)0x8210);
+        public const int GL_DOT_PRODUCT_TEXTURE_3D_NV = ((int)0x86EF);
+        public const int GL_OFFSET_TEXTURE_2D_MATRIX_NV = ((int)GL_OFFSET_TEXTURE_MATRIX_NV);
+        public const int GL_LUMINANCE_ALPHA8UI_EXT = ((int)0x8D81);
+        public const int GL_LUMINANCE12 = ((int)0x8041);
+        public const int GL_PROGRAM_LENGTH_NV = ((int)0x8627);
+        public const int GL_COLOR_ATTACHMENT11_EXT = ((int)0x8CEB);
+        public const int GL_INTENSITY4 = ((int)0x804A);
+        public const int GL_UNSIGNED_BYTE = ((int)0x1401);
+        public const int GL_BGR_INTEGER_EXT = ((int)0x8D9A);
+        public const int GL_NORMAL_ARRAY_BUFFER_BINDING = ((int)0x8897);
+        public const int GL_TRANSFORM_FEEDBACK_VARYINGS = ((int)0x8C83);
+        public const int GL_SRGB_ALPHA_EXT = ((int)0x8C42);
+        public const int GL_LOCAL_CONSTANT_VALUE_EXT = ((int)0x87EC);
+        public const int GL_OPERAND0_ALPHA_EXT = ((int)0x8598);
+        public const int GL_OPERAND1_ALPHA_EXT = ((int)0x8599);
+        public const int GL_BUMP_TARGET_ATI = ((int)0x877C);
+        public const int GL_MAP2_BINORMAL_EXT = ((int)0x8447);
+        public const int GL_ONE_MINUS_CONSTANT_ALPHA = ((int)0x8004);
+        public const int GL_TEXTURE21_ARB = ((int)0x84D5);
+        public const int GL_VERTEX_ATTRIB_ARRAY12_NV = ((int)0x865C);
+        public const int GL_MATRIX23_ARB = ((int)0x88D7);
+        public const int GL_EVAL_VERTEX_ATTRIB13_NV = ((int)0x86D3);
+        public const int GL_LUMINANCE8_ALPHA8_EXT = ((int)0x8045);
+        public const int GL_RGB2_EXT = ((int)0x804E);
+        public const int GL_EMBOSS_MAP_NV = ((int)0x855F);
+        public const int GL_BOOL_VEC4_ARB = ((int)0x8B59);
+        public const int GL_TEXTURE1 = ((int)0x84C1);
+        public const int GL_TEXTURE_2D_BINDING_EXT = ((int)0x8069);
+        public const int GL_TEXTURE_RED_TYPE = ((int)0x8C10);
+        public const int GL_EDGE_FLAG_ARRAY_BUFFER_BINDING = ((int)0x889B);
+        public const int GL_LUMINANCE12_ALPHA12 = ((int)0x8047);
+        public const int GL_WRITE_ONLY_ARB = ((int)0x88B9);
+        public const int GL_RGBA16_EXT = ((int)0x805B);
+        public const int GL_EVAL_VERTEX_ATTRIB3_NV = ((int)0x86C9);
+        public const int GL_SCALE_BY_FOUR_NV = ((int)0x853F);
+        public const int GL_EDGE_FLAG_ARRAY_STRIDE_EXT = ((int)0x808C);
+        public const int GL_COLOR_ARRAY_EXT = ((int)0x8076);
+        public const int GL_DISTANCE_ATTENUATION_EXT = ((int)0x8129);
+        public const int GL_CURRENT_RASTER_INDEX = ((int)0x0B05);
+        public const int GL_PROGRAM_ATTRIBS_ARB = ((int)0x88AC);
+        public const int GL_BLEND_EQUATION_EXT = ((int)0x8009);
+        public const int GL_SAMPLE_COVERAGE_ARB = ((int)0x80A0);
+        public const int GL_NUM_FILL_STREAMS_NV = ((int)0x8E29);
+        public const int GL_MAX_VERTEX_UNIFORM_COMPONENTS = ((int)0x8B4A);
+        public const int GL_SRGB8 = ((int)0x8C41);
+        public const int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = ((int)0x8C4E);
+        public const int GL_ONE_EXT = ((int)0x87DE);
+        public const int GL_RG8UI = ((int)0x8238);
+        public const int GL_PROXY_TEXTURE_CUBE_MAP = ((int)0x851B);
+        public const int GL_TEXTURE_3D_BINDING_EXT = ((int)0x806A);
+        public const int GL_CONVOLUTION_1D_EXT = ((int)0x8010);
+        public const int GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV = ((int)0x8DAD);
+        public const int GL_VERTEX_ATTRIB_ARRAY14_NV = ((int)0x865E);
+        public const int GL_UNPACK_SKIP_IMAGES_EXT = ((int)0x806D);
+        public const int GL_TRIANGLE_STRIP_ADJACENCY_EXT = ((int)0x000D);
+        public const int GL_HALF_BIAS_NEGATE_NV = ((int)0x853B);
+        public const int GL_INTENSITY32I_EXT = ((int)0x8D85);
+        public const int GL_QUAD_TEXTURE_SELECT_SGIS = ((int)0x8125);
+        public const int GL_R11F_G11F_B10F = ((int)0x8C3A);
+        public const int GL_PACK_CMYK_HINT_EXT = ((int)0x800E);
+        public const int GL_STATIC_COPY_ARB = ((int)0x88E6);
+        public const int GL_READ_FRAMEBUFFER_BINDING = ((int)0x8CAA);
+        public const int GL_DRAW_BUFFER3 = ((int)0x8828);
+        public const int GL_COMPRESSED_INTENSITY = ((int)0x84EC);
+        public const int GL_BINORMAL_ARRAY_EXT = ((int)0x843A);
+        public const int GL_COMBINER_SUM_OUTPUT_NV = ((int)0x854C);
+        public const int GL_LUMINANCE16_EXT = ((int)0x8042);
+        public const int GL_OP_SET_LT_EXT = ((int)0x878D);
+        public const int GL_TEXTURE26 = ((int)0x84DA);
+        public const int GL_TEXTURE27 = ((int)0x84DB);
+        public const int GL_TEXTURE4_ARB = ((int)0x84C4);
+        public const int GL_AND_INVERTED = ((int)0x1504);
+        public const int GL_TEXTURE22 = ((int)0x84D6);
+        public const int GL_TEXTURE23 = ((int)0x84D7);
+        public const int GL_CONVOLUTION_WIDTH_EXT = ((int)0x8018);
+        public const int GL_TEXTURE21 = ((int)0x84D5);
+        public const int GL_SOURCE2_RGB_EXT = ((int)0x8582);
+        public const int GL_REG_16_ATI = ((int)0x8931);
+        public const int GL_VERTEX_ATTRIB_ARRAY11_NV = ((int)0x865B);
+        public const int GL_TEXTURE28 = ((int)0x84DC);
+        public const int GL_TEXTURE29 = ((int)0x84DD);
+        public const int GL_DRAW_BUFFER1_ARB = ((int)0x8826);
+        public const int GL_MAP_UNSYNCHRONIZED_BIT = ((int)0x0020);
+        public const int GL_FRAGMENT_DEPTH_EXT = ((int)0x8452);
+        public const int GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM = ((int)103087);
+        public const int GL_RGBA32F_ARB = ((int)0x8814);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT = ((int)0x8CD9);
+        public const int GL_BUFFER_MAPPED = ((int)0x88BC);
+        public const int GL_TEXTURE24 = ((int)0x84D8);
+        public const int GL_TEXTURE25 = ((int)0x84D9);
+        public const int GL_TEXTURE20 = ((int)0x84D4);
+        public const int GL_BLEND_DST_RGB = ((int)0x80C8);
+        public const int GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV = ((int)0x885D);
+        public const int GL_TEXTURE_COORD_ARRAY_TYPE = ((int)0x8089);
+        public const int GL_DSDT_NV = ((int)0x86F5);
+        public const int GL_MULTISAMPLE_ARB = ((int)0x809D);
+        public const int GL_STENCIL_ATTACHMENT_EXT = ((int)0x8D20);
+        public const int GL_NOR = ((int)0x1508);
+        public const int GL_FLOAT_R16_NV = ((int)0x8884);
+        public const int GL_MAX_VERTEX_VARYING_COMPONENTS_ARB = ((int)0x8DDE);
+        public const int GL_AUX1 = ((int)0x040A);
+        public const int GL_EVAL_TRIANGULAR_2D_NV = ((int)0x86C1);
+        public const int GL_LINE_STIPPLE_PATTERN = ((int)0x0B25);
+        public const int GL_FLOAT_MAT2x3 = ((int)0x8B65);
+        public const int GL_CULL_VERTEX_IBM = ((int)103050);
+        public const int GL_PACK_LSB_FIRST = ((int)0x0D01);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT = ((int)0x8CD0);
+        public const int GL_MODELVIEW6_ARB = ((int)0x8726);
+        public const int GL_VARIABLE_F_NV = ((int)0x8528);
+        public const int GL_RGB32F_ARB = ((int)0x8815);
+        public const int GL_DRAW_BUFFER2_ARB = ((int)0x8827);
+        public const int GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT = ((int)0x8C72);
+        public const int GL_FLOAT_MAT3_ARB = ((int)0x8B5B);
+        public const int GL_OBJECT_ATTACHED_OBJECTS_ARB = ((int)0x8B85);
+        public const int GL_GENERATE_MIPMAP = ((int)0x8191);
+        public const int GL_DUAL_ALPHA16_SGIS = ((int)0x8113);
+        public const int GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB = ((int)0x889D);
+        public const int GL_DETAIL_TEXTURE_MODE_SGIS = ((int)0x809B);
+        public const int GL_GENERATE_MIPMAP_SGIS = ((int)0x8191);
+        public const int GL_GREEN_BIT_ATI = ((int)0x00000002);
+        public const int GL_TEXTURE_1D_STACK_MESAX = ((int)0x8759);
+        public const int GL_SAMPLER_1D_ARRAY_SHADOW = ((int)0x8DC3);
+        public const int GL_EVAL_VERTEX_ATTRIB8_NV = ((int)0x86CE);
+        public const int GL_VERTEX_ATTRIB_ARRAY_TYPE = ((int)0x8625);
+        public const int GL_TRACK_MATRIX_TRANSFORM_NV = ((int)0x8649);
+        public const int GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = ((int)0x8515);
+        public const int GL_UPPER_LEFT = ((int)0x8CA2);
+        public const int GL_REDUCE = ((int)0x8016);
+        public const int GL_COLOR_TABLE_INTENSITY_SIZE_SGI = ((int)0x80DF);
+        public const int GL_MATRIX27_ARB = ((int)0x88DB);
+        public const int GL_RGB_INTEGER = ((int)0x8D98);
+        public const int GL_BLEND_SRC_RGB = ((int)0x80C9);
+        public const int GL_GEQUAL = ((int)0x0206);
+        public const int GL_POST_CONVOLUTION_RED_SCALE_EXT = ((int)0x801C);
+        public const int GL_UNSIGNED_SHORT_8_8_REV_MESA = ((int)0x85BB);
+        public const int GL_COLOR_ATTACHMENT12 = ((int)0x8CEC);
+        public const int GL_LIGHT_ENV_MODE_SGIX = ((int)0x8407);
+        public const int GL_VERTEX_CONSISTENT_HINT_PGI = ((int)0x1A22B);
+        public const int GL_RENDERBUFFER_GREEN_SIZE_EXT = ((int)0x8D51);
+        public const int GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE = ((int)0x85B0);
+        public const int GL_R1UI_C4UB_V3F_SUN = ((int)0x85C5);
+        public const int GL_NEAREST = ((int)0x2600);
+        public const int GL_MIRRORED_REPEAT_IBM = ((int)0x8370);
+        public const int GL_CURRENT_PALETTE_MATRIX_ARB = ((int)0x8843);
+        public const int GL_COLOR_TABLE_INTENSITY_SIZE = ((int)0x80DF);
+        public const int GL_PROXY_TEXTURE_RECTANGLE_ARB = ((int)0x84F7);
+        public const int GL_REPLACE = ((int)0x1E01);
+        public const int GL_COLOR_SUM_EXT = ((int)0x8458);
+        public const int GL_OBJECT_VALIDATE_STATUS_ARB = ((int)0x8B83);
+        public const int GL_POLYGON_SMOOTH = ((int)0x0B41);
+        public const int GL_VERTEX_ATTRIB_ARRAY15_NV = ((int)0x865F);
+        public const int GL_FOG_COORDINATE_SOURCE_EXT = ((int)0x8450);
+        public const int GL_UNSIGNED_SHORT_8_8_REV_APPLE = ((int)0x85BB);
+        public const int GL_DUAL_LUMINANCE_ALPHA4_SGIS = ((int)0x811C);
+        public const int GL_TEXTURE_COMPRESSED_ARB = ((int)0x86A1);
+        public const int GL_RENDERBUFFER_BLUE_SIZE = ((int)0x8D52);
+        public const int GL_ALPHA32I_EXT = ((int)0x8D84);
+        public const int GL_ALPHA4_EXT = ((int)0x803B);
+        public const int GL_TEXTURE_1D_ARRAY_EXT = ((int)0x8C18);
+        public const int GL_INT_SAMPLER_1D_ARRAY = ((int)0x8DCE);
+        public const int GL_STENCIL_PASS_DEPTH_FAIL = ((int)0x0B95);
+        public const int GL_TEXTURE_WIDTH = ((int)0x1000);
+        public const int GL_CURRENT_MATRIX_STACK_DEPTH_ARB = ((int)0x8640);
+        public const int GL_UNPACK_SUBSAMPLE_RATE_SGIX = ((int)0x85A1);
+        public const int GL_T2F_C4UB_V3F = ((int)0x2A29);
+        public const int GL_SAMPLE_MASK_SGIS = ((int)0x80A0);
+        public const int GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT = ((int)0x8366);
+        public const int GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT = ((int)0x8337);
+        public const int GL_MODELVIEW19_ARB = ((int)0x8733);
+        public const int GL_CLAMP_TO_BORDER = ((int)0x812D);
+        public const int GL_CLAMP_READ_COLOR_ARB = ((int)0x891C);
+        public const int GL_MAX_PROJECTION_STACK_DEPTH = ((int)0x0D38);
+        public const int GL_FIXED_ONLY = ((int)0x891D);
+        public const int GL_TEXTURE_RED_TYPE_ARB = ((int)0x8C10);
+        public const int GL_VERTEX_ATTRIB_ARRAY_POINTER = ((int)0x8645);
+        public const int GL_QUERY_RESULT_AVAILABLE = ((int)0x8867);
+        public const int GL_MAP1_VERTEX_ATTRIB4_4_NV = ((int)0x8664);
+        public const int GL_VERTEX_ARRAY_BINDING = ((int)0x85B5);
+        public const int GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI = ((int)0x87F6);
+        public const int GL_SHADING_LANGUAGE_VERSION_ARB = ((int)0x8B8C);
+        public const int GL_MODELVIEW11_ARB = ((int)0x872B);
+        public const int GL_FLOAT_RGB16_NV = ((int)0x8888);
+        public const int GL_READ_BUFFER = ((int)0x0C02);
+        public const int GL_CON_16_ATI = ((int)0x8951);
+        public const int GL_SAMPLER_2D_SHADOW = ((int)0x8B62);
+        public const int GL_NORMAL_ARRAY_POINTER = ((int)0x808F);
+        public const int GL_TEXTURE_GEN_T = ((int)0x0C61);
+        public const int GL_PREVIOUS_ARB = ((int)0x8578);
+        public const int GL_REG_9_ATI = ((int)0x892A);
+        public const int GL_TEXTURE_GEN_Q = ((int)0x0C63);
+        public const int GL_SAMPLE_PATTERN_EXT = ((int)0x80AC);
+        public const int GL_EYE_LINE_SGIS = ((int)0x81F6);
+        public const int GL_IMAGE_ROTATE_ANGLE_HP = ((int)0x8159);
+        public const int GL_SAMPLES_PASSED = ((int)0x8914);
+        public const int GL_LINEAR_ATTENUATION = ((int)0x1208);
+        public const int GL_RECLAIM_MEMORY_HINT_PGI = ((int)0x1A1FE);
+        public const int GL_ALPHA12 = ((int)0x803D);
+        public const int GL_RG32I = ((int)0x823B);
+        public const int GL_MAP_ATTRIB_V_ORDER_NV = ((int)0x86C4);
+        public const int GL_ALPHA16 = ((int)0x803E);
+        public const int GL_CON_3_ATI = ((int)0x8944);
+        public const int GL_BOOL_VEC2_ARB = ((int)0x8B57);
+        public const int GL_OBJECT_BUFFER_SIZE_ATI = ((int)0x8764);
+        public const int GL_DRAW_FRAMEBUFFER_BINDING = ((int)GL_FRAMEBUFFER_BINDING);
+        public const int GL_PROXY_TEXTURE_3D_EXT = ((int)0x8070);
+        public const int GL_DEPTH_COMPONENT32 = ((int)0x81A7);
+        public const int GL_QUAD_STRIP = ((int)0x0008);
+        public const int GL_MAP1_VERTEX_ATTRIB10_4_NV = ((int)0x866A);
+        public const int GL_FOG_COORD_ARRAY_BUFFER_BINDING = ((int)GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING);
+        public const int GL_MAX_SPOT_EXPONENT_NV = ((int)0x8505);
+        public const int GL_UNSIGNED_INT_24_8_NV = ((int)0x84FA);
+        public const int GL_STENCIL_BACK_FUNC = ((int)0x8800);
+        public const int GL_STENCIL_BACK_REF = ((int)0x8CA3);
+        public const int GL_MATRIX_INDEX_ARRAY_POINTER_ARB = ((int)0x8849);
+        public const int GL_SWIZZLE_STQ_ATI = ((int)0x8977);
+        public const int GL_SAMPLER_1D_ARB = ((int)0x8B5D);
+        public const int GL_CALLIGRAPHIC_FRAGMENT_SGIX = ((int)0x8183);
+        public const int GL_INTERPOLATE_ARB = ((int)0x8575);
+        public const int GL_RGBA16UI = ((int)0x8D76);
+        public const int GL_SUBTRACT = ((int)0x84E7);
+        public const int GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX = ((int)0x813E);
+        public const int GL_LUMINANCE4_EXT = ((int)0x803F);
+        public const int GL_AUX0 = ((int)0x0409);
+        public const int GL_VERTEX_ATTRIB_ARRAY4_NV = ((int)0x8654);
+        public const int GL_MODELVIEW21_ARB = ((int)0x8735);
+        public const int GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT = ((int)0x8C88);
+        public const int GL_STENCIL_BACK_FUNC_ATI = ((int)0x8800);
+        public const int GL_RED_MIN_CLAMP_INGR = ((int)0x8560);
+        public const int GL_TEXTURE_COORD_ARRAY_POINTER_EXT = ((int)0x8092);
+        public const int GL_SAMPLE_MASK_EXT = ((int)0x80A0);
+        public const int GL_SMOOTH_LINE_WIDTH_RANGE = ((int)0x0B22);
+        public const int GL_TEXTURE_WRAP_R = ((int)0x8072);
+        public const int GL_MAP2_VERTEX_ATTRIB15_4_NV = ((int)0x867F);
+        public const int GL_STENCIL_FAIL = ((int)0x0B94);
+        public const int GL_MODELVIEW1_EXT = ((int)0x850A);
+        public const int GL_MAX_CONVOLUTION_HEIGHT_EXT = ((int)0x801B);
+        public const int GL_POINT_SIZE_MIN_ARB = ((int)0x8126);
+        public const int GL_CONTEXT_FLAGS = ((int)0x821E);
+        public const int GL_RGB10 = ((int)0x8052);
+        public const int GL_MAP1_TEXTURE_COORD_1 = ((int)0x0D93);
+        public const int GL_RGB16 = ((int)0x8054);
+        public const int GL_T2F_IUI_N3F_V2F_EXT = ((int)0x81B3);
+        public const int GL_SAMPLER_2D_ARRAY = ((int)0x8DC1);
+        public const int GL_POINT_SPRITE_R_MODE_NV = ((int)0x8863);
+        public const int GL_TEXTURE_DEPTH_SIZE = ((int)0x884A);
+        public const int GL_MAX_NAME_STACK_DEPTH = ((int)0x0D37);
+        public const int GL_UNIFORM_BUFFER_BINDING_EXT = ((int)0x8DEF);
+        public const int GL_RGB12 = ((int)0x8053);
+        public const int GL_RESCALE_NORMAL_EXT = ((int)0x803A);
+        public const int GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT = ((int)0x850E);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT = ((int)0x8CDA);
+        public const int GL_ABGR_EXT = ((int)0x8000);
+        public const int GL_RG16F = ((int)0x822F);
+        public const int GL_SAMPLE_ALPHA_TO_ONE_ARB = ((int)0x809F);
+        public const int GL_MODELVIEW0_ARB = ((int)0x1700);
+        public const int GL_HISTOGRAM_RED_SIZE = ((int)0x8028);
+        public const int GL_RG32UI = ((int)0x823C);
+        public const int GL_INVARIANT_DATATYPE_EXT = ((int)0x87EB);
+        public const int GL_HISTOGRAM_LUMINANCE_SIZE = ((int)0x802C);
+        public const int GL_COLOR_LOGIC_OP = ((int)0x0BF2);
+        public const int GL_COLOR_ATTACHMENT15 = ((int)0x8CEF);
+        public const int GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT = ((int)0x851A);
+        public const int GL_CURRENT_TEXTURE_COORDS = ((int)0x0B03);
+        public const int GL_SAMPLE_MASK_INVERT_EXT = ((int)0x80AB);
+        public const int GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB = ((int)0x8841);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_NV = ((int)0x8C8E);
+        public const int GL_SHADER_OPERATION_NV = ((int)0x86DF);
+        public const int GL_FOG = ((int)0x0B60);
+        public const int GL_TEXTURE10_ARB = ((int)0x84CA);
+        public const int GL_RENDERBUFFER_ALPHA_SIZE = ((int)0x8D53);
+        public const int GL_SHADOW_AMBIENT_SGIX = ((int)0x80BF);
+        public const int GL_DU8DV8_ATI = ((int)0x877A);
+        public const int GL_STATIC_COPY = ((int)0x88E6);
+        public const int GL_OPERAND2_ALPHA = ((int)0x859A);
+        public const int GL_INDEX_ARRAY_BUFFER_BINDING = ((int)0x8899);
+        public const int GL_POINT = ((int)0x1B00);
+        public const int GL_1PASS_EXT = ((int)0x80A1);
+        public const int GL_CONVOLUTION_FORMAT_EXT = ((int)0x8017);
+        public const int GL_RGBA_FLOAT_MODE_ARB = ((int)0x8820);
+        public const int GL_BLUE_MAX_CLAMP_INGR = ((int)0x8566);
+        public const int GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX = ((int)0x8189);
+        public const int GL_GENERATE_MIPMAP_HINT_SGIS = ((int)0x8192);
+        public const int GL_OUTPUT_TEXTURE_COORD21_EXT = ((int)0x87B2);
+        public const int GL_COMPRESSED_LUMINANCE_ALPHA = ((int)0x84EB);
+        public const int GL_OUTPUT_TEXTURE_COORD30_EXT = ((int)0x87BB);
+        public const int GL_POST_CONVOLUTION_ALPHA_SCALE_EXT = ((int)0x801F);
+        public const int GL_UNSIGNED_NORMALIZED = ((int)0x8C17);
+        public const int GL_BACK_LEFT = ((int)0x0402);
+        public const int GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB = ((int)0x880C);
+        public const int GL_CONVOLUTION_HEIGHT = ((int)0x8019);
+        public const int GL_RGB32F = ((int)0x8815);
+        public const int GL_TABLE_TOO_LARGE = ((int)0x8031);
+        public const int GL_SAMPLES_3DFX = ((int)0x86B4);
+        public const int GL_DRAW_BUFFER8_ARB = ((int)0x882D);
+        public const int GL_RENDERBUFFER_ALPHA_SIZE_EXT = ((int)0x8D53);
+        public const int GL_VERTEX_ARRAY_LIST_STRIDE_IBM = ((int)103080);
+        public const int GL_RGB16F_ARB = ((int)0x881B);
+        public const int GL_FOG_FUNC_SGIS = ((int)0x812A);
+        public const int GL_R1UI_V3F_SUN = ((int)0x85C4);
+        public const int GL_RGB_S3TC = ((int)0x83A0);
+        public const int GL_TEXTURE_MAX_ANISOTROPY_EXT = ((int)0x84FE);
+        public const int GL_PROGRAM_ATTRIB_COMPONENTS_NV = ((int)0x8906);
+        public const int GL_CON_31_ATI = ((int)0x8960);
+        public const int GL_ALIASED_POINT_SIZE_RANGE = ((int)0x846D);
+        public const int GL_DRAW_BUFFER2_ATI = ((int)0x8827);
+        public const int GL_COMBINER0_NV = ((int)0x8550);
+        public const int GL_UNSIGNED_SHORT_8_8_APPLE = ((int)0x85BA);
+        public const int GL_TEXTURE_CLIPMAP_DEPTH_SGIX = ((int)0x8176);
+        public const int GL_MAX_EXT = ((int)0x8008);
+        public const int GL_PIXEL_MODE_BIT = ((int)0x00000020);
+        public const int GL_SRC0_RGB = ((int)GL_SOURCE0_RGB);
+        public const int GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX = ((int)0x8408);
+        public const int GL_REG_21_ATI = ((int)0x8936);
+        public const int GL_SEPARATE_ATTRIBS_NV = ((int)0x8C8D);
+        public const int GL_CLIENT_ACTIVE_TEXTURE = ((int)0x84E1);
+        public const int GL_SEPARATE_SPECULAR_COLOR_EXT = ((int)0x81FA);
+        public const int GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT = ((int)0x8C2D);
+        public const int GL_PREFER_DOUBLEBUFFER_HINT_PGI = ((int)0x1A1F8);
+        public const int GL_ALLOW_DRAW_FRG_HINT_PGI = ((int)0x1A210);
+        public const int GL_422_AVERAGE_EXT = ((int)0x80CE);
+        public const int GL_BACK = ((int)0x0405);
+        public const int GL_RGB12_EXT = ((int)0x8053);
+        public const int GL_DEPTH_COMPONENT24 = ((int)0x81A6);
+        public const int GL_MAP1_VERTEX_ATTRIB12_4_NV = ((int)0x866C);
+        public const int GL_COMBINER1_NV = ((int)0x8551);
+        public const int GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES = ((int)0x8B9B);
+        public const int GL_STREAM_COPY_ARB = ((int)0x88E2);
+        public const int GL_PROXY_TEXTURE_2D_ARRAY = ((int)0x8C1B);
+        public const int GL_MAP2_VERTEX_ATTRIB2_4_NV = ((int)0x8672);
+        public const int GL_ELEMENT_ARRAY_BUFFER = ((int)0x8893);
+        public const int GL_HILO8_NV = ((int)0x885E);
+        public const int GL_LINEAR_MIPMAP_NEAREST = ((int)0x2701);
+        public const int GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX = ((int)0x8409);
+        public const int GL_VERTEX_ATTRIB_ARRAY2_NV = ((int)0x8652);
+        public const int GL_COMPRESSED_RG = ((int)0x8226);
+        public const int GL_FOG_END = ((int)0x0B64);
+        public const int GL_OP_INDEX_EXT = ((int)0x8782);
+        public const int GL_SPRITE_AXIS_SGIX = ((int)0x814A);
+        public const int GL_MAX_SHININESS_NV = ((int)0x8504);
+        public const int GL_VERTEX_BLEND_ARB = ((int)0x86A7);
+        public const int GL_MATRIX19_ARB = ((int)0x88D3);
+        public const int GL_RENDERBUFFER_SAMPLES = ((int)0x8CAB);
+        public const int GL_PROXY_POST_CONVOLUTION_COLOR_TABLE = ((int)0x80D4);
+        public const int GL_CLAMP_VERTEX_COLOR_ARB = ((int)0x891A);
+        public const int GL_STENCIL_BACK_PASS_DEPTH_FAIL = ((int)0x8802);
+        public const int GL_DEPTH = ((int)0x1801);
+        public const int GL_DEPTH_COMPONENT16_SGIX = ((int)0x81A5);
+        public const int GL_MAX_PIXEL_MAP_TABLE = ((int)0x0D34);
+        public const int GL_MIN_PROGRAM_TEXEL_OFFSET = ((int)0x8904);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = ((int)0x8CD2);
+        public const int GL_LUMINANCE32I_EXT = ((int)0x8D86);
+        public const int GL_DRAW_FRAMEBUFFER_EXT = ((int)0x8CA9);
+        public const int GL_COLOR_ATTACHMENT13_EXT = ((int)0x8CED);
+        public const int GL_COMPRESSED_RGB_ARB = ((int)0x84ED);
+        public const int GL_INTERLACE_OML = ((int)0x8980);
+        public const int GL_NUM_FRAGMENT_CONSTANTS_ATI = ((int)0x896F);
+        public const int GL_MAT_COLOR_INDEXES_BIT_PGI = ((int)0x01000000);
+        public const int GL_FOG_COORDINATE_ARRAY_POINTER = ((int)0x8456);
+        public const int GL_POST_CONVOLUTION_BLUE_BIAS_EXT = ((int)0x8022);
+        public const int GL_INDEX_OFFSET = ((int)0x0D13);
+        public const int GL_REPLACEMENT_CODE_ARRAY_SUN = ((int)0x85C0);
+        public const int GL_CURRENT_QUERY = ((int)0x8865);
+        public const int GL_HILO16_NV = ((int)0x86F8);
+        public const int GL_TEXTURE_MATERIAL_PARAMETER_EXT = ((int)0x8352);
+        public const int GL_FLOAT_RGBA16_NV = ((int)0x888A);
+        public const int GL_INT_SAMPLER_2D_ARRAY = ((int)0x8DCF);
+        public const int GL_MODELVIEW4_ARB = ((int)0x8724);
+        public const int GL_BYTE = ((int)0x1400);
+        public const int GL_OBJECT_DISTANCE_TO_POINT_SGIS = ((int)0x81F1);
+        public const int GL_DECR_WRAP_EXT = ((int)0x8508);
+        public const int GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV = ((int)0x86F0);
+        public const int GL_STENCIL_BACK_PASS_DEPTH_PASS = ((int)0x8803);
+        public const int GL_OPERAND1_ALPHA_ARB = ((int)0x8599);
+        public const int GL_MAX_DRAW_BUFFERS = ((int)0x8824);
+        public const int GL_CON_21_ATI = ((int)0x8956);
+        public const int GL_COLOR_ARRAY = ((int)0x8076);
+        public const int GL_TEXTURE11_ARB = ((int)0x84CB);
+        public const int GL_FOG_COLOR = ((int)0x0B66);
+        public const int GL_COLOR_ATTACHMENT14 = ((int)0x8CEE);
+        public const int GL_COMPILE_AND_EXECUTE = ((int)0x1301);
+        public const int GL_SEPARATE_SPECULAR_COLOR = ((int)0x81FA);
+        public const int GL_FLOAT_VEC2_ARB = ((int)0x8B50);
+        public const int GL_OPERAND1_RGB_ARB = ((int)0x8591);
+        public const int GL_PIXEL_MAP_R_TO_R = ((int)0x0C76);
+        public const int GL_TEXTURE_LUMINANCE_TYPE_ARB = ((int)0x8C14);
+        public const int GL_OBJECT_SUBTYPE_ARB = ((int)0x8B4F);
+        public const int GL_OP_NEGATE_EXT = ((int)0x8783);
+        public const int GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT = ((int)0x8516);
+        public const int GL_SAMPLE_BUFFERS_EXT = ((int)0x80A8);
+        public const int GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB = ((int)0x88B6);
+        public const int GL_IMAGE_TRANSFORM_2D_HP = ((int)0x8161);
+        public const int GL_VARIABLE_G_NV = ((int)0x8529);
+        public const int GL_OFFSET_TEXTURE_2D_BIAS_NV = ((int)GL_OFFSET_TEXTURE_BIAS_NV);
+        public const int GL_COMPILE = ((int)0x1300);
+        public const int GL_ARRAY_BUFFER_BINDING_ARB = ((int)0x8894);
+        public const int GL_VERTEX_ARRAY_LIST_IBM = ((int)103070);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = ((int)0x8C85);
+        public const int GL_LUMINANCE_ALPHA16F_ARB = ((int)0x881F);
+        public const int GL_BUMP_ENVMAP_ATI = ((int)0x877B);
+        public const int GL_COMBINER5_NV = ((int)0x8555);
+        public const int GL_ALPHA_MAX_SGIX = ((int)0x8321);
+        public const int GL_FUNC_REVERSE_SUBTRACT = ((int)0x800B);
+        public const int GL_PROGRAM_ERROR_POSITION_ARB = ((int)0x864B);
+        public const int GL_INFO_LOG_LENGTH = ((int)0x8B84);
+        public const int GL_DOT_PRODUCT_NV = ((int)0x86EC);
+        public const int GL_OCCLUSION_TEST_HP = ((int)0x8165);
+        public const int GL_FOG_COORDINATE = ((int)0x8451);
+        public const int GL_COLOR_ATTACHMENT10 = ((int)0x8CEA);
+        public const int GL_TEXTURE_ALPHA_TYPE = ((int)0x8C13);
+        public const int GL_DRAW_BUFFER14_ATI = ((int)0x8833);
+        public const int GL_EXPAND_NEGATE_NV = ((int)0x8539);
+        public const int GL_MODELVIEW22_ARB = ((int)0x8736);
+        public const int GL_CLIENT_ATTRIB_STACK_DEPTH = ((int)0x0BB1);
+        public const int GL_VERTEX_PRECLIP_HINT_SGIX = ((int)0x83EF);
+        public const int GL_GEOMETRY_VERTICES_OUT_EXT = ((int)0x8DDA);
+        public const int GL_PROGRAM_OBJECT_ARB = ((int)0x8B40);
+        public const int GL_INT_SAMPLER_3D_EXT = ((int)0x8DCB);
+        public const int GL_NEGATIVE_Y_EXT = ((int)0x87DA);
+        public const int GL_RGB8_EXT = ((int)0x8051);
+        public const int GL_INCR = ((int)0x1E02);
+        public const int GL_SAMPLE_BUFFERS_SGIS = ((int)0x80A8);
+        public const int GL_VARIANT_EXT = ((int)0x87C1);
+        public const int GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = ((int)0x8C76);
+        public const int GL_COMBINER2_NV = ((int)0x8552);
+        public const int GL_ACTIVE_UNIFORM_MAX_LENGTH = ((int)0x8B87);
+        public const int GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV = ((int)0x887A);
+        public const int GL_EQUIV = ((int)0x1509);
+        public const int GL_CURRENT_QUERY_ARB = ((int)0x8865);
+        public const int GL_READ_PIXEL_DATA_RANGE_NV = ((int)0x8879);
+        public const int GL_TEXTURE_COMPRESSED_IMAGE_SIZE = ((int)0x86A0);
+        public const int GL_422_REV_EXT = ((int)0x80CD);
+        public const int GL_MAX_TEXTURE_BUFFER_SIZE_ARB = ((int)0x8C2B);
+        public const int GL_SEPARATE_ATTRIBS = ((int)0x8C8D);
+        public const int GL_CLIP_NEAR_HINT_PGI = ((int)0x1A220);
+        public const int GL_VERTEX_ARRAY_TYPE_EXT = ((int)0x807B);
+        public const int GL_DOT3_RGBA_ARB = ((int)0x86AF);
+        public const int GL_CON_30_ATI = ((int)0x895F);
+        public const int GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT = ((int)0x8C8A);
+        public const int GL_UNSIGNED_INT_SAMPLER_1D_ARRAY = ((int)0x8DD6);
+        public const int GL_T2F_IUI_N3F_V3F_EXT = ((int)0x81B4);
+        public const int GL_OUTPUT_TEXTURE_COORD14_EXT = ((int)0x87AB);
+        public const int GL_COLOR3_BIT_PGI = ((int)0x00010000);
+        public const int GL_RENDERBUFFER_HEIGHT = ((int)0x8D43);
+        public const int GL_CURRENT_MATRIX_ARB = ((int)0x8641);
+        public const int GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB = ((int)0x862E);
+        public const int GL_UNSIGNED_INT_10_10_10_2 = ((int)0x8036);
+        public const int GL_DRAW_BUFFER11_ATI = ((int)0x8830);
+        public const int GL_COMBINER3_NV = ((int)0x8553);
+        public const int GL_ACTIVE_TEXTURE = ((int)0x84E0);
+        public const int GL_RGBA32UI = ((int)0x8D70);
+        public const int GL_TRUE = ((int)1);
+        public const int GL_COMBINE = ((int)0x8570);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT = ((int)0x8DA8);
+        public const int GL_MAX_ASYNC_HISTOGRAM_SGIX = ((int)0x832D);
+        public const int GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB = ((int)0x8895);
+        public const int GL_FRAGMENT_LIGHT5_SGIX = ((int)0x8411);
+        public const int GL_MODULATE_SUBTRACT_ATI = ((int)0x8746);
+        public const int GL_ALWAYS_FAST_HINT_PGI = ((int)0x1A20C);
+        public const int GL_TEXTURE_WRAP_R_EXT = ((int)0x8072);
+        public const int GL_OUTPUT_TEXTURE_COORD27_EXT = ((int)0x87B8);
+        public const int GL_UNSIGNED_INT_24_8_EXT = ((int)0x84FA);
+        public const int GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT = ((int)0x8DDF);
+        public const int GL_COMBINE_ALPHA = ((int)0x8572);
+        public const int GL_ALL_COMPLETED_NV = ((int)0x84F2);
+        public const int GL_CULL_VERTEX_EYE_POSITION_EXT = ((int)0x81AB);
+        public const int GL_RGBA_INTEGER_EXT = ((int)0x8D99);
+        public const int GL_T2F_V3F = ((int)0x2A27);
+        public const int GL_OUTPUT_TEXTURE_COORD22_EXT = ((int)0x87B3);
+        public const int GL_COMPRESSED_SIGNED_RED_RGTC1 = ((int)0x8DBC);
+        public const int GL_FLOAT_MAT2 = ((int)0x8B5A);
+        public const int GL_CULL_FRAGMENT_NV = ((int)0x86E7);
+        public const int GL_TEXTURE18_ARB = ((int)0x84D2);
+        public const int GL_2D = ((int)0x0600);
+        public const int GL_3D = ((int)0x0601);
+        public const int GL_EVAL_VERTEX_ATTRIB11_NV = ((int)0x86D1);
+        public const int GL_GREEN_MAX_CLAMP_INGR = ((int)0x8565);
+        public const int GL_SCALEBIAS_HINT_SGIX = ((int)0x8322);
+        public const int GL_INDEX_ARRAY_POINTER_EXT = ((int)0x8091);
+        public const int GL_OUTPUT_TEXTURE_COORD4_EXT = ((int)0x87A1);
+        public const int GL_OBJECT_BUFFER_USAGE_ATI = ((int)0x8765);
+        public const int GL_MAX_RENDERBUFFER_SIZE_EXT = ((int)0x84E8);
+        public const int GL_FRAMEBUFFER = ((int)0x8D40);
+        public const int GL_RASTERIZER_DISCARD_EXT = ((int)0x8C89);
+        public const int GL_POLYGON_TOKEN = ((int)0x0703);
+        public const int GL_CURRENT_SECONDARY_COLOR = ((int)0x8459);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER = ((int)0x8C8E);
+        public const int GL_VERTEX_WEIGHTING_EXT = ((int)0x8509);
+        public const int GL_OR_REVERSE = ((int)0x150B);
+        public const int GL_BLEND_DST_RGB_EXT = ((int)0x80C8);
+        public const int GL_GREEN_BIAS = ((int)0x0D19);
+        public const int GL_MODELVIEW8_ARB = ((int)0x8728);
+        public const int GL_SCALAR_EXT = ((int)0x87BE);
+        public const int GL_ADD_ATI = ((int)0x8963);
+        public const int GL_PROXY_TEXTURE_CUBE_MAP_EXT = ((int)0x851B);
+        public const int GL_BINORMAL_ARRAY_POINTER_EXT = ((int)0x8443);
+        public const int GL_EXP2 = ((int)0x0801);
+        public const int GL_DYNAMIC_COPY_ARB = ((int)0x88EA);
+        public const int GL_CURRENT_OCCLUSION_QUERY_ID_NV = ((int)0x8865);
+        public const int GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI = ((int)0x87F4);
+        public const int GL_PROXY_TEXTURE_1D_ARRAY = ((int)0x8C19);
+        public const int GL_LUMINANCE8UI_EXT = ((int)0x8D80);
+        public const int GL_PROGRAM_TARGET_NV = ((int)0x8646);
+        public const int GL_DT_BIAS_NV = ((int)0x8717);
+        public const int GL_STENCIL_INDEX1_EXT = ((int)0x8D46);
+        public const int GL_SELECTION_BUFFER_POINTER = ((int)0x0DF3);
+        public const int GL_GREEN_MIN_CLAMP_INGR = ((int)0x8561);
+        public const int GL_RGBA8I_EXT = ((int)0x8D8E);
+        public const int GL_COMBINER6_NV = ((int)0x8556);
+        public const int GL_FOG_COORD = ((int)GL_FOG_COORDINATE);
+        public const int GL_OBJECT_TYPE_ARB = ((int)0x8B4E);
+        public const int GL_POST_COLOR_MATRIX_GREEN_BIAS = ((int)0x80B9);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB = ((int)0x8DA7);
+        public const int GL_UNSIGNED_SHORT_4_4_4_4_REV = ((int)0x8365);
+        public const int GL_ELEMENT_ARRAY_BUFFER_ARB = ((int)0x8893);
+        public const int GL_COLOR_TABLE_WIDTH = ((int)0x80D9);
+        public const int GL_INDEX_ARRAY_STRIDE_EXT = ((int)0x8086);
+        public const int GL_CON_7_ATI = ((int)0x8948);
+        public const int GL_COMPRESSED_RGB = ((int)0x84ED);
+        public const int GL_MAP1_BINORMAL_EXT = ((int)0x8446);
+        public const int GL_RENDERBUFFER_WIDTH_EXT = ((int)0x8D42);
+        public const int GL_VERTEX_STREAM7_ATI = ((int)0x8773);
+        public const int GL_OPERAND0_RGB_ARB = ((int)0x8590);
+        public const int GL_ACCUM_ALPHA_BITS = ((int)0x0D5B);
+        public const int GL_TEXTURE_CUBE_MAP = ((int)0x8513);
+        public const int GL_MODULATE_ADD_ATI = ((int)0x8744);
+        public const int GL_MAP_TESSELLATION_NV = ((int)0x86C2);
+        public const int GL_MATRIX9_ARB = ((int)0x88C9);
+        public const int GL_COMBINER7_NV = ((int)0x8557);
+        public const int GL_POINT_SIZE_MAX = ((int)0x8127);
+        public const int GL_LUMINANCE4_ALPHA4 = ((int)0x8043);
+        public const int GL_COLOR_TABLE_SCALE = ((int)0x80D6);
+        public const int GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX = ((int)0x8174);
+        public const int GL_FENCE_APPLE = ((int)0x8A0B);
+        public const int GL_OBJECT_POINT_SGIS = ((int)0x81F5);
+        public const int GL_IUI_N3F_V2F_EXT = ((int)0x81AF);
+        public const int GL_FRAGMENT_LIGHT0_SGIX = ((int)0x840C);
+        public const int GL_RESCALE_NORMAL = ((int)0x803A);
+        public const int GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV = ((int)0x870D);
+        public const int GL_SWIZZLE_STR_ATI = ((int)0x8976);
+        public const int GL_TEXTURE16_ARB = ((int)0x84D0);
+        public const int GL_COMPRESSED_LUMINANCE = ((int)0x84EA);
+        public const int GL_DEPTH_ATTACHMENT_EXT = ((int)0x8D00);
+        public const int GL_X_EXT = ((int)0x87D5);
+        public const int GL_COMPRESSED_SLUMINANCE = ((int)0x8C4A);
+        public const int GL_WEIGHT_ARRAY_TYPE_ARB = ((int)0x86A9);
+        public const int GL_NORMAL_ARRAY_LIST_IBM = ((int)103071);
+        public const int GL_R16 = ((int)0x822A);
+        public const int GL_FLOAT_RGBA_MODE_NV = ((int)0x888E);
+        public const int GL_COLOR_WRITEMASK = ((int)0x0C23);
+        public const int GL_BACK_PRIMARY_COLOR_NV = ((int)0x8C77);
+        public const int GL_SCALE_BY_ONE_HALF_NV = ((int)0x8540);
+        public const int GL_OUTPUT_TEXTURE_COORD24_EXT = ((int)0x87B5);
+        public const int GL_OP_DOT4_EXT = ((int)0x8785);
+        public const int GL_REG_25_ATI = ((int)0x893A);
+        public const int GL_TEXTURE1_ARB = ((int)0x84C1);
+        public const int GL_TEXTURE_STACK_DEPTH = ((int)0x0BA5);
+        public const int GL_COLOR_ARRAY_TYPE = ((int)0x8082);
+        public const int GL_PACK_SKIP_ROWS = ((int)0x0D03);
+        public const int GL_MAX_PROGRAM_MATRICES_ARB = ((int)0x862F);
+        public const int GL_SIGNED_LUMINANCE_NV = ((int)0x8701);
+        public const int GL_TRACK_MATRIX_NV = ((int)0x8648);
+        public const int GL_GENERIC_ATTRIB_NV = ((int)0x8C7D);
+        public const int GL_CON_17_ATI = ((int)0x8952);
+        public const int GL_UNPACK_IMAGE_HEIGHT = ((int)0x806E);
+        public const int GL_GREEN = ((int)0x1904);
+        public const int GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV = ((int)0x8DA2);
+        public const int GL_DEPTH32F_STENCIL8 = ((int)0x8CAD);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = ((int)0x8CD7);
+        public const int GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP = ((int)0x8162);
+        public const int GL_PRIMITIVES_GENERATED = ((int)0x8C87);
+        public const int GL_ALPHA_MIN_SGIX = ((int)0x8320);
+        public const int GL_CURRENT_RASTER_POSITION_VALID = ((int)0x0B08);
+        public const int GL_REG_28_ATI = ((int)0x893D);
+        public const int GL_STENCIL_INDEX16 = ((int)0x8D49);
+        public const int GL_TEXTURE_UNSIGNED_REMAP_MODE_NV = ((int)0x888F);
+        public const int GL_CLIP_FAR_HINT_PGI = ((int)0x1A221);
+        public const int GL_MATRIX_PALETTE_ARB = ((int)0x8840);
+        public const int GL_SAMPLER_CUBE = ((int)0x8B60);
+        public const int GL_SIGNED_IDENTITY_NV = ((int)0x853C);
+        public const int GL_SELECTION_BUFFER_SIZE = ((int)0x0DF4);
+        public const int GL_POINT_SMOOTH = ((int)0x0B10);
+        public const int GL_TEXTURE_POST_SPECULAR_HP = ((int)0x8168);
+        public const int GL_COMBINER_COMPONENT_USAGE_NV = ((int)0x8544);
+        public const int GL_PROGRAM_PARAMETERS_ARB = ((int)0x88A8);
+        public const int GL_CURRENT_BINORMAL_EXT = ((int)0x843C);
+        public const int GL_TEXTURE6_ARB = ((int)0x84C6);
+        public const int GL_COLOR_TABLE_GREEN_SIZE_SGI = ((int)0x80DB);
+        public const int GL_RGB8I_EXT = ((int)0x8D8F);
+        public const int GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB = ((int)0x886A);
+        public const int GL_INTERLEAVED_ATTRIBS = ((int)0x8C8C);
+        public const int GL_COLOR_INDEX1_EXT = ((int)0x80E2);
+        public const int GL_HISTOGRAM_EXT = ((int)0x8024);
+        public const int GL_VERTEX_STREAM3_ATI = ((int)0x876F);
+        public const int GL_INDEX_TEST_FUNC_EXT = ((int)0x81B6);
+        public const int GL_IMAGE_MIN_FILTER_HP = ((int)0x815D);
+        public const int GL_UNSIGNED_SHORT_5_5_5_1 = ((int)0x8034);
+        public const int GL_COORD_REPLACE_ARB = ((int)0x8862);
+        public const int GL_SOURCE1_RGB = ((int)0x8581);
+        public const int GL_OPERAND1_RGB_EXT = ((int)0x8591);
+        public const int GL_TEXTURE_MAX_LOD = ((int)0x813B);
+        public const int GL_CONSTANT_COLOR = ((int)0x8001);
+        public const int GL_TEXTURE_MIN_FILTER = ((int)0x2801);
+        public const int GL_MAX_TEXTURE_SIZE = ((int)0x0D33);
+        public const int GL_AMBIENT = ((int)0x1200);
+        public const int GL_DEPTH_COMPONENT24_SGIX = ((int)0x81A6);
+        public const int GL_MAGNITUDE_SCALE_NV = ((int)0x8712);
+        public const int GL_TEXCOORD1_BIT_PGI = ((int)0x10000000);
+        public const int GL_CURRENT_MATRIX_INDEX_ARB = ((int)0x8845);
+        public const int GL_TEXTURE_4DSIZE_SGIS = ((int)0x8136);
+        public const int GL_PIXEL_MAP_B_TO_B_SIZE = ((int)0x0CB8);
+        public const int GL_BOOL_VEC4 = ((int)0x8B59);
+        public const int GL_CONSTANT_BORDER = ((int)0x8151);
+        public const int GL_UNSIGNED_BYTE_3_3_2_EXT = ((int)0x8032);
+        public const int GL_RESAMPLE_AVERAGE_OML = ((int)0x8988);
+        public const int GL_ASYNC_READ_PIXELS_SGIX = ((int)0x835E);
+        public const int GL_FLOAT_RGB32_NV = ((int)0x8889);
+        public const int GL_PIXEL_MAG_FILTER_EXT = ((int)0x8331);
+        public const int GL_REG_20_ATI = ((int)0x8935);
+        public const int GL_PERTURB_EXT = ((int)0x85AE);
+        public const int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV = ((int)0x8C80);
+        public const int GL_PREVIOUS_TEXTURE_INPUT_NV = ((int)0x86E4);
+        public const int GL_QUADRATIC_ATTENUATION = ((int)0x1209);
+        public const int GL_INVERTED_SCREEN_W_REND = ((int)0x8491);
+        public const int GL_RED_INTEGER = ((int)0x8D94);
+        public const int GL_RASTER_POSITION_UNCLIPPED_IBM = ((int)0x19262);
+        public const int GL_MATRIX6_ARB = ((int)0x88C6);
+        public const int GL_TEXTURE0 = ((int)0x84C0);
+        public const int GL_COLOR_TABLE_BIAS = ((int)0x80D7);
+        public const int GL_COLOR_ATTACHMENT10_EXT = ((int)0x8CEA);
+        public const int GL_PIXEL_MAP_I_TO_G = ((int)0x0C73);
+        public const int GL_CONVOLUTION_HEIGHT_EXT = ((int)0x8019);
+        public const int GL_VERTEX_STREAM1_ATI = ((int)0x876D);
+        public const int GL_TEXTURE_BINDING_RECTANGLE_NV = ((int)0x84F6);
+        public const int GL_COMPRESSED_RED_RGTC1 = ((int)0x8DBB);
+        public const int GL_SLUMINANCE_EXT = ((int)0x8C46);
+        public const int GL_MATRIX_MODE = ((int)0x0BA0);
+        public const int GL_INT_SAMPLER_2D_ARRAY_EXT = ((int)0x8DCF);
+        public const int GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX = ((int)0x818A);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = ((int)0x8CD4);
+        public const int GL_PROXY_HISTOGRAM_EXT = ((int)0x8025);
+        public const int GL_FLOAT_MAT3x4 = ((int)0x8B68);
+        public const int GL_MODELVIEW28_ARB = ((int)0x873C);
+        public const int GL_RGBA16F = ((int)0x881A);
+        public const int GL_FOG_BIT = ((int)0x00000080);
+        public const int GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB = ((int)0x880B);
+        public const int GL_RGBA32I_EXT = ((int)0x8D82);
+        public const int GL_ALPHA8_EXT = ((int)0x803C);
+        public const int GL_FOG_COORDINATE_ARRAY_TYPE = ((int)0x8454);
+        public const int GL_OP_EXP_BASE_2_EXT = ((int)0x8791);
+        public const int GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT = ((int)0x884E);
+        public const int GL_PIXEL_TILE_HEIGHT_SGIX = ((int)0x8141);
+        public const int GL_FULL_STIPPLE_HINT_PGI = ((int)0x1A219);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = ((int)0x8CD0);
+        public const int GL_MATRIX5_ARB = ((int)0x88C5);
+        public const int GL_SLUMINANCE8 = ((int)0x8C47);
+        public const int GL_GREATER = ((int)0x0204);
+        public const int GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV = ((int)0x8855);
+        public const int GL_COLOR_ARRAY_LIST_STRIDE_IBM = ((int)103082);
+        public const int GL_RETURN = ((int)0x0102);
+        public const int GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB = ((int)0x86A2);
+        public const int GL_MAX_EVAL_ORDER = ((int)0x0D30);
+        public const int GL_OPERAND0_RGB_EXT = ((int)0x8590);
+        public const int GL_STENCIL_TEST_TWO_SIDE_EXT = ((int)0x8910);
+        public const int GL_MAP2_VERTEX_ATTRIB9_4_NV = ((int)0x8679);
+        public const int GL_IGNORE_BORDER_HP = ((int)0x8150);
+        public const int GL_POINT_SIZE_MAX_EXT = ((int)0x8127);
+        public const int GL_TEXTURE_BASE_LEVEL_SGIS = ((int)0x813C);
+        public const int GL_SIGNED_LUMINANCE_ALPHA_NV = ((int)0x8703);
+        public const int GL_PROGRAM_ADDRESS_REGISTERS_ARB = ((int)0x88B0);
+        public const int GL_READ_PIXEL_DATA_RANGE_LENGTH_NV = ((int)0x887B);
+        public const int GL_UNSIGNED_INT_VEC4_EXT = ((int)0x8DC8);
+        public const int GL_PROGRAM_ALU_INSTRUCTIONS_ARB = ((int)0x8805);
+        public const int GL_TEXTURE_RESIDENT_EXT = ((int)0x8067);
+        public const int GL_BACK_NORMALS_HINT_PGI = ((int)0x1A223);
+        public const int GL_RG16 = ((int)0x822C);
+        public const int GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX = ((int)0x817B);
+        public const int GL_SAMPLER_2D_RECT_ARB = ((int)0x8B63);
+        public const int GL_INTENSITY12_EXT = ((int)0x804C);
+        public const int GL_LUMINANCE_ALPHA_FLOAT32_ATI = ((int)0x8819);
+        public const int GL_STREAM_DRAW = ((int)0x88E0);
+        public const int GL_STENCIL_INDEX = ((int)0x1901);
+        public const int GL_REG_30_ATI = ((int)0x893F);
+        public const int GL_DRAW_BUFFER8_ATI = ((int)0x882D);
+        public const int GL_FILTER4_SGIS = ((int)0x8146);
+        public const int GL_IUI_N3F_V3F_EXT = ((int)0x81B0);
+        public const int GL_MAP2_VERTEX_ATTRIB8_4_NV = ((int)0x8678);
+        public const int GL_DRAW_BUFFER3_ATI = ((int)0x8828);
+        public const int GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL = ((int)0x83F7);
+        public const int GL_TEXTURE19_ARB = ((int)0x84D3);
+        public const int GL_MULTISAMPLE_EXT = ((int)0x809D);
+        public const int GL_QUERY_COUNTER_BITS_ARB = ((int)0x8864);
+        public const int GL_MAX_3D_TEXTURE_SIZE = ((int)0x8073);
+        public const int GL_YCRCB_SGIX = ((int)0x8318);
+        public const int GL_TEXTURE_MAG_FILTER = ((int)0x2800);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = ((int)0x8212);
+        public const int GL_STRICT_DEPTHFUNC_HINT_PGI = ((int)0x1A216);
+        public const int GL_VERTEX_ARRAY_RANGE_LENGTH_NV = ((int)0x851E);
+        public const int GL_TRIANGLE_STRIP = ((int)0x0005);
+        public const int GL_TRANSPOSE_TEXTURE_MATRIX = ((int)0x84E5);
+        public const int GL_SAMPLES = ((int)0x80A9);
+        public const int GL_FOG_COORDINATE_EXT = ((int)0x8451);
+        public const int GL_NORMAL_MAP_ARB = ((int)0x8511);
+        public const int GL_MULTISAMPLE = ((int)0x809D);
+        public const int GL_PIXEL_CUBIC_WEIGHT_EXT = ((int)0x8333);
+        public const int GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB = ((int)0x889C);
+        public const int GL_SIGNED_INTENSITY8_NV = ((int)0x8708);
+        public const int GL_HISTOGRAM_WIDTH = ((int)0x8026);
+        public const int GL_Q = ((int)0x2003);
+        public const int GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB = ((int)0x8624);
+        public const int GL_ALPHA_MIN_CLAMP_INGR = ((int)0x8563);
+        public const int GL_COMPRESSED_SLUMINANCE_EXT = ((int)0x8C4A);
+        public const int GL_DRAW_BUFFER6_ATI = ((int)0x882B);
+        public const int GL_FOG_START = ((int)0x0B63);
+        public const int GL_SLUMINANCE8_EXT = ((int)0x8C47);
+        public const int GL_RASTERIZER_DISCARD = ((int)0x8C89);
+        public const int GL_SPRITE_OBJECT_ALIGNED_SGIX = ((int)0x814D);
+        public const int GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS = ((int)0x8354);
+        public const int GL_POST_COLOR_MATRIX_RED_BIAS_SGI = ((int)0x80B8);
+        public const int GL_PIXEL_MAP_A_TO_A_SIZE = ((int)0x0CB9);
+        public const int GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT = ((int)0x8DE1);
+        public const int GL_UNSIGNED_INT_8_8_8_8_REV = ((int)0x8367);
+        public const int GL_TEXTURE_4D_SGIS = ((int)0x8134);
+        public const int GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = ((int)0x8C4C);
+        public const int GL_COMPRESSED_RED_RGTC1_EXT = ((int)0x8DBB);
+        public const int GL_SAMPLER_CUBE_ARB = ((int)0x8B60);
+        public const int GL_MATRIX14_ARB = ((int)0x88CE);
+        public const int GL_DEPENDENT_RGB_TEXTURE_3D_NV = ((int)0x8859);
+        public const int GL_FEEDBACK_BUFFER_TYPE = ((int)0x0DF2);
+        public const int GL_UNSIGNED_INT_SAMPLER_1D = ((int)0x8DD1);
+        public const int GL_LUMINANCE_FLOAT16_ATI = ((int)0x881E);
+        public const int GL_FRAMEBUFFER_SRGB = ((int)0x8DB9);
+        public const int GL_TEXTURE_MAX_CLAMP_S_SGIX = ((int)0x8369);
+        public const int GL_GREEN_INTEGER = ((int)0x8D95);
+        public const int GL_ZERO_EXT = ((int)0x87DD);
+        public const int GL_BGRA_INTEGER = ((int)0x8D9B);
+        public const int GL_LINES_ADJACENCY_ARB = ((int)0x000A);
+        public const int GL_LINK_STATUS = ((int)0x8B82);
+        public const int GL_OBJECT_DELETE_STATUS_ARB = ((int)0x8B80);
+        public const int GL_VERTEX_ARRAY_BUFFER_BINDING = ((int)0x8896);
+        public const int GL_TEXTURE3_ARB = ((int)0x84C3);
+        public const int GL_READ_FRAMEBUFFER_BINDING_EXT = ((int)0x8CAA);
+        public const int GL_TEXTURE_COORD_ARRAY_SIZE_EXT = ((int)0x8088);
+        public const int GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT = ((int)0x8DE3);
+        public const int GL_RGBA_INTEGER = ((int)0x8D99);
+        public const int GL_CONVOLUTION_FILTER_BIAS_EXT = ((int)0x8015);
+        public const int GL_MODELVIEW_PROJECTION_NV = ((int)0x8629);
+        public const int GL_BLEND_EQUATION_ALPHA_EXT = ((int)0x883D);
+        public const int GL_VERTEX_ARRAY_BINDING_APPLE = ((int)0x85B5);
+        public const int GL_LIGHT_MODEL_COLOR_CONTROL = ((int)0x81F8);
+        public const int GL_POST_CONVOLUTION_COLOR_TABLE = ((int)0x80D1);
+        public const int GL_PACK_RESAMPLE_SGIX = ((int)0x842C);
+        public const int GL_MAP1_GRID_SEGMENTS = ((int)0x0DD1);
+        public const int GL_RGBA8UI_EXT = ((int)0x8D7C);
+        public const int GL_CON_26_ATI = ((int)0x895B);
+        public const int GL_TEXTURE_LUMINANCE_TYPE = ((int)0x8C14);
+        public const int GL_TEXTURE3 = ((int)0x84C3);
+        public const int GL_SUBTRACT_ARB = ((int)0x84E7);
+        public const int GL_R16F = ((int)0x822D);
+        public const int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = ((int)0x8C80);
+        public const int GL_POLYGON_OFFSET_LINE = ((int)0x2A02);
+        public const int GL_V2F = ((int)0x2A20);
+        public const int GL_CLIP_DISTANCE5 = ((int)GL_CLIP_PLANE5);
+        public const int GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE = ((int)0x851E);
+        public const int GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV = ((int)0x86F2);
+        public const int GL_SRC_ALPHA_SATURATE = ((int)0x0308);
+        public const int GL_TEXTURE_SHADER_NV = ((int)0x86DE);
+        public const int GL_MAP1_NORMAL = ((int)0x0D92);
+        public const int GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV = ((int)0x8853);
+        public const int GL_RENDERBUFFER_INTERNAL_FORMAT = ((int)0x8D44);
+        public const int GL_DRAW_FRAMEBUFFER_BINDING_EXT = ((int)GL_FRAMEBUFFER_BINDING_EXT);
+        public const int GL_PACK_RESAMPLE_OML = ((int)0x8984);
+        public const int GL_PRIMARY_COLOR = ((int)0x8577);
+        public const int GL_VERTEX_ARRAY_RANGE_APPLE = ((int)0x851D);
+        public const int GL_INDEX_CLEAR_VALUE = ((int)0x0C20);
+        public const int GL_PROXY_TEXTURE_COLOR_TABLE_SGI = ((int)0x80BD);
+        public const int GL_CLAMP = ((int)0x2900);
+        public const int GL_STENCIL_TAG_BITS_EXT = ((int)0x88F2);
+        public const int GL_MULTISAMPLE_BIT = ((int)0x20000000);
+        public const int GL_RGBA8_EXT = ((int)0x8058);
+        public const int GL_VERTEX_ARRAY_POINTER_EXT = ((int)0x808E);
+        public const int GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = ((int)0x8519);
+        public const int GL_DRAW_BUFFER13_ARB = ((int)0x8832);
+        public const int GL_SCALE_BY_TWO_NV = ((int)0x853E);
+        public const int GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = ((int)0x8517);
+        public const int GL_INVERSE_TRANSPOSE_NV = ((int)0x862D);
+        public const int GL_PIXEL_PACK_BUFFER_BINDING = ((int)0x88ED);
+        public const int GL_NORMAL_ARRAY_STRIDE = ((int)0x807F);
+        public const int GL_FOG_SCALE_VALUE_SGIX = ((int)0x81FD);
+        public const int GL_FRAGMENT_LIGHT1_SGIX = ((int)0x840D);
+        public const int GL_MAP_ATTRIB_U_ORDER_NV = ((int)0x86C3);
+        public const int GL_RGBA32I = ((int)0x8D82);
+        public const int GL_OFFSET_HILO_TEXTURE_2D_NV = ((int)0x8854);
+        public const int GL_Y_EXT = ((int)0x87D6);
+        public const int GL_T2F_IUI_V2F_EXT = ((int)0x81B1);
+        public const int GL_FRAGMENT_SHADER = ((int)0x8B30);
+        public const int GL_SRC1_ALPHA = ((int)GL_SOURCE1_ALPHA);
+        public const int GL_W_EXT = ((int)0x87D8);
+        public const int GL_FOG_COORDINATE_ARRAY_STRIDE = ((int)0x8455);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV = ((int)0x8C7F);
+        public const int GL_COMPARE_R_TO_TEXTURE = ((int)0x884E);
+        public const int GL_INDEX = ((int)0x8222);
+        public const int GL_TEXCOORD3_BIT_PGI = ((int)0x40000000);
+        public const int GL_SAMPLES_EXT = ((int)0x80A9);
+        public const int GL_FRAGMENT_PROGRAM_BINDING_NV = ((int)0x8873);
+        public const int GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT = ((int)0x8DD6);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT = ((int)0x8CD4);
+        public const int GL_LINE_SMOOTH_HINT = ((int)0x0C52);
+        public const int GL_VALIDATE_STATUS = ((int)0x8B83);
+        public const int GL_OP_DOT3_EXT = ((int)0x8784);
+        public const int GL_PIXEL_MAP_I_TO_I = ((int)0x0C70);
+        public const int GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX = ((int)0x8402);
+        public const int GL_SAMPLE_COVERAGE_INVERT_ARB = ((int)0x80AB);
+        public const int GL_DEPTH_PASS_INSTRUMENT_SGIX = ((int)0x8310);
+        public const int GL_MODELVIEW3_ARB = ((int)0x8723);
+        public const int GL_DRAW_BUFFER1 = ((int)0x8826);
+        public const int GL_INVERT = ((int)0x150A);
+        public const int GL_TEXTURE_BORDER_VALUES_NV = ((int)0x871A);
+        public const int GL_CURRENT_RASTER_DISTANCE = ((int)0x0B09);
+        public const int GL_SIGNED_RGB_UNSIGNED_ALPHA_NV = ((int)0x870C);
+        public const int GL_ALWAYS = ((int)0x0207);
+        public const int GL_HISTOGRAM_FORMAT_EXT = ((int)0x8027);
+        public const int GL_COLOR_ARRAY_SIZE_EXT = ((int)0x8081);
+        public const int GL_VERTEX_ATTRIB_ARRAY5_NV = ((int)0x8655);
+        public const int GL_STENCIL_WRITEMASK = ((int)0x0B98);
+        public const int GL_OR = ((int)0x1507);
+        public const int GL_SAMPLER_CUBE_SHADOW = ((int)0x8DC5);
+        public const int GL_RED_BIT_ATI = ((int)0x00000001);
+        public const int GL_REFLECTION_MAP_ARB = ((int)0x8512);
+        public const int GL_INT_SAMPLER_BUFFER_EXT = ((int)0x8DD0);
+        public const int GL_PROGRAM_INSTRUCTIONS_ARB = ((int)0x88A0);
+        public const int GL_4PASS_3_SGIS = ((int)0x80A7);
+        public const int GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB = ((int)0x86A0);
+        public const int GL_COLOR_INDEX4_EXT = ((int)0x80E4);
+        public const int GL_DISCARD_ATI = ((int)0x8763);
+        public const int GL_FUNC_SUBTRACT = ((int)0x800A);
+        public const int GL_TEXTURE_CUBE_MAP_EXT = ((int)0x8513);
+        public const int GL_TEXTURE_ALPHA_TYPE_ARB = ((int)0x8C13);
+        public const int GL_PIXEL_MAP_I_TO_B_SIZE = ((int)0x0CB4);
+        public const int GL_PIXEL_GROUP_COLOR_SGIS = ((int)0x8356);
+        public const int GL_MAX_MODELVIEW_STACK_DEPTH = ((int)0x0D36);
+        public const int GL_OUTPUT_COLOR0_EXT = ((int)0x879B);
+        public const int GL_SINGLE_COLOR_EXT = ((int)0x81F9);
+        public const int GL_STENCIL_INDEX1 = ((int)0x8D46);
+        public const int GL_POINT_FADE_THRESHOLD_SIZE_EXT = ((int)0x8128);
+        public const int GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = ((int)0x851A);
+        public const int GL_TEXTURE_CUBE_MAP_NEGATIVE_X = ((int)0x8516);
+        public const int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = ((int)0x8518);
+        public const int GL_PRESENT_DURATION_NV = ((int)0x8E2B);
+        public const int GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT = ((int)0x851C);
+        public const int GL_SAMPLE_MASK_VALUE_EXT = ((int)0x80AA);
+        public const int GL_DEPTH_COMPONENT = ((int)0x1902);
+        public const int GL_MAX_VARYING_COMPONENTS = ((int)GL_MAX_VARYING_FLOATS);
+        public const int GL_MATRIX2_NV = ((int)0x8632);
+        public const int GL_PIXEL_COUNTER_BITS_NV = ((int)0x8864);
+        public const int GL_OPERAND2_RGB_EXT = ((int)0x8592);
+        public const int GL_TANGENT_ARRAY_TYPE_EXT = ((int)0x843E);
+        public const int GL_SLUMINANCE8_ALPHA8 = ((int)0x8C45);
+        public const int GL_LUMINANCE_ALPHA = ((int)0x190A);
+        public const int GL_MAX_PROGRAM_TEMPORARIES_ARB = ((int)0x88A5);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV = ((int)0x8C85);
+        public const int GL_MULTISAMPLE_COVERAGE_MODES_NV = ((int)0x8E12);
+        public const int GL_SECONDARY_COLOR_ARRAY_TYPE_EXT = ((int)0x845B);
+        public const int GL_TEXTURE_WRAP_S = ((int)0x2802);
+        public const int GL_STENCIL_PASS_DEPTH_PASS = ((int)0x0B96);
+        public const int GL_MAP1_VERTEX_ATTRIB11_4_NV = ((int)0x866B);
+        public const int GL_POINT_SIZE_MAX_SGIS = ((int)0x8127);
+        public const int GL_CLIP_PLANE0 = ((int)0x3000);
+        public const int GL_COORD_REPLACE = ((int)0x8862);
+        public const int GL_DEPTH_COMPONENT16_ARB = ((int)0x81A5);
+        public const int GL_EYE_PLANE = ((int)0x2502);
+        public const int GL_MATRIX7_ARB = ((int)0x88C7);
+        public const int GL_PROXY_TEXTURE_CUBE_MAP_ARB = ((int)0x851B);
+        public const int GL_PROXY_TEXTURE_1D = ((int)0x8063);
+        public const int GL_PROXY_TEXTURE_2D = ((int)0x8064);
+        public const int GL_PROXY_TEXTURE_3D = ((int)0x8070);
+        public const int GL_4PASS_3_EXT = ((int)0x80A7);
+        public const int GL_COLOR_ATTACHMENT6_EXT = ((int)0x8CE6);
+        public const int GL_FRAGMENT_LIGHTING_SGIX = ((int)0x8400);
+        public const int GL_STENCIL_BACK_VALUE_MASK = ((int)0x8CA4);
+        public const int GL_TEXTURE2_ARB = ((int)0x84C2);
+        public const int GL_SHADER_TYPE = ((int)0x8B4F);
+        public const int GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = ((int)0x8808);
+        public const int GL_DELETE_STATUS = ((int)0x8B80);
+        public const int GL_CURRENT_ATTRIB_NV = ((int)0x8626);
+        public const int GL_ATTRIB_ARRAY_SIZE_NV = ((int)0x8623);
+        public const int GL_SHADOW_ATTENUATION_EXT = ((int)0x834E);
+        public const int GL_MAX_ACTIVE_LIGHTS_SGIX = ((int)0x8405);
+        public const int GL_LUMINANCE8_ALPHA8 = ((int)0x8045);
+        public const int GL_COMBINE_RGB_ARB = ((int)0x8571);
+        public const int GL_PRIMITIVES_GENERATED_NV = ((int)0x8C87);
+        public const int GL_TEXTURE_BLUE_TYPE_ARB = ((int)0x8C12);
+        public const int GL_SAMPLER_2D = ((int)0x8B5E);
+        public const int GL_SAMPLER_3D = ((int)0x8B5F);
+        public const int GL_COLOR_MATERIAL_PARAMETER = ((int)0x0B56);
+        public const int GL_SAMPLER_1D = ((int)0x8B5D);
+        public const int GL_UNPACK_LSB_FIRST = ((int)0x0CF1);
+        public const int GL_UNSIGNED_INT_10_10_10_2_EXT = ((int)0x8036);
+        public const int GL_PROXY_TEXTURE_1D_ARRAY_EXT = ((int)0x8C19);
+        public const int GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI = ((int)0x80D2);
+        public const int GL_TEXTURE_MIN_LOD_SGIS = ((int)0x813A);
+        public const int GL_SPARE1_NV = ((int)0x852F);
+        public const int GL_BLEND_EQUATION_RGB = ((int)GL_BLEND_EQUATION);
+        public const int GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV = ((int)0x8856);
+        public const int GL_MATERIAL_SIDE_HINT_PGI = ((int)0x1A22C);
+        public const int GL_COLOR_MATRIX_SGI = ((int)0x80B1);
+        public const int GL_STENCIL_CLEAR_VALUE = ((int)0x0B91);
+        public const int GL_RGB_SCALE_EXT = ((int)0x8573);
+        public const int GL_PROGRAM_STRING_ARB = ((int)0x8628);
+        public const int GL_FLOAT_R_NV = ((int)0x8880);
+        public const int GL_REGISTER_COMBINERS_NV = ((int)0x8522);
+        public const int GL_VERTEX_ARRAY_EXT = ((int)0x8074);
+        public const int GL_TEXTURE_BLUE_TYPE = ((int)0x8C12);
+        public const int GL_DRAW_BUFFER10_ATI = ((int)0x882F);
+        public const int GL_LIGHT3 = ((int)0x4003);
+        public const int GL_RENDERBUFFER_SAMPLES_EXT = ((int)0x8CAB);
+        public const int GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB = ((int)0x8DDD);
+        public const int GL_MAX_VERTEX_VARYING_COMPONENTS_EXT = ((int)0x8DDE);
+        public const int GL_REG_4_ATI = ((int)0x8925);
+        public const int GL_READ_WRITE_ARB = ((int)0x88BA);
+        public const int GL_COMPRESSED_SLUMINANCE_ALPHA = ((int)0x8C4B);
+        public const int GL_SAMPLES_SGIS = ((int)0x80A9);
+        public const int GL_FRAGMENT_LIGHT4_SGIX = ((int)0x8410);
+        public const int GL_DEPTH_STENCIL = ((int)0x84F9);
+        public const int GL_VERTEX_ARRAY_TYPE = ((int)0x807B);
+        public const int GL_LUMINANCE16UI_EXT = ((int)0x8D7A);
+        public const int GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB = ((int)0x8C2D);
+        public const int GL_EXTENSIONS = ((int)0x1F03);
+        public const int GL_PROXY_HISTOGRAM = ((int)0x8025);
+        public const int GL_COLOR_INDEX16_EXT = ((int)0x80E7);
+        public const int GL_OPERAND1_ALPHA = ((int)0x8599);
+        public const int GL_TEXTURE_1D_ARRAY = ((int)0x8C18);
+        public const int GL_FRONT_AND_BACK = ((int)0x0408);
+        public const int GL_MATRIX6_NV = ((int)0x8636);
+        public const int GL_SRC1_RGB = ((int)GL_SOURCE1_RGB);
+        public const int GL_RENDERBUFFER_BINDING = ((int)0x8CA7);
+        public const int GL_RENDERBUFFER_GREEN_SIZE = ((int)0x8D51);
+        public const int GL_UNSIGNED_INT_24_8 = ((int)0x84FA);
+        public const int GL_VERTEX_ATTRIB_ARRAY3_NV = ((int)0x8653);
+        public const int GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE = ((int)0x80D5);
+        public const int GL_POST_CONVOLUTION_BLUE_SCALE_EXT = ((int)0x801E);
+        public const int GL_LIGHT_MODEL_COLOR_CONTROL_EXT = ((int)0x81F8);
+        public const int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = ((int)0x83F0);
+        public const int GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB = ((int)0x8625);
+        public const int GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB = ((int)0x8B87);
+        public const int GL_RENDERBUFFER_COLOR_SAMPLES_NV = ((int)0x8E10);
+        public const int GL_TRANSPOSE_PROJECTION_MATRIX_ARB = ((int)0x84E4);
+        public const int GL_COMPILE_STATUS = ((int)0x8B81);
+        public const int GL_MAX_TEXTURE_LOD_BIAS = ((int)0x84FD);
+        public const int GL_MATRIX2_ARB = ((int)0x88C2);
+        public const int GL_TEXTURE_COLOR_TABLE_SGI = ((int)0x80BC);
+        public const int GL_COLOR_ATTACHMENT13 = ((int)0x8CED);
+        public const int GL_DYNAMIC_READ = ((int)0x88E9);
+        public const int GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV = ((int)0x8DA1);
+        public const int GL_OP_POWER_EXT = ((int)0x8793);
+        public const int GL_PROGRAM_RESIDENT_NV = ((int)0x8647);
+        public const int GL_STENCIL_VALUE_MASK = ((int)0x0B93);
+        public const int GL_VERTEX_SHADER_EXT = ((int)0x8780);
+        public const int GL_POINT_FADE_THRESHOLD_SIZE = ((int)0x8128);
+        public const int GL_DEPTH_COMPONENT16 = ((int)0x81A5);
+        public const int GL_COLOR_SUM = ((int)0x8458);
+        public const int GL_CONVOLUTION_FILTER_BIAS = ((int)0x8015);
+        public const int GL_TEXTURE_LOD_BIAS_EXT = ((int)0x8501);
+        public const int GL_HISTOGRAM_BLUE_SIZE = ((int)0x802A);
+        public const int GL_WRAP_BORDER_SUN = ((int)0x81D4);
+        public const int GL_DUAL_INTENSITY12_SGIS = ((int)0x811A);
+        public const int GL_ORDER = ((int)0x0A01);
+        public const int GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV = ((int)0x8DA5);
+        public const int GL_MAX_PROGRAM_INSTRUCTIONS_ARB = ((int)0x88A1);
+        public const int GL_RGB_FLOAT32_ATI = ((int)0x8815);
+        public const int GL_MODELVIEW17_ARB = ((int)0x8731);
+        public const int GL_OUTPUT_TEXTURE_COORD0_EXT = ((int)0x879D);
+        public const int GL_OPERAND2_ALPHA_EXT = ((int)0x859A);
+        public const int GL_SRGB = ((int)0x8C40);
+        public const int GL_MAT_AMBIENT_BIT_PGI = ((int)0x00100000);
+        public const int GL_MATRIX18_ARB = ((int)0x88D2);
+        public const int GL_REG_11_ATI = ((int)0x892C);
+        public const int GL_COLOR_ARRAY_POINTER_EXT = ((int)0x8090);
+        public const int GL_TEXTURE_MAX_CLAMP_R_SGIX = ((int)0x836B);
+        public const int GL_TRANSPOSE_COLOR_MATRIX_ARB = ((int)0x84E6);
+        public const int GL_MATRIX0_NV = ((int)0x8630);
+        public const int GL_MIN_EXT = ((int)0x8007);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT = ((int)0x8CD7);
+        public const int GL_POLYGON_BIT = ((int)0x00000008);
+        public const int GL_NOTEQUAL = ((int)0x0205);
+        public const int GL_MAX_SAMPLES_EXT = ((int)0x8D57);
+        public const int GL_POINT_SIZE_RANGE = ((int)0x0B12);
+        public const int GL_LINEAR_SHARPEN_ALPHA_SGIS = ((int)0x80AE);
+        public const int GL_OP_RECIP_EXT = ((int)0x8794);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_MODE = ((int)0x8C7F);
+        public const int GL_DOT3_ATI = ((int)0x8966);
+        public const int GL_TRANSPOSE_TEXTURE_MATRIX_ARB = ((int)0x84E5);
+        public const int GL_CND_ATI = ((int)0x896A);
+        public const int GL_TABLE_TOO_LARGE_EXT = ((int)0x8031);
+        public const int GL_MAP1_VERTEX_ATTRIB9_4_NV = ((int)0x8669);
+        public const int GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING = ((int)0x889D);
+        public const int GL_TEXTURE_BINDING_BUFFER_EXT = ((int)0x8C2C);
+        public const int GL_OBJECT_DISTANCE_TO_LINE_SGIS = ((int)0x81F3);
+        public const int GL_PROGRAM_ERROR_STRING_NV = ((int)0x8874);
+        public const int GL_FRAMEBUFFER_SRGB_CAPABLE_EXT = ((int)0x8DBA);
+        public const int GL_MATRIX12_ARB = ((int)0x88CC);
+        public const int GL_INT_SAMPLER_CUBE = ((int)0x8DCC);
+        public const int GL_COMPRESSED_RED_GREEN_RGTC2_EXT = ((int)0x8DBD);
+        public const int GL_IMAGE_ROTATE_ORIGIN_Y_HP = ((int)0x815B);
+        public const int GL_R1UI_T2F_C4F_N3F_V3F_SUN = ((int)0x85CB);
+        public const int GL_TEXTURE5 = ((int)0x84C5);
+        public const int GL_SAMPLER_1D_SHADOW = ((int)0x8B61);
+        public const int GL_POST_COLOR_MATRIX_ALPHA_BIAS = ((int)0x80BB);
+        public const int GL_RENDERBUFFER_STENCIL_SIZE_EXT = ((int)0x8D55);
+        public const int GL_PIXEL_TRANSFORM_2D_MATRIX_EXT = ((int)0x8338);
+        public const int GL_SHADER_SOURCE_LENGTH = ((int)0x8B88);
+        public const int GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV = ((int)0x8E11);
+        public const int GL_STENCIL_BACK_FAIL_ATI = ((int)0x8801);
+        public const int GL_MAP2_GRID_DOMAIN = ((int)0x0DD2);
+        public const int GL_CLAMP_READ_COLOR = ((int)0x891C);
+        public const int GL_ELEMENT_ARRAY_POINTER_APPLE = ((int)0x876A);
+        public const int GL_SECONDARY_COLOR_ARRAY_SIZE_EXT = ((int)0x845A);
+        public const int GL_RG_INTEGER = ((int)0x8228);
+        public const int GL_MAX_TEXTURE_IMAGE_UNITS = ((int)0x8872);
+        public const int GL_EVAL_VERTEX_ATTRIB12_NV = ((int)0x86D2);
+        public const int GL_PACK_SKIP_PIXELS = ((int)0x0D04);
+        public const int GL_VIEWPORT_BIT = ((int)0x00000800);
+        public const int GL_DEPTH_BUFFER = ((int)0x8223);
+        public const int GL_COPY_INVERTED = ((int)0x150C);
+        public const int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = ((int)0x8C4D);
+        public const int GL_MATRIX1_NV = ((int)0x8631);
+        public const int GL_TEXTURE_CUBE_MAP_POSITIVE_X = ((int)0x8515);
+        public const int GL_CONSTANT = ((int)0x8576);
+        public const int GL_TEXTURE_CUBE_MAP_POSITIVE_Z = ((int)0x8519);
+        public const int GL_LOCAL_EXT = ((int)0x87C4);
+        public const int GL_RGB10_A2_EXT = ((int)0x8059);
+        public const int GL_OUTPUT_COLOR1_EXT = ((int)0x879C);
+        public const int GL_STENCIL_INDEX8 = ((int)0x8D48);
+        public const int GL_SRGB_ALPHA = ((int)0x8C42);
+        public const int GL_FOG_COORDINATE_ARRAY_STRIDE_EXT = ((int)0x8455);
+        public const int GL_INVERSE_NV = ((int)0x862B);
+        public const int GL_SMOOTH_POINT_SIZE_RANGE = ((int)0x0B12);
+        public const int GL_UNSIGNED_BYTE_2_3_3_REV = ((int)0x8362);
+        public const int GL_SPARE0_PLUS_SECONDARY_COLOR_NV = ((int)0x8532);
+        public const int GL_CULL_MODES_NV = ((int)0x86E0);
+        public const int GL_MAX_PROGRAM_OUTPUT_VERTICES_NV = ((int)0x8C27);
+        public const int GL_OBJECT_LINE_SGIS = ((int)0x81F7);
+        public const int GL_POST_COLOR_MATRIX_RED_SCALE = ((int)0x80B4);
+        public const int GL_TEXTURE_3D_EXT = ((int)0x806F);
+        public const int GL_TEXTURE_COORD_ARRAY_STRIDE_EXT = ((int)0x808A);
+        public const int GL_LIGHT2 = ((int)0x4002);
+        public const int GL_QUAD_INTENSITY4_SGIS = ((int)0x8122);
+        public const int GL_TEXTURE_FILTER4_SIZE_SGIS = ((int)0x8147);
+        public const int GL_REG_14_ATI = ((int)0x892F);
+        public const int GL_FLOAT_MAT4x2 = ((int)0x8B69);
+        public const int GL_SAMPLE_BUFFERS = ((int)0x80A8);
+        public const int GL_WEIGHT_ARRAY_POINTER_ARB = ((int)0x86AC);
+        public const int GL_ATTENUATION_EXT = ((int)0x834D);
+        public const int GL_R8I = ((int)0x8231);
+        public const int GL_DRAW_BUFFER0_ARB = ((int)0x8825);
+        public const int GL_SPRITE_TRANSLATION_SGIX = ((int)0x814B);
+        public const int GL_TEXTURE_FLOAT_COMPONENTS_NV = ((int)0x888C);
+        public const int GL_PRIMARY_COLOR_EXT = ((int)0x8577);
+        public const int GL_IMAGE_ROTATE_ORIGIN_X_HP = ((int)0x815A);
+        public const int GL_TEXTURE_BIT = ((int)0x00040000);
+        public const int GL_UNPACK_SKIP_ROWS = ((int)0x0CF3);
+        public const int GL_DST_ALPHA = ((int)0x0304);
+        public const int GL_SRGB8_EXT = ((int)0x8C41);
+        public const int GL_UNSIGNED_SHORT_5_6_5_EXT = ((int)0x8363);
+        public const int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT = ((int)0x8518);
+        public const int GL_TEXTURE_CLIPMAP_FRAME_SGIX = ((int)0x8172);
+        public const int GL_NAND = ((int)0x150E);
+        public const int GL_CURRENT_WEIGHT_ARB = ((int)0x86A8);
+        public const int GL_ACTIVE_VERTEX_UNITS_ARB = ((int)0x86A5);
+        public const int GL_FENCE_STATUS_NV = ((int)0x84F3);
+        public const int GL_MULTISAMPLE_FILTER_HINT_NV = ((int)0x8534);
+        public const int GL_CURRENT_INDEX = ((int)0x0B01);
+        public const int GL_HISTOGRAM_RED_SIZE_EXT = ((int)0x8028);
+        public const int GL_DOUBLEBUFFER = ((int)0x0C32);
+        public const int GL_PROGRAM_ERROR_POSITION_NV = ((int)0x864B);
+        public const int GL_FLOAT_RGB_NV = ((int)0x8882);
+        public const int GL_CULL_VERTEX_EXT = ((int)0x81AA);
+        public const int GL_MATRIX3_NV = ((int)0x8633);
+        public const int GL_PREVIOUS_EXT = ((int)0x8578);
+        public const int GL_TEXTURE14 = ((int)0x84CE);
+        public const int GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI = ((int)0x80D5);
+        public const int GL_MAX_VERTEX_STREAMS_ATI = ((int)0x876B);
+        public const int GL_PIXEL_UNPACK_BUFFER_EXT = ((int)0x88EC);
+        public const int GL_OP_CROSS_PRODUCT_EXT = ((int)0x8797);
+        public const int GL_RGB10_A2 = ((int)0x8059);
+        public const int GL_TEXTURE22_ARB = ((int)0x84D6);
+        public const int GL_CONSERVE_MEMORY_HINT_PGI = ((int)0x1A1FD);
+        public const int GL_INTENSITY_EXT = ((int)0x8049);
+        public const int GL_GEOMETRY_SHADER_ARB = ((int)0x8DD9);
+        public const int GL_RESAMPLE_DECIMATE_SGIX = ((int)0x8430);
+        public const int GL_ASYNC_MARKER_SGIX = ((int)0x8329);
+        public const int GL_EMISSION = ((int)0x1600);
+        public const int GL_FRAMEZOOM_SGIX = ((int)0x818B);
+        public const int GL_TEXTURE9 = ((int)0x84C9);
+        public const int GL_OBJECT_SHADER_SOURCE_LENGTH_ARB = ((int)0x8B88);
+        public const int GL_DEPTH_WRITEMASK = ((int)0x0B72);
+        public const int GL_UNSIGNED_SHORT_5_6_5_REV = ((int)0x8364);
+        public const int GL_CON_25_ATI = ((int)0x895A);
+        public const int GL_STENCIL_ATTACHMENT = ((int)0x8D20);
+        public const int GL_COPY = ((int)0x1503);
+        public const int GL_DUAL_INTENSITY16_SGIS = ((int)0x811B);
+        public const int GL_MAGNITUDE_BIAS_NV = ((int)0x8718);
+        public const int GL_ACTIVE_ATTRIBUTES = ((int)0x8B89);
+        public const int GL_COLOR_ATTACHMENT11 = ((int)0x8CEB);
+        public const int GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM = ((int)103084);
+        public const int GL_MAX_DRAW_BUFFERS_ARB = ((int)0x8824);
+        public const int GL_REG_15_ATI = ((int)0x8930);
+        public const int GL_PACK_ROW_LENGTH = ((int)0x0D02);
+        public const int GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS = ((int)0x809C);
+        public const int GL_CON_20_ATI = ((int)0x8955);
+        public const int GL_NUM_PASSES_ATI = ((int)0x8970);
+        public const int GL_FRAME_NV = ((int)0x8E26);
+        public const int GL_MAT_SPECULAR_BIT_PGI = ((int)0x04000000);
+        public const int GL_MAX_DEFORMATION_ORDER_SGIX = ((int)0x8197);
+        public const int GL_MATRIX5_NV = ((int)0x8635);
+        public const int GL_MAX_PALETTE_MATRICES_ARB = ((int)0x8842);
+        public const int GL_EXP = ((int)0x0800);
+        public const int GL_EMBOSS_CONSTANT_NV = ((int)0x855E);
+        public const int GL_COMBINER_AB_DOT_PRODUCT_NV = ((int)0x8545);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = ((int)0x8CDB);
+        public const int GL_NEAREST_CLIPMAP_LINEAR_SGIX = ((int)0x844E);
+        public const int GL_TEXTURE_PRIORITY_EXT = ((int)0x8066);
+        public const int GL_STREAM_READ = ((int)0x88E1);
+        public const int GL_TEXTURE_COMPARE_FUNC_ARB = ((int)0x884D);
+        public const int GL_PROGRAM_POINT_SIZE_ARB = ((int)0x8642);
+        public const int GL_INSTRUMENT_BUFFER_POINTER_SGIX = ((int)0x8180);
+        public const int GL_TRANSPOSE_PROJECTION_MATRIX = ((int)0x84E4);
+        public const int GL_VERTEX_STREAM2_ATI = ((int)0x876E);
+        public const int GL_BUFFER_MAP_POINTER = ((int)0x88BD);
+        public const int GL_MULTISAMPLE_BIT_3DFX = ((int)0x20000000);
+        public const int GL_DRAW_BUFFER0 = ((int)0x8825);
+        public const int GL_FRAGMENT_LIGHT6_SGIX = ((int)0x8412);
+        public const int GL_MAX_FRAGMENT_LIGHTS_SGIX = ((int)0x8404);
+        public const int GL_OPERAND0_ALPHA_ARB = ((int)0x8598);
+        public const int GL_TEXTURE_2D_STACK_BINDING_MESAX = ((int)0x875E);
+        public const int GL_R8UI = ((int)0x8232);
+        public const int GL_MATRIX16_ARB = ((int)0x88D0);
+        public const int GL_SAMPLE_MASK_INVERT_SGIS = ((int)0x80AB);
+        public const int GL_UNSIGNED_INT_SAMPLER_3D_EXT = ((int)0x8DD3);
+        public const int GL_COLOR_MATRIX_STACK_DEPTH = ((int)0x80B2);
+        public const int GL_EMBOSS_LIGHT_NV = ((int)0x855D);
+        public const int GL_COLOR_TABLE_LUMINANCE_SIZE = ((int)0x80DE);
+        public const int GL_DOMAIN = ((int)0x0A02);
+        public const int GL_VECTOR_EXT = ((int)0x87BF);
+        public const int GL_EVAL_VERTEX_ATTRIB10_NV = ((int)0x86D0);
+        public const int GL_POINT_SIZE_MIN_EXT = ((int)0x8126);
+        public const int GL_CCW = ((int)0x0901);
+        public const int GL_INT_VEC2 = ((int)0x8B53);
+        public const int GL_UNIFORM_BUFFER_EXT = ((int)0x8DEE);
+        public const int GL_C4F_N3F_V3F = ((int)0x2A26);
+        public const int GL_ZOOM_X = ((int)0x0D16);
+        public const int GL_AMBIENT_AND_DIFFUSE = ((int)0x1602);
+        public const int GL_MATRIX_INDEX_ARRAY_TYPE_ARB = ((int)0x8847);
+        public const int GL_OUTPUT_TEXTURE_COORD5_EXT = ((int)0x87A2);
+        public const int GL_MAX_ELEMENTS_VERTICES_EXT = ((int)0x80E8);
+        public const int GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT = ((int)0x8DD7);
+        public const int GL_TEXTURE_COORD_ARRAY_COUNT_EXT = ((int)0x808B);
+        public const int GL_RGB_SCALE = ((int)0x8573);
+        public const int GL_IUI_V3F_EXT = ((int)0x81AE);
+        public const int GL_CONVOLUTION_BORDER_MODE_EXT = ((int)0x8013);
+        public const int GL_VARIANT_ARRAY_EXT = ((int)0x87E8);
+        public const int GL_POST_TEXTURE_FILTER_BIAS_SGIX = ((int)0x8179);
+        public const int GL_MATRIX7_NV = ((int)0x8637);
+        public const int GL_MAP2_TANGENT_EXT = ((int)0x8445);
+        public const int GL_SRC_ALPHA = ((int)0x0302);
+        public const int GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL = ((int)0x83F5);
+        public const int GL_FRAGMENT_NORMAL_EXT = ((int)0x834A);
+        public const int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB = ((int)0x889F);
+        public const int GL_NUM_INSTRUCTIONS_PER_PASS_ATI = ((int)0x8971);
+        public const int GL_RENDERBUFFER_COVERAGE_SAMPLES_NV = ((int)0x8CAB);
+        public const int GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM = ((int)103086);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = ((int)0x8CD6);
+        public const int GL_PROGRAM_LENGTH_ARB = ((int)0x8627);
+        public const int GL_CON_29_ATI = ((int)0x895E);
+        public const int GL_SAMPLER_2D_ARRAY_EXT = ((int)0x8DC1);
+        public const int GL_LUMINANCE8 = ((int)0x8040);
+        public const int GL_TRANSFORM_FEEDBACK_VARYINGS_NV = ((int)0x8C83);
+        public const int GL_PIXEL_MAP_G_TO_G_SIZE = ((int)0x0CB7);
+        public const int GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI = ((int)0x87F7);
+        public const int GL_T2F_IUI_V3F_EXT = ((int)0x81B2);
+        public const int GL_FRAMEBUFFER_UNSUPPORTED_EXT = ((int)0x8CDD);
+        public const int GL_COMPRESSED_RGBA_FXT1_3DFX = ((int)0x86B1);
+        public const int GL_PIXEL_TEX_GEN_Q_ROUND_SGIX = ((int)0x8185);
+        public const int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT = ((int)0x8C80);
+        public const int GL_OP_SUB_EXT = ((int)0x8796);
+        public const int GL_SAMPLER_CUBE_SHADOW_EXT = ((int)0x8DC5);
+        public const int GL_MATRIX4_NV = ((int)0x8634);
+        public const int GL_OP_ADD_EXT = ((int)0x8787);
+        public const int GL_DEPTH_TEST = ((int)0x0B71);
+        public const int GL_UNSIGNED_INVERT_NV = ((int)0x8537);
+        public const int GL_DRAW_BUFFER = ((int)0x0C01);
+        public const int GL_VERTEX_ID_NV = ((int)0x8C7B);
+        public const int GL_RGBA16 = ((int)0x805B);
+        public const int GL_ALPHA8UI_EXT = ((int)0x8D7E);
+        public const int GL_BLEND_DST = ((int)0x0BE0);
+        public const int GL_UNSIGNED_SHORT_8_8_MESA = ((int)0x85BA);
+        public const int GL_VERTEX_SHADER_INVARIANTS_EXT = ((int)0x87D1);
+        public const int GL_FALSE = ((int)0);
+        public const int GL_LIGHTING = ((int)0x0B50);
+        public const int GL_EDGE_FLAG = ((int)0x0B43);
+        public const int GL_CON_6_ATI = ((int)0x8947);
+        public const int GL_VERTEX_PROGRAM_POINT_SIZE = ((int)0x8642);
+        public const int GL_INTENSITY32F_ARB = ((int)0x8817);
+        public const int GL_FOG_SPECULAR_TEXTURE_WIN = ((int)0x80EC);
+        public const int GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX = ((int)0x8175);
+        public const int GL_FRAGMENT_SHADER_ATI = ((int)0x8920);
+        public const int GL_SAMPLE_COVERAGE_VALUE_ARB = ((int)0x80AA);
+        public const int GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = ((int)0x8516);
+        public const int GL_CON_8_ATI = ((int)0x8949);
+        public const int GL_CON_1_ATI = ((int)0x8942);
+        public const int GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = ((int)0x0001);
+        public const int GL_MAX_VARYING_COMPONENTS_EXT = ((int)0x8B4B);
+        public const int GL_VERTEX_DATA_HINT_PGI = ((int)0x1A22A);
+        public const int GL_PACK_SWAP_BYTES = ((int)0x0D00);
+        public const int GL_CONVOLUTION_2D_EXT = ((int)0x8011);
+        public const int GL_OUT_OF_MEMORY = ((int)0x0505);
+        public const int GL_UNSIGNED_INT_8_8_S8_S8_REV_NV = ((int)0x86DB);
+        public const int GL_NONE = ((int)0);
+        public const int GL_422_EXT = ((int)0x80CC);
+        public const int GL_TEXTURE_BORDER = ((int)0x1005);
+        public const int GL_FLOAT = ((int)0x1406);
+        public const int GL_MATRIX3_ARB = ((int)0x88C3);
+        public const int GL_REFLECTION_MAP_NV = ((int)0x8512);
+        public const int GL_MODELVIEW31_ARB = ((int)0x873F);
+        public const int GL_OUTPUT_TEXTURE_COORD31_EXT = ((int)0x87BC);
+        public const int GL_MINMAX_FORMAT_EXT = ((int)0x802F);
+        public const int GL_VIEWPORT = ((int)0x0BA2);
+        public const int GL_CLAMP_TO_EDGE = ((int)0x812F);
+        public const int GL_QUADS = ((int)0x0007);
+        public const int GL_CONSTANT_ARB = ((int)0x8576);
+        public const int GL_POLYGON_MODE = ((int)0x0B40);
+        public const int GL_R1UI_T2F_V3F_SUN = ((int)0x85C9);
+        public const int GL_CON_11_ATI = ((int)0x894C);
+        public const int GL_COLOR_ATTACHMENT8_EXT = ((int)0x8CE8);
+        public const int GL_ALPHA_MAX_CLAMP_INGR = ((int)0x8567);
+        public const int GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT = ((int)0x850F);
+        public const int GL_MAP2_VERTEX_ATTRIB0_4_NV = ((int)0x8670);
+        public const int GL_SECONDARY_COLOR_NV = ((int)0x852D);
+        public const int GL_FOG_INDEX = ((int)0x0B61);
+        public const int GL_R = ((int)0x2002);
+        public const int GL_S = ((int)0x2000);
+        public const int GL_TEXTURE_DEFORMATION_SGIX = ((int)0x8195);
+        public const int GL_SHININESS = ((int)0x1601);
+        public const int GL_UNSIGNED_INT_5_9_9_9_REV_EXT = ((int)0x8C3E);
+        public const int GL_T = ((int)0x2001);
+        public const int GL_GEOMETRY_DEFORMATION_BIT_SGIX = ((int)0x00000002);
+        public const int GL_FRAGMENT_PROGRAM_NV = ((int)0x8870);
+        public const int GL_TRIANGLE_STRIP_ADJACENCY_ARB = ((int)0x000D);
+        public const int GL_DEPTH_STENCIL_NV = ((int)0x84F9);
+        public const int GL_COLOR_TABLE_SGI = ((int)0x80D0);
+        public const int GL_HALF_FLOAT_NV = ((int)0x140B);
+        public const int GL_DUAL_ALPHA8_SGIS = ((int)0x8111);
+        public const int GL_BUFFER_ACCESS_ARB = ((int)0x88BB);
+        public const int GL_TEXTURE_SHARED_SIZE = ((int)0x8C3F);
+        public const int GL_RGB16I_EXT = ((int)0x8D89);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER = ((int)0x8CDC);
+        public const int GL_LUMINANCE4 = ((int)0x803F);
+        public const int GL_ASYNC_DRAW_PIXELS_SGIX = ((int)0x835D);
+        public const int GL_COLOR = ((int)0x1800);
+        public const int GL_FORMAT_SUBSAMPLE_24_24_OML = ((int)0x8982);
+        public const int GL_BLEND_DST_ALPHA = ((int)0x80CA);
+        public const int GL_STENCIL_BACK_WRITEMASK = ((int)0x8CA5);
+        public const int GL_SECONDARY_COLOR_ARRAY_LIST_IBM = ((int)103077);
+        public const int GL_PIXEL_MAP_I_TO_B = ((int)0x0C74);
+        public const int GL_VERTEX_PROGRAM_NV = ((int)0x8620);
+        public const int GL_FRAMEBUFFER_BINDING = ((int)0x8CA6);
+        public const int GL_HISTOGRAM_BLUE_SIZE_EXT = ((int)0x802A);
+        public const int GL_OP_RECIP_SQRT_EXT = ((int)0x8795);
+        public const int GL_MAP1_INDEX = ((int)0x0D91);
+        public const int GL_QUERY_NO_WAIT_NV = ((int)0x8E14);
+        public const int GL_FRAMEBUFFER_UNDEFINED = ((int)0x8219);
+        public const int GL_IMAGE_MAG_FILTER_HP = ((int)0x815C);
+        public const int GL_MODELVIEW10_ARB = ((int)0x872A);
+        public const int GL_CURRENT_MATRIX_STACK_DEPTH_NV = ((int)0x8640);
+        public const int GL_VERTEX_ARRAY_BUFFER_BINDING_ARB = ((int)0x8896);
+        public const int GL_MAX_VIEWPORT_DIMS = ((int)0x0D3A);
+        public const int GL_CON_24_ATI = ((int)0x8959);
+        public const int GL_MAX_DRAW_BUFFERS_ATI = ((int)0x8824);
+        public const int GL_EDGE_FLAG_ARRAY_COUNT_EXT = ((int)0x808D);
+        public const int GL_LIST_PRIORITY_SGIX = ((int)0x8182);
+        public const int GL_MAP2_VERTEX_ATTRIB13_4_NV = ((int)0x867D);
+        public const int GL_REG_8_ATI = ((int)0x8929);
+        public const int GL_PIXEL_TILE_GRID_DEPTH_SGIX = ((int)0x8144);
+        public const int GL_ACCUM = ((int)0x0100);
+        public const int GL_POINTS = ((int)0x0000);
+        public const int GL_INT_VEC3 = ((int)0x8B54);
+        public const int GL_DRAW_BUFFER10_ARB = ((int)0x882F);
+        public const int GL_DEPTH_CLAMP_NV = ((int)0x864F);
+        public const int GL_ZOOM_Y = ((int)0x0D17);
+        public const int GL_COLOR_MATERIAL_FACE = ((int)0x0B55);
+        public const int GL_RGBA12_EXT = ((int)0x805A);
+        public const int GL_TEXTURE_BASE_LEVEL = ((int)0x813C);
+        public const int GL_RGBA8 = ((int)0x8058);
+        public const int GL_INDEX_MATERIAL_EXT = ((int)0x81B8);
+        public const int GL_DEPTH_TEXTURE_MODE_ARB = ((int)0x884B);
+        public const int GL_RGBA2 = ((int)0x8055);
+        public const int GL_MAX_TEXTURE_IMAGE_UNITS_ARB = ((int)0x8872);
+        public const int GL_MIRROR_CLAMP_EXT = ((int)0x8742);
+        public const int GL_COLOR_INDEXES = ((int)0x1603);
+        public const int GL_RGBA4 = ((int)0x8056);
+        public const int GL_MAX_VARYING_FLOATS_ARB = ((int)0x8B4B);
+        public const int GL_E_TIMES_F_NV = ((int)0x8531);
+        public const int GL_FOG_COORDINATE_ARRAY_POINTER_EXT = ((int)0x8456);
+        public const int GL_FRAGMENT_PROGRAM_ARB = ((int)0x8804);
+        public const int GL_MODELVIEW = ((int)0x1700);
+        public const int GL_TEXTURE30 = ((int)0x84DE);
+        public const int GL_INT_SAMPLER_CUBE_EXT = ((int)0x8DCC);
+        public const int GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX = ((int)0x8188);
+        public const int GL_TEXTURE29_ARB = ((int)0x84DD);
+        public const int GL_TEXTURE_COMPRESSION_HINT_ARB = ((int)0x84EF);
+        public const int GL_SAMPLER_2D_SHADOW_ARB = ((int)0x8B62);
+        public const int GL_DEPTH_BUFFER_FLOAT_MODE_NV = ((int)0x8DAF);
+        public const int GL_PIXEL_PACK_BUFFER = ((int)0x88EB);
+        public const int GL_LUMINANCE_ALPHA32I_EXT = ((int)0x8D87);
+        public const int GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV = ((int)0x8DA0);
+        public const int GL_2_BYTES = ((int)0x1407);
+        public const int GL_CULL_FACE_MODE = ((int)0x0B45);
+        public const int GL_VERTEX_ATTRIB_ARRAY7_NV = ((int)0x8657);
+        public const int GL_SIGNED_ALPHA_NV = ((int)0x8705);
+        public const int GL_MODELVIEW20_ARB = ((int)0x8734);
+        public const int GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB = ((int)0x84F8);
+        public const int GL_COMPRESSED_SIGNED_RED_RGTC1_EXT = ((int)0x8DBC);
+        public const int GL_SAMPLE_PATTERN_SGIS = ((int)0x80AC);
+        public const int GL_CON_28_ATI = ((int)0x895D);
+        public const int GL_CURRENT_MATRIX_NV = ((int)0x8641);
+        public const int GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = ((int)0x8C88);
+        public const int GL_UNSIGNED_INT_S8_S8_8_8_NV = ((int)0x86DA);
+        public const int GL_HISTOGRAM_SINK_EXT = ((int)0x802D);
+        public const int GL_R1UI_C4F_N3F_V3F_SUN = ((int)0x85C8);
+        public const int GL_NEAREST_MIPMAP_NEAREST = ((int)0x2700);
+        public const int GL_RGBA16I = ((int)0x8D88);
+        public const int GL_8X_BIT_ATI = ((int)0x00000004);
+        public const int GL_POST_CONVOLUTION_ALPHA_BIAS_EXT = ((int)0x8023);
+        public const int GL_MAP2_VERTEX_ATTRIB6_4_NV = ((int)0x8676);
+        public const int GL_BUFFER_SIZE_ARB = ((int)0x8764);
+        public const int GL_TEXCOORD2_BIT_PGI = ((int)0x20000000);
+        public const int GL_FRAGMENT_MATERIAL_EXT = ((int)0x8349);
+        public const int GL_BUFFER_ACCESS = ((int)0x88BB);
+        public const int GL_INTENSITY16_EXT = ((int)0x804D);
+        public const int GL_FRAMEZOOM_FACTOR_SGIX = ((int)0x818C);
+        public const int GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI = ((int)0x1A203);
+        public const int GL_VERTEX_PROGRAM_BINDING_NV = ((int)0x864A);
+        public const int GL_INTENSITY4_EXT = ((int)0x804A);
+        public const int GL_POINT_DISTANCE_ATTENUATION = ((int)0x8129);
+        public const int GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB = ((int)0x8645);
+        public const int GL_R8 = ((int)0x8229);
+        public const int GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV = ((int)0x8857);
+        public const int GL_SIGNED_HILO_NV = ((int)0x86F9);
+        public const int GL_SHADE_MODEL = ((int)0x0B54);
+        public const int GL_POLYGON_OFFSET_FACTOR = ((int)0x8038);
+        public const int GL_BLEND_DST_ALPHA_EXT = ((int)0x80CA);
+        public const int GL_UNSIGNED_IDENTITY_NV = ((int)0x8536);
+        public const int GL_DOT4_ATI = ((int)0x8967);
+        public const int GL_LINEAR_CLIPMAP_NEAREST_SGIX = ((int)0x844F);
+        public const int GL_ALPHA_SCALE = ((int)0x0D1C);
+        public const int GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = ((int)0x8B4D);
+        public const int GL_COLOR_TABLE_LUMINANCE_SIZE_SGI = ((int)0x80DE);
+        public const int GL_COLOR_TABLE_BLUE_SIZE = ((int)0x80DC);
+        public const int GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = ((int)0x83F2);
+        public const int GL_OBJECT_LINEAR = ((int)0x2401);
+        public const int GL_FLOAT_VEC4 = ((int)0x8B52);
+        public const int GL_LUMINANCE12_ALPHA12_EXT = ((int)0x8047);
+        public const int GL_TEXTURE23_ARB = ((int)0x84D7);
+        public const int GL_TANGENT_ARRAY_POINTER_EXT = ((int)0x8442);
+        public const int GL_BUMP_ROT_MATRIX_SIZE_ATI = ((int)0x8776);
+        public const int GL_MAX_COLOR_MATRIX_STACK_DEPTH = ((int)0x80B3);
+        public const int GL_TEXTURE12_ARB = ((int)0x84CC);
+        public const int GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB = ((int)0x880D);
+        public const int GL_MAX_CONVOLUTION_WIDTH = ((int)0x801A);
+        public const int GL_YCBCR_MESA = ((int)0x8757);
+        public const int GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN = ((int)0x85C3);
+        public const int GL_CON_15_ATI = ((int)0x8950);
+        public const int GL_OPERAND2_RGB = ((int)0x8592);
+        public const int GL_DETAIL_TEXTURE_2D_SGIS = ((int)0x8095);
+        public const int GL_EVAL_VERTEX_ATTRIB9_NV = ((int)0x86CF);
+        public const int GL_NORMALIZE = ((int)0x0BA1);
+        public const int GL_COMPRESSED_INTENSITY_ARB = ((int)0x84EC);
+        public const int GL_STENCIL_BITS = ((int)0x0D57);
+        public const int GL_REPLACE_EXT = ((int)0x8062);
+        public const int GL_MAX_VERTEX_SHADER_INVARIANTS_EXT = ((int)0x87C7);
+        public const int GL_UNSIGNED_INT_2_10_10_10_REV_EXT = ((int)0x8368);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_EXT = ((int)0x8C8E);
+        public const int GL_CON_10_ATI = ((int)0x894B);
+        public const int GL_RENDERBUFFER_WIDTH = ((int)0x8D42);
+        public const int GL_COLOR_ARRAY_TYPE_EXT = ((int)0x8082);
+        public const int GL_DOT3_RGBA_EXT = ((int)0x8741);
+        public const int GL_MODELVIEW5_ARB = ((int)0x8725);
+        public const int GL_POINT_FADE_THRESHOLD_SIZE_ARB = ((int)0x8128);
+        public const int GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = ((int)0x851A);
+        public const int GL_COLOR_SUM_CLAMP_NV = ((int)0x854F);
+        public const int GL_COLOR_ATTACHMENT0 = ((int)0x8CE0);
+        public const int GL_READ_FRAMEBUFFER_EXT = ((int)0x8CA8);
+        public const int GL_SPRITE_SGIX = ((int)0x8148);
+        public const int GL_LEFT = ((int)0x0406);
+        public const int GL_LIGHT_MODEL_LOCAL_VIEWER = ((int)0x0B51);
+        public const int GL_LUMINANCE6_ALPHA2 = ((int)0x8044);
+        public const int GL_DSDT8_MAG8_NV = ((int)0x870A);
+        public const int GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT = ((int)0x8DD5);
+        public const int GL_BUMP_TEX_UNITS_ATI = ((int)0x8778);
+        public const int GL_DT_SCALE_NV = ((int)0x8711);
+        public const int GL_DRAW_BUFFER6 = ((int)0x882B);
+        public const int GL_FLOAT_CLEAR_COLOR_VALUE_NV = ((int)0x888D);
+        public const int GL_MAX_PROGRAM_PARAMETERS_ARB = ((int)0x88A9);
+        public const int GL_FLOAT_VEC3_ARB = ((int)0x8B51);
+        public const int GL_TEXTURE_MAX_LOD_SGIS = ((int)0x813B);
+        public const int GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB = ((int)0x88AB);
+        public const int GL_RGBA = ((int)0x1908);
+        public const int GL_TEXTURE_COORD_ARRAY = ((int)0x8078);
+        public const int GL_ACCUM_BLUE_BITS = ((int)0x0D5A);
+        public const int GL_FOG_COORDINATE_ARRAY_LIST_IBM = ((int)103076);
+        public const int GL_LOGIC_OP = ((int)0x0BF1);
+        public const int GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT = ((int)0x8515);
+        public const int GL_SOURCE3_RGB_NV = ((int)0x8583);
+        public const int GL_R32F = ((int)0x822E);
+        public const int GL_LUMINANCE_ALPHA32UI_EXT = ((int)0x8D75);
+        public const int GL_WEIGHT_ARRAY_STRIDE_ARB = ((int)0x86AA);
+        public const int GL_CLIP_DISTANCE_NV = ((int)0x8C7A);
+        public const int GL_RGB_SCALE_ARB = ((int)0x8573);
+        public const int GL_ACCUM_RED_BITS = ((int)0x0D58);
+        public const int GL_VERTEX_STATE_PROGRAM_NV = ((int)0x8621);
+        public const int GL_VIBRANCE_BIAS_NV = ((int)0x8719);
+        public const int GL_CLAMP_TO_BORDER_ARB = ((int)0x812D);
+        public const int GL_DEPTH_STENCIL_EXT = ((int)0x84F9);
+        public const int GL_RGB8I = ((int)0x8D8F);
+        public const int GL_FLOAT_RGBA_NV = ((int)0x8883);
+        public const int GL_R1UI_C3F_V3F_SUN = ((int)0x85C6);
+        public const int GL_ALPHA_BIAS = ((int)0x0D1D);
+        public const int GL_ALPHA_FLOAT32_ATI = ((int)0x8816);
+        public const int GL_GEOMETRY_OUTPUT_TYPE_EXT = ((int)0x8DDC);
+        public const int GL_DOUBLE_EXT = ((int)0x140A);
+        public const int GL_OP_FRAC_EXT = ((int)0x8789);
+        public const int GL_DST_COLOR = ((int)0x0306);
+        public const int GL_PACK_IMAGE_DEPTH_SGIS = ((int)0x8131);
+        public const int GL_CLIP_DISTANCE4 = ((int)GL_CLIP_PLANE4);
+        public const int GL_TEXTURE_MAX_LEVEL_SGIS = ((int)0x813D);
+        public const int GL_SIGNED_LUMINANCE8_ALPHA8_NV = ((int)0x8704);
+        public const int GL_POINT_BIT = ((int)0x00000002);
+        public const int GL_TEXTURE26_ARB = ((int)0x84DA);
+        public const int GL_MAP2_VERTEX_ATTRIB3_4_NV = ((int)0x8673);
+        public const int GL_ALPHA_BITS = ((int)0x0D55);
+        public const int GL_INT_SAMPLER_3D = ((int)0x8DCB);
+        public const int GL_INT_SAMPLER_2D = ((int)0x8DCA);
+        public const int GL_RED_BIAS = ((int)0x0D15);
+        public const int GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV = ((int)0x8852);
+        public const int GL_CON_19_ATI = ((int)0x8954);
+        public const int GL_COMPRESSED_LUMINANCE_ALPHA_ARB = ((int)0x84EB);
+        public const int GL_PIXEL_MAP_B_TO_B = ((int)0x0C78);
+        public const int GL_FOG_SCALE_SGIX = ((int)0x81FC);
+        public const int GL_STENCIL_INDEX4_EXT = ((int)0x8D47);
+        public const int GL_VARIANT_ARRAY_POINTER_EXT = ((int)0x87E9);
+        public const int GL_RED_BITS = ((int)0x0D52);
+        public const int GL_TEXTURE_GEQUAL_R_SGIX = ((int)0x819D);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = ((int)0x8215);
+        public const int GL_UNSIGNED_SHORT_5_5_5_1_EXT = ((int)0x8034);
+        public const int GL_R16I = ((int)0x8233);
+        public const int GL_TEXTURE28_ARB = ((int)0x84DC);
+        public const int GL_RGBA8UI = ((int)0x8D7C);
+        public const int GL_TEXTURE_MAX_LEVEL = ((int)0x813D);
+        public const int GL_DEPTH_ATTACHMENT = ((int)0x8D00);
+        public const int GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB = ((int)0x8C29);
+        public const int GL_POSITION = ((int)0x1203);
+        public const int GL_MAX_VERTEX_SHADER_LOCALS_EXT = ((int)0x87C9);
+        public const int GL_YCBCR_422_APPLE = ((int)0x85B9);
+        public const int GL_MOV_ATI = ((int)0x8961);
+        public const int GL_RASTERIZER_DISCARD_NV = ((int)0x8C89);
+        public const int GL_LOWER_LEFT = ((int)0x8CA1);
+        public const int GL_COLOR_INDEX12_EXT = ((int)0x80E6);
+        public const int GL_SECONDARY_COLOR_ARRAY = ((int)0x845E);
+        public const int GL_INDEX_BITS = ((int)0x0D51);
+        public const int GL_UNSIGNED_SHORT_5_6_5 = ((int)0x8363);
+        public const int GL_PACK_IMAGE_HEIGHT_EXT = ((int)0x806C);
+        public const int GL_OP_MULTIPLY_MATRIX_EXT = ((int)0x8798);
+        public const int GL_TRANSFORM_BIT = ((int)0x00001000);
+        public const int GL_NORMAL_ARRAY_TYPE_EXT = ((int)0x807E);
+        public const int GL_MAX = ((int)0x8008);
+        public const int GL_NICEST = ((int)0x1102);
+        public const int GL_TEXT_FRAGMENT_SHADER_ATI = ((int)0x8200);
+        public const int GL_PROJECTION_MATRIX = ((int)0x0BA7);
+        public const int GL_INTENSITY8I_EXT = ((int)0x8D91);
+        public const int GL_ONE_MINUS_CONSTANT_ALPHA_EXT = ((int)0x8004);
+        public const int GL_MVP_MATRIX_EXT = ((int)0x87E3);
+        public const int GL_TEXTURE6 = ((int)0x84C6);
+        public const int GL_STATIC_ATI = ((int)0x8760);
+        public const int GL_T2F_N3F_V3F = ((int)0x2A2B);
+        public const int GL_REFERENCE_PLANE_EQUATION_SGIX = ((int)0x817E);
+        public const int GL_DUAL_TEXTURE_SELECT_SGIS = ((int)0x8124);
+        public const int GL_COMBINE_EXT = ((int)0x8570);
+        public const int GL_RGBA2_EXT = ((int)0x8055);
+        public const int GL_FRAGMENT_LIGHT2_SGIX = ((int)0x840E);
+        public const int GL_MAP1_VERTEX_ATTRIB14_4_NV = ((int)0x866E);
+        public const int GL_UNSIGNED_SHORT = ((int)0x1403);
+        public const int GL_UNSIGNED_SHORT_4_4_4_4_EXT = ((int)0x8033);
+        public const int GL_UNPACK_IMAGE_HEIGHT_EXT = ((int)0x806E);
+        public const int GL_LUMINANCE_ALPHA8I_EXT = ((int)0x8D93);
+        public const int GL_TEXTURE_2D_ARRAY = ((int)0x8C1A);
+        public const int GL_COLOR_ARRAY_SIZE = ((int)0x8081);
+        public const int GL_MAP1_GRID_DOMAIN = ((int)0x0DD0);
+        public const int GL_OUTPUT_TEXTURE_COORD23_EXT = ((int)0x87B4);
+        public const int GL_POST_CONVOLUTION_GREEN_BIAS = ((int)0x8021);
+        public const int GL_UNPACK_SKIP_VOLUMES_SGIS = ((int)0x8132);
+        public const int GL_SAMPLE_COVERAGE_VALUE = ((int)0x80AA);
+        public const int GL_RGBA16F_ARB = ((int)0x881A);
+        public const int GL_PIXEL_UNPACK_BUFFER_BINDING_EXT = ((int)0x88EF);
+        public const int GL_TEXTURE_HI_SIZE_NV = ((int)0x871B);
+        public const int GL_MAP_INVALIDATE_RANGE_BIT = ((int)0x0004);
+        public const int GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT = ((int)0x8365);
+        public const int GL_CON_9_ATI = ((int)0x894A);
+        public const int GL_GREEN_SCALE = ((int)0x0D18);
+        public const int GL_HISTOGRAM_LUMINANCE_SIZE_EXT = ((int)0x802C);
+        public const int GL_MAP2_VERTEX_ATTRIB10_4_NV = ((int)0x867A);
+        public const int GL_FLOAT_MAT3 = ((int)0x8B5B);
+        public const int GL_ACTIVE_UNIFORMS = ((int)0x8B86);
+        public const int GL_AVERAGE_EXT = ((int)0x8335);
+        public const int GL_BGR_INTEGER = ((int)0x8D9A);
+        public const int GL_CON_14_ATI = ((int)0x894F);
+        public const int GL_FOG_FACTOR_TO_ALPHA_SGIX = ((int)0x836F);
+        public const int GL_ACTIVE_TEXTURE_ARB = ((int)0x84E0);
+        public const int GL_ARRAY_ELEMENT_LOCK_FIRST_EXT = ((int)0x81A8);
+        public const int GL_PIXEL_UNPACK_BUFFER_ARB = ((int)0x88EC);
+        public const int GL_INTERLACE_READ_INGR = ((int)0x8568);
+        public const int GL_STREAM_DRAW_ARB = ((int)0x88E0);
+        public const int GL_DEPTH_BOUNDS_TEST_EXT = ((int)0x8890);
+        public const int GL_EDGE_FLAG_ARRAY = ((int)0x8079);
+        public const int GL_MAP2_VERTEX_ATTRIB14_4_NV = ((int)0x867E);
+        public const int GL_TEXTURE_LIGHT_EXT = ((int)0x8350);
+        public const int GL_LESS = ((int)0x0201);
+        public const int GL_VERTEX_ATTRIB_ARRAY_INTEGER = ((int)0x88FD);
+        public const int GL_CURRENT_RASTER_NORMAL_SGIX = ((int)0x8406);
+        public const int GL_QUAD_MESH_SUN = ((int)0x8614);
+        public const int GL_ONE_MINUS_SRC_ALPHA = ((int)0x0303);
+        public const int GL_COMPRESSED_SRGB_ALPHA_EXT = ((int)0x8C49);
+        public const int GL_ALPHA16F_ARB = ((int)0x881C);
+        public const int GL_RGBA16I_EXT = ((int)0x8D88);
+        public const int GL_SRGB8_ALPHA8 = ((int)0x8C43);
+        public const int GL_OBJECT_ACTIVE_UNIFORMS_ARB = ((int)0x8B86);
+        public const int GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI = ((int)0x80B7);
+        public const int GL_BACK_RIGHT = ((int)0x0403);
+        public const int GL_DRAW_BUFFER12 = ((int)0x8831);
+        public const int GL_DRAW_BUFFER14 = ((int)0x8833);
+        public const int GL_COLOR_CLEAR_VALUE = ((int)0x0C22);
+        public const int GL_QUERY_RESULT = ((int)0x8866);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = ((int)0x8214);
+        public const int GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI = ((int)0x8802);
+        public const int GL_SAMPLER_2D_ARRAY_SHADOW = ((int)0x8DC4);
+        public const int GL_TEXTURE_INTERNAL_FORMAT = ((int)0x1003);
+        public const int GL_INT_VEC4 = ((int)0x8B55);
+        public const int GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT = ((int)0x8C71);
+        public const int GL_PIXEL_UNPACK_BUFFER_BINDING_ARB = ((int)0x88EF);
+        public const int GL_GEOMETRY_DEFORMATION_SGIX = ((int)0x8194);
+        public const int GL_OP_MADD_EXT = ((int)0x8788);
+        public const int GL_COLOR_MATERIAL = ((int)0x0B57);
+        public const int GL_INDEX_ARRAY_POINTER = ((int)0x8091);
+        public const int GL_YCRCBA_SGIX = ((int)0x8319);
+        public const int GL_PROGRAM_FORMAT_ARB = ((int)0x8876);
+        public const int GL_WEIGHT_ARRAY_ARB = ((int)0x86AD);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT = ((int)0x8DA9);
+        public const int GL_FOG_COORD_ARRAY = ((int)GL_FOG_COORDINATE_ARRAY);
+        public const int GL_BUMP_NUM_TEX_UNITS_ATI = ((int)0x8777);
+        public const int GL_VARIANT_ARRAY_TYPE_EXT = ((int)0x87E7);
+        public const int GL_ARRAY_BUFFER_BINDING = ((int)0x8894);
+        public const int GL_FORMAT_SUBSAMPLE_244_244_OML = ((int)0x8983);
+        public const int GL_FLOAT_R32_NV = ((int)0x8885);
+        public const int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = ((int)0x8C4F);
+        public const int GL_VERTEX_ATTRIB_ARRAY8_NV = ((int)0x8658);
+        public const int GL_TEXTURE_LUMINANCE_SIZE = ((int)0x8060);
+        public const int GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV = ((int)0x86D9);
+        public const int GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB = ((int)0x88B1);
+        public const int GL_FOG_HINT = ((int)0x0C54);
+        public const int GL_LEQUAL = ((int)0x0203);
+        public const int GL_UNSIGNED_INT_10F_11F_11F_REV = ((int)0x8C3B);
+        public const int GL_PROGRAM_ERROR_STRING_ARB = ((int)0x8874);
+        public const int GL_TEXTURE_BINDING_2D_ARRAY_EXT = ((int)0x8C1D);
+        public const int GL_ELEMENT_ARRAY_BUFFER_BINDING = ((int)0x8895);
+        public const int GL_LINE_WIDTH = ((int)0x0B21);
+        public const int GL_TEXTURE_COLOR_WRITEMASK_SGIS = ((int)0x81EF);
+        public const int GL_NUM_GENERAL_COMBINERS_NV = ((int)0x854E);
+        public const int GL_POST_COLOR_MATRIX_RED_BIAS = ((int)0x80B8);
+        public const int GL_TEXTURE_2D = ((int)0x0DE1);
+        public const int GL_TEXTURE_3D = ((int)0x806F);
+        public const int GL_DEPTH_BUFFER_BIT = ((int)0x00000100);
+        public const int GL_TEXTURE_1D = ((int)0x0DE0);
+        public const int GL_DRAW_BUFFER15 = ((int)0x8834);
+        public const int GL_SHORT = ((int)0x1402);
+        public const int GL_POST_CONVOLUTION_RED_BIAS = ((int)0x8020);
+        public const int GL_PROGRAM_NATIVE_ATTRIBS_ARB = ((int)0x88AE);
+        public const int GL_LIGHTING_BIT = ((int)0x00000040);
+        public const int GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB = ((int)0x8622);
+        public const int GL_COLOR_ATTACHMENT7_EXT = ((int)0x8CE7);
+        public const int GL_EYE_POINT_SGIS = ((int)0x81F4);
+        public const int GL_MODELVIEW26_ARB = ((int)0x873A);
+        public const int GL_CON_18_ATI = ((int)0x8953);
+        public const int GL_EDGE_FLAG_ARRAY_LIST_IBM = ((int)103075);
+        public const int GL_COLOR_TABLE = ((int)0x80D0);
+        public const int GL_MAX_TEXTURE_BUFFER_SIZE_EXT = ((int)0x8C2B);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = ((int)0x8D56);
+        public const int GL_VERTEX_ATTRIB_ARRAY0_NV = ((int)0x8650);
+        public const int GL_R11F_G11F_B10F_EXT = ((int)0x8C3A);
+        public const int GL_CULL_FACE = ((int)0x0B44);
+        public const int GL_BLUE_MIN_CLAMP_INGR = ((int)0x8562);
+        public const int GL_CON_23_ATI = ((int)0x8958);
+        public const int GL_BUFFER_USAGE_ARB = ((int)0x8765);
+        public const int GL_COMPRESSED_RED = ((int)0x8225);
+        public const int GL_STORAGE_CACHED_APPLE = ((int)0x85BE);
+        public const int GL_DECR_WRAP = ((int)0x8508);
+        public const int GL_INTERLEAVED_ATTRIBS_EXT = ((int)0x8C8C);
+        public const int GL_REG_2_ATI = ((int)0x8923);
+        public const int GL_UNPACK_SWAP_BYTES = ((int)0x0CF0);
+        public const int GL_LUMINANCE8I_EXT = ((int)0x8D92);
+        public const int GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = ((int)0x8809);
+        public const int GL_LUMINANCE_INTEGER_EXT = ((int)0x8D9C);
+        public const int GL_CLAMP_VERTEX_COLOR = ((int)0x891A);
+        public const int GL_CURRENT_VERTEX_WEIGHT_EXT = ((int)0x850B);
+        public const int GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = ((int)0x88B2);
+        public const int GL_DRAW_BUFFER0_ATI = ((int)0x8825);
+        public const int GL_MAX_COLOR_ATTACHMENTS_EXT = ((int)0x8CDF);
+        public const int GL_TANGENT_ARRAY_EXT = ((int)0x8439);
+        public const int GL_QUAD_ALPHA8_SGIS = ((int)0x811F);
+        public const int GL_STENCIL_BUFFER_BIT = ((int)0x00000400);
+        public const int GL_HI_SCALE_NV = ((int)0x870E);
+        public const int GL_CLAMP_FRAGMENT_COLOR = ((int)0x891B);
+        public const int GL_MAX_ATTRIB_STACK_DEPTH = ((int)0x0D35);
+        public const int GL_SIGNED_INTENSITY_NV = ((int)0x8707);
+        public const int GL_VERTEX_SHADER_INSTRUCTIONS_EXT = ((int)0x87CF);
+        public const int GL_CURRENT_RASTER_TEXTURE_COORDS = ((int)0x0B06);
+        public const int GL_PASS_THROUGH_TOKEN = ((int)0x0700);
+        public const int GL_CONSTANT_ALPHA_EXT = ((int)0x8003);
+        public const int GL_FLAT = ((int)0x1D00);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = ((int)0x8216);
+        public const int GL_POINT_SPRITE_ARB = ((int)0x8861);
+        public const int GL_TEXTURE_BINDING_1D_ARRAY = ((int)0x8C1C);
+        public const int GL_REG_19_ATI = ((int)0x8934);
+        public const int GL_GEOMETRY_INPUT_TYPE_ARB = ((int)0x8DDB);
+        public const int GL_FEEDBACK_BUFFER_SIZE = ((int)0x0DF1);
+        public const int GL_COLOR_ATTACHMENT0_EXT = ((int)0x8CE0);
+        public const int GL_RGB5_EXT = ((int)0x8050);
+        public const int GL_VERTEX_SHADER_VARIANTS_EXT = ((int)0x87D0);
+        public const int GL_COLOR_TABLE_WIDTH_SGI = ((int)0x80D9);
+        public const int GL_CONVOLUTION_BORDER_COLOR = ((int)0x8154);
+        public const int GL_EVAL_FRACTIONAL_TESSELLATION_NV = ((int)0x86C5);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT = ((int)0x8CDC);
+        public const int GL_INT_SAMPLER_2D_RECT_EXT = ((int)0x8DCD);
+        public const int GL_RESAMPLE_ZERO_FILL_SGIX = ((int)0x842F);
+        public const int GL_UNPACK_CMYK_HINT_EXT = ((int)0x800F);
+        public const int GL_TEXTURE_GREEN_SIZE_EXT = ((int)0x805D);
+        public const int GL_MUL_ATI = ((int)0x8964);
+        public const int GL_RGB5_A1_EXT = ((int)0x8057);
+        public const int GL_CONVOLUTION_2D = ((int)0x8011);
+        public const int GL_MAP_INVALIDATE_BUFFER_BIT = ((int)0x0008);
+        public const int GL_CONVOLUTION_1D = ((int)0x8010);
+        public const int GL_SAMPLES_PASSED_ARB = ((int)0x8914);
+        public const int GL_PIXEL_MAP_I_TO_G_SIZE = ((int)0x0CB3);
+        public const int GL_NEAREST_MIPMAP_LINEAR = ((int)0x2702);
+        public const int GL_MODELVIEW12_ARB = ((int)0x872C);
+        public const int GL_EDGE_FLAG_ARRAY_STRIDE = ((int)0x808C);
+        public const int GL_FOG_OFFSET_VALUE_SGIX = ((int)0x8199);
+        public const int GL_PROXY_TEXTURE_1D_EXT = ((int)0x8063);
+        public const int GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV = ((int)0x86F3);
+        public const int GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB = ((int)0x88A2);
+        public const int GL_SOURCE2_ALPHA = ((int)0x858A);
+        public const int GL_SAMPLER_BUFFER_EXT = ((int)0x8DC2);
+        public const int GL_QUARTER_BIT_ATI = ((int)0x00000010);
+        public const int GL_MAP1_VERTEX_ATTRIB8_4_NV = ((int)0x8668);
+        public const int GL_VARIABLE_A_NV = ((int)0x8523);
+        public const int GL_POINT_SPRITE_COORD_ORIGIN = ((int)0x8CA0);
+        public const int GL_MAX_TEXTURE_COORDS_NV = ((int)0x8871);
+        public const int GL_OPERAND0_RGB = ((int)0x8590);
+        public const int GL_OUTPUT_TEXTURE_COORD16_EXT = ((int)0x87AD);
+        public const int GL_SAMPLE_ALPHA_TO_ONE_EXT = ((int)0x809F);
+        public const int GL_MATRIX4_ARB = ((int)0x88C4);
+        public const int GL_PROGRAM_PARAMETER_NV = ((int)0x8644);
+        public const int GL_SRC0_ALPHA = ((int)GL_SOURCE0_ALPHA);
+        public const int GL_COLOR_ARRAY_BUFFER_BINDING_ARB = ((int)0x8898);
+        public const int GL_MAT_SHININESS_BIT_PGI = ((int)0x02000000);
+        public const int GL_MODELVIEW1_STACK_DEPTH_EXT = ((int)0x8502);
+        public const int GL_RGB5 = ((int)0x8050);
+        public const int GL_COLOR_MATRIX = ((int)0x80B1);
+        public const int GL_SOURCE0_RGB = ((int)0x8580);
+        public const int GL_MAP2_VERTEX_ATTRIB4_4_NV = ((int)0x8674);
+        public const int GL_EDGEFLAG_BIT_PGI = ((int)0x00040000);
+        public const int GL_BLUE_BIT_ATI = ((int)0x00000004);
+        public const int GL_COMPRESSED_SIGNED_RG_RGTC2 = ((int)0x8DBE);
+        public const int GL_LUMINANCE_ALPHA32F_ARB = ((int)0x8819);
+        public const int GL_TEXTURE_ENV_MODE = ((int)0x2200);
+        public const int GL_OUTPUT_TEXTURE_COORD1_EXT = ((int)0x879E);
+        public const int GL_COMBINE4_NV = ((int)0x8503);
+        public const int GL_TEXTURE_COORD_ARRAY_LIST_IBM = ((int)103074);
+        public const int GL_COMPRESSED_TEXTURE_FORMATS = ((int)0x86A3);
+        public const int GL_SECONDARY_COLOR_ARRAY_SIZE = ((int)0x845A);
+        public const int GL_TEXTURE_COMPARE_SGIX = ((int)0x819A);
+        public const int GL_DRAW_BUFFER5_ATI = ((int)0x882A);
+        public const int GL_PN_TRIANGLES_POINT_MODE_ATI = ((int)0x87F2);
+        public const int GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = ((int)0x8DD7);
+        public const int GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING = ((int)0x889A);
+        public const int GL_INDEX_ARRAY_STRIDE = ((int)0x8086);
+        public const int GL_SAMPLE_ALPHA_TO_COVERAGE = ((int)0x809E);
+        public const int GL_COMPARE_R_TO_TEXTURE_ARB = ((int)0x884E);
+        public const int GL_REPEAT = ((int)0x2901);
+        public const int GL_TEXTURE4 = ((int)0x84C4);
+        public const int GL_LIGHT_MODEL_AMBIENT = ((int)0x0B53);
+        public const int GL_TEXTURE27_ARB = ((int)0x84DB);
+        public const int GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB = ((int)0x889A);
+        public const int GL_SIGNED_NEGATE_NV = ((int)0x853D);
+        public const int GL_PROXY_COLOR_TABLE = ((int)0x80D3);
+        public const int GL_TEXTURE_LEQUAL_R_SGIX = ((int)0x819C);
+        public const int GL_BLEND_SRC_ALPHA_EXT = ((int)0x80CB);
+        public const int GL_FRAGMENT_DEPTH = ((int)0x8452);
+        public const int GL_PRIMITIVE_RESTART_INDEX_NV = ((int)0x8559);
+        public const int GL_LUMINANCE16_ALPHA16_EXT = ((int)0x8048);
+        public const int GL_PIXEL_MAP_I_TO_R_SIZE = ((int)0x0CB2);
+        public const int GL_TEXTURE14_ARB = ((int)0x84CE);
+        public const int GL_REPLICATE_BORDER_HP = ((int)0x8153);
+        public const int GL_REG_3_ATI = ((int)0x8924);
+        public const int GL_TEXTURE_BUFFER_FORMAT_EXT = ((int)0x8C2E);
+        public const int GL_LINE_TOKEN = ((int)0x0702);
+        public const int GL_PROXY_TEXTURE_2D_STACK_MESAX = ((int)0x875C);
+        public const int GL_POLYGON_OFFSET_FILL = ((int)0x8037);
+        public const int GL_R1UI_T2F_N3F_V3F_SUN = ((int)0x85CA);
+        public const int GL_SOURCE3_ALPHA_NV = ((int)0x858B);
+        public const int GL_SPOT_EXPONENT = ((int)0x1205);
+        public const int GL_SIGNED_HILO8_NV = ((int)0x885F);
+        public const int GL_INTENSITY_FLOAT16_ATI = ((int)0x881D);
+        public const int GL_FRAGMENT_COLOR_EXT = ((int)0x834C);
+        public const int GL_BINORMAL_ARRAY_TYPE_EXT = ((int)0x8440);
+        public const int GL_ALPHA16I_EXT = ((int)0x8D8A);
+        public const int GL_SINGLE_COLOR = ((int)0x81F9);
+        public const int GL_HISTOGRAM_GREEN_SIZE = ((int)0x8029);
+        public const int GL_STREAM_READ_ARB = ((int)0x88E1);
+        public const int GL_MATRIX10_ARB = ((int)0x88CA);
+        public const int GL_LIGHT1 = ((int)0x4001);
+        public const int GL_DEPTH_BOUNDS_EXT = ((int)0x8891);
+        public const int GL_LUMINANCE_ALPHA16I_EXT = ((int)0x8D8D);
+        public const int GL_TRIANGLE_FAN = ((int)0x0006);
+        public const int GL_OUTPUT_TEXTURE_COORD28_EXT = ((int)0x87B9);
+        public const int GL_INTENSITY = ((int)0x8049);
+        public const int GL_BGRA_INTEGER_EXT = ((int)0x8D9B);
+        public const int GL_PRIMARY_COLOR_NV = ((int)0x852C);
+        public const int GL_RESTART_SUN = ((int)0x0001);
+        public const int GL_STREAM_COPY = ((int)0x88E2);
+        public const int GL_CLIENT_ALL_ATTRIB_BITS = unchecked((int)0xFFFFFFFF);
+        public const int GL_POST_CONVOLUTION_RED_SCALE = ((int)0x801C);
+        public const int GL_MAX_TEXTURE_IMAGE_UNITS_NV = ((int)0x8872);
+        public const int GL_OUTPUT_TEXTURE_COORD10_EXT = ((int)0x87A7);
+        public const int GL_MAP_COLOR = ((int)0x0D10);
+        public const int GL_3D_COLOR_TEXTURE = ((int)0x0603);
+        public const int GL_COLOR_MATRIX_STACK_DEPTH_SGI = ((int)0x80B2);
+        public const int GL_BUFFER_SERIALIZED_MODIFY_APPLE = ((int)0x8A12);
+        public const int GL_VARIABLE_C_NV = ((int)0x8525);
+        public const int GL_OPERAND3_RGB_NV = ((int)0x8593);
+        public const int GL_OBJECT_INFO_LOG_LENGTH_ARB = ((int)0x8B84);
+        public const int GL_TEXTURE8 = ((int)0x84C8);
+        public const int GL_DEPTH_BIAS = ((int)0x0D1F);
+        public const int GL_OP_MAX_EXT = ((int)0x878A);
+        public const int GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB = ((int)0x8DE1);
+        public const int GL_PRIMITIVE_RESTART_NV = ((int)0x8558);
+        public const int GL_BGRA = ((int)0x80E1);
+        public const int GL_DYNAMIC_DRAW_ARB = ((int)0x88E8);
+        public const int GL_QUERY_WAIT = ((int)0x8E13);
+        public const int GL_MODELVIEW27_ARB = ((int)0x873B);
+        public const int GL_POLYGON_OFFSET_FACTOR_EXT = ((int)0x8038);
+        public const int GL_BIAS_BY_NEGATIVE_ONE_HALF_NV = ((int)0x8541);
+        public const int GL_ATTRIB_ARRAY_POINTER_NV = ((int)0x8645);
+        public const int GL_INDEX_ARRAY_TYPE = ((int)0x8085);
+        public const int GL_LUMINANCE = ((int)0x1909);
+        public const int GL_MODELVIEW14_ARB = ((int)0x872E);
+        public const int GL_WEIGHT_ARRAY_BUFFER_BINDING = ((int)0x889E);
+        public const int GL_MATRIX11_ARB = ((int)0x88CB);
+        public const int GL_REG_10_ATI = ((int)0x892B);
+        public const int GL_RGBA_SIGNED_COMPONENTS_EXT = ((int)0x8C3C);
+        public const int GL_MAT_EMISSION_BIT_PGI = ((int)0x00800000);
+        public const int GL_TEXTURE_COMPRESSION_HINT = ((int)0x84EF);
+        public const int GL_PACK_INVERT_MESA = ((int)0x8758);
+        public const int GL_GLOBAL_ALPHA_SUN = ((int)0x81D9);
+        public const int GL_MAX_CONVOLUTION_WIDTH_EXT = ((int)0x801A);
+        public const int GL_UNSIGNED_INT_VEC4 = ((int)0x8DC8);
+        public const int GL_LUMINANCE16I_EXT = ((int)0x8D8C);
+        public const int GL_TRANSPOSE_MODELVIEW_MATRIX_ARB = ((int)0x84E3);
+        public const int GL_MAX_VERTEX_ATTRIBS_ARB = ((int)0x8869);
+        public const int GL_UNSIGNED_INT_VEC2 = ((int)0x8DC6);
+        public const int GL_COMP_BIT_ATI = ((int)0x00000002);
+        public const int GL_DSDT8_NV = ((int)0x8709);
+        public const int GL_DEPTH_SCALE = ((int)0x0D1E);
+        public const int GL_TEXTURE_COMPARE_FUNC = ((int)0x884D);
+        public const int GL_MAP2_TEXTURE_COORD_1 = ((int)0x0DB3);
+        public const int GL_FOG_COORD_ARRAY_STRIDE = ((int)GL_FOG_COORDINATE_ARRAY_STRIDE);
+        public const int GL_MAJOR_VERSION = ((int)0x821B);
+        public const int GL_DISCARD_NV = ((int)0x8530);
+        public const int GL_MAP1_VERTEX_ATTRIB3_4_NV = ((int)0x8663);
+        public const int GL_COMPRESSED_RGBA = ((int)0x84EE);
+        public const int GL_CURRENT_FOG_COORDINATE_EXT = ((int)0x8453);
+        public const int GL_LINE_WIDTH_GRANULARITY = ((int)0x0B23);
+        public const int GL_VENDOR = ((int)0x1F00);
+        public const int GL_PIXEL_MAP_R_TO_R_SIZE = ((int)0x0CB6);
+        public const int GL_UNPACK_SKIP_PIXELS = ((int)0x0CF4);
+        public const int GL_R16UI = ((int)0x8234);
+        public const int GL_INTERLACE_READ_OML = ((int)0x8981);
+        public const int GL_DRAW_BUFFER13_ATI = ((int)0x8832);
+        public const int GL_COMBINE_ARB = ((int)0x8570);
+        public const int GL_PIXEL_UNPACK_BUFFER = ((int)0x88EC);
+        public const int GL_SAMPLER_1D_ARRAY_EXT = ((int)0x8DC0);
+        public const int GL_2PASS_0_EXT = ((int)0x80A2);
+        public const int GL_INVARIANT_EXT = ((int)0x87C2);
+        public const int GL_INDEX_ARRAY_BUFFER_BINDING_ARB = ((int)0x8899);
+        public const int GL_SMOOTH_POINT_SIZE_GRANULARITY = ((int)0x0B13);
+        public const int GL_INTENSITY8UI_EXT = ((int)0x8D7F);
+        public const int GL_TEXTURE_LOD_BIAS_T_SGIX = ((int)0x818F);
+        public const int GL_ALL_ATTRIB_BITS = unchecked((int)0xFFFFFFFF);
+        public const int GL_LINEAR_DETAIL_SGIS = ((int)0x8097);
+        public const int GL_READ_ONLY_ARB = ((int)0x88B8);
+        public const int GL_TEXTURE_FILTER_CONTROL = ((int)0x8500);
+        public const int GL_COMPRESSED_LUMINANCE_ARB = ((int)0x84EA);
+        public const int GL_TEXTURE_1D_STACK_BINDING_MESAX = ((int)0x875D);
+        public const int GL_LO_BIAS_NV = ((int)0x8715);
+        public const int GL_MAX_PROGRAM_IF_DEPTH_NV = ((int)0x88F6);
+        public const int GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = ((int)0x8B4C);
+        public const int GL_DOT_PRODUCT_DEPTH_REPLACE_NV = ((int)0x86ED);
+        public const int GL_VERTEX_ARRAY_STORAGE_HINT_APPLE = ((int)0x851F);
+        public const int GL_REG_18_ATI = ((int)0x8933);
+        public const int GL_ARRAY_OBJECT_BUFFER_ATI = ((int)0x8766);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_START = ((int)0x8C84);
+        public const int GL_NATIVE_GRAPHICS_END_HINT_PGI = ((int)0x1A204);
+        public const int GL_AUX_BUFFERS = ((int)0x0C00);
+        public const int GL_INVALID_VALUE = ((int)0x0501);
+        public const int GL_LINE_SMOOTH = ((int)0x0B20);
+        public const int GL_DRAW_BUFFER15_ARB = ((int)0x8834);
+        public const int GL_FRONT_RIGHT = ((int)0x0401);
+        public const int GL_DEPENDENT_AR_TEXTURE_2D_NV = ((int)0x86E9);
+        public const int GL_MAP_STENCIL = ((int)0x0D11);
+        public const int GL_EIGHTH_BIT_ATI = ((int)0x00000020);
+        public const int GL_MAX_CLIENT_ATTRIB_STACK_DEPTH = ((int)0x0D3B);
+        public const int GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB = ((int)0x851C);
+        public const int GL_CLIENT_ACTIVE_TEXTURE_ARB = ((int)0x84E1);
+        public const int GL_MAX_PROGRAM_TEXEL_OFFSET_NV = ((int)0x8905);
+        public const int GL_LIST_BIT = ((int)0x00020000);
+        public const int GL_RGB9_E5_EXT = ((int)0x8C3D);
+        public const int GL_TEXTURE_HEIGHT = ((int)0x1001);
+        public const int GL_TRANSPOSE_NV = ((int)0x862C);
+        public const int GL_DECR = ((int)0x1E03);
+        public const int GL_MAX_VERTEX_ATTRIBS = ((int)0x8869);
+        public const int GL_ONE_MINUS_CONSTANT_COLOR = ((int)0x8002);
+        public const int GL_CUBIC_HP = ((int)0x815F);
+        public const int GL_BUFFER_FLUSHING_UNMAP_APPLE = ((int)0x8A13);
+        public const int GL_REG_6_ATI = ((int)0x8927);
+        public const int GL_RGBA_FLOAT16_ATI = ((int)0x881A);
+        public const int GL_TEXTURE_GREEN_TYPE_ARB = ((int)0x8C11);
+        public const int GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL = ((int)0x83F8);
+        public const int GL_3D_COLOR = ((int)0x0602);
+        public const int GL_EVAL_2D_NV = ((int)0x86C0);
+        public const int GL_MAX_TEXTURE_COORDS_ARB = ((int)0x8871);
+        public const int GL_COLOR_INDEX = ((int)0x1900);
+        public const int GL_BOOL_VEC3_ARB = ((int)0x8B58);
+        public const int GL_UNSIGNED_SHORT_4_4_4_4 = ((int)0x8033);
+        public const int GL_ELEMENT_ARRAY_APPLE = ((int)0x8768);
+        public const int GL_REFERENCE_PLANE_SGIX = ((int)0x817D);
+        public const int GL_SAMPLE_BUFFERS_ARB = ((int)0x80A8);
+        public const int GL_NORMAL_ARRAY_BUFFER_BINDING_ARB = ((int)0x8897);
+        public const int GL_4D_COLOR_TEXTURE = ((int)0x0604);
+        public const int GL_UNSIGNED_SHORT_5_6_5_REV_EXT = ((int)0x8364);
+        public const int GL_PIXEL_MAP_S_TO_S_SIZE = ((int)0x0CB1);
+        public const int GL_RGB9_E5 = ((int)0x8C3D);
+        public const int GL_BOOL = ((int)0x8B56);
+        public const int GL_PIXEL_TILE_GRID_HEIGHT_SGIX = ((int)0x8143);
+        public const int GL_HALF_FLOAT_ARB = ((int)0x140B);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT = ((int)0x8C7F);
+        public const int GL_OR_INVERTED = ((int)0x150D);
+        public const int GL_SOURCE0_ALPHA_ARB = ((int)0x8588);
+        public const int GL_FUNC_ADD = ((int)0x8006);
+        public const int GL_TEXTURE_GEN_MODE = ((int)0x2500);
+        public const int GL_TEXTURE_INTENSITY_TYPE_ARB = ((int)0x8C15);
+        public const int GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI = ((int)0x8973);
+        public const int GL_SRGB8_ALPHA8_EXT = ((int)0x8C43);
+        public const int GL_EYE_DISTANCE_TO_LINE_SGIS = ((int)0x81F2);
+        public const int GL_SECONDARY_COLOR_ARRAY_POINTER = ((int)0x845D);
+        public const int GL_RG8 = ((int)0x822B);
+        public const int GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = ((int)0x83F1);
+        public const int GL_FOG_COORDINATE_ARRAY_EXT = ((int)0x8457);
+        public const int GL_SIGNED_RGB8_NV = ((int)0x86FF);
+        public const int GL_RENDERBUFFER_RED_SIZE_EXT = ((int)0x8D50);
+        public const int GL_FILL = ((int)0x1B02);
+        public const int GL_PHONG_WIN = ((int)0x80EA);
+        public const int GL_PROXY_TEXTURE_RECTANGLE_NV = ((int)0x84F7);
+        public const int GL_R1UI_N3F_V3F_SUN = ((int)0x85C7);
+        public const int GL_SAMPLER_1D_ARRAY = ((int)0x8DC0);
+        public const int GL_WEIGHT_ARRAY_SIZE_ARB = ((int)0x86AB);
+        public const int GL_COMPRESSED_RGB_FXT1_3DFX = ((int)0x86B0);
+        public const int GL_TEXTURE_STENCIL_SIZE = ((int)0x88F1);
+        public const int GL_FRAMEBUFFER_BINDING_EXT = ((int)0x8CA6);
+        public const int GL_OPERAND0_ALPHA = ((int)0x8598);
+        public const int GL_CONVOLUTION_FILTER_SCALE_EXT = ((int)0x8014);
+        public const int GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS = ((int)0x80B0);
+        public const int GL_UNSIGNED_INT_SAMPLER_3D = ((int)0x8DD3);
+        public const int GL_MIRROR_CLAMP_TO_EDGE_EXT = ((int)0x8743);
+        public const int GL_CON_0_ATI = ((int)0x8941);
+        public const int GL_WEIGHT_SUM_UNITY_ARB = ((int)0x86A6);
+        public const int GL_UNSIGNED_INT_2_10_10_10_REV = ((int)0x8368);
+        public const int GL_TEXTURE_1D_BINDING_EXT = ((int)0x8068);
+        public const int GL_TEXTURE_BINDING_CUBE_MAP_ARB = ((int)0x8514);
+        public const int GL_FLOAT_RG_NV = ((int)0x8881);
+        public const int GL_UNSIGNED_SHORT_1_5_5_5_REV = ((int)0x8366);
+        public const int GL_COLOR_SUM_ARB = ((int)0x8458);
+        public const int GL_SPRITE_EYE_ALIGNED_SGIX = ((int)0x814E);
+        public const int GL_QUERY_BY_REGION_NO_WAIT_NV = ((int)0x8E16);
+        public const int GL_2X_BIT_ATI = ((int)0x00000001);
+        public const int GL_DEPTH_STENCIL_TO_RGBA_NV = ((int)0x886E);
+        public const int GL_COLOR_TABLE_ALPHA_SIZE = ((int)0x80DD);
+        public const int GL_Z_EXT = ((int)0x87D7);
+        public const int GL_PROXY_TEXTURE_1D_STACK_MESAX = ((int)0x875B);
+        public const int GL_DISTANCE_ATTENUATION_SGIS = ((int)0x8129);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB = ((int)0x8DA8);
+        public const int GL_ACCUM_GREEN_BITS = ((int)0x0D59);
+        public const int GL_REDUCE_EXT = ((int)0x8016);
+        public const int GL_UNSIGNED_BYTE_2_3_3_REV_EXT = ((int)0x8362);
+        public const int GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = ((int)0x88B3);
+        public const int GL_OBJECT_COMPILE_STATUS_ARB = ((int)0x8B81);
+        public const int GL_INT_SAMPLER_1D_ARRAY_EXT = ((int)0x8DCE);
+        public const int GL_PIXEL_TEXTURE_SGIS = ((int)0x8353);
+        public const int GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN = ((int)0x85C1);
+        public const int GL_COLOR_ATTACHMENT14_EXT = ((int)0x8CEE);
+        public const int GL_CON_13_ATI = ((int)0x894E);
+        public const int GL_PROGRAM_RESULT_COMPONENTS_NV = ((int)0x8907);
+        public const int GL_MAX_PROGRAM_ENV_PARAMETERS_ARB = ((int)0x88B5);
+        public const int GL_ATTRIB_STACK_DEPTH = ((int)0x0BB0);
+        public const int GL_STENCIL_CLEAR_TAG_VALUE_EXT = ((int)0x88F3);
+        public const int GL_TEXTURE_PRIORITY = ((int)0x8066);
+        public const int GL_MAX_ELEMENTS_INDICES_EXT = ((int)0x80E9);
+        public const int GL_TEXTURE_CLIPMAP_OFFSET_SGIX = ((int)0x8173);
+        public const int GL_RGB = ((int)0x1907);
+        public const int GL_TEXTURE_GEN_S = ((int)0x0C60);
+        public const int GL_TEXTURE_GEN_R = ((int)0x0C62);
+        public const int GL_POST_CONVOLUTION_GREEN_SCALE = ((int)0x801D);
+        public const int GL_LINEAR_SHARPEN_SGIS = ((int)0x80AD);
+        public const int GL_ALLOW_DRAW_WIN_HINT_PGI = ((int)0x1A20F);
+        public const int GL_RG = ((int)0x8227);
+        public const int GL_STATIC_READ = ((int)0x88E5);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = ((int)0x8211);
+        public const int GL_SWIZZLE_STQ_DQ_ATI = ((int)0x8979);
+        public const int GL_MAP2_VERTEX_ATTRIB7_4_NV = ((int)0x8677);
+        public const int GL_TEXTURE10 = ((int)0x84CA);
+        public const int GL_STENCIL = ((int)0x1802);
+        public const int GL_LUMINANCE16_ALPHA16 = ((int)0x8048);
+        public const int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = ((int)0x8B49);
+        public const int GL_POINT_SIZE_MIN_SGIS = ((int)0x8126);
+        public const int GL_LINEAR = ((int)0x2601);
+        public const int GL_MAP_READ_BIT = ((int)0x0001);
+        public const int GL_TEXTURE_BLUE_SIZE_EXT = ((int)0x805E);
+        public const int GL_HISTOGRAM_ALPHA_SIZE_EXT = ((int)0x802B);
+        public const int GL_COLOR_ATTACHMENT7 = ((int)0x8CE7);
+        public const int GL_QUAD_ALPHA4_SGIS = ((int)0x811E);
+        public const int GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = ((int)0x8B8A);
+        public const int GL_SOURCE2_RGB_ARB = ((int)0x8582);
+        public const int GL_PIXEL_MAP_I_TO_A = ((int)0x0C75);
+        public const int GL_PRESENT_TIME_NV = ((int)0x8E2A);
+        public const int GL_C4UB_V3F = ((int)0x2A23);
+        public const int GL_C4UB_V2F = ((int)0x2A22);
+        public const int GL_VARIABLE_B_NV = ((int)0x8524);
+        public const int GL_RENDERBUFFER_DEPTH_SIZE = ((int)0x8D54);
+        public const int GL_COMPRESSED_ALPHA_ARB = ((int)0x84E9);
+        public const int GL_PROGRAM_FORMAT_ASCII_ARB = ((int)0x8875);
+        public const int GL_VERTEX_PRECLIP_SGIX = ((int)0x83EE);
+        public const int GL_UNSIGNED_INT_10F_11F_11F_REV_EXT = ((int)0x8C3B);
+        public const int GL_BLEND_SRC_RGB_EXT = ((int)0x80C9);
+        public const int GL_OP_SET_GE_EXT = ((int)0x878C);
+        public const int GL_UNSIGNED_INT_SAMPLER_2D_EXT = ((int)0x8DD2);
+        public const int GL_EYE_LINEAR = ((int)0x2400);
+        public const int GL_OUTPUT_TEXTURE_COORD19_EXT = ((int)0x87B0);
+        public const int GL_LERP_ATI = ((int)0x8969);
+        public const int GL_CURRENT_BIT = ((int)0x00000001);
+        public const int GL_COMBINE_ALPHA_ARB = ((int)0x8572);
+        public const int GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI = ((int)0x80B3);
+        public const int GL_BACK_SECONDARY_COLOR_NV = ((int)0x8C78);
+        public const int GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX = ((int)0x840B);
+        public const int GL_CUBIC_EXT = ((int)0x8334);
+        public const int GL_COLOR_TABLE_ALPHA_SIZE_SGI = ((int)0x80DD);
+        public const int GL_MAX_VERTEX_SHADER_VARIANTS_EXT = ((int)0x87C6);
+        public const int GL_ARRAY_BUFFER_ARB = ((int)0x8892);
+        public const int GL_TEXTURE_LOD_BIAS_R_SGIX = ((int)0x8190);
+        public const int GL_POINT_SMOOTH_HINT = ((int)0x0C51);
+        public const int GL_LIGHT7 = ((int)0x4007);
+        public const int GL_BUFFER_MAP_POINTER_ARB = ((int)0x88BD);
+        public const int GL_MAX_VERTEX_UNITS_ARB = ((int)0x86A4);
+        public const int GL_DEPENDENT_GB_TEXTURE_2D_NV = ((int)0x86EA);
+        public const int GL_COLOR_TABLE_BIAS_SGI = ((int)0x80D7);
+        public const int GL_MAX_LIGHTS = ((int)0x0D31);
+        public const int GL_DSDT8_MAG8_INTENSITY8_NV = ((int)0x870B);
+        public const int GL_MATRIX0_ARB = ((int)0x88C0);
+        public const int GL_ALLOW_DRAW_MEM_HINT_PGI = ((int)0x1A211);
+        public const int GL_EDGE_FLAG_ARRAY_EXT = ((int)0x8079);
+        public const int GL_ALPHA_INTEGER = ((int)0x8D97);
+        public const int GL_FLOAT_MAT2_ARB = ((int)0x8B5A);
+        public const int GL_VERTEX_ATTRIB_ARRAY_SIZE = ((int)0x8623);
+        public const int GL_ACCUM_CLEAR_VALUE = ((int)0x0B80);
+        public const int GL_HI_BIAS_NV = ((int)0x8714);
+        public const int GL_4PASS_0_EXT = ((int)0x80A4);
+        public const int GL_LINEAR_DETAIL_ALPHA_SGIS = ((int)0x8098);
+        public const int GL_MAP2_VERTEX_ATTRIB5_4_NV = ((int)0x8675);
+        public const int GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB = ((int)0x8B4D);
+        public const int GL_FRAGMENT_SHADER_ARB = ((int)0x8B30);
+        public const int GL_MAX_RATIONAL_EVAL_ORDER_NV = ((int)0x86D7);
+        public const int GL_CURRENT_SECONDARY_COLOR_EXT = ((int)0x8459);
+        public const int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = ((int)0x889F);
+        public const int GL_MIRROR_CLAMP_TO_BORDER_EXT = ((int)0x8912);
+        public const int GL_BLUE_BIAS = ((int)0x0D1B);
+        public const int GL_MAP2_NORMAL = ((int)0x0DB2);
+        public const int GL_RENDERBUFFER_BINDING_EXT = ((int)0x8CA7);
+        public const int GL_HALF_FLOAT = ((int)0x140B);
+        public const int GL_SOURCE1_ALPHA = ((int)0x8589);
+        public const int GL_FOG_COORDINATE_SOURCE = ((int)0x8450);
+        public const int GL_COLOR_BUFFER_BIT = ((int)0x00004000);
+        public const int GL_BIAS_BIT_ATI = ((int)0x00000008);
+        public const int GL_SHADER_CONSISTENT_NV = ((int)0x86DD);
+        public const int GL_LUMINANCE12_ALPHA4_EXT = ((int)0x8046);
+        public const int GL_TEXTURE_LO_SIZE_NV = ((int)0x871C);
+        public const int GL_UNSIGNED_INT_VEC3_EXT = ((int)0x8DC7);
+        public const int GL_POST_CONVOLUTION_GREEN_SCALE_EXT = ((int)0x801D);
+        public const int GL_DEPENDENT_HILO_TEXTURE_2D_NV = ((int)0x8858);
+        public const int GL_STACK_UNDERFLOW = ((int)0x0504);
+        public const int GL_PIXEL_PACK_BUFFER_BINDING_ARB = ((int)0x88ED);
+        public const int GL_FOG_DISTANCE_MODE_NV = ((int)0x855A);
+        public const int GL_TEXTURE_MATERIAL_FACE_EXT = ((int)0x8351);
+        public const int GL_CONVOLUTION_FORMAT = ((int)0x8017);
+        public const int GL_CW = ((int)0x0900);
+        public const int GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI = ((int)0x00200000);
+        public const int GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = ((int)0x87CC);
+        public const int GL_CONSTANT_ALPHA = ((int)0x8003);
+        public const int GL_VERTEX_SOURCE_ATI = ((int)0x8774);
+        public const int GL_NATIVE_GRAPHICS_HANDLE_PGI = ((int)0x1A202);
+        public const int GL_COLOR_TABLE_GREEN_SIZE = ((int)0x80DB);
+        public const int GL_SAMPLE_BUFFERS_3DFX = ((int)0x86B3);
+        public const int GL_DRAW_BUFFER8 = ((int)0x882D);
+        public const int GL_TEXTURE_BINDING_CUBE_MAP_EXT = ((int)0x8514);
+        public const int GL_UNSIGNED_INT_SAMPLER_CUBE = ((int)0x8DD4);
+        public const int GL_EVAL_BIT = ((int)0x00010000);
+        public const int GL_MODELVIEW9_ARB = ((int)0x8729);
+        public const int GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB = ((int)0x88AF);
+        public const int GL_4PASS_0_SGIS = ((int)0x80A4);
+        public const int GL_REG_7_ATI = ((int)0x8928);
+        public const int GL_ALPHA_TEST_REF = ((int)0x0BC2);
+        public const int GL_LIGHT_MODEL_TWO_SIDE = ((int)0x0B52);
+        public const int GL_ALLOW_DRAW_OBJ_HINT_PGI = ((int)0x1A20E);
+        public const int GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV = ((int)0x8533);
+        public const int GL_UNSIGNED_INT_VEC2_EXT = ((int)0x8DC6);
+        public const int GL_REG_31_ATI = ((int)0x8940);
+        public const int GL_INVALID_FRAMEBUFFER_OPERATION_EXT = ((int)0x0506);
+        public const int GL_PACK_SKIP_IMAGES = ((int)0x806B);
+        public const int GL_DRAW_PIXELS_APPLE = ((int)0x8A0A);
+        public const int GL_LINES_ADJACENCY_EXT = ((int)0x000A);
+        public const int GL_MATRIX_INDEX_ARRAY_STRIDE_ARB = ((int)0x8848);
+        public const int GL_SAMPLER_1D_ARRAY_SHADOW_EXT = ((int)0x8DC3);
+        public const int GL_DS_SCALE_NV = ((int)0x8710);
+        public const int GL_MAP2_VERTEX_3 = ((int)0x0DB7);
+        public const int GL_POINT_SIZE = ((int)0x0B11);
+        public const int GL_MAP2_VERTEX_4 = ((int)0x0DB8);
+        public const int GL_LINE_STRIP_ADJACENCY_EXT = ((int)0x000B);
+        public const int GL_VERTEX_ARRAY_POINTER = ((int)0x808E);
+        public const int GL_MATRIX24_ARB = ((int)0x88D8);
+        public const int GL_MAX_SAMPLES = ((int)0x8D57);
+        public const int GL_FLOAT_MAT2x4 = ((int)0x8B66);
+        public const int GL_SOURCE0_ALPHA_EXT = ((int)0x8588);
+        public const int GL_VERTEX_ARRAY_RANGE_POINTER_NV = ((int)0x8521);
+        public const int GL_SPARE0_NV = ((int)0x852E);
+        public const int GL_LINE_WIDTH_RANGE = ((int)0x0B22);
+        public const int GL_CON_2_ATI = ((int)0x8943);
+        public const int GL_TEXTURE_COORD_ARRAY_TYPE_EXT = ((int)0x8089);
+        public const int GL_OP_LOG_BASE_2_EXT = ((int)0x8792);
+        public const int GL_POST_CONVOLUTION_ALPHA_SCALE = ((int)0x801F);
+        public const int GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV = ((int)0x88F4);
+        public const int GL_NUM_LOOPBACK_COMPONENTS_ATI = ((int)0x8974);
+        public const int GL_EDGE_FLAG_ARRAY_POINTER_EXT = ((int)0x8093);
+        public const int GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = ((int)0x880E);
+        public const int GL_SEPARATE_ATTRIBS_EXT = ((int)0x8C8D);
+        public const int GL_MAX_ARRAY_TEXTURE_LAYERS = ((int)0x88FF);
+        public const int GL_RGBA_S3TC = ((int)0x83A2);
+        public const int GL_TEXTURE_PRE_SPECULAR_HP = ((int)0x8169);
+        public const int GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB = ((int)0x88A7);
+        public const int GL_VARIABLE_D_NV = ((int)0x8526);
+        public const int GL_QUERY_COUNTER_BITS = ((int)0x8864);
+        public const int GL_MAX_RECTANGLE_TEXTURE_SIZE_NV = ((int)0x84F8);
+        public const int GL_COLOR_ATTACHMENT3_EXT = ((int)0x8CE3);
+        public const int GL_PRIMITIVE_ID_NV = ((int)0x8C7C);
+        public const int GL_CONST_EYE_NV = ((int)0x86E5);
+        public const int GL_MODELVIEW23_ARB = ((int)0x8737);
+        public const int GL_TEXTURE_SHARED_SIZE_EXT = ((int)0x8C3F);
+        public const int GL_PROGRAM_NATIVE_PARAMETERS_ARB = ((int)0x88AA);
+        public const int GL_NEAREST_CLIPMAP_NEAREST_SGIX = ((int)0x844D);
+        public const int GL_AUTO_NORMAL = ((int)0x0D80);
+        public const int GL_CONVOLUTION_WIDTH = ((int)0x8018);
+        public const int GL_TEXTURE_COMPRESSED = ((int)0x86A1);
+        public const int GL_MINOR_VERSION = ((int)0x821C);
+        public const int GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT = ((int)0x8517);
+        public const int GL_BLEND = ((int)0x0BE2);
+        public const int GL_ARRAY_ELEMENT_LOCK_COUNT_EXT = ((int)0x81A9);
+        public const int GL_COMBINER_SCALE_NV = ((int)0x8548);
+        public const int GL_STENCIL_FUNC = ((int)0x0B92);
+        public const int GL_POST_CONVOLUTION_ALPHA_BIAS = ((int)0x8023);
+        public const int GL_MAP1_VERTEX_ATTRIB13_4_NV = ((int)0x866D);
+        public const int GL_ELEMENT_ARRAY_TYPE_ATI = ((int)0x8769);
+        public const int GL_MAX_PROGRAM_CALL_DEPTH_NV = ((int)0x88F5);
+        public const int GL_IUI_V2F_EXT = ((int)0x81AD);
+        public const int GL_MODELVIEW7_ARB = ((int)0x8727);
+        public const int GL_GEOMETRY_OUTPUT_TYPE_ARB = ((int)0x8DDC);
+        public const int GL_COMPRESSED_RGBA_ARB = ((int)0x84EE);
+        public const int GL_COLOR_ARRAY_POINTER = ((int)0x8090);
+        public const int GL_RENDERBUFFER_STENCIL_SIZE = ((int)0x8D55);
+        public const int GL_INDEX_ARRAY_EXT = ((int)0x8077);
+        public const int GL_LUMINANCE32UI_EXT = ((int)0x8D74);
+        public const int GL_TEXTURE_COORD_NV = ((int)0x8C79);
+        public const int GL_TEXTURE7_ARB = ((int)0x84C7);
+        public const int GL_BGR_EXT = ((int)0x80E0);
+        public const int GL_TEXTURE_COMPARE_MODE_ARB = ((int)0x884C);
+        public const int GL_BGR = ((int)0x80E0);
+        public const int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT = ((int)0x8C8B);
+        public const int GL_SOURCE0_RGB_ARB = ((int)0x8580);
+        public const int GL_HISTOGRAM_WIDTH_EXT = ((int)0x8026);
+        public const int GL_LINE_STRIP = ((int)0x0003);
+        public const int GL_VERTEX_ARRAY_SIZE_EXT = ((int)0x807A);
+        public const int GL_LIGHT6 = ((int)0x4006);
+        public const int GL_DUAL_LUMINANCE4_SGIS = ((int)0x8114);
+        public const int GL_VERTEX_SHADER_OPTIMIZED_EXT = ((int)0x87D4);
+        public const int GL_TEXTURE20_ARB = ((int)0x84D4);
+        public const int GL_SWIZZLE_STR_DR_ATI = ((int)0x8978);
+        public const int GL_CURRENT_TIME_NV = ((int)0x8E28);
+        public const int GL_SAMPLE_MASK_VALUE_SGIS = ((int)0x80AA);
+        public const int GL_NORMAL_ARRAY_STRIDE_EXT = ((int)0x807F);
+        public const int GL_POINT_SIZE_MAX_ARB = ((int)0x8127);
+        public const int GL_COMPRESSED_ALPHA = ((int)0x84E9);
+        public const int GL_2PASS_0_SGIS = ((int)0x80A2);
+        public const int GL_RGB8 = ((int)0x8051);
+        public const int GL_BITMAP_TOKEN = ((int)0x0704);
+        public const int GL_VERTEX_ARRAY = ((int)0x8074);
+        public const int GL_VERTEX_ARRAY_RANGE_VALID_NV = ((int)0x851F);
+        public const int GL_POST_CONVOLUTION_COLOR_TABLE_SGI = ((int)0x80D1);
+        public const int GL_SAMPLES_ARB = ((int)0x80A9);
+        public const int GL_REG_27_ATI = ((int)0x893C);
+        public const int GL_STORAGE_SHARED_APPLE = ((int)0x85BF);
+        public const int GL_LINE_STIPPLE = ((int)0x0B24);
+        public const int GL_VERTEX_SHADER = ((int)0x8B31);
+        public const int GL_TANGENT_ARRAY_STRIDE_EXT = ((int)0x843F);
+        public const int GL_OUTPUT_TEXTURE_COORD18_EXT = ((int)0x87AF);
+        public const int GL_FULL_RANGE_EXT = ((int)0x87E1);
+        public const int GL_TEXTURE_MIN_LOD = ((int)0x813A);
+        public const int GL_NEGATIVE_W_EXT = ((int)0x87DC);
+        public const int GL_TEXTURE_WRAP_T = ((int)0x2803);
+        public const int GL_SET = ((int)0x150F);
+        public const int GL_GREEN_INTEGER_EXT = ((int)0x8D95);
+        public const int GL_INDEX_BIT_PGI = ((int)0x00080000);
+        public const int GL_ADD_SIGNED = ((int)0x8574);
+        public const int GL_MULTISAMPLE_SGIS = ((int)0x809D);
+        public const int GL_FLOAT_RG32_NV = ((int)0x8887);
+        public const int GL_OPERAND1_RGB = ((int)0x8591);
+        public const int GL_SPHERE_MAP = ((int)0x2402);
+        public const int GL_INDEX_ARRAY_COUNT_EXT = ((int)0x8087);
+        public const int GL_CONVOLUTION_BORDER_MODE = ((int)0x8013);
+        public const int GL_SIGNED_RGB_NV = ((int)0x86FE);
+        public const int GL_DRAW_BUFFER4 = ((int)0x8829);
+        public const int GL_ONE_MINUS_CONSTANT_COLOR_EXT = ((int)0x8002);
+        public const int GL_DRAW_BUFFER11_ARB = ((int)0x8830);
+        public const int GL_TEXTURE_BUFFER_FORMAT_ARB = ((int)0x8C2E);
+        public const int GL_ACCUM_BUFFER_BIT = ((int)0x00000200);
+        public const int GL_TRIANGLE_MESH_SUN = ((int)0x8615);
+        public const int GL_ASYNC_TEX_IMAGE_SGIX = ((int)0x835C);
+        public const int GL_DEPTH_STENCIL_TO_BGRA_NV = ((int)0x886F);
+        public const int GL_FOG_COORDINATE_ARRAY_TYPE_EXT = ((int)0x8454);
+        public const int GL_NEGATIVE_X_EXT = ((int)0x87D9);
+        public const int GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT = ((int)0x8336);
+        public const int GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX = ((int)0x8178);
+        public const int GL_MAX_ASYNC_READ_PIXELS_SGIX = ((int)0x8361);
+        public const int GL_STATIC_DRAW = ((int)0x88E4);
+        public const int GL_NORMAL_ARRAY_TYPE = ((int)0x807E);
+        public const int GL_LOCAL_CONSTANT_EXT = ((int)0x87C3);
+        public const int GL_STRICT_SCISSOR_HINT_PGI = ((int)0x1A218);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = ((int)0x8CD3);
+        public const int GL_MAP2_VERTEX_ATTRIB11_4_NV = ((int)0x867B);
+        public const int GL_POST_COLOR_MATRIX_RED_SCALE_SGI = ((int)0x80B4);
+        public const int GL_PER_STAGE_CONSTANTS_NV = ((int)0x8535);
+        public const int GL_LUMINANCE4_ALPHA4_EXT = ((int)0x8043);
+        public const int GL_PIXEL_MAP_G_TO_G = ((int)0x0C77);
+        public const int GL_COMBINER_MAPPING_NV = ((int)0x8543);
+        public const int GL_SCISSOR_BIT = ((int)0x00080000);
+        public const int GL_COMBINE_RGB = ((int)0x8571);
+        public const int GL_MATRIX28_ARB = ((int)0x88DC);
+        public const int GL_POINT_FADE_THRESHOLD_SIZE_SGIS = ((int)0x8128);
+        public const int GL_MAP1_VERTEX_ATTRIB1_4_NV = ((int)0x8661);
+        public const int GL_QUERY_WAIT_NV = ((int)0x8E13);
+        public const int GL_ONE_MINUS_DST_ALPHA = ((int)0x0305);
+        public const int GL_TEXTURE_COORD_ARRAY_EXT = ((int)0x8078);
+        public const int GL_OP_FLOOR_EXT = ((int)0x878F);
+        public const int GL_MATRIX30_ARB = ((int)0x88DE);
+        public const int GL_OPERAND2_ALPHA_ARB = ((int)0x859A);
+        public const int GL_NORMAL_ARRAY_LIST_STRIDE_IBM = ((int)103081);
+        public const int GL_PROXY_TEXTURE_2D_ARRAY_EXT = ((int)0x8C1B);
+        public const int GL_CURRENT_FOG_COORD = ((int)GL_CURRENT_FOG_COORDINATE);
+        public const int GL_SIGNED_LUMINANCE8_NV = ((int)0x8702);
+        public const int GL_R32I = ((int)0x8235);
+        public const int GL_PHONG_HINT_WIN = ((int)0x80EB);
+        public const int GL_RGB10_EXT = ((int)0x8052);
+        public const int GL_ZERO = ((int)0);
+        public const int GL_SPOT_DIRECTION = ((int)0x1204);
+        public const int GL_REG_5_ATI = ((int)0x8926);
+        public const int GL_LOCAL_CONSTANT_DATATYPE_EXT = ((int)0x87ED);
+        public const int GL_OUTPUT_TEXTURE_COORD12_EXT = ((int)0x87A9);
+        public const int GL_TRANSFORM_HINT_APPLE = ((int)0x85B1);
+        public const int GL_NORMALIZED_RANGE_EXT = ((int)0x87E0);
+        public const int GL_VERTEX_ARRAY_STRIDE = ((int)0x807C);
+        public const int GL_TEXTURE_BUFFER_ARB = ((int)0x8C2A);
+        public const int GL_DEPTH_COMPONENT32_ARB = ((int)0x81A7);
+        public const int GL_DRAW_BUFFER4_ATI = ((int)0x8829);
+        public const int GL_MATRIX13_ARB = ((int)0x88CD);
+        public const int GL_OFFSET_TEXTURE_2D_SCALE_NV = ((int)GL_OFFSET_TEXTURE_SCALE_NV);
+        public const int GL_DEPTH24_STENCIL8_EXT = ((int)0x88F0);
+        public const int GL_TRIANGLES_ADJACENCY_ARB = ((int)0x000C);
+        public const int GL_VERTEX_ATTRIB_ARRAY1_NV = ((int)0x8651);
+        public const int GL_COLOR_ARRAY_LIST_IBM = ((int)103072);
+        public const int GL_RESAMPLE_ZERO_FILL_OML = ((int)0x8987);
+        public const int GL_LINE_RESET_TOKEN = ((int)0x0707);
+        public const int GL_GEOMETRY_VERTICES_OUT_ARB = ((int)0x8DDA);
+        public const int GL_MATRIX22_ARB = ((int)0x88D6);
+        public const int GL_TEXTURE_COORD_ARRAY_SIZE = ((int)0x8088);
+        public const int GL_TEXTURE_BINDING_RECTANGLE_ARB = ((int)0x84F6);
+        public const int GL_BLUE_BITS = ((int)0x0D54);
+        public const int GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS = ((int)0x8355);
+        public const int GL_PARALLEL_ARRAYS_INTEL = ((int)0x83F4);
+        public const int GL_IMAGE_TRANSLATE_Y_HP = ((int)0x8158);
+        public const int GL_RED_SCALE = ((int)0x0D14);
+        public const int GL_UNPACK_ALIGNMENT = ((int)0x0CF5);
+        public const int GL_C3F_V3F = ((int)0x2A24);
+        public const int GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI = ((int)0x87F8);
+        public const int GL_FRONT_FACE = ((int)0x0B46);
+        public const int GL_DRAW_BUFFER7 = ((int)0x882C);
+        public const int GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT = ((int)0x8DD8);
+        public const int GL_STENCIL_INDEX4 = ((int)0x8D47);
+        public const int GL_OUTPUT_TEXTURE_COORD25_EXT = ((int)0x87B6);
+        public const int GL_NORMAL_ARRAY_POINTER_EXT = ((int)0x808F);
+        public const int GL_COLOR_ATTACHMENT5 = ((int)0x8CE5);
+        public const int GL_AND_REVERSE = ((int)0x1502);
+        public const int GL_MAX_PROGRAM_TEXEL_OFFSET = ((int)0x8905);
+        public const int GL_DRAW_BUFFER7_ARB = ((int)0x882C);
+        public const int GL_OCCLUSION_TEST_RESULT_HP = ((int)0x8166);
+        public const int GL_READ_FRAMEBUFFER = ((int)0x8CA8);
+        public const int GL_SLUMINANCE8_ALPHA8_EXT = ((int)0x8C45);
+        public const int GL_SPRITE_MODE_SGIX = ((int)0x8149);
+        public const int GL_TEXTURE_LUMINANCE_SIZE_EXT = ((int)0x8060);
+        public const int GL_DOT_PRODUCT_TEXTURE_1D_NV = ((int)0x885C);
+        public const int GL_CONVOLUTION_HINT_SGIX = ((int)0x8316);
+        public const int GL_MAP1_VERTEX_3 = ((int)0x0D97);
+        public const int GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX = ((int)0x8312);
+        public const int GL_EVAL_VERTEX_ATTRIB15_NV = ((int)0x86D5);
+        public const int GL_MAP1_VERTEX_4 = ((int)0x0D98);
+        public const int GL_INCR_WRAP_EXT = ((int)0x8507);
+        public const int GL_POST_COLOR_MATRIX_BLUE_SCALE = ((int)0x80B6);
+        public const int GL_ALPHA16_EXT = ((int)0x803E);
+        public const int GL_TEXTURE_GREEN_TYPE = ((int)0x8C11);
+        public const int GL_RGB16F = ((int)0x881B);
+        public const int GL_MAX_CONVOLUTION_HEIGHT = ((int)0x801B);
+        public const int GL_FRAGMENT_LIGHT7_SGIX = ((int)0x8413);
+        public const int GL_RGBA12 = ((int)0x805A);
+        public const int GL_TEXTURE_DEPTH_TYPE = ((int)0x8C16);
+        public const int GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = ((int)0x87C8);
+        public const int GL_MODELVIEW24_ARB = ((int)0x8738);
+        public const int GL_OP_MIN_EXT = ((int)0x878B);
+        public const int GL_4PASS_1_EXT = ((int)0x80A5);
+        public const int GL_PIXEL_MAP_I_TO_I_SIZE = ((int)0x0CB0);
+        public const int GL_SOURCE1_RGB_ARB = ((int)0x8581);
+        public const int GL_TEXTURE2 = ((int)0x84C2);
+        public const int GL_PIXEL_COUNT_NV = ((int)0x8866);
+        public const int GL_TEXTURE_RED_SIZE_EXT = ((int)0x805C);
+        public const int GL_NEGATE_BIT_ATI = ((int)0x00000004);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT = ((int)0x8C8F);
+        public const int GL_SAMPLE_ALPHA_TO_ONE = ((int)0x809F);
+        public const int GL_INDEX_MATERIAL_FACE_EXT = ((int)0x81BA);
+        public const int GL_VARIANT_VALUE_EXT = ((int)0x87E4);
+        public const int GL_TEXTURE_MULTI_BUFFER_HINT_SGIX = ((int)0x812E);
+        public const int GL_LO_SCALE_NV = ((int)0x870F);
+        public const int GL_PROJECTION = ((int)0x1701);
+        public const int GL_TEXTURE8_ARB = ((int)0x84C8);
+        public const int GL_FRONT = ((int)0x0404);
+        public const int GL_SAMPLE_ALPHA_TO_ONE_SGIS = ((int)0x809F);
+        public const int GL_LUMINANCE16F_ARB = ((int)0x881E);
+        public const int GL_DRAW_BUFFER12_ATI = ((int)0x8831);
+        public const int GL_DEPTH_STENCIL_ATTACHMENT = ((int)0x821A);
+        public const int GL_MAX_PROGRAM_RESULT_COMPONENTS_NV = ((int)0x8909);
+        public const int GL_SAMPLE_COVERAGE = ((int)0x80A0);
+        public const int GL_EYE_RADIAL_NV = ((int)0x855B);
+        public const int GL_FOG_COORD_SRC = ((int)GL_FOG_COORDINATE_SOURCE);
+        public const int GL_MAX_CLIPMAP_DEPTH_SGIX = ((int)0x8177);
+        public const int GL_COLOR_TABLE_RED_SIZE = ((int)0x80DA);
+        public const int GL_LUMINANCE8_EXT = ((int)0x8040);
+        public const int GL_DUAL_ALPHA4_SGIS = ((int)0x8110);
+        public const int GL_OUTPUT_VERTEX_EXT = ((int)0x879A);
+        public const int GL_RGB8UI_EXT = ((int)0x8D7D);
+        public const int GL_T2F_C3F_V3F = ((int)0x2A2A);
+        public const int GL_STRICT_LIGHTING_HINT_PGI = ((int)0x1A217);
+        public const int GL_PIXEL_SUBSAMPLE_4242_SGIX = ((int)0x85A4);
+        public const int GL_MAP1_TEXTURE_COORD_4 = ((int)0x0D96);
+        public const int GL_COLOR_ATTACHMENT2_EXT = ((int)0x8CE2);
+        public const int GL_OUTPUT_FOG_EXT = ((int)0x87BD);
+        public const int GL_MAP2_VERTEX_ATTRIB1_4_NV = ((int)0x8671);
+        public const int GL_UNSIGNED_INT = ((int)0x1405);
+        public const int GL_INCR_WRAP = ((int)0x8507);
+        public const int GL_SLUMINANCE = ((int)0x8C46);
+        public const int GL_VERTEX23_BIT_PGI = ((int)0x00000004);
+        public const int GL_OPERAND3_ALPHA_NV = ((int)0x859B);
+        public const int GL_IMAGE_SCALE_X_HP = ((int)0x8155);
+        public const int GL_RENDER = ((int)0x1C00);
+        public const int GL_RED_INTEGER_EXT = ((int)0x8D94);
+        public const int GL_SOURCE1_ALPHA_ARB = ((int)0x8589);
+        public const int GL_MAX_ARRAY_TEXTURE_LAYERS_EXT = ((int)0x88FF);
+        public const int GL_4PASS_2_SGIS = ((int)0x80A6);
+        public const int GL_2PASS_1_EXT = ((int)0x80A3);
+        public const int GL_POST_COLOR_MATRIX_GREEN_SCALE = ((int)0x80B5);
+        public const int GL_PACK_ALIGNMENT = ((int)0x0D05);
+        public const int GL_MAP2_VERTEX_ATTRIB12_4_NV = ((int)0x867C);
+        public const int GL_RENDERBUFFER_EXT = ((int)0x8D41);
+        public const int GL_4PASS_1_SGIS = ((int)0x80A5);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT = ((int)0x8DA7);
+        public const int GL_RGB32UI = ((int)0x8D71);
+        public const int GL_NORMAL_BIT_PGI = ((int)0x08000000);
+        public const int GL_SIGNED_RGBA8_NV = ((int)0x86FC);
+        public const int GL_FLOAT_MAT4_ARB = ((int)0x8B5C);
+        public const int GL_INDEX_LOGIC_OP = ((int)0x0BF1);
+        public const int GL_TEXTURE_INTENSITY_TYPE = ((int)0x8C15);
+        public const int GL_SCREEN_COORDINATES_REND = ((int)0x8490);
+        public const int GL_DEPTH_FUNC = ((int)0x0B74);
+        public const int GL_T2F_C4F_N3F_V3F = ((int)0x2A2C);
+        public const int GL_DRAW_BUFFER9_ATI = ((int)0x882E);
+        public const int GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT = ((int)0x87C5);
+        public const int GL_TRANSFORM_FEEDBACK_ATTRIBS_NV = ((int)0x8C7E);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = ((int)0x8C8F);
+        public const int GL_SELECT = ((int)0x1C02);
+        public const int GL_MAX_VERTEX_HINT_PGI = ((int)0x1A22D);
+        public const int GL_DEPTH_COMPONENT24_ARB = ((int)0x81A6);
+        public const int GL_NORMAL_ARRAY_EXT = ((int)0x8075);
+        public const int GL_OPERAND2_RGB_ARB = ((int)0x8592);
+        public const int GL_MINMAX_SINK = ((int)0x8030);
+        public const int GL_TEXTURE_RED_SIZE = ((int)0x805C);
+        public const int GL_STENCIL_BUFFER = ((int)0x8224);
+        public const int GL_CON_27_ATI = ((int)0x895C);
+        public const int GL_DRAW_BUFFER3_ARB = ((int)0x8828);
+        public const int GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT = ((int)0x87CD);
+        public const int GL_DEPTH_TEXTURE_MODE = ((int)0x884B);
+        public const int GL_QUAD_INTENSITY8_SGIS = ((int)0x8123);
+        public const int GL_PROXY_TEXTURE_2D_EXT = ((int)0x8064);
+        public const int GL_DRAW_FRAMEBUFFER = ((int)0x8CA9);
+        public const int GL_NEGATIVE_ONE_EXT = ((int)0x87DF);
+        public const int GL_COLOR_TABLE_RED_SIZE_SGI = ((int)0x80DA);
+        public const int GL_POLYGON_OFFSET_EXT = ((int)0x8037);
+        public const int GL_DRAW_BUFFER6_ARB = ((int)0x882B);
+        public const int GL_COLOR_ATTACHMENT9_EXT = ((int)0x8CE9);
+        public const int GL_INTENSITY16UI_EXT = ((int)0x8D79);
+        public const int GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI = ((int)0x80BA);
+        public const int GL_MAX_4D_TEXTURE_SIZE_SGIS = ((int)0x8138);
+        public const int GL_DIFFUSE = ((int)0x1201);
+        public const int GL_CND0_ATI = ((int)0x896B);
+        public const int GL_NAME_STACK_DEPTH = ((int)0x0D70);
+        public const int GL_TEXTURE_BUFFER_EXT = ((int)0x8C2A);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT = ((int)0x8CD2);
+        public const int GL_NUM_FRAGMENT_REGISTERS_ATI = ((int)0x896E);
+        public const int GL_PRIMITIVES_GENERATED_EXT = ((int)0x8C87);
+        public const int GL_PROGRAM_NATIVE_TEMPORARIES_ARB = ((int)0x88A6);
+        public const int GL_FRAMEBUFFER_DEFAULT = ((int)0x8218);
+        public const int GL_RGBA16UI_EXT = ((int)0x8D76);
+        public const int GL_MATRIX26_ARB = ((int)0x88DA);
+        public const int GL_MULT = ((int)0x0103);
+        public const int GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = ((int)0x886A);
+        public const int GL_REG_23_ATI = ((int)0x8938);
+        public const int GL_KEEP = ((int)0x1E00);
+        public const int GL_OUTPUT_TEXTURE_COORD9_EXT = ((int)0x87A6);
+        public const int GL_CURRENT_VERTEX_ATTRIB_ARB = ((int)0x8626);
+        public const int GL_POLYGON_STIPPLE = ((int)0x0B42);
+        public const int GL_ALPHA8I_EXT = ((int)0x8D90);
+        public const int GL_INT_SAMPLER_1D = ((int)0x8DC9);
+        public const int GL_COLOR_ATTACHMENT12_EXT = ((int)0x8CEC);
+        public const int GL_TEXTURE_NORMAL_EXT = ((int)0x85AF);
+        public const int GL_CMYKA_EXT = ((int)0x800D);
+        public const int GL_CLAMP_TO_EDGE_SGIS = ((int)0x812F);
+        public const int GL_SPOT_CUTOFF = ((int)0x1206);
+        public const int GL_OUTPUT_TEXTURE_COORD2_EXT = ((int)0x879F);
+        public const int GL_IR_INSTRUMENT1_SGIX = ((int)0x817F);
+        public const int GL_COLOR_ARRAY_BUFFER_BINDING = ((int)0x8898);
+        public const int GL_DUAL_LUMINANCE_ALPHA8_SGIS = ((int)0x811D);
+        public const int GL_TEXTURE9_ARB = ((int)0x84C9);
+        public const int GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT = ((int)0x8DE0);
+        public const int GL_RGB8UI = ((int)0x8D7D);
+        public const int GL_COMBINER_AB_OUTPUT_NV = ((int)0x854A);
+        public const int GL_FUNC_REVERSE_SUBTRACT_EXT = ((int)0x800B);
+        public const int GL_TEXTURE16 = ((int)0x84D0);
+        public const int GL_TEXTURE17 = ((int)0x84D1);
+        public const int GL_ADD_SIGNED_ARB = ((int)0x8574);
+        public const int GL_TEXTURE15 = ((int)0x84CF);
+        public const int GL_TEXTURE12 = ((int)0x84CC);
+        public const int GL_TEXTURE13 = ((int)0x84CD);
+        public const int GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI = ((int)0x80B6);
+        public const int GL_TEXTURE11 = ((int)0x84CB);
+        public const int GL_YCRCB_422_SGIX = ((int)0x81BB);
+        public const int GL_MINMAX_EXT = ((int)0x802E);
+        public const int GL_NUM_INSTRUCTIONS_TOTAL_ATI = ((int)0x8972);
+        public const int GL_TEXTURE18 = ((int)0x84D2);
+        public const int GL_TEXTURE19 = ((int)0x84D3);
+        public const int GL_POLYGON = ((int)0x0009);
+        public const int GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT = ((int)0x87CB);
+        public const int GL_OFFSET_TEXTURE_2D_NV = ((int)0x86E8);
+        public const int GL_TEXTURE_COMPARE_MODE = ((int)0x884C);
+        public const int GL_INDEX_MATERIAL_PARAMETER_EXT = ((int)0x81B9);
+        public const int GL_FOG_MODE = ((int)0x0B65);
+        public const int GL_SECONDARY_INTERPOLATOR_ATI = ((int)0x896D);
+        public const int GL_TEXTURE_COMPONENTS = ((int)0x1003);
+        public const int GL_VERTEX_PROGRAM_TWO_SIDE_ARB = ((int)0x8643);
+        public const int GL_NORMAL_ARRAY_COUNT_EXT = ((int)0x8080);
+        public const int GL_PIXEL_PACK_BUFFER_EXT = ((int)0x88EB);
+        public const int GL_MODULATE = ((int)0x2100);
+        public const int GL_INT_VEC2_ARB = ((int)0x8B53);
+        public const int GL_FUNC_SUBTRACT_EXT = ((int)0x800A);
+        public const int GL_REG_1_ATI = ((int)0x8922);
+        public const int GL_DRAW_BUFFER4_ARB = ((int)0x8829);
+        public const int GL_2PASS_1_SGIS = ((int)0x80A3);
+        public const int GL_REG_26_ATI = ((int)0x893B);
+        public const int GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV = ((int)0x885A);
+        public const int GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT = ((int)0x845C);
+        public const int GL_TEXTURE_BINDING_1D_ARRAY_EXT = ((int)0x8C1C);
+        public const int GL_COMBINE_RGB_EXT = ((int)0x8571);
+        public const int GL_TEXTURE_DS_SIZE_NV = ((int)0x871D);
+        public const int GL_VERTEX_SHADER_BINDING_EXT = ((int)0x8781);
+        public const int GL_COLOR_ATTACHMENT5_EXT = ((int)0x8CE5);
+        public const int GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI = ((int)0x8803);
+        public const int GL_MODELVIEW29_ARB = ((int)0x873D);
+        public const int GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX = ((int)0x8187);
+        public const int GL_FLOAT_MAT3x2 = ((int)0x8B67);
+        public const int GL_INTERLEAVED_ATTRIBS_NV = ((int)0x8C8C);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT = ((int)0x8D56);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = ((int)0x8CD1);
+        public const int GL_TEXTURE_ENV = ((int)0x2300);
+        public const int GL_TEXTURE_CLIPMAP_CENTER_SGIX = ((int)0x8171);
+        public const int GL_POLYGON_OFFSET_POINT = ((int)0x2A01);
+        public const int GL_OUTPUT_TEXTURE_COORD8_EXT = ((int)0x87A5);
+        public const int GL_UNPACK_RESAMPLE_OML = ((int)0x8985);
+        public const int GL_CURRENT_NORMAL = ((int)0x0B02);
+        public const int GL_STEREO = ((int)0x0C33);
+        public const int GL_DEFORMATIONS_MASK_SGIX = ((int)0x8196);
+        public const int GL_DUAL_LUMINANCE16_SGIS = ((int)0x8117);
+        public const int GL_TEXTURE_DT_SIZE_NV = ((int)0x871E);
+        public const int GL_STATIC_READ_ARB = ((int)0x88E5);
+        public const int GL_SAMPLER_1D_SHADOW_ARB = ((int)0x8B61);
+        public const int GL_MODELVIEW18_ARB = ((int)0x8732);
+        public const int GL_PROGRAM_BINDING_ARB = ((int)0x8677);
+        public const int GL_SMOOTH = ((int)0x1D01);
+        public const int GL_INTERPOLATE = ((int)0x8575);
+        public const int GL_POST_CONVOLUTION_GREEN_BIAS_EXT = ((int)0x8021);
+        public const int GL_SATURATE_BIT_ATI = ((int)0x00000040);
+        public const int GL_POLYGON_OFFSET_UNITS = ((int)0x2A00);
+        public const int GL_OUTPUT_TEXTURE_COORD26_EXT = ((int)0x87B7);
+        public const int GL_VERTEX_PROGRAM_TWO_SIDE_NV = ((int)0x8643);
+        public const int GL_READ_WRITE = ((int)0x88BA);
+        public const int GL_MIN_PROGRAM_TEXEL_OFFSET_NV = ((int)0x8904);
+        public const int GL_COPY_PIXEL_TOKEN = ((int)0x0706);
+        public const int GL_INVALID_OPERATION = ((int)0x0502);
+        public const int GL_EVAL_VERTEX_ATTRIB5_NV = ((int)0x86CB);
+        public const int GL_DETAIL_TEXTURE_2D_BINDING_SGIS = ((int)0x8096);
+        public const int GL_HISTOGRAM_ALPHA_SIZE = ((int)0x802B);
+        public const int GL_RGBA32F = ((int)0x8814);
+        public const int GL_MAX_CUBE_MAP_TEXTURE_SIZE = ((int)0x851C);
+        public const int GL_LUMINANCE6_ALPHA2_EXT = ((int)0x8044);
+        public const int GL_MAX_CLIP_DISTANCES = ((int)GL_MAX_CLIP_PLANES);
+        public const int GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT = ((int)0x8519);
+        public const int GL_FENCE_CONDITION_NV = ((int)0x84F4);
+        public const int GL_PROGRAM_TEX_INSTRUCTIONS_ARB = ((int)0x8806);
+        public const int GL_DYNAMIC_COPY = ((int)0x88EA);
+        public const int GL_PIXEL_TEX_GEN_MODE_SGIX = ((int)0x832B);
+        public const int GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI = ((int)0x80D4);
+        public const int GL_UNSIGNED_INT_SAMPLER_1D_EXT = ((int)0x8DD1);
+        public const int GL_LUMINANCE_ALPHA16UI_EXT = ((int)0x8D7B);
+        public const int GL_CLIP_PLANE5 = ((int)0x3005);
+        public const int GL_CLIP_PLANE4 = ((int)0x3004);
+        public const int GL_CLAMP_TO_BORDER_SGIS = ((int)0x812D);
+        public const int GL_CLIP_PLANE1 = ((int)0x3001);
+        public const int GL_TEXTURE_ENV_COLOR = ((int)0x2201);
+        public const int GL_CLIP_PLANE3 = ((int)0x3003);
+        public const int GL_CLIP_PLANE2 = ((int)0x3002);
+        public const int GL_INTENSITY16I_EXT = ((int)0x8D8B);
+        public const int GL_LINE_STIPPLE_REPEAT = ((int)0x0B26);
+        public const int GL_POST_CONVOLUTION_BLUE_SCALE = ((int)0x801E);
+        public const int GL_SWIZZLE_STRQ_DQ_ATI = ((int)0x897B);
+        public const int GL_STENCIL_REF = ((int)0x0B97);
+        public const int GL_PIXEL_MAP_I_TO_A_SIZE = ((int)0x0CB5);
+        public const int GL_IMAGE_TRANSLATE_X_HP = ((int)0x8157);
+        public const int GL_TEXTURE24_ARB = ((int)0x84D8);
+        public const int GL_FASTEST = ((int)0x1101);
+        public const int GL_4X_BIT_ATI = ((int)0x00000002);
+        public const int GL_DSDT_MAG_NV = ((int)0x86F6);
+        public const int GL_COMBINE_ALPHA_EXT = ((int)0x8572);
+        public const int GL_SUB_ATI = ((int)0x8965);
+        public const int GL_COMPRESSED_LUMINANCE_LATC1_EXT = ((int)0x8C70);
+        public const int GL_WRITE_ONLY = ((int)0x88B9);
+        public const int GL_MIRROR_CLAMP_ATI = ((int)0x8742);
+        public const int GL_MAP1_VERTEX_ATTRIB0_4_NV = ((int)0x8660);
+        public const int GL_TEXTURE_CONSTANT_DATA_SUNX = ((int)0x81D6);
+        public const int GL_DUAL_LUMINANCE8_SGIS = ((int)0x8115);
+        public const int GL_INDEX_WRITEMASK = ((int)0x0C21);
+        public const int GL_SAMPLE_ALPHA_TO_COVERAGE_ARB = ((int)0x809E);
+        public const int GL_ACTIVE_VARYINGS_NV = ((int)0x8C81);
+        public const int GL_POINT_SPRITE_NV = ((int)0x8861);
+        public const int GL_FUNC_ADD_EXT = ((int)0x8006);
+        public const int GL_PERSPECTIVE_CORRECTION_HINT = ((int)0x0C50);
+        public const int GL_RG8I = ((int)0x8237);
+        public const int GL_ALPHA8 = ((int)0x803C);
+        public const int GL_RENDER_MODE = ((int)0x0C40);
+        public const int GL_OP_ROUND_EXT = ((int)0x8790);
+        public const int GL_VERTEX_ARRAY_COUNT_EXT = ((int)0x807D);
+        public const int GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV = ((int)0x8868);
+        public const int GL_ADD = ((int)0x0104);
+        public const int GL_MAX_TEXTURE_UNITS = ((int)0x84E2);
+        public const int GL_PROGRAM_TEMPORARIES_ARB = ((int)0x88A4);
+        public const int GL_COLOR_ARRAY_STRIDE_EXT = ((int)0x8083);
+        public const int GL_POLYGON_SMOOTH_HINT = ((int)0x0C53);
+        public const int GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX = ((int)0x8186);
+        public const int GL_DECAL = ((int)0x2101);
+        public const int GL_INDEX_ARRAY_LIST_IBM = ((int)103073);
+        public const int GL_1PASS_SGIS = ((int)0x80A1);
+        public const int GL_TEXTURE_BINDING_CUBE_MAP = ((int)0x8514);
+        public const int GL_UNSIGNED_INT_8_8_8_8_REV_EXT = ((int)0x8367);
+        public const int GL_UNPACK_ROW_LENGTH = ((int)0x0CF2);
+        public const int GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV = ((int)0x88FD);
+        public const int GL_MAP1_VERTEX_ATTRIB15_4_NV = ((int)0x866F);
+        public const int GL_ENABLE_BIT = ((int)0x00002000);
+        public const int GL_EVAL_VERTEX_ATTRIB4_NV = ((int)0x86CA);
+        public const int GL_INTERLACE_SGIX = ((int)0x8094);
+        public const int GL_FLOAT_MAT4 = ((int)0x8B5C);
+        public const int GL_SAMPLER_3D_ARB = ((int)0x8B5F);
+        public const int GL_CON_22_ATI = ((int)0x8957);
+        public const int GL_PN_TRIANGLES_NORMAL_MODE_ATI = ((int)0x87F3);
+        public const int GL_FOG_OFFSET_SGIX = ((int)0x8198);
+        public const int GL_CONSTANT_ATTENUATION = ((int)0x1207);
+        public const int GL_HALF_BIT_ATI = ((int)0x00000008);
+        public const int GL_ADD_SIGNED_EXT = ((int)0x8574);
+        public const int GL_MAX_ELEMENTS_INDICES = ((int)0x80E9);
+        public const int GL_ALPHA_TEST = ((int)0x0BC0);
+        public const int GL_COLOR_ATTACHMENT2 = ((int)0x8CE2);
+        public const int GL_COLOR_ATTACHMENT3 = ((int)0x8CE3);
+        public const int GL_HISTOGRAM_GREEN_SIZE_EXT = ((int)0x8029);
+        public const int GL_COLOR_ATTACHMENT1 = ((int)0x8CE1);
+        public const int GL_COLOR_ATTACHMENT6 = ((int)0x8CE6);
+        public const int GL_PACK_SKIP_VOLUMES_SGIS = ((int)0x8130);
+        public const int GL_COLOR_ATTACHMENT4 = ((int)0x8CE4);
+        public const int GL_MATRIX15_ARB = ((int)0x88CF);
+        public const int GL_ATTRIB_ARRAY_STRIDE_NV = ((int)0x8624);
+        public const int GL_COLOR_ATTACHMENT8 = ((int)0x8CE8);
+        public const int GL_COLOR_ATTACHMENT9 = ((int)0x8CE9);
+        public const int GL_BLUE_INTEGER_EXT = ((int)0x8D96);
+        public const int GL_DRAW_BUFFER9_ARB = ((int)0x882E);
+        public const int GL_WIDE_LINE_HINT_PGI = ((int)0x1A222);
+        public const int GL_RED = ((int)0x1903);
+        public const int GL_DYNAMIC_ATI = ((int)0x8761);
+        public const int GL_VERTEX_WEIGHT_ARRAY_EXT = ((int)0x850C);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT = ((int)0x8CD1);
+        public const int GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL = ((int)0x83F6);
+        public const int GL_BLEND_COLOR = ((int)0x8005);
+        public const int GL_EQUAL = ((int)0x0202);
+        public const int GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = ((int)0x84FF);
+        public const int GL_OUTPUT_TEXTURE_COORD7_EXT = ((int)0x87A4);
+        public const int GL_VERTEX_STREAM4_ATI = ((int)0x8770);
+        public const int GL_AUX3 = ((int)0x040C);
+        public const int GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI = ((int)0x80BB);
+        public const int GL_QUERY_BY_REGION_NO_WAIT = ((int)0x8E16);
+        public const int GL_REFLECTION_MAP_EXT = ((int)0x8512);
+        public const int GL_DEPTH_CLEAR_VALUE = ((int)0x0B73);
+        public const int GL_READ_ONLY = ((int)0x88B8);
+        public const int GL_POINT_SIZE_MIN = ((int)0x8126);
+        public const int GL_FLOAT_VEC3 = ((int)0x8B51);
+        public const int GL_INT_VEC4_ARB = ((int)0x8B55);
+        public const int GL_DOUBLE = ((int)0x140A);
+        public const int GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV = ((int)0x86F1);
+        public const int GL_TEXTURE_2D_STACK_MESAX = ((int)0x875A);
+        public const int GL_MAP1_TEXTURE_COORD_2 = ((int)0x0D94);
+        public const int GL_MAP2_GRID_SEGMENTS = ((int)0x0DD3);
+        public const int GL_POST_COLOR_MATRIX_COLOR_TABLE = ((int)0x80D2);
+        public const int GL_OFFSET_TEXTURE_RECTANGLE_NV = ((int)0x864C);
+        public const int GL_CLIP_DISTANCE3 = ((int)GL_CLIP_PLANE3);
+        public const int GL_HISTOGRAM_FORMAT = ((int)0x8027);
+        public const int GL_N3F_V3F = ((int)0x2A25);
+        public const int GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT = ((int)0x8C73);
+        public const int GL_OBJECT_LINK_STATUS_ARB = ((int)0x8B82);
+        public const int GL_PIXEL_TILE_WIDTH_SGIX = ((int)0x8140);
+        public const int GL_TEXTURE_FILTER_CONTROL_EXT = ((int)0x8500);
+        public const int GL_BLEND_EQUATION_RGB_EXT = ((int)GL_BLEND_EQUATION);
+        public const int GL_LINE_STRIP_ADJACENCY_ARB = ((int)0x000B);
+        public const int GL_MULTISAMPLE_BIT_EXT = ((int)0x20000000);
+        public const int GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV = ((int)0x8C88);
+        public const int GL_VERTEX4_BIT_PGI = ((int)0x00000008);
+        public const int GL_TEXTURE_INDEX_SIZE_EXT = ((int)0x80ED);
+        public const int GL_MAP2_TEXTURE_COORD_3 = ((int)0x0DB5);
+        public const int GL_MODELVIEW0_MATRIX_EXT = ((int)GL_MODELVIEW_MATRIX);
+        public const int GL_TEXTURE_DEPTH = ((int)0x8071);
+        public const int GL_POLYGON_OFFSET_BIAS_EXT = ((int)0x8039);
+        public const int GL_OFFSET_TEXTURE_SCALE_NV = ((int)0x86E2);
+        public const int GL_422_REV_AVERAGE_EXT = ((int)0x80CF);
+        public const int GL_RENDERER = ((int)0x1F01);
+        public const int GL_RGBA_MODE = ((int)0x0C31);
+        public const int GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = ((int)0x87D2);
+        public const int GL_EXPAND_NORMAL_NV = ((int)0x8538);
+        public const int GL_MAX_ASYNC_TEX_IMAGE_SGIX = ((int)0x835F);
+        public const int GL_TEXTURE_BINDING_BUFFER_ARB = ((int)0x8C2C);
+        public const int GL_MODELVIEW1_MATRIX_EXT = ((int)0x8506);
+        public const int GL_UNPACK_RESAMPLE_SGIX = ((int)0x842D);
+        public const int GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI = ((int)0x87F1);
+        public const int GL_RGBA_INTEGER_MODE_EXT = ((int)0x8D9E);
+        public const int GL_DUAL_ALPHA12_SGIS = ((int)0x8112);
+        public const int GL_FRAGMENT_LIGHT3_SGIX = ((int)0x840F);
+        public const int GL_LUMINANCE16 = ((int)0x8042);
+        public const int GL_DOT3_RGBA = ((int)0x86AF);
+        public const int GL_COMPRESSED_SLUMINANCE_ALPHA_EXT = ((int)0x8C4B);
+        public const int GL_TEXTURE_RECTANGLE_ARB = ((int)0x84F5);
+        public const int GL_POINT_SPRITE = ((int)0x8861);
+        public const int GL_FRONT_LEFT = ((int)0x0400);
+        public const int GL_MODELVIEW30_ARB = ((int)0x873E);
+        public const int GL_ALWAYS_SOFT_HINT_PGI = ((int)0x1A20D);
+        public const int GL_COORD_REPLACE_NV = ((int)0x8862);
+        public const int GL_RESAMPLE_DECIMATE_OML = ((int)0x8989);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT = ((int)0x8CDB);
+        public const int GL_TEXTURE_RECTANGLE_NV = ((int)0x84F5);
+        public const int GL_LINES = ((int)0x0001);
+        public const int GL_ONE = ((int)1);
+        public const int GL_ARRAY_OBJECT_OFFSET_ATI = ((int)0x8767);
+        public const int GL_MIN = ((int)0x8007);
+        public const int GL_CURRENT_VERTEX_ATTRIB = ((int)0x8626);
+        public const int GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV = ((int)0x8DA3);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT = ((int)0x8C84);
+        public const int GL_PIXEL_MIN_FILTER_EXT = ((int)0x8332);
+        public const int GL_DOT3_RGB = ((int)0x86AE);
+        public const int GL_QUERY_RESULT_ARB = ((int)0x8866);
+        public const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT = ((int)0x8CD6);
+        public const int GL_MAP1_VERTEX_ATTRIB5_4_NV = ((int)0x8665);
+        public const int GL_REG_0_ATI = ((int)0x8921);
+        public const int GL_PIXEL_PACK_BUFFER_ARB = ((int)0x88EB);
+        public const int GL_DOT_PRODUCT_TEXTURE_2D_NV = ((int)0x86EE);
+        public const int GL_DUAL_INTENSITY4_SGIS = ((int)0x8118);
+        public const int GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX = ((int)0x8311);
+        public const int GL_COLOR_ARRAY_COUNT_EXT = ((int)0x8084);
+        public const int GL_RENDERBUFFER_DEPTH_SIZE_EXT = ((int)0x8D54);
+        public const int GL_DRAW_BUFFER15_ATI = ((int)0x8834);
+        public const int GL_DEPTH_COMPONENT32F_NV = ((int)0x8DAB);
+        public const int GL_TEXTURE_COORD_ARRAY_STRIDE = ((int)0x808A);
+        public const int GL_UNPACK_CLIENT_STORAGE_APPLE = ((int)0x85B2);
+        public const int GL_DOT3_RGB_ARB = ((int)0x86AE);
+        public const int GL_RGB_FLOAT16_ATI = ((int)0x881B);
+        public const int GL_TEXTURE_BINDING_2D_ARRAY = ((int)0x8C1D);
+        public const int GL_CLAMP_FRAGMENT_COLOR_ARB = ((int)0x891B);
+        public const int GL_MAX_BINDABLE_UNIFORM_SIZE_EXT = ((int)0x8DED);
+        public const int GL_ALPHA32UI_EXT = ((int)0x8D72);
+        public const int GL_PIXEL_TRANSFORM_2D_EXT = ((int)0x8330);
+        public const int GL_VARIANT_ARRAY_STRIDE_EXT = ((int)0x87E6);
+        public const int GL_FRAMEBUFFER_SRGB_EXT = ((int)0x8DB9);
+        public const int GL_MAX_TRACK_MATRICES_NV = ((int)0x862F);
+        public const int GL_LINEAR_CLIPMAP_LINEAR_SGIX = ((int)0x8170);
+        public const int GL_BLUE = ((int)0x1905);
+        public const int GL_BLEND_SRC_ALPHA = ((int)0x80CB);
+        public const int GL_YCRCB_444_SGIX = ((int)0x81BC);
+        public const int GL_CMYK_EXT = ((int)0x800C);
+        public const int GL_TEXTURE_MATRIX = ((int)0x0BA8);
+        public const int GL_DEPTH_COMPONENT32_SGIX = ((int)0x81A7);
+        public const int GL_RG16UI = ((int)0x823A);
+        public const int GL_TEXTURE_CUBE_MAP_ARB = ((int)0x8513);
+        public const int GL_ASYNC_HISTOGRAM_SGIX = ((int)0x832C);
+        public const int GL_MINMAX_SINK_EXT = ((int)0x8030);
+        public const int GL_MAX_FRAMEZOOM_FACTOR_SGIX = ((int)0x818D);
+        public const int GL_MINMAX = ((int)0x802E);
+        public const int GL_FOG_DENSITY = ((int)0x0B62);
+        public const int GL_INT = ((int)0x1404);
+        public const int GL_PIXEL_MAP_A_TO_A = ((int)0x0C79);
+        public const int GL_DEPTH_BITS = ((int)0x0D56);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV = ((int)0x8C8F);
+        public const int GL_MAP1_VERTEX_ATTRIB2_4_NV = ((int)0x8662);
+        public const int GL_LUMINANCE_ALPHA_FLOAT16_ATI = ((int)0x881F);
+        public const int GL_DRAW_BUFFER9 = ((int)0x882E);
+        public const int GL_DEPTH24_STENCIL8 = ((int)0x88F0);
+        public const int GL_TRIANGLES_ADJACENCY_EXT = ((int)0x000C);
+        public const int GL_SHARED_TEXTURE_PALETTE_EXT = ((int)0x81FB);
+        public const int GL_TRANSPOSE_CURRENT_MATRIX_ARB = ((int)0x88B7);
+        public const int GL_VERTEX_STREAM0_ATI = ((int)0x876C);
+        public const int GL_IMAGE_SCALE_Y_HP = ((int)0x8156);
+        public const int GL_COLOR_ARRAY_STRIDE = ((int)0x8083);
+        public const int GL_TEXTURE = ((int)0x1702);
+        public const int GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB = ((int)0x8DDF);
+        public const int GL_QUERY_BY_REGION_WAIT = ((int)0x8E15);
+        public const int GL_BUFFER_MAPPED_ARB = ((int)0x88BC);
+        public const int GL_FRAGMENT_SHADER_DERIVATIVE_HINT = ((int)0x8B8B);
+        public const int GL_TEXTURE_BLUE_SIZE = ((int)0x805E);
+        public const int GL_READ_PIXEL_DATA_RANGE_POINTER_NV = ((int)0x887D);
+        public const int GL_AUX2 = ((int)0x040B);
+        public const int GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB = ((int)0x8DE0);
+        public const int GL_SOURCE0_ALPHA = ((int)0x8588);
+        public const int GL_COLOR_ATTACHMENT15_EXT = ((int)0x8CEF);
+        public const int GL_DSDT_MAG_INTENSITY_NV = ((int)0x86DC);
+        public const int GL_DRAW_BUFFER7_ATI = ((int)0x882C);
+        public const int GL_SEPARABLE_2D_EXT = ((int)0x8012);
+        public const int GL_MATRIX8_ARB = ((int)0x88C8);
+        public const int GL_FRAMEBUFFER_COMPLETE_EXT = ((int)0x8CD5);
+        public const int GL_MAP2_INDEX = ((int)0x0DB1);
+        public const int GL_SUBPIXEL_BITS = ((int)0x0D50);
+        public const int GL_TEXTURE_STENCIL_SIZE_EXT = ((int)0x88F1);
+        public const int GL_LINE = ((int)0x1B01);
+        public const int GL_SECONDARY_COLOR_ARRAY_TYPE = ((int)0x845B);
+        public const int GL_FLOAT_VEC2 = ((int)0x8B50);
+        public const int GL_DOT_PRODUCT_PASS_THROUGH_NV = ((int)0x885B);
+        public const int GL_INSTRUMENT_MEASUREMENTS_SGIX = ((int)0x8181);
+        public const int GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV = ((int)0x864D);
+        public const int GL_CURRENT_RASTER_COLOR = ((int)0x0B04);
+        public const int GL_MAP1_VERTEX_ATTRIB7_4_NV = ((int)0x8667);
+        public const int GL_MAP1_TEXTURE_COORD_3 = ((int)0x0D95);
+        public const int GL_MODELVIEW_STACK_DEPTH = ((int)0x0BA3);
+        public const int GL_SRC_COLOR = ((int)0x0300);
+        public const int GL_MAX_FOG_FUNC_POINTS_SGIS = ((int)0x812C);
+        public const int GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI = ((int)0x80B5);
+        public const int GL_DUDV_ATI = ((int)0x8779);
+        public const int GL_R3_G3_B2 = ((int)0x2A10);
+        public const int GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI = ((int)0x87F5);
+        public const int GL_SCISSOR_TEST = ((int)0x0C11);
+        public const int GL_COMPRESSED_RG_RGTC2 = ((int)0x8DBD);
+        public const int GL_FOG_FUNC_POINTS_SGIS = ((int)0x812B);
+        public const int GL_MAP1_COLOR_4 = ((int)0x0D90);
+        public const int GL_PIXEL_MAP_S_TO_S = ((int)0x0C71);
+        public const int GL_CONSTANT_EXT = ((int)0x8576);
+        public const int GL_INTENSITY32UI_EXT = ((int)0x8D73);
+        public const int GL_TRANSPOSE_COLOR_MATRIX = ((int)0x84E6);
+        public const int GL_REG_24_ATI = ((int)0x8939);
+        public const int GL_FLOAT_VEC4_ARB = ((int)0x8B52);
+        public const int GL_CONSTANT_BORDER_HP = ((int)0x8151);
+        public const int GL_4_BYTES = ((int)0x1409);
+        public const int GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB = ((int)0x8B8A);
+        public const int GL_MAP2_TEXTURE_COORD_2 = ((int)0x0DB4);
+        public const int GL_COMBINER_INPUT_NV = ((int)0x8542);
+        public const int GL_SPRITE_AXIAL_SGIX = ((int)0x814C);
+        public const int GL_INDEX_TEST_REF_EXT = ((int)0x81B7);
+        public const int GL_PROGRAM_TEX_INDIRECTIONS_ARB = ((int)0x8807);
+        public const int GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV = ((int)0x862E);
+        public const int GL_PIXEL_COUNT_AVAILABLE_NV = ((int)0x8867);
+        public const int GL_MULTISAMPLE_3DFX = ((int)0x86B2);
+        public const int GL_VERTEX_ATTRIB_ARRAY9_NV = ((int)0x8659);
+        public const int GL_TEXTURE_BORDER_COLOR = ((int)0x1004);
+        public const int GL_VERTEX_PROGRAM_POINT_SIZE_ARB = ((int)0x8642);
+        public const int GL_INVARIANT_VALUE_EXT = ((int)0x87EA);
+        public const int GL_SHADING_LANGUAGE_VERSION = ((int)0x8B8C);
+        public const int GL_TRIANGLES = ((int)0x0004);
+        public const int GL_TEXTURE31_ARB = ((int)0x84DF);
+        public const int GL_TRANSFORM_FEEDBACK_BUFFER_START_NV = ((int)0x8C84);
+        public const int GL_TEXTURE7 = ((int)0x84C7);
+        public const int GL_POST_CONVOLUTION_RED_BIAS_EXT = ((int)0x8020);
+        public const int GL_INDEX_SHIFT = ((int)0x0D12);
+        public const int GL_MAX_MAP_TESSELLATION_NV = ((int)0x86D6);
+        public const int GL_INDEX_ARRAY = ((int)0x8077);
+        public const int GL_NO_ERROR = ((int)0);
+        public const int GL_OP_MUL_EXT = ((int)0x8786);
+        public const int GL_FEEDBACK_BUFFER_POINTER = ((int)0x0DF0);
+        public const int GL_MODELVIEW_MATRIX = ((int)0x0BA6);
+        public const int GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV = ((int)0x864E);
+        public const int GL_MAX_PROGRAM_LOOP_COUNT_NV = ((int)0x88F8);
+        public const int GL_FORCE_BLUE_TO_ONE_NV = ((int)0x8860);
+        public const int GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB = ((int)0x8B4A);
+        public const int GL_STACK_OVERFLOW = ((int)0x0503);
+        public const int GL_RENDERBUFFER_INTERNAL_FORMAT_EXT = ((int)0x8D44);
+        public const int GL_MAX_TEXTURE_LOD_BIAS_EXT = ((int)0x84FD);
+        public const int GL_VERTEX_ATTRIB_ARRAY_STRIDE = ((int)0x8624);
+        public const int GL_LINE_LOOP = ((int)0x0002);
+        public const int GL_NEGATIVE_Z_EXT = ((int)0x87DB);
+        public const int GL_ACTIVE_VARYING_MAX_LENGTH_NV = ((int)0x8C82);
+        public const int GL_DETAIL_TEXTURE_LEVEL_SGIS = ((int)0x809A);
+        public const int GL_ATTACHED_SHADERS = ((int)0x8B85);
+        public const int GL_TEXTURE13_ARB = ((int)0x84CD);
+        public const int GL_TEXTURE_COMPARE_FAIL_VALUE_ARB = ((int)0x80BF);
+        public const int GL_ALIASED_LINE_WIDTH_RANGE = ((int)0x846E);
+        public const int GL_QUAD_LUMINANCE4_SGIS = ((int)0x8120);
+        public const int GL_OUTPUT_TEXTURE_COORD29_EXT = ((int)0x87BA);
+        public const int GL_GENERATE_MIPMAP_HINT = ((int)0x8192);
+        public const int GL_SAMPLER_2D_ARRAY_SHADOW_EXT = ((int)0x8DC4);
+        public const int GL_TEXTURE15_ARB = ((int)0x84CF);
+        public const int GL_INTENSITY_FLOAT32_ATI = ((int)0x8817);
+        public const int GL_TEXTURE_ALPHA_SIZE_EXT = ((int)0x805F);
+        public const int GL_VERTEX_SHADER_ARB = ((int)0x8B31);
+        public const int GL_PRIMARY_COLOR_ARB = ((int)0x8577);
+        public const int GL_ARRAY_BUFFER = ((int)0x8892);
+        public const int GL_SEPARABLE_2D = ((int)0x8012);
+        public const int GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT = ((int)0x8DE2);
+        public const int GL_CLIENT_VERTEX_ARRAY_BIT = ((int)0x00000002);
+        public const int GL_DEPTH_RANGE = ((int)0x0B70);
+        public const int GL_VERTEX_STREAM5_ATI = ((int)0x8771);
+        public const int GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV = ((int)0x8851);
+        public const int GL_ALPHA12_EXT = ((int)0x803D);
+        public const int GL_MAX_ASYNC_DRAW_PIXELS_SGIX = ((int)0x8360);
+        public const int GL_POST_COLOR_MATRIX_ALPHA_SCALE = ((int)0x80B7);
+        public const int GL_ELEMENT_ARRAY_POINTER_ATI = ((int)0x876A);
+        public const int GL_CON_12_ATI = ((int)0x894D);
+        public const int GL_MATRIX_INDEX_ARRAY_ARB = ((int)0x8844);
+        public const int GL_SIGNED_ALPHA8_NV = ((int)0x8706);
+        public const int GL_PIXEL_SUBSAMPLE_4444_SGIX = ((int)0x85A2);
+        public const int GL_LIST_INDEX = ((int)0x0B33);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT = ((int)0x8CD4);
+        public const int GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV = ((int)0x8850);
+        public const int GL_INVALID_ENUM = ((int)0x0500);
+        public const int GL_COLOR4_BIT_PGI = ((int)0x00020000);
+        public const int GL_CON_5_ATI = ((int)0x8946);
+        public const int GL_TEXTURE_MAG_SIZE_NV = ((int)0x871F);
+        public const int GL_QUAD_LUMINANCE8_SGIS = ((int)0x8121);
+        public const int GL_FRAMEBUFFER_COMPLETE = ((int)0x8CD5);
+        public const int GL_DRAW_PIXEL_TOKEN = ((int)0x0705);
+        public const int GL_INTENSITY12 = ((int)0x804C);
+        public const int GL_COEFF = ((int)0x0A00);
+        public const int GL_TEXTURE_CUBE_MAP_POSITIVE_Y = ((int)0x8517);
+        public const int GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT = ((int)0x87CA);
+        public const int GL_INTENSITY16 = ((int)0x804D);
+        public const int GL_OUTPUT_TEXTURE_COORD20_EXT = ((int)0x87B1);
+        public const int GL_LIGHT5 = ((int)0x4005);
+        public const int GL_LUMINANCE12_EXT = ((int)0x8041);
+        public const int GL_BLUE_SCALE = ((int)0x0D1A);
+        public const int GL_RENDERBUFFER_BLUE_SIZE_EXT = ((int)0x8D52);
+        public const int GL_UNSIGNED_BYTE_3_3_2 = ((int)0x8032);
+        public const int GL_VARIANT_DATATYPE_EXT = ((int)0x87E5);
+        public const int GL_COLOR_ATTACHMENT4_EXT = ((int)0x8CE4);
+        public const int GL_BLUE_INTEGER = ((int)0x8D96);
+        public const int GL_WRITE_PIXEL_DATA_RANGE_NV = ((int)0x8878);
+        public const int GL_COMBINER_CD_DOT_PRODUCT_NV = ((int)0x8546);
+        public const int GL_TEXTURE_2D_ARRAY_EXT = ((int)0x8C1A);
+        public const int GL_OP_MOV_EXT = ((int)0x8799);
+        public const int GL_BOOL_VEC3 = ((int)0x8B58);
+        public const int GL_BOOL_VEC2 = ((int)0x8B57);
+        public const int GL_OUTPUT_TEXTURE_COORD13_EXT = ((int)0x87AA);
+        public const int GL_RG16I = ((int)0x8239);
+        public const int GL_TEXTURE_LIGHTING_MODE_HP = ((int)0x8167);
+        public const int GL_STENCIL_INDEX16_EXT = ((int)0x8D49);
+        public const int GL_CURRENT_PROGRAM = ((int)0x8B8D);
+        public const int GL_MODELVIEW13_ARB = ((int)0x872D);
+        public const int GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = ((int)0x8810);
+        public const int GL_ALPHA4 = ((int)0x803B);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT = ((int)0x8CD3);
+        public const int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = ((int)0x8C8B);
+        public const int GL_BUFFER_SIZE = ((int)0x8764);
+        public const int GL_PIXEL_MAP_I_TO_R = ((int)0x0C72);
+        public const int GL_POINT_DISTANCE_ATTENUATION_ARB = ((int)0x8129);
+        public const int GL_RGBA_FLOAT32_ATI = ((int)0x8814);
+        public const int GL_SOURCE2_ALPHA_ARB = ((int)0x858A);
+        public const int GL_RENDERBUFFER_HEIGHT_EXT = ((int)0x8D43);
+        public const int GL_VERTEX_ARRAY_RANGE_POINTER_APPLE = ((int)0x8521);
+        public const int GL_TRANSFORM_FEEDBACK_VARYINGS_EXT = ((int)0x8C83);
+        public const int GL_FLOAT_RG16_NV = ((int)0x8886);
+        public const int GL_INTENSITY8 = ((int)0x804B);
+        public const int GL_FIXED_ONLY_ARB = ((int)0x891D);
+        public const int GL_MODELVIEW0_EXT = ((int)GL_MODELVIEW);
+        public const int GL_MAX_ELEMENTS_VERTICES = ((int)0x80E8);
+        public const int GL_VERTEX_ARRAY_SIZE = ((int)0x807A);
+        public const int GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB = ((int)0x889E);
+        public const int GL_BGRA_EXT = ((int)0x80E1);
+        public const int GL_TRANSFORM_FEEDBACK_RECORD_NV = ((int)0x8C86);
+        public const int GL_LINEAR_SHARPEN_COLOR_SGIS = ((int)0x80AF);
+        public const int GL_QUERY_RESULT_AVAILABLE_ARB = ((int)0x8867);
+        public const int GL_CURRENT_FOG_COORDINATE = ((int)0x8453);
+        public const int GL_MAX_TEXTURE_STACK_DEPTH = ((int)0x0D39);
+        public const int GL_FIELDS_NV = ((int)0x8E27);
+        public const int GL_R32UI = ((int)0x8236);
+        public const int GL_COLOR_ATTACHMENT1_EXT = ((int)0x8CE1);
+        public const int GL_CULL_VERTEX_OBJECT_POSITION_EXT = ((int)0x81AC);
+        public const int GL_COLOR_INDEX2_EXT = ((int)0x80E3);
+        public const int GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM = ((int)103085);
+        public const int GL_BINORMAL_ARRAY_STRIDE_EXT = ((int)0x8441);
+        public const int GL_AND = ((int)0x1501);
+        public const int GL_CLIP_DISTANCE2 = ((int)GL_CLIP_PLANE2);
+        public const int GL_REG_29_ATI = ((int)0x893E);
+        public const int GL_OBJECT_ACTIVE_ATTRIBUTES_ARB = ((int)0x8B89);
+        public const int GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV = ((int)0x887C);
+        public const int GL_FRAMEBUFFER_EXT = ((int)0x8D40);
+        public const int GL_DRAW_BUFFER14_ARB = ((int)0x8833);
+        public const int GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT = ((int)0x8510);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = ((int)0x8217);
+        public const int GL_INDEX_TEST_EXT = ((int)0x81B5);
+        public const int GL_MODULATE_SIGNED_ADD_ATI = ((int)0x8745);
+        public const int GL_COMBINER_MUX_SUM_NV = ((int)0x8547);
+        public const int GL_DSDT_MAG_VIB_NV = ((int)0x86F7);
+        public const int GL_RGB16UI = ((int)0x8D77);
+        public const int GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI = ((int)0x80B9);
+        public const int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB = ((int)0x8B49);
+        public const int GL_DOT2_ADD_ATI = ((int)0x896C);
+        public const int GL_RENDERBUFFER = ((int)0x8D41);
+        public const int GL_RGBA4_S3TC = ((int)0x83A3);
+        public const int GL_COMPRESSED_TEXTURE_FORMATS_ARB = ((int)0x86A3);
+        public const int GL_PROGRAM_STRING_NV = ((int)0x8628);
+        public const int GL_HISTOGRAM_SINK = ((int)0x802D);
+        public const int GL_RGBA4_EXT = ((int)0x8056);
+        public const int GL_RGBA32UI_EXT = ((int)0x8D70);
+        public const int GL_MATRIX20_ARB = ((int)0x88D4);
+        public const int GL_PN_TRIANGLES_ATI = ((int)0x87F0);
+        public const int GL_TEXTURE_COMPARE_OPERATOR_SGIX = ((int)0x819B);
+        public const int GL_LINE_BIT = ((int)0x00000004);
+        public const int GL_TYPE_RGBA_FLOAT_ATI = ((int)0x8820);
+        public const int GL_VERTEX_PROGRAM_TWO_SIDE = ((int)0x8643);
+        public const int GL_XOR = ((int)0x1506);
+        public const int GL_SLUMINANCE_ALPHA_EXT = ((int)0x8C44);
+        public const int GL_SAMPLE_ALPHA_TO_MASK_SGIS = ((int)0x809E);
+        public const int GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = ((int)0x880F);
+        public const int GL_ELEMENT_ARRAY_TYPE_APPLE = ((int)0x8769);
+        public const int GL_CONVOLUTION_BORDER_COLOR_HP = ((int)0x8154);
+        public const int GL_ELEMENT_ARRAY_ATI = ((int)0x8768);
+        public const int GL_UNSIGNED_INT_VEC3 = ((int)0x8DC7);
+        public const int GL_CONVOLUTION_FILTER_SCALE = ((int)0x8014);
+        public const int GL_GEOMETRY_SHADER_EXT = ((int)0x8DD9);
+        public const int GL_HALF_BIAS_NORMAL_NV = ((int)0x853A);
+        public const int GL_VERTEX_ARRAY_STRIDE_EXT = ((int)0x807C);
+        public const int GL_RGB32UI_EXT = ((int)0x8D71);
+        public const int GL_TEXTURE_GREEN_SIZE = ((int)0x805D);
+        public const int GL_RGB32I = ((int)0x8D83);
+        public const int GL_REPLACEMENT_CODE_SUN = ((int)0x81D8);
+        public const int GL_TEXTURE_4D_BINDING_SGIS = ((int)0x814F);
+        public const int GL_CURRENT_COLOR = ((int)0x0B00);
+        public const int GL_SRGB_EXT = ((int)0x8C40);
+        public const int GL_GREEN_BITS = ((int)0x0D53);
+        public const int GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT = ((int)0x8DDD);
+        public const int GL_MIRROR_CLAMP_TO_EDGE_ATI = ((int)0x8743);
+        public const int GL_TEXTURE_INTENSITY_SIZE_EXT = ((int)0x8061);
+        public const int GL_TEXTURE_BINDING_1D = ((int)0x8068);
+        public const int GL_TEXTURE_BINDING_2D = ((int)0x8069);
+        public const int GL_TEXTURE_BINDING_3D = ((int)0x806A);
+        public const int GL_INTENSITY8_EXT = ((int)0x804B);
+        public const int GL_MAP2_TEXTURE_COORD_4 = ((int)0x0DB6);
+        public const int GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = ((int)0x880A);
+        public const int GL_SAMPLE_COVERAGE_INVERT = ((int)0x80AB);
+        public const int GL_TEXTURE_RESIDENT = ((int)0x8067);
+        public const int GL_DOT3_RGB_EXT = ((int)0x8740);
+        public const int GL_SAMPLER_2D_ARB = ((int)0x8B5E);
+        public const int GL_DRAW_BUFFER1_ATI = ((int)0x8826);
+        public const int GL_RGBA8I = ((int)0x8D8E);
+        public const int GL_COLOR_INDEX8_EXT = ((int)0x80E5);
+        public const int GL_PROXY_TEXTURE_4D_SGIS = ((int)0x8135);
+        public const int GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX = ((int)0x817C);
+        public const int GL_GEOMETRY_PROGRAM_NV = ((int)0x8C26);
+        public const int GL_QUERY_BY_REGION_WAIT_NV = ((int)0x8E15);
+        public const int GL_PACK_SKIP_IMAGES_EXT = ((int)0x806B);
+        public const int GL_BLEND_EQUATION = ((int)0x8009);
+        public const int GL_COLOR_ALPHA_PAIRING_ATI = ((int)0x8975);
+        public const int GL_UNPACK_SKIP_IMAGES = ((int)0x806D);
+        public const int GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT = ((int)0x8C29);
+        public const int GL_MAD_ATI = ((int)0x8968);
+        public const int GL_STENCIL_INDEX8_EXT = ((int)0x8D48);
+        public const int GL_VERTEX_ATTRIB_ARRAY6_NV = ((int)0x8656);
+        public const int GL_BITMAP = ((int)0x1A00);
+        public const int GL_OUTPUT_TEXTURE_COORD6_EXT = ((int)0x87A3);
+        public const int GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = ((int)0x8213);
+        public const int GL_PROJECTION_STACK_DEPTH = ((int)0x0BA4);
+        public const int GL_VIBRANCE_SCALE_NV = ((int)0x8713);
+        public const int GL_DEPTH_COMPONENT32F = ((int)0x8CAC);
+        public const int GL_UNSIGNED_INT_8_8_8_8_EXT = ((int)0x8035);
+        public const int GL_SCISSOR_BOX = ((int)0x0C10);
+        public const int GL_MATRIX17_ARB = ((int)0x88D1);
+        public const int GL_TEXTURE_ALPHA_SIZE = ((int)0x805F);
+        public const int GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT = ((int)0x87CE);
+        public const int GL_TEXTURE_APPLICATION_MODE_EXT = ((int)0x834F);
+        public const int GL_STENCIL_TEST = ((int)0x0B90);
+        public const int GL_INDEX_MODE = ((int)0x0C30);
+        public const int GL_MODELVIEW16_ARB = ((int)0x8730);
+        public const int GL_CURRENT_RASTER_SECONDARY_COLOR = ((int)0x845F);
+        public const int GL_RESAMPLE_REPLICATE_OML = ((int)0x8986);
+        public const int GL_DRAW_BUFFER5_ARB = ((int)0x882A);
+        public const int GL_SAMPLE_ALPHA_TO_MASK_EXT = ((int)0x809E);
+        public const int GL_MODELVIEW1_ARB = ((int)0x850A);
+        public const int GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV = ((int)0x8C28);
+        public const int GL_PIXEL_TILE_CACHE_INCREMENT_SGIX = ((int)0x813F);
+        public const int GL_FEEDBACK = ((int)0x1C01);
+    }
+}
diff --git a/src/Tao.OpenGl/Gl.cs b/src/Tao.OpenGl/Gl.cs
new file mode 100644
index 0000000..92742c5
--- /dev/null
+++ b/src/Tao.OpenGl/Gl.cs
@@ -0,0 +1,43430 @@
+namespace Tao.OpenGl
+{
+    using System;
+    using System.Runtime.InteropServices;
+
+    public static partial class Gl
+    {
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glNewList(UInt32 list, int mode)
+        {
+            Delegates.glNewList((UInt32)list, (int)mode);
+        }
+
+        public static 
+        void glNewList(Int32 list, int mode)
+        {
+            Delegates.glNewList((UInt32)list, (int)mode);
+        }
+
+        public static 
+        void glEndList()
+        {
+            Delegates.glEndList();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glCallList(UInt32 list)
+        {
+            Delegates.glCallList((UInt32)list);
+        }
+
+        public static 
+        void glCallList(Int32 list)
+        {
+            Delegates.glCallList((UInt32)list);
+        }
+
+        public static 
+        void glCallLists(Int32 n, int type, IntPtr lists)
+        {
+            unsafe
+            {
+                Delegates.glCallLists((Int32)n, (int)type, (IntPtr)lists);
+            }
+        }
+
+        public static 
+        void glCallLists(Int32 n, int type, [In, Out] object lists)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle lists_ptr = System.Runtime.InteropServices.GCHandle.Alloc(lists, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCallLists((Int32)n, (int)type, (IntPtr)lists_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    lists_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteLists(UInt32 list, Int32 range)
+        {
+            Delegates.glDeleteLists((UInt32)list, (Int32)range);
+        }
+
+        public static 
+        void glDeleteLists(Int32 list, Int32 range)
+        {
+            Delegates.glDeleteLists((UInt32)list, (Int32)range);
+        }
+
+        public static 
+        Int32 glGenLists(Int32 range)
+        {
+            return Delegates.glGenLists((Int32)range);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glListBase(UInt32 @base)
+        {
+            Delegates.glListBase((UInt32)@base);
+        }
+
+        public static 
+        void glListBase(Int32 @base)
+        {
+            Delegates.glListBase((UInt32)@base);
+        }
+
+        public static 
+        void glBegin(int mode)
+        {
+            Delegates.glBegin((int)mode);
+        }
+
+        public static 
+        void glBitmap(Int32 width, Int32 height, Single xorig, Single yorig, Single xmove, Single ymove, Byte[] bitmap)
+        {
+            unsafe
+            {
+                fixed (Byte* bitmap_ptr = bitmap)
+                {
+                    Delegates.glBitmap((Int32)width, (Int32)height, (Single)xorig, (Single)yorig, (Single)xmove, (Single)ymove, (Byte*)bitmap_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBitmap(Int32 width, Int32 height, Single xorig, Single yorig, Single xmove, Single ymove, ref Byte bitmap)
+        {
+            unsafe
+            {
+                fixed (Byte* bitmap_ptr = &bitmap)
+                {
+                    Delegates.glBitmap((Int32)width, (Int32)height, (Single)xorig, (Single)yorig, (Single)xmove, (Single)ymove, (Byte*)bitmap_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBitmap(Int32 width, Int32 height, Single xorig, Single yorig, Single xmove, Single ymove, IntPtr bitmap)
+        {
+            unsafe
+            {
+                Delegates.glBitmap((Int32)width, (Int32)height, (Single)xorig, (Single)yorig, (Single)xmove, (Single)ymove, (Byte*)bitmap);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3b(SByte red, SByte green, SByte blue)
+        {
+            Delegates.glColor3b((SByte)red, (SByte)green, (SByte)blue);
+        }
+
+        public static 
+        void glColor3b(Byte red, Byte green, Byte blue)
+        {
+            Delegates.glColor3b((SByte)red, (SByte)green, (SByte)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3bv(SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glColor3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3bv(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glColor3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3bv(ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glColor3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3bv(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glColor3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3bv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor3bv((SByte*)v);
+            }
+        }
+
+        public static 
+        void glColor3d(Double red, Double green, Double blue)
+        {
+            Delegates.glColor3d((Double)red, (Double)green, (Double)blue);
+        }
+
+        public static 
+        void glColor3dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glColor3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glColor3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor3dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glColor3f(Single red, Single green, Single blue)
+        {
+            Delegates.glColor3f((Single)red, (Single)green, (Single)blue);
+        }
+
+        public static 
+        void glColor3fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glColor3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glColor3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor3fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glColor3i(Int32 red, Int32 green, Int32 blue)
+        {
+            Delegates.glColor3i((Int32)red, (Int32)green, (Int32)blue);
+        }
+
+        public static 
+        void glColor3iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glColor3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glColor3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor3iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glColor3s(Int16 red, Int16 green, Int16 blue)
+        {
+            Delegates.glColor3s((Int16)red, (Int16)green, (Int16)blue);
+        }
+
+        public static 
+        void glColor3sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glColor3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glColor3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor3sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glColor3ub(Byte red, Byte green, Byte blue)
+        {
+            Delegates.glColor3ub((Byte)red, (Byte)green, (Byte)blue);
+        }
+
+        public static 
+        void glColor3ubv(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glColor3ubv((Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3ubv(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glColor3ubv((Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3ubv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor3ubv((Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3ui(UInt32 red, UInt32 green, UInt32 blue)
+        {
+            Delegates.glColor3ui((UInt32)red, (UInt32)green, (UInt32)blue);
+        }
+
+        public static 
+        void glColor3ui(Int32 red, Int32 green, Int32 blue)
+        {
+            Delegates.glColor3ui((UInt32)red, (UInt32)green, (UInt32)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3uiv(UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glColor3uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3uiv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glColor3uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3uiv(ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glColor3uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3uiv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glColor3uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3uiv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor3uiv((UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3us(UInt16 red, UInt16 green, UInt16 blue)
+        {
+            Delegates.glColor3us((UInt16)red, (UInt16)green, (UInt16)blue);
+        }
+
+        public static 
+        void glColor3us(Int16 red, Int16 green, Int16 blue)
+        {
+            Delegates.glColor3us((UInt16)red, (UInt16)green, (UInt16)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3usv(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glColor3usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3usv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glColor3usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3usv(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glColor3usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3usv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glColor3usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3usv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor3usv((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4b(SByte red, SByte green, SByte blue, SByte alpha)
+        {
+            Delegates.glColor4b((SByte)red, (SByte)green, (SByte)blue, (SByte)alpha);
+        }
+
+        public static 
+        void glColor4b(Byte red, Byte green, Byte blue, Byte alpha)
+        {
+            Delegates.glColor4b((SByte)red, (SByte)green, (SByte)blue, (SByte)alpha);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4bv(SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glColor4bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4bv(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glColor4bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4bv(ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glColor4bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4bv(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glColor4bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4bv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4bv((SByte*)v);
+            }
+        }
+
+        public static 
+        void glColor4d(Double red, Double green, Double blue, Double alpha)
+        {
+            Delegates.glColor4d((Double)red, (Double)green, (Double)blue, (Double)alpha);
+        }
+
+        public static 
+        void glColor4dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glColor4dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glColor4dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glColor4f(Single red, Single green, Single blue, Single alpha)
+        {
+            Delegates.glColor4f((Single)red, (Single)green, (Single)blue, (Single)alpha);
+        }
+
+        public static 
+        void glColor4fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glColor4fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glColor4fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glColor4i(Int32 red, Int32 green, Int32 blue, Int32 alpha)
+        {
+            Delegates.glColor4i((Int32)red, (Int32)green, (Int32)blue, (Int32)alpha);
+        }
+
+        public static 
+        void glColor4iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glColor4iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glColor4iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glColor4s(Int16 red, Int16 green, Int16 blue, Int16 alpha)
+        {
+            Delegates.glColor4s((Int16)red, (Int16)green, (Int16)blue, (Int16)alpha);
+        }
+
+        public static 
+        void glColor4sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glColor4sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glColor4sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glColor4ub(Byte red, Byte green, Byte blue, Byte alpha)
+        {
+            Delegates.glColor4ub((Byte)red, (Byte)green, (Byte)blue, (Byte)alpha);
+        }
+
+        public static 
+        void glColor4ubv(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glColor4ubv((Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4ubv(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glColor4ubv((Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4ubv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4ubv((Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4ui(UInt32 red, UInt32 green, UInt32 blue, UInt32 alpha)
+        {
+            Delegates.glColor4ui((UInt32)red, (UInt32)green, (UInt32)blue, (UInt32)alpha);
+        }
+
+        public static 
+        void glColor4ui(Int32 red, Int32 green, Int32 blue, Int32 alpha)
+        {
+            Delegates.glColor4ui((UInt32)red, (UInt32)green, (UInt32)blue, (UInt32)alpha);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4uiv(UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glColor4uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4uiv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glColor4uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4uiv(ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glColor4uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4uiv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glColor4uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4uiv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4uiv((UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4us(UInt16 red, UInt16 green, UInt16 blue, UInt16 alpha)
+        {
+            Delegates.glColor4us((UInt16)red, (UInt16)green, (UInt16)blue, (UInt16)alpha);
+        }
+
+        public static 
+        void glColor4us(Int16 red, Int16 green, Int16 blue, Int16 alpha)
+        {
+            Delegates.glColor4us((UInt16)red, (UInt16)green, (UInt16)blue, (UInt16)alpha);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4usv(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glColor4usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4usv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glColor4usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4usv(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glColor4usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4usv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glColor4usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4usv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4usv((UInt16*)v);
+            }
+        }
+
+        public static 
+        void glEdgeFlag(bool flag)
+        {
+            Delegates.glEdgeFlag((bool)flag);
+        }
+
+        public static 
+        void glEdgeFlagv(bool[] flag)
+        {
+            unsafe
+            {
+                fixed (bool* flag_ptr = flag)
+                {
+                    Delegates.glEdgeFlagv((bool*)flag_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEdgeFlagv(ref bool flag)
+        {
+            unsafe
+            {
+                fixed (bool* flag_ptr = &flag)
+                {
+                    Delegates.glEdgeFlagv((bool*)flag_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEdgeFlagv(IntPtr flag)
+        {
+            unsafe
+            {
+                Delegates.glEdgeFlagv((bool*)flag);
+            }
+        }
+
+        public static 
+        void glEnd()
+        {
+            Delegates.glEnd();
+        }
+
+        public static 
+        void glIndexd(Double c)
+        {
+            Delegates.glIndexd((Double)c);
+        }
+
+        public static 
+        void glIndexdv(Double[] c)
+        {
+            unsafe
+            {
+                fixed (Double* c_ptr = c)
+                {
+                    Delegates.glIndexdv((Double*)c_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glIndexdv(ref Double c)
+        {
+            unsafe
+            {
+                fixed (Double* c_ptr = &c)
+                {
+                    Delegates.glIndexdv((Double*)c_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glIndexdv(IntPtr c)
+        {
+            unsafe
+            {
+                Delegates.glIndexdv((Double*)c);
+            }
+        }
+
+        public static 
+        void glIndexf(Single c)
+        {
+            Delegates.glIndexf((Single)c);
+        }
+
+        public static 
+        void glIndexfv(Single[] c)
+        {
+            unsafe
+            {
+                fixed (Single* c_ptr = c)
+                {
+                    Delegates.glIndexfv((Single*)c_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glIndexfv(ref Single c)
+        {
+            unsafe
+            {
+                fixed (Single* c_ptr = &c)
+                {
+                    Delegates.glIndexfv((Single*)c_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glIndexfv(IntPtr c)
+        {
+            unsafe
+            {
+                Delegates.glIndexfv((Single*)c);
+            }
+        }
+
+        public static 
+        void glIndexi(Int32 c)
+        {
+            Delegates.glIndexi((Int32)c);
+        }
+
+        public static 
+        void glIndexiv(Int32[] c)
+        {
+            unsafe
+            {
+                fixed (Int32* c_ptr = c)
+                {
+                    Delegates.glIndexiv((Int32*)c_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glIndexiv(ref Int32 c)
+        {
+            unsafe
+            {
+                fixed (Int32* c_ptr = &c)
+                {
+                    Delegates.glIndexiv((Int32*)c_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glIndexiv(IntPtr c)
+        {
+            unsafe
+            {
+                Delegates.glIndexiv((Int32*)c);
+            }
+        }
+
+        public static 
+        void glIndexs(Int16 c)
+        {
+            Delegates.glIndexs((Int16)c);
+        }
+
+        public static 
+        void glIndexsv(Int16[] c)
+        {
+            unsafe
+            {
+                fixed (Int16* c_ptr = c)
+                {
+                    Delegates.glIndexsv((Int16*)c_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glIndexsv(ref Int16 c)
+        {
+            unsafe
+            {
+                fixed (Int16* c_ptr = &c)
+                {
+                    Delegates.glIndexsv((Int16*)c_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glIndexsv(IntPtr c)
+        {
+            unsafe
+            {
+                Delegates.glIndexsv((Int16*)c);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glNormal3b(SByte nx, SByte ny, SByte nz)
+        {
+            Delegates.glNormal3b((SByte)nx, (SByte)ny, (SByte)nz);
+        }
+
+        public static 
+        void glNormal3b(Byte nx, Byte ny, Byte nz)
+        {
+            Delegates.glNormal3b((SByte)nx, (SByte)ny, (SByte)nz);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glNormal3bv(SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glNormal3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3bv(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glNormal3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glNormal3bv(ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glNormal3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3bv(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glNormal3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3bv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glNormal3bv((SByte*)v);
+            }
+        }
+
+        public static 
+        void glNormal3d(Double nx, Double ny, Double nz)
+        {
+            Delegates.glNormal3d((Double)nx, (Double)ny, (Double)nz);
+        }
+
+        public static 
+        void glNormal3dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glNormal3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glNormal3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glNormal3dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glNormal3f(Single nx, Single ny, Single nz)
+        {
+            Delegates.glNormal3f((Single)nx, (Single)ny, (Single)nz);
+        }
+
+        public static 
+        void glNormal3fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glNormal3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glNormal3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glNormal3fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glNormal3i(Int32 nx, Int32 ny, Int32 nz)
+        {
+            Delegates.glNormal3i((Int32)nx, (Int32)ny, (Int32)nz);
+        }
+
+        public static 
+        void glNormal3iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glNormal3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glNormal3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glNormal3iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glNormal3s(Int16 nx, Int16 ny, Int16 nz)
+        {
+            Delegates.glNormal3s((Int16)nx, (Int16)ny, (Int16)nz);
+        }
+
+        public static 
+        void glNormal3sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glNormal3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glNormal3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glNormal3sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos2d(Double x, Double y)
+        {
+            Delegates.glRasterPos2d((Double)x, (Double)y);
+        }
+
+        public static 
+        void glRasterPos2dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glRasterPos2dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos2dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glRasterPos2dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos2dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos2dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos2f(Single x, Single y)
+        {
+            Delegates.glRasterPos2f((Single)x, (Single)y);
+        }
+
+        public static 
+        void glRasterPos2fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glRasterPos2fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos2fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glRasterPos2fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos2fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos2fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos2i(Int32 x, Int32 y)
+        {
+            Delegates.glRasterPos2i((Int32)x, (Int32)y);
+        }
+
+        public static 
+        void glRasterPos2iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glRasterPos2iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos2iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glRasterPos2iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos2iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos2iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos2s(Int16 x, Int16 y)
+        {
+            Delegates.glRasterPos2s((Int16)x, (Int16)y);
+        }
+
+        public static 
+        void glRasterPos2sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glRasterPos2sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos2sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glRasterPos2sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos2sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos2sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos3d(Double x, Double y, Double z)
+        {
+            Delegates.glRasterPos3d((Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glRasterPos3dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glRasterPos3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos3dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glRasterPos3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos3dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos3dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos3f(Single x, Single y, Single z)
+        {
+            Delegates.glRasterPos3f((Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glRasterPos3fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glRasterPos3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos3fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glRasterPos3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos3fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos3fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos3i(Int32 x, Int32 y, Int32 z)
+        {
+            Delegates.glRasterPos3i((Int32)x, (Int32)y, (Int32)z);
+        }
+
+        public static 
+        void glRasterPos3iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glRasterPos3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos3iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glRasterPos3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos3iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos3iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos3s(Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glRasterPos3s((Int16)x, (Int16)y, (Int16)z);
+        }
+
+        public static 
+        void glRasterPos3sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glRasterPos3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos3sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glRasterPos3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos3sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos3sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos4d(Double x, Double y, Double z, Double w)
+        {
+            Delegates.glRasterPos4d((Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        public static 
+        void glRasterPos4dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glRasterPos4dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos4dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glRasterPos4dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos4dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos4dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos4f(Single x, Single y, Single z, Single w)
+        {
+            Delegates.glRasterPos4f((Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glRasterPos4fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glRasterPos4fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos4fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glRasterPos4fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos4fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos4fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos4i(Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glRasterPos4i((Int32)x, (Int32)y, (Int32)z, (Int32)w);
+        }
+
+        public static 
+        void glRasterPos4iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glRasterPos4iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos4iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glRasterPos4iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos4iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos4iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glRasterPos4s(Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glRasterPos4s((Int16)x, (Int16)y, (Int16)z, (Int16)w);
+        }
+
+        public static 
+        void glRasterPos4sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glRasterPos4sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos4sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glRasterPos4sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRasterPos4sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glRasterPos4sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glRectd(Double x1, Double y1, Double x2, Double y2)
+        {
+            Delegates.glRectd((Double)x1, (Double)y1, (Double)x2, (Double)y2);
+        }
+
+        public static 
+        void glRectdv(Double[] v1, Double[] v2)
+        {
+            unsafe
+            {
+                fixed (Double* v1_ptr = v1)
+                fixed (Double* v2_ptr = v2)
+                {
+                    Delegates.glRectdv((Double*)v1_ptr, (Double*)v2_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRectdv(ref Double v1, ref Double v2)
+        {
+            unsafe
+            {
+                fixed (Double* v1_ptr = &v1)
+                fixed (Double* v2_ptr = &v2)
+                {
+                    Delegates.glRectdv((Double*)v1_ptr, (Double*)v2_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRectdv(IntPtr v1, IntPtr v2)
+        {
+            unsafe
+            {
+                Delegates.glRectdv((Double*)v1, (Double*)v2);
+            }
+        }
+
+        public static 
+        void glRectf(Single x1, Single y1, Single x2, Single y2)
+        {
+            Delegates.glRectf((Single)x1, (Single)y1, (Single)x2, (Single)y2);
+        }
+
+        public static 
+        void glRectfv(Single[] v1, Single[] v2)
+        {
+            unsafe
+            {
+                fixed (Single* v1_ptr = v1)
+                fixed (Single* v2_ptr = v2)
+                {
+                    Delegates.glRectfv((Single*)v1_ptr, (Single*)v2_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRectfv(ref Single v1, ref Single v2)
+        {
+            unsafe
+            {
+                fixed (Single* v1_ptr = &v1)
+                fixed (Single* v2_ptr = &v2)
+                {
+                    Delegates.glRectfv((Single*)v1_ptr, (Single*)v2_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRectfv(IntPtr v1, IntPtr v2)
+        {
+            unsafe
+            {
+                Delegates.glRectfv((Single*)v1, (Single*)v2);
+            }
+        }
+
+        public static 
+        void glRecti(Int32 x1, Int32 y1, Int32 x2, Int32 y2)
+        {
+            Delegates.glRecti((Int32)x1, (Int32)y1, (Int32)x2, (Int32)y2);
+        }
+
+        public static 
+        void glRectiv(Int32[] v1, Int32[] v2)
+        {
+            unsafe
+            {
+                fixed (Int32* v1_ptr = v1)
+                fixed (Int32* v2_ptr = v2)
+                {
+                    Delegates.glRectiv((Int32*)v1_ptr, (Int32*)v2_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRectiv(ref Int32 v1, ref Int32 v2)
+        {
+            unsafe
+            {
+                fixed (Int32* v1_ptr = &v1)
+                fixed (Int32* v2_ptr = &v2)
+                {
+                    Delegates.glRectiv((Int32*)v1_ptr, (Int32*)v2_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRectiv(IntPtr v1, IntPtr v2)
+        {
+            unsafe
+            {
+                Delegates.glRectiv((Int32*)v1, (Int32*)v2);
+            }
+        }
+
+        public static 
+        void glRects(Int16 x1, Int16 y1, Int16 x2, Int16 y2)
+        {
+            Delegates.glRects((Int16)x1, (Int16)y1, (Int16)x2, (Int16)y2);
+        }
+
+        public static 
+        void glRectsv(Int16[] v1, Int16[] v2)
+        {
+            unsafe
+            {
+                fixed (Int16* v1_ptr = v1)
+                fixed (Int16* v2_ptr = v2)
+                {
+                    Delegates.glRectsv((Int16*)v1_ptr, (Int16*)v2_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRectsv(ref Int16 v1, ref Int16 v2)
+        {
+            unsafe
+            {
+                fixed (Int16* v1_ptr = &v1)
+                fixed (Int16* v2_ptr = &v2)
+                {
+                    Delegates.glRectsv((Int16*)v1_ptr, (Int16*)v2_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRectsv(IntPtr v1, IntPtr v2)
+        {
+            unsafe
+            {
+                Delegates.glRectsv((Int16*)v1, (Int16*)v2);
+            }
+        }
+
+        public static 
+        void glTexCoord1d(Double s)
+        {
+            Delegates.glTexCoord1d((Double)s);
+        }
+
+        public static 
+        void glTexCoord1dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glTexCoord1dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glTexCoord1dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord1dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord1f(Single s)
+        {
+            Delegates.glTexCoord1f((Single)s);
+        }
+
+        public static 
+        void glTexCoord1fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord1fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord1fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord1fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord1i(Int32 s)
+        {
+            Delegates.glTexCoord1i((Int32)s);
+        }
+
+        public static 
+        void glTexCoord1iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glTexCoord1iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glTexCoord1iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord1iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord1s(Int16 s)
+        {
+            Delegates.glTexCoord1s((Int16)s);
+        }
+
+        public static 
+        void glTexCoord1sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glTexCoord1sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord1sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord1sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord2d(Double s, Double t)
+        {
+            Delegates.glTexCoord2d((Double)s, (Double)t);
+        }
+
+        public static 
+        void glTexCoord2dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glTexCoord2dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord2dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord2f(Single s, Single t)
+        {
+            Delegates.glTexCoord2f((Single)s, (Single)t);
+        }
+
+        public static 
+        void glTexCoord2fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord2fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord2fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord2i(Int32 s, Int32 t)
+        {
+            Delegates.glTexCoord2i((Int32)s, (Int32)t);
+        }
+
+        public static 
+        void glTexCoord2iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glTexCoord2iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord2iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord2s(Int16 s, Int16 t)
+        {
+            Delegates.glTexCoord2s((Int16)s, (Int16)t);
+        }
+
+        public static 
+        void glTexCoord2sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glTexCoord2sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord2sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord3d(Double s, Double t, Double r)
+        {
+            Delegates.glTexCoord3d((Double)s, (Double)t, (Double)r);
+        }
+
+        public static 
+        void glTexCoord3dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glTexCoord3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glTexCoord3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord3dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord3f(Single s, Single t, Single r)
+        {
+            Delegates.glTexCoord3f((Single)s, (Single)t, (Single)r);
+        }
+
+        public static 
+        void glTexCoord3fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord3fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord3i(Int32 s, Int32 t, Int32 r)
+        {
+            Delegates.glTexCoord3i((Int32)s, (Int32)t, (Int32)r);
+        }
+
+        public static 
+        void glTexCoord3iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glTexCoord3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glTexCoord3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord3iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord3s(Int16 s, Int16 t, Int16 r)
+        {
+            Delegates.glTexCoord3s((Int16)s, (Int16)t, (Int16)r);
+        }
+
+        public static 
+        void glTexCoord3sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glTexCoord3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord3sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord4d(Double s, Double t, Double r, Double q)
+        {
+            Delegates.glTexCoord4d((Double)s, (Double)t, (Double)r, (Double)q);
+        }
+
+        public static 
+        void glTexCoord4dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glTexCoord4dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glTexCoord4dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord4dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord4f(Single s, Single t, Single r, Single q)
+        {
+            Delegates.glTexCoord4f((Single)s, (Single)t, (Single)r, (Single)q);
+        }
+
+        public static 
+        void glTexCoord4fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord4fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord4fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord4fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord4i(Int32 s, Int32 t, Int32 r, Int32 q)
+        {
+            Delegates.glTexCoord4i((Int32)s, (Int32)t, (Int32)r, (Int32)q);
+        }
+
+        public static 
+        void glTexCoord4iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glTexCoord4iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glTexCoord4iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord4iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord4s(Int16 s, Int16 t, Int16 r, Int16 q)
+        {
+            Delegates.glTexCoord4s((Int16)s, (Int16)t, (Int16)r, (Int16)q);
+        }
+
+        public static 
+        void glTexCoord4sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glTexCoord4sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord4sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord4sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertex2d(Double x, Double y)
+        {
+            Delegates.glVertex2d((Double)x, (Double)y);
+        }
+
+        public static 
+        void glVertex2dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertex2dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertex2dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex2dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glVertex2f(Single x, Single y)
+        {
+            Delegates.glVertex2f((Single)x, (Single)y);
+        }
+
+        public static 
+        void glVertex2fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertex2fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertex2fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex2fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glVertex2i(Int32 x, Int32 y)
+        {
+            Delegates.glVertex2i((Int32)x, (Int32)y);
+        }
+
+        public static 
+        void glVertex2iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertex2iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertex2iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex2iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertex2s(Int16 x, Int16 y)
+        {
+            Delegates.glVertex2s((Int16)x, (Int16)y);
+        }
+
+        public static 
+        void glVertex2sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertex2sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertex2sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex2sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertex3d(Double x, Double y, Double z)
+        {
+            Delegates.glVertex3d((Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glVertex3dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertex3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertex3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex3dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glVertex3f(Single x, Single y, Single z)
+        {
+            Delegates.glVertex3f((Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glVertex3fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertex3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertex3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex3fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glVertex3i(Int32 x, Int32 y, Int32 z)
+        {
+            Delegates.glVertex3i((Int32)x, (Int32)y, (Int32)z);
+        }
+
+        public static 
+        void glVertex3iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertex3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertex3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex3iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertex3s(Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glVertex3s((Int16)x, (Int16)y, (Int16)z);
+        }
+
+        public static 
+        void glVertex3sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertex3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertex3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex3sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertex4d(Double x, Double y, Double z, Double w)
+        {
+            Delegates.glVertex4d((Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        public static 
+        void glVertex4dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertex4dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertex4dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex4dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glVertex4f(Single x, Single y, Single z, Single w)
+        {
+            Delegates.glVertex4f((Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glVertex4fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertex4fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertex4fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex4fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glVertex4i(Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glVertex4i((Int32)x, (Int32)y, (Int32)z, (Int32)w);
+        }
+
+        public static 
+        void glVertex4iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertex4iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertex4iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex4iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertex4s(Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glVertex4s((Int16)x, (Int16)y, (Int16)z, (Int16)w);
+        }
+
+        public static 
+        void glVertex4sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertex4sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertex4sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex4sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glClipPlane(int plane, Double[] equation)
+        {
+            unsafe
+            {
+                fixed (Double* equation_ptr = equation)
+                {
+                    Delegates.glClipPlane((int)plane, (Double*)equation_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glClipPlane(int plane, ref Double equation)
+        {
+            unsafe
+            {
+                fixed (Double* equation_ptr = &equation)
+                {
+                    Delegates.glClipPlane((int)plane, (Double*)equation_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glClipPlane(int plane, IntPtr equation)
+        {
+            unsafe
+            {
+                Delegates.glClipPlane((int)plane, (Double*)equation);
+            }
+        }
+
+        public static 
+        void glColorMaterial(int face, int mode)
+        {
+            Delegates.glColorMaterial((int)face, (int)mode);
+        }
+
+        public static 
+        void glCullFace(int mode)
+        {
+            Delegates.glCullFace((int)mode);
+        }
+
+        public static 
+        void glFogf(int pname, Single param)
+        {
+            Delegates.glFogf((int)pname, (Single)param);
+        }
+
+        public static 
+        void glFogfv(int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glFogfv((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogfv(int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glFogfv((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogfv(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glFogfv((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glFogi(int pname, Int32 param)
+        {
+            Delegates.glFogi((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glFogiv(int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glFogiv((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogiv(int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glFogiv((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogiv(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glFogiv((int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glFrontFace(int mode)
+        {
+            Delegates.glFrontFace((int)mode);
+        }
+
+        public static 
+        void glHint(int target, int mode)
+        {
+            Delegates.glHint((int)target, (int)mode);
+        }
+
+        public static 
+        void glLightf(int light, int pname, Single param)
+        {
+            Delegates.glLightf((int)light, (int)pname, (Single)param);
+        }
+
+        public static 
+        void glLightfv(int light, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glLightfv((int)light, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLightfv(int light, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glLightfv((int)light, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLightfv(int light, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glLightfv((int)light, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glLighti(int light, int pname, Int32 param)
+        {
+            Delegates.glLighti((int)light, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glLightiv(int light, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glLightiv((int)light, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLightiv(int light, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glLightiv((int)light, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLightiv(int light, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glLightiv((int)light, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glLightModelf(int pname, Single param)
+        {
+            Delegates.glLightModelf((int)pname, (Single)param);
+        }
+
+        public static 
+        void glLightModelfv(int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glLightModelfv((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLightModelfv(int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glLightModelfv((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLightModelfv(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glLightModelfv((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glLightModeli(int pname, Int32 param)
+        {
+            Delegates.glLightModeli((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glLightModeliv(int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glLightModeliv((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLightModeliv(int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glLightModeliv((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLightModeliv(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glLightModeliv((int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glLineStipple(Int32 factor, UInt16 pattern)
+        {
+            unsafe
+            {
+                Delegates.glLineStipple((Int32)factor, (UInt16)pattern);
+            }
+        }
+
+        public static 
+        void glLineStipple(Int32 factor, Int16 pattern)
+        {
+            unsafe
+            {
+                Delegates.glLineStipple((Int32)factor, (UInt16)pattern);
+            }
+        }
+
+        public static 
+        void glLineWidth(Single width)
+        {
+            Delegates.glLineWidth((Single)width);
+        }
+
+        public static 
+        void glMaterialf(int face, int pname, Single param)
+        {
+            Delegates.glMaterialf((int)face, (int)pname, (Single)param);
+        }
+
+        public static 
+        void glMaterialfv(int face, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glMaterialfv((int)face, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMaterialfv(int face, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glMaterialfv((int)face, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMaterialfv(int face, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glMaterialfv((int)face, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glMateriali(int face, int pname, Int32 param)
+        {
+            Delegates.glMateriali((int)face, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glMaterialiv(int face, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glMaterialiv((int)face, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMaterialiv(int face, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glMaterialiv((int)face, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMaterialiv(int face, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glMaterialiv((int)face, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glPointSize(Single size)
+        {
+            Delegates.glPointSize((Single)size);
+        }
+
+        public static 
+        void glPolygonMode(int face, int mode)
+        {
+            Delegates.glPolygonMode((int)face, (int)mode);
+        }
+
+        public static 
+        void glPolygonStipple(Byte[] mask)
+        {
+            unsafe
+            {
+                fixed (Byte* mask_ptr = mask)
+                {
+                    Delegates.glPolygonStipple((Byte*)mask_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPolygonStipple(ref Byte mask)
+        {
+            unsafe
+            {
+                fixed (Byte* mask_ptr = &mask)
+                {
+                    Delegates.glPolygonStipple((Byte*)mask_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPolygonStipple(IntPtr mask)
+        {
+            unsafe
+            {
+                Delegates.glPolygonStipple((Byte*)mask);
+            }
+        }
+
+        public static 
+        void glScissor(Int32 x, Int32 y, Int32 width, Int32 height)
+        {
+            Delegates.glScissor((Int32)x, (Int32)y, (Int32)width, (Int32)height);
+        }
+
+        public static 
+        void glShadeModel(int mode)
+        {
+            Delegates.glShadeModel((int)mode);
+        }
+
+        public static 
+        void glTexParameterf(int target, int pname, Single param)
+        {
+            Delegates.glTexParameterf((int)target, (int)pname, (Single)param);
+        }
+
+        public static 
+        void glTexParameterfv(int target, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glTexParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexParameterfv(int target, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glTexParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexParameterfv(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glTexParameterfv((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glTexParameteri(int target, int pname, Int32 param)
+        {
+            Delegates.glTexParameteri((int)target, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glTexParameteriv(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glTexParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexParameteriv(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glTexParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexParameteriv(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glTexParameteriv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glTexImage1D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 border, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexImage1D((int)target, (Int32)level, (Int32)internalformat, (Int32)width, (Int32)border, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexImage1D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 border, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexImage1D((int)target, (Int32)level, (Int32)internalformat, (Int32)width, (Int32)border, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexImage2D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 height, Int32 border, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexImage2D((int)target, (Int32)level, (Int32)internalformat, (Int32)width, (Int32)height, (Int32)border, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexImage2D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 height, Int32 border, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexImage2D((int)target, (Int32)level, (Int32)internalformat, (Int32)width, (Int32)height, (Int32)border, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexEnvf(int target, int pname, Single param)
+        {
+            Delegates.glTexEnvf((int)target, (int)pname, (Single)param);
+        }
+
+        public static 
+        void glTexEnvfv(int target, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glTexEnvfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexEnvfv(int target, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glTexEnvfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexEnvfv(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glTexEnvfv((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glTexEnvi(int target, int pname, Int32 param)
+        {
+            Delegates.glTexEnvi((int)target, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glTexEnviv(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glTexEnviv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexEnviv(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glTexEnviv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexEnviv(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glTexEnviv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glTexGend(int coord, int pname, Double param)
+        {
+            Delegates.glTexGend((int)coord, (int)pname, (Double)param);
+        }
+
+        public static 
+        void glTexGendv(int coord, int pname, Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glTexGendv((int)coord, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexGendv(int coord, int pname, ref Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glTexGendv((int)coord, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexGendv(int coord, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glTexGendv((int)coord, (int)pname, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glTexGenf(int coord, int pname, Single param)
+        {
+            Delegates.glTexGenf((int)coord, (int)pname, (Single)param);
+        }
+
+        public static 
+        void glTexGenfv(int coord, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glTexGenfv((int)coord, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexGenfv(int coord, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glTexGenfv((int)coord, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexGenfv(int coord, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glTexGenfv((int)coord, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glTexGeni(int coord, int pname, Int32 param)
+        {
+            Delegates.glTexGeni((int)coord, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glTexGeniv(int coord, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glTexGeniv((int)coord, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexGeniv(int coord, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glTexGeniv((int)coord, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexGeniv(int coord, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glTexGeniv((int)coord, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glFeedbackBuffer(Int32 size, int type, [Out] Single[] buffer)
+        {
+            unsafe
+            {
+                fixed (Single* buffer_ptr = buffer)
+                {
+                    Delegates.glFeedbackBuffer((Int32)size, (int)type, (Single*)buffer_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFeedbackBuffer(Int32 size, int type, [Out] out Single buffer)
+        {
+            unsafe
+            {
+                fixed (Single* buffer_ptr = &buffer)
+                {
+                    Delegates.glFeedbackBuffer((Int32)size, (int)type, (Single*)buffer_ptr);
+                    buffer = *buffer_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glFeedbackBuffer(Int32 size, int type, [Out] IntPtr buffer)
+        {
+            unsafe
+            {
+                Delegates.glFeedbackBuffer((Int32)size, (int)type, (Single*)buffer);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSelectBuffer(Int32 size, [Out] UInt32[] buffer)
+        {
+            unsafe
+            {
+                fixed (UInt32* buffer_ptr = buffer)
+                {
+                    Delegates.glSelectBuffer((Int32)size, (UInt32*)buffer_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSelectBuffer(Int32 size, [Out] Int32[] buffer)
+        {
+            unsafe
+            {
+                fixed (Int32* buffer_ptr = buffer)
+                {
+                    Delegates.glSelectBuffer((Int32)size, (UInt32*)buffer_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSelectBuffer(Int32 size, [Out] out UInt32 buffer)
+        {
+            unsafe
+            {
+                fixed (UInt32* buffer_ptr = &buffer)
+                {
+                    Delegates.glSelectBuffer((Int32)size, (UInt32*)buffer_ptr);
+                    buffer = *buffer_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glSelectBuffer(Int32 size, [Out] out Int32 buffer)
+        {
+            unsafe
+            {
+                fixed (Int32* buffer_ptr = &buffer)
+                {
+                    Delegates.glSelectBuffer((Int32)size, (UInt32*)buffer_ptr);
+                    buffer = *buffer_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glSelectBuffer(Int32 size, [Out] IntPtr buffer)
+        {
+            unsafe
+            {
+                Delegates.glSelectBuffer((Int32)size, (UInt32*)buffer);
+            }
+        }
+
+        public static 
+        Int32 glRenderMode(int mode)
+        {
+            return Delegates.glRenderMode((int)mode);
+        }
+
+        public static 
+        void glInitNames()
+        {
+            Delegates.glInitNames();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glLoadName(UInt32 name)
+        {
+            Delegates.glLoadName((UInt32)name);
+        }
+
+        public static 
+        void glLoadName(Int32 name)
+        {
+            Delegates.glLoadName((UInt32)name);
+        }
+
+        public static 
+        void glPassThrough(Single token)
+        {
+            Delegates.glPassThrough((Single)token);
+        }
+
+        public static 
+        void glPopName()
+        {
+            Delegates.glPopName();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPushName(UInt32 name)
+        {
+            Delegates.glPushName((UInt32)name);
+        }
+
+        public static 
+        void glPushName(Int32 name)
+        {
+            Delegates.glPushName((UInt32)name);
+        }
+
+        public static 
+        void glDrawBuffer(int mode)
+        {
+            Delegates.glDrawBuffer((int)mode);
+        }
+
+        public static 
+        void glClear(int mask)
+        {
+            Delegates.glClear((int)mask);
+        }
+
+        public static 
+        void glClearAccum(Single red, Single green, Single blue, Single alpha)
+        {
+            Delegates.glClearAccum((Single)red, (Single)green, (Single)blue, (Single)alpha);
+        }
+
+        public static 
+        void glClearIndex(Single c)
+        {
+            Delegates.glClearIndex((Single)c);
+        }
+
+        public static 
+        void glClearColor(Single red, Single green, Single blue, Single alpha)
+        {
+            Delegates.glClearColor((Single)red, (Single)green, (Single)blue, (Single)alpha);
+        }
+
+        public static 
+        void glClearStencil(Int32 s)
+        {
+            Delegates.glClearStencil((Int32)s);
+        }
+
+        public static 
+        void glClearDepth(Double depth)
+        {
+            Delegates.glClearDepth((Double)depth);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glStencilMask(UInt32 mask)
+        {
+            Delegates.glStencilMask((UInt32)mask);
+        }
+
+        public static 
+        void glStencilMask(Int32 mask)
+        {
+            Delegates.glStencilMask((UInt32)mask);
+        }
+
+        public static 
+        void glColorMask(bool red, bool green, bool blue, bool alpha)
+        {
+            Delegates.glColorMask((bool)red, (bool)green, (bool)blue, (bool)alpha);
+        }
+
+        public static 
+        void glDepthMask(bool flag)
+        {
+            Delegates.glDepthMask((bool)flag);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glIndexMask(UInt32 mask)
+        {
+            Delegates.glIndexMask((UInt32)mask);
+        }
+
+        public static 
+        void glIndexMask(Int32 mask)
+        {
+            Delegates.glIndexMask((UInt32)mask);
+        }
+
+        public static 
+        void glAccum(int op, Single value)
+        {
+            Delegates.glAccum((int)op, (Single)value);
+        }
+
+        public static 
+        void glDisable(int cap)
+        {
+            Delegates.glDisable((int)cap);
+        }
+
+        public static 
+        void glEnable(int cap)
+        {
+            Delegates.glEnable((int)cap);
+        }
+
+        public static 
+        void glFinish()
+        {
+            Delegates.glFinish();
+        }
+
+        public static 
+        void glFlush()
+        {
+            Delegates.glFlush();
+        }
+
+        public static 
+        void glPopAttrib()
+        {
+            Delegates.glPopAttrib();
+        }
+
+        public static 
+        void glPushAttrib(int mask)
+        {
+            Delegates.glPushAttrib((int)mask);
+        }
+
+        public static 
+        void glMap1d(int target, Double u1, Double u2, Int32 stride, Int32 order, Double[] points)
+        {
+            unsafe
+            {
+                fixed (Double* points_ptr = points)
+                {
+                    Delegates.glMap1d((int)target, (Double)u1, (Double)u2, (Int32)stride, (Int32)order, (Double*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMap1d(int target, Double u1, Double u2, Int32 stride, Int32 order, ref Double points)
+        {
+            unsafe
+            {
+                fixed (Double* points_ptr = &points)
+                {
+                    Delegates.glMap1d((int)target, (Double)u1, (Double)u2, (Int32)stride, (Int32)order, (Double*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMap1d(int target, Double u1, Double u2, Int32 stride, Int32 order, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glMap1d((int)target, (Double)u1, (Double)u2, (Int32)stride, (Int32)order, (Double*)points);
+            }
+        }
+
+        public static 
+        void glMap1f(int target, Single u1, Single u2, Int32 stride, Int32 order, Single[] points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = points)
+                {
+                    Delegates.glMap1f((int)target, (Single)u1, (Single)u2, (Int32)stride, (Int32)order, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMap1f(int target, Single u1, Single u2, Int32 stride, Int32 order, ref Single points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = &points)
+                {
+                    Delegates.glMap1f((int)target, (Single)u1, (Single)u2, (Int32)stride, (Int32)order, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMap1f(int target, Single u1, Single u2, Int32 stride, Int32 order, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glMap1f((int)target, (Single)u1, (Single)u2, (Int32)stride, (Int32)order, (Single*)points);
+            }
+        }
+
+        public static 
+        void glMap2d(int target, Double u1, Double u2, Int32 ustride, Int32 uorder, Double v1, Double v2, Int32 vstride, Int32 vorder, Double[] points)
+        {
+            unsafe
+            {
+                fixed (Double* points_ptr = points)
+                {
+                    Delegates.glMap2d((int)target, (Double)u1, (Double)u2, (Int32)ustride, (Int32)uorder, (Double)v1, (Double)v2, (Int32)vstride, (Int32)vorder, (Double*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMap2d(int target, Double u1, Double u2, Int32 ustride, Int32 uorder, Double v1, Double v2, Int32 vstride, Int32 vorder, ref Double points)
+        {
+            unsafe
+            {
+                fixed (Double* points_ptr = &points)
+                {
+                    Delegates.glMap2d((int)target, (Double)u1, (Double)u2, (Int32)ustride, (Int32)uorder, (Double)v1, (Double)v2, (Int32)vstride, (Int32)vorder, (Double*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMap2d(int target, Double u1, Double u2, Int32 ustride, Int32 uorder, Double v1, Double v2, Int32 vstride, Int32 vorder, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glMap2d((int)target, (Double)u1, (Double)u2, (Int32)ustride, (Int32)uorder, (Double)v1, (Double)v2, (Int32)vstride, (Int32)vorder, (Double*)points);
+            }
+        }
+
+        public static 
+        void glMap2f(int target, Single u1, Single u2, Int32 ustride, Int32 uorder, Single v1, Single v2, Int32 vstride, Int32 vorder, Single[] points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = points)
+                {
+                    Delegates.glMap2f((int)target, (Single)u1, (Single)u2, (Int32)ustride, (Int32)uorder, (Single)v1, (Single)v2, (Int32)vstride, (Int32)vorder, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMap2f(int target, Single u1, Single u2, Int32 ustride, Int32 uorder, Single v1, Single v2, Int32 vstride, Int32 vorder, ref Single points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = &points)
+                {
+                    Delegates.glMap2f((int)target, (Single)u1, (Single)u2, (Int32)ustride, (Int32)uorder, (Single)v1, (Single)v2, (Int32)vstride, (Int32)vorder, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMap2f(int target, Single u1, Single u2, Int32 ustride, Int32 uorder, Single v1, Single v2, Int32 vstride, Int32 vorder, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glMap2f((int)target, (Single)u1, (Single)u2, (Int32)ustride, (Int32)uorder, (Single)v1, (Single)v2, (Int32)vstride, (Int32)vorder, (Single*)points);
+            }
+        }
+
+        public static 
+        void glMapGrid1d(Int32 un, Double u1, Double u2)
+        {
+            Delegates.glMapGrid1d((Int32)un, (Double)u1, (Double)u2);
+        }
+
+        public static 
+        void glMapGrid1f(Int32 un, Single u1, Single u2)
+        {
+            Delegates.glMapGrid1f((Int32)un, (Single)u1, (Single)u2);
+        }
+
+        public static 
+        void glMapGrid2d(Int32 un, Double u1, Double u2, Int32 vn, Double v1, Double v2)
+        {
+            Delegates.glMapGrid2d((Int32)un, (Double)u1, (Double)u2, (Int32)vn, (Double)v1, (Double)v2);
+        }
+
+        public static 
+        void glMapGrid2f(Int32 un, Single u1, Single u2, Int32 vn, Single v1, Single v2)
+        {
+            Delegates.glMapGrid2f((Int32)un, (Single)u1, (Single)u2, (Int32)vn, (Single)v1, (Single)v2);
+        }
+
+        public static 
+        void glEvalCoord1d(Double u)
+        {
+            Delegates.glEvalCoord1d((Double)u);
+        }
+
+        public static 
+        void glEvalCoord1dv(Double[] u)
+        {
+            unsafe
+            {
+                fixed (Double* u_ptr = u)
+                {
+                    Delegates.glEvalCoord1dv((Double*)u_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEvalCoord1dv(ref Double u)
+        {
+            unsafe
+            {
+                fixed (Double* u_ptr = &u)
+                {
+                    Delegates.glEvalCoord1dv((Double*)u_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEvalCoord1dv(IntPtr u)
+        {
+            unsafe
+            {
+                Delegates.glEvalCoord1dv((Double*)u);
+            }
+        }
+
+        public static 
+        void glEvalCoord1f(Single u)
+        {
+            Delegates.glEvalCoord1f((Single)u);
+        }
+
+        public static 
+        void glEvalCoord1fv(Single[] u)
+        {
+            unsafe
+            {
+                fixed (Single* u_ptr = u)
+                {
+                    Delegates.glEvalCoord1fv((Single*)u_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEvalCoord1fv(ref Single u)
+        {
+            unsafe
+            {
+                fixed (Single* u_ptr = &u)
+                {
+                    Delegates.glEvalCoord1fv((Single*)u_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEvalCoord1fv(IntPtr u)
+        {
+            unsafe
+            {
+                Delegates.glEvalCoord1fv((Single*)u);
+            }
+        }
+
+        public static 
+        void glEvalCoord2d(Double u, Double v)
+        {
+            Delegates.glEvalCoord2d((Double)u, (Double)v);
+        }
+
+        public static 
+        void glEvalCoord2dv(Double[] u)
+        {
+            unsafe
+            {
+                fixed (Double* u_ptr = u)
+                {
+                    Delegates.glEvalCoord2dv((Double*)u_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEvalCoord2dv(ref Double u)
+        {
+            unsafe
+            {
+                fixed (Double* u_ptr = &u)
+                {
+                    Delegates.glEvalCoord2dv((Double*)u_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEvalCoord2dv(IntPtr u)
+        {
+            unsafe
+            {
+                Delegates.glEvalCoord2dv((Double*)u);
+            }
+        }
+
+        public static 
+        void glEvalCoord2f(Single u, Single v)
+        {
+            Delegates.glEvalCoord2f((Single)u, (Single)v);
+        }
+
+        public static 
+        void glEvalCoord2fv(Single[] u)
+        {
+            unsafe
+            {
+                fixed (Single* u_ptr = u)
+                {
+                    Delegates.glEvalCoord2fv((Single*)u_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEvalCoord2fv(ref Single u)
+        {
+            unsafe
+            {
+                fixed (Single* u_ptr = &u)
+                {
+                    Delegates.glEvalCoord2fv((Single*)u_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEvalCoord2fv(IntPtr u)
+        {
+            unsafe
+            {
+                Delegates.glEvalCoord2fv((Single*)u);
+            }
+        }
+
+        public static 
+        void glEvalMesh1(int mode, Int32 i1, Int32 i2)
+        {
+            Delegates.glEvalMesh1((int)mode, (Int32)i1, (Int32)i2);
+        }
+
+        public static 
+        void glEvalPoint1(Int32 i)
+        {
+            Delegates.glEvalPoint1((Int32)i);
+        }
+
+        public static 
+        void glEvalMesh2(int mode, Int32 i1, Int32 i2, Int32 j1, Int32 j2)
+        {
+            Delegates.glEvalMesh2((int)mode, (Int32)i1, (Int32)i2, (Int32)j1, (Int32)j2);
+        }
+
+        public static 
+        void glEvalPoint2(Int32 i, Int32 j)
+        {
+            Delegates.glEvalPoint2((Int32)i, (Int32)j);
+        }
+
+        public static 
+        void glAlphaFunc(int func, Single @ref)
+        {
+            Delegates.glAlphaFunc((int)func, (Single)@ref);
+        }
+
+        public static 
+        void glBlendFunc(int sfactor, int dfactor)
+        {
+            Delegates.glBlendFunc((int)sfactor, (int)dfactor);
+        }
+
+        public static 
+        void glLogicOp(int opcode)
+        {
+            Delegates.glLogicOp((int)opcode);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glStencilFunc(int func, Int32 @ref, UInt32 mask)
+        {
+            Delegates.glStencilFunc((int)func, (Int32)@ref, (UInt32)mask);
+        }
+
+        public static 
+        void glStencilFunc(int func, Int32 @ref, Int32 mask)
+        {
+            Delegates.glStencilFunc((int)func, (Int32)@ref, (UInt32)mask);
+        }
+
+        public static 
+        void glStencilOp(int fail, int zfail, int zpass)
+        {
+            Delegates.glStencilOp((int)fail, (int)zfail, (int)zpass);
+        }
+
+        public static 
+        void glDepthFunc(int func)
+        {
+            Delegates.glDepthFunc((int)func);
+        }
+
+        public static 
+        void glPixelZoom(Single xfactor, Single yfactor)
+        {
+            Delegates.glPixelZoom((Single)xfactor, (Single)yfactor);
+        }
+
+        public static 
+        void glPixelTransferf(int pname, Single param)
+        {
+            Delegates.glPixelTransferf((int)pname, (Single)param);
+        }
+
+        public static 
+        void glPixelTransferi(int pname, Int32 param)
+        {
+            Delegates.glPixelTransferi((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glPixelStoref(int pname, Single param)
+        {
+            Delegates.glPixelStoref((int)pname, (Single)param);
+        }
+
+        public static 
+        void glPixelStorei(int pname, Int32 param)
+        {
+            Delegates.glPixelStorei((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glPixelMapfv(int map, Int32 mapsize, Single[] values)
+        {
+            unsafe
+            {
+                fixed (Single* values_ptr = values)
+                {
+                    Delegates.glPixelMapfv((int)map, (Int32)mapsize, (Single*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelMapfv(int map, Int32 mapsize, ref Single values)
+        {
+            unsafe
+            {
+                fixed (Single* values_ptr = &values)
+                {
+                    Delegates.glPixelMapfv((int)map, (Int32)mapsize, (Single*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelMapfv(int map, Int32 mapsize, IntPtr values)
+        {
+            unsafe
+            {
+                Delegates.glPixelMapfv((int)map, (Int32)mapsize, (Single*)values);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPixelMapuiv(int map, Int32 mapsize, UInt32[] values)
+        {
+            unsafe
+            {
+                fixed (UInt32* values_ptr = values)
+                {
+                    Delegates.glPixelMapuiv((int)map, (Int32)mapsize, (UInt32*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelMapuiv(int map, Int32 mapsize, Int32[] values)
+        {
+            unsafe
+            {
+                fixed (Int32* values_ptr = values)
+                {
+                    Delegates.glPixelMapuiv((int)map, (Int32)mapsize, (UInt32*)values_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPixelMapuiv(int map, Int32 mapsize, ref UInt32 values)
+        {
+            unsafe
+            {
+                fixed (UInt32* values_ptr = &values)
+                {
+                    Delegates.glPixelMapuiv((int)map, (Int32)mapsize, (UInt32*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelMapuiv(int map, Int32 mapsize, ref Int32 values)
+        {
+            unsafe
+            {
+                fixed (Int32* values_ptr = &values)
+                {
+                    Delegates.glPixelMapuiv((int)map, (Int32)mapsize, (UInt32*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelMapuiv(int map, Int32 mapsize, IntPtr values)
+        {
+            unsafe
+            {
+                Delegates.glPixelMapuiv((int)map, (Int32)mapsize, (UInt32*)values);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPixelMapusv(int map, Int32 mapsize, UInt16[] values)
+        {
+            unsafe
+            {
+                fixed (UInt16* values_ptr = values)
+                {
+                    Delegates.glPixelMapusv((int)map, (Int32)mapsize, (UInt16*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelMapusv(int map, Int32 mapsize, Int16[] values)
+        {
+            unsafe
+            {
+                fixed (Int16* values_ptr = values)
+                {
+                    Delegates.glPixelMapusv((int)map, (Int32)mapsize, (UInt16*)values_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPixelMapusv(int map, Int32 mapsize, ref UInt16 values)
+        {
+            unsafe
+            {
+                fixed (UInt16* values_ptr = &values)
+                {
+                    Delegates.glPixelMapusv((int)map, (Int32)mapsize, (UInt16*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelMapusv(int map, Int32 mapsize, ref Int16 values)
+        {
+            unsafe
+            {
+                fixed (Int16* values_ptr = &values)
+                {
+                    Delegates.glPixelMapusv((int)map, (Int32)mapsize, (UInt16*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelMapusv(int map, Int32 mapsize, IntPtr values)
+        {
+            unsafe
+            {
+                Delegates.glPixelMapusv((int)map, (Int32)mapsize, (UInt16*)values);
+            }
+        }
+
+        public static 
+        void glReadBuffer(int mode)
+        {
+            Delegates.glReadBuffer((int)mode);
+        }
+
+        public static 
+        void glCopyPixels(Int32 x, Int32 y, Int32 width, Int32 height, int type)
+        {
+            Delegates.glCopyPixels((Int32)x, (Int32)y, (Int32)width, (Int32)height, (int)type);
+        }
+
+        public static 
+        void glReadPixels(Int32 x, Int32 y, Int32 width, Int32 height, int format, int type, [Out] IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glReadPixels((Int32)x, (Int32)y, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glReadPixels(Int32 x, Int32 y, Int32 width, Int32 height, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glReadPixels((Int32)x, (Int32)y, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glDrawPixels(Int32 width, Int32 height, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glDrawPixels((Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glDrawPixels(Int32 width, Int32 height, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glDrawPixels((Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetBooleanv(int pname, [Out] bool[] @params)
+        {
+            unsafe
+            {
+                fixed (bool* @params_ptr = @params)
+                {
+                    Delegates.glGetBooleanv((int)pname, (bool*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetBooleanv(int pname, [Out] out bool @params)
+        {
+            unsafe
+            {
+                fixed (bool* @params_ptr = &@params)
+                {
+                    Delegates.glGetBooleanv((int)pname, (bool*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetBooleanv(int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetBooleanv((int)pname, (bool*)@params);
+            }
+        }
+
+        public static 
+        void glGetClipPlane(int plane, [Out] Double[] equation)
+        {
+            unsafe
+            {
+                fixed (Double* equation_ptr = equation)
+                {
+                    Delegates.glGetClipPlane((int)plane, (Double*)equation_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetClipPlane(int plane, [Out] out Double equation)
+        {
+            unsafe
+            {
+                fixed (Double* equation_ptr = &equation)
+                {
+                    Delegates.glGetClipPlane((int)plane, (Double*)equation_ptr);
+                    equation = *equation_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetClipPlane(int plane, [Out] IntPtr equation)
+        {
+            unsafe
+            {
+                Delegates.glGetClipPlane((int)plane, (Double*)equation);
+            }
+        }
+
+        public static 
+        void glGetDoublev(int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetDoublev((int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetDoublev(int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetDoublev((int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetDoublev(int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetDoublev((int)pname, (Double*)@params);
+            }
+        }
+
+        public static 
+        int glGetError()
+        {
+            return Delegates.glGetError();
+        }
+
+        public static 
+        void glGetFloatv(int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetFloatv((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetFloatv(int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetFloatv((int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetFloatv(int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetFloatv((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetIntegerv(int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetIntegerv((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetIntegerv(int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetIntegerv((int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetIntegerv(int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetIntegerv((int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetLightfv(int light, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetLightfv((int)light, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetLightfv(int light, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetLightfv((int)light, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetLightfv(int light, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetLightfv((int)light, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetLightiv(int light, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetLightiv((int)light, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetLightiv(int light, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetLightiv((int)light, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetLightiv(int light, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetLightiv((int)light, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetMapdv(int target, int query, [Out] Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glGetMapdv((int)target, (int)query, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMapdv(int target, int query, [Out] out Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glGetMapdv((int)target, (int)query, (Double*)v_ptr);
+                    v = *v_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMapdv(int target, int query, [Out] IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glGetMapdv((int)target, (int)query, (Double*)v);
+            }
+        }
+
+        public static 
+        void glGetMapfv(int target, int query, [Out] Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glGetMapfv((int)target, (int)query, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMapfv(int target, int query, [Out] out Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glGetMapfv((int)target, (int)query, (Single*)v_ptr);
+                    v = *v_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMapfv(int target, int query, [Out] IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glGetMapfv((int)target, (int)query, (Single*)v);
+            }
+        }
+
+        public static 
+        void glGetMapiv(int target, int query, [Out] Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glGetMapiv((int)target, (int)query, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMapiv(int target, int query, [Out] out Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glGetMapiv((int)target, (int)query, (Int32*)v_ptr);
+                    v = *v_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMapiv(int target, int query, [Out] IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glGetMapiv((int)target, (int)query, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glGetMaterialfv(int face, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetMaterialfv((int)face, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMaterialfv(int face, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetMaterialfv((int)face, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMaterialfv(int face, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMaterialfv((int)face, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetMaterialiv(int face, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetMaterialiv((int)face, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMaterialiv(int face, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetMaterialiv((int)face, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMaterialiv(int face, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMaterialiv((int)face, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetPixelMapfv(int map, [Out] Single[] values)
+        {
+            unsafe
+            {
+                fixed (Single* values_ptr = values)
+                {
+                    Delegates.glGetPixelMapfv((int)map, (Single*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelMapfv(int map, [Out] out Single values)
+        {
+            unsafe
+            {
+                fixed (Single* values_ptr = &values)
+                {
+                    Delegates.glGetPixelMapfv((int)map, (Single*)values_ptr);
+                    values = *values_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelMapfv(int map, [Out] IntPtr values)
+        {
+            unsafe
+            {
+                Delegates.glGetPixelMapfv((int)map, (Single*)values);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetPixelMapuiv(int map, [Out] UInt32[] values)
+        {
+            unsafe
+            {
+                fixed (UInt32* values_ptr = values)
+                {
+                    Delegates.glGetPixelMapuiv((int)map, (UInt32*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelMapuiv(int map, [Out] Int32[] values)
+        {
+            unsafe
+            {
+                fixed (Int32* values_ptr = values)
+                {
+                    Delegates.glGetPixelMapuiv((int)map, (UInt32*)values_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetPixelMapuiv(int map, [Out] out UInt32 values)
+        {
+            unsafe
+            {
+                fixed (UInt32* values_ptr = &values)
+                {
+                    Delegates.glGetPixelMapuiv((int)map, (UInt32*)values_ptr);
+                    values = *values_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelMapuiv(int map, [Out] out Int32 values)
+        {
+            unsafe
+            {
+                fixed (Int32* values_ptr = &values)
+                {
+                    Delegates.glGetPixelMapuiv((int)map, (UInt32*)values_ptr);
+                    values = *values_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelMapuiv(int map, [Out] IntPtr values)
+        {
+            unsafe
+            {
+                Delegates.glGetPixelMapuiv((int)map, (UInt32*)values);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetPixelMapusv(int map, [Out] UInt16[] values)
+        {
+            unsafe
+            {
+                fixed (UInt16* values_ptr = values)
+                {
+                    Delegates.glGetPixelMapusv((int)map, (UInt16*)values_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelMapusv(int map, [Out] Int16[] values)
+        {
+            unsafe
+            {
+                fixed (Int16* values_ptr = values)
+                {
+                    Delegates.glGetPixelMapusv((int)map, (UInt16*)values_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetPixelMapusv(int map, [Out] out UInt16 values)
+        {
+            unsafe
+            {
+                fixed (UInt16* values_ptr = &values)
+                {
+                    Delegates.glGetPixelMapusv((int)map, (UInt16*)values_ptr);
+                    values = *values_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelMapusv(int map, [Out] out Int16 values)
+        {
+            unsafe
+            {
+                fixed (Int16* values_ptr = &values)
+                {
+                    Delegates.glGetPixelMapusv((int)map, (UInt16*)values_ptr);
+                    values = *values_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelMapusv(int map, [Out] IntPtr values)
+        {
+            unsafe
+            {
+                Delegates.glGetPixelMapusv((int)map, (UInt16*)values);
+            }
+        }
+
+        public static 
+        void glGetPolygonStipple([Out] Byte[] mask)
+        {
+            unsafe
+            {
+                fixed (Byte* mask_ptr = mask)
+                {
+                    Delegates.glGetPolygonStipple((Byte*)mask_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetPolygonStipple([Out] out Byte mask)
+        {
+            unsafe
+            {
+                fixed (Byte* mask_ptr = &mask)
+                {
+                    Delegates.glGetPolygonStipple((Byte*)mask_ptr);
+                    mask = *mask_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetPolygonStipple([Out] IntPtr mask)
+        {
+            unsafe
+            {
+                Delegates.glGetPolygonStipple((Byte*)mask);
+            }
+        }
+
+        public static 
+        string glGetString(int name)
+        {
+            unsafe
+            {
+                return System.Runtime.InteropServices.Marshal.PtrToStringAnsi(Delegates.glGetString((int)name));
+            }
+        }
+
+        public static 
+        void glGetTexEnvfv(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetTexEnvfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexEnvfv(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexEnvfv((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexEnvfv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexEnvfv((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetTexEnviv(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetTexEnviv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexEnviv(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexEnviv((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexEnviv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexEnviv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetTexGendv(int coord, int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetTexGendv((int)coord, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexGendv(int coord, int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexGendv((int)coord, (int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexGendv(int coord, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexGendv((int)coord, (int)pname, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glGetTexGenfv(int coord, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetTexGenfv((int)coord, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexGenfv(int coord, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexGenfv((int)coord, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexGenfv(int coord, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexGenfv((int)coord, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetTexGeniv(int coord, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetTexGeniv((int)coord, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexGeniv(int coord, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexGeniv((int)coord, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexGeniv(int coord, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexGeniv((int)coord, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetTexImage(int target, Int32 level, int format, int type, [Out] IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glGetTexImage((int)target, (Int32)level, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glGetTexImage(int target, Int32 level, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetTexImage((int)target, (Int32)level, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetTexParameterfv(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetTexParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexParameterfv(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexParameterfv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexParameterfv((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetTexParameteriv(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetTexParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexParameteriv(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexParameteriv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexParameteriv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetTexLevelParameterfv(int target, Int32 level, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetTexLevelParameterfv((int)target, (Int32)level, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexLevelParameterfv(int target, Int32 level, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexLevelParameterfv((int)target, (Int32)level, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexLevelParameterfv(int target, Int32 level, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexLevelParameterfv((int)target, (Int32)level, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetTexLevelParameteriv(int target, Int32 level, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetTexLevelParameteriv((int)target, (Int32)level, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexLevelParameteriv(int target, Int32 level, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexLevelParameteriv((int)target, (Int32)level, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexLevelParameteriv(int target, Int32 level, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexLevelParameteriv((int)target, (Int32)level, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        bool glIsEnabled(int cap)
+        {
+            return Delegates.glIsEnabled((int)cap);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsList(UInt32 list)
+        {
+            return Delegates.glIsList((UInt32)list);
+        }
+
+        public static 
+        bool glIsList(Int32 list)
+        {
+            return Delegates.glIsList((UInt32)list);
+        }
+
+        public static 
+        void glDepthRange(Double near, Double far)
+        {
+            Delegates.glDepthRange((Double)near, (Double)far);
+        }
+
+        public static 
+        void glFrustum(Double left, Double right, Double bottom, Double top, Double zNear, Double zFar)
+        {
+            Delegates.glFrustum((Double)left, (Double)right, (Double)bottom, (Double)top, (Double)zNear, (Double)zFar);
+        }
+
+        public static 
+        void glLoadIdentity()
+        {
+            Delegates.glLoadIdentity();
+        }
+
+        public static 
+        void glLoadMatrixf(Single[] m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = m)
+                {
+                    Delegates.glLoadMatrixf((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadMatrixf(ref Single m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = &m)
+                {
+                    Delegates.glLoadMatrixf((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadMatrixf(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glLoadMatrixf((Single*)m);
+            }
+        }
+
+        public static 
+        void glLoadMatrixd(Double[] m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = m)
+                {
+                    Delegates.glLoadMatrixd((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadMatrixd(ref Double m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = &m)
+                {
+                    Delegates.glLoadMatrixd((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadMatrixd(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glLoadMatrixd((Double*)m);
+            }
+        }
+
+        public static 
+        void glMatrixMode(int mode)
+        {
+            Delegates.glMatrixMode((int)mode);
+        }
+
+        public static 
+        void glMultMatrixf(Single[] m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = m)
+                {
+                    Delegates.glMultMatrixf((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultMatrixf(ref Single m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = &m)
+                {
+                    Delegates.glMultMatrixf((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultMatrixf(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glMultMatrixf((Single*)m);
+            }
+        }
+
+        public static 
+        void glMultMatrixd(Double[] m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = m)
+                {
+                    Delegates.glMultMatrixd((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultMatrixd(ref Double m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = &m)
+                {
+                    Delegates.glMultMatrixd((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultMatrixd(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glMultMatrixd((Double*)m);
+            }
+        }
+
+        public static 
+        void glOrtho(Double left, Double right, Double bottom, Double top, Double zNear, Double zFar)
+        {
+            Delegates.glOrtho((Double)left, (Double)right, (Double)bottom, (Double)top, (Double)zNear, (Double)zFar);
+        }
+
+        public static 
+        void glPopMatrix()
+        {
+            Delegates.glPopMatrix();
+        }
+
+        public static 
+        void glPushMatrix()
+        {
+            Delegates.glPushMatrix();
+        }
+
+        public static 
+        void glRotated(Double angle, Double x, Double y, Double z)
+        {
+            Delegates.glRotated((Double)angle, (Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glRotatef(Single angle, Single x, Single y, Single z)
+        {
+            Delegates.glRotatef((Single)angle, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glScaled(Double x, Double y, Double z)
+        {
+            Delegates.glScaled((Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glScalef(Single x, Single y, Single z)
+        {
+            Delegates.glScalef((Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glTranslated(Double x, Double y, Double z)
+        {
+            Delegates.glTranslated((Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glTranslatef(Single x, Single y, Single z)
+        {
+            Delegates.glTranslatef((Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glViewport(Int32 x, Int32 y, Int32 width, Int32 height)
+        {
+            Delegates.glViewport((Int32)x, (Int32)y, (Int32)width, (Int32)height);
+        }
+
+        public static 
+        void glArrayElement(Int32 i)
+        {
+            Delegates.glArrayElement((Int32)i);
+        }
+
+        public static 
+        void glColorPointer(Int32 size, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glColorPointer((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glColorPointer(Int32 size, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glColorPointer((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glDisableClientState(int array)
+        {
+            Delegates.glDisableClientState((int)array);
+        }
+
+        public static 
+        void glDrawArrays(int mode, Int32 first, Int32 count)
+        {
+            Delegates.glDrawArrays((int)mode, (Int32)first, (Int32)count);
+        }
+
+        public static 
+        void glDrawElements(int mode, Int32 count, int type, IntPtr indices)
+        {
+            unsafe
+            {
+                Delegates.glDrawElements((int)mode, (Int32)count, (int)type, (IntPtr)indices);
+            }
+        }
+
+        public static 
+        void glDrawElements(int mode, Int32 count, int type, [In, Out] object indices)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glDrawElements((int)mode, (Int32)count, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    indices_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glEdgeFlagPointer(Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glEdgeFlagPointer((Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glEdgeFlagPointer(Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glEdgeFlagPointer((Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glEnableClientState(int array)
+        {
+            Delegates.glEnableClientState((int)array);
+        }
+
+        public static 
+        void glGetPointerv(int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetPointerv((int)pname, (IntPtr)@params);
+            }
+        }
+
+        public static 
+        void glGetPointerv(int pname, [In, Out] object @params)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle @params_ptr = System.Runtime.InteropServices.GCHandle.Alloc(@params, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetPointerv((int)pname, (IntPtr)@params_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    @params_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glIndexPointer(int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glIndexPointer((int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glIndexPointer(int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glIndexPointer((int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glInterleavedArrays(int format, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glInterleavedArrays((int)format, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glInterleavedArrays(int format, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glInterleavedArrays((int)format, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glNormalPointer(int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glNormalPointer((int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glNormalPointer(int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glNormalPointer((int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexCoordPointer(Int32 size, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glTexCoordPointer((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glTexCoordPointer(Int32 size, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexCoordPointer((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glVertexPointer(Int32 size, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexPointer((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glVertexPointer(Int32 size, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexPointer((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glPolygonOffset(Single factor, Single units)
+        {
+            Delegates.glPolygonOffset((Single)factor, (Single)units);
+        }
+
+        public static 
+        void glCopyTexImage1D(int target, Int32 level, int internalformat, Int32 x, Int32 y, Int32 width, Int32 border)
+        {
+            Delegates.glCopyTexImage1D((int)target, (Int32)level, (int)internalformat, (Int32)x, (Int32)y, (Int32)width, (Int32)border);
+        }
+
+        public static 
+        void glCopyTexImage2D(int target, Int32 level, int internalformat, Int32 x, Int32 y, Int32 width, Int32 height, Int32 border)
+        {
+            Delegates.glCopyTexImage2D((int)target, (Int32)level, (int)internalformat, (Int32)x, (Int32)y, (Int32)width, (Int32)height, (Int32)border);
+        }
+
+        public static 
+        void glCopyTexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 x, Int32 y, Int32 width)
+        {
+            Delegates.glCopyTexSubImage1D((int)target, (Int32)level, (Int32)xoffset, (Int32)x, (Int32)y, (Int32)width);
+        }
+
+        public static 
+        void glCopyTexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 x, Int32 y, Int32 width, Int32 height)
+        {
+            Delegates.glCopyTexSubImage2D((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)x, (Int32)y, (Int32)width, (Int32)height);
+        }
+
+        public static 
+        void glTexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 width, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexSubImage1D((int)target, (Int32)level, (Int32)xoffset, (Int32)width, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 width, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexSubImage1D((int)target, (Int32)level, (Int32)xoffset, (Int32)width, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexSubImage2D((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexSubImage2D((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glAreTexturesResident(Int32 n, UInt32[] textures, [Out] bool[] residences)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = textures)
+                fixed (bool* residences_ptr = residences)
+                {
+                    return Delegates.glAreTexturesResident((Int32)n, (UInt32*)textures_ptr, (bool*)residences_ptr);
+                }
+            }
+        }
+
+        public static 
+        bool glAreTexturesResident(Int32 n, Int32[] textures, [Out] bool[] residences)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = textures)
+                fixed (bool* residences_ptr = residences)
+                {
+                    return Delegates.glAreTexturesResident((Int32)n, (UInt32*)textures_ptr, (bool*)residences_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glAreTexturesResident(Int32 n, ref UInt32 textures, [Out] out bool residences)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = &textures)
+                fixed (bool* residences_ptr = &residences)
+                {
+                    bool retval = Delegates.glAreTexturesResident((Int32)n, (UInt32*)textures_ptr, (bool*)residences_ptr);
+                    residences = *residences_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        bool glAreTexturesResident(Int32 n, ref Int32 textures, [Out] out bool residences)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = &textures)
+                fixed (bool* residences_ptr = &residences)
+                {
+                    bool retval = Delegates.glAreTexturesResident((Int32)n, (UInt32*)textures_ptr, (bool*)residences_ptr);
+                    residences = *residences_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        bool glAreTexturesResident(Int32 n, IntPtr textures, [Out] IntPtr residences)
+        {
+            unsafe
+            {
+                return Delegates.glAreTexturesResident((Int32)n, (UInt32*)textures, (bool*)residences);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindTexture(int target, UInt32 texture)
+        {
+            Delegates.glBindTexture((int)target, (UInt32)texture);
+        }
+
+        public static 
+        void glBindTexture(int target, Int32 texture)
+        {
+            Delegates.glBindTexture((int)target, (UInt32)texture);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteTextures(Int32 n, UInt32[] textures)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = textures)
+                {
+                    Delegates.glDeleteTextures((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteTextures(Int32 n, Int32[] textures)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = textures)
+                {
+                    Delegates.glDeleteTextures((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteTextures(Int32 n, ref UInt32 textures)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = &textures)
+                {
+                    Delegates.glDeleteTextures((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteTextures(Int32 n, ref Int32 textures)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = &textures)
+                {
+                    Delegates.glDeleteTextures((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteTextures(Int32 n, IntPtr textures)
+        {
+            unsafe
+            {
+                Delegates.glDeleteTextures((Int32)n, (UInt32*)textures);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenTextures(Int32 n, [Out] UInt32[] textures)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = textures)
+                {
+                    Delegates.glGenTextures((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenTextures(Int32 n, [Out] Int32[] textures)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = textures)
+                {
+                    Delegates.glGenTextures((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenTextures(Int32 n, [Out] out UInt32 textures)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = &textures)
+                {
+                    Delegates.glGenTextures((Int32)n, (UInt32*)textures_ptr);
+                    textures = *textures_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenTextures(Int32 n, [Out] out Int32 textures)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = &textures)
+                {
+                    Delegates.glGenTextures((Int32)n, (UInt32*)textures_ptr);
+                    textures = *textures_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenTextures(Int32 n, [Out] IntPtr textures)
+        {
+            unsafe
+            {
+                Delegates.glGenTextures((Int32)n, (UInt32*)textures);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsTexture(UInt32 texture)
+        {
+            return Delegates.glIsTexture((UInt32)texture);
+        }
+
+        public static 
+        bool glIsTexture(Int32 texture)
+        {
+            return Delegates.glIsTexture((UInt32)texture);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPrioritizeTextures(Int32 n, UInt32[] textures, Single[] priorities)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = textures)
+                fixed (Single* priorities_ptr = priorities)
+                {
+                    Delegates.glPrioritizeTextures((Int32)n, (UInt32*)textures_ptr, (Single*)priorities_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPrioritizeTextures(Int32 n, Int32[] textures, Single[] priorities)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = textures)
+                fixed (Single* priorities_ptr = priorities)
+                {
+                    Delegates.glPrioritizeTextures((Int32)n, (UInt32*)textures_ptr, (Single*)priorities_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPrioritizeTextures(Int32 n, ref UInt32 textures, ref Single priorities)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = &textures)
+                fixed (Single* priorities_ptr = &priorities)
+                {
+                    Delegates.glPrioritizeTextures((Int32)n, (UInt32*)textures_ptr, (Single*)priorities_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPrioritizeTextures(Int32 n, ref Int32 textures, ref Single priorities)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = &textures)
+                fixed (Single* priorities_ptr = &priorities)
+                {
+                    Delegates.glPrioritizeTextures((Int32)n, (UInt32*)textures_ptr, (Single*)priorities_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPrioritizeTextures(Int32 n, IntPtr textures, IntPtr priorities)
+        {
+            unsafe
+            {
+                Delegates.glPrioritizeTextures((Int32)n, (UInt32*)textures, (Single*)priorities);
+            }
+        }
+
+        public static 
+        void glIndexub(Byte c)
+        {
+            Delegates.glIndexub((Byte)c);
+        }
+
+        public static 
+        void glIndexubv(Byte[] c)
+        {
+            unsafe
+            {
+                fixed (Byte* c_ptr = c)
+                {
+                    Delegates.glIndexubv((Byte*)c_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glIndexubv(ref Byte c)
+        {
+            unsafe
+            {
+                fixed (Byte* c_ptr = &c)
+                {
+                    Delegates.glIndexubv((Byte*)c_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glIndexubv(IntPtr c)
+        {
+            unsafe
+            {
+                Delegates.glIndexubv((Byte*)c);
+            }
+        }
+
+        public static 
+        void glPopClientAttrib()
+        {
+            Delegates.glPopClientAttrib();
+        }
+
+        public static 
+        void glPushClientAttrib(int mask)
+        {
+            Delegates.glPushClientAttrib((int)mask);
+        }
+
+        public static 
+        void glBlendColor(Single red, Single green, Single blue, Single alpha)
+        {
+            Delegates.glBlendColor((Single)red, (Single)green, (Single)blue, (Single)alpha);
+        }
+
+        public static 
+        void glBlendEquation(int mode)
+        {
+            Delegates.glBlendEquation((int)mode);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDrawRangeElements(int mode, UInt32 start, UInt32 end, Int32 count, int type, IntPtr indices)
+        {
+            unsafe
+            {
+                Delegates.glDrawRangeElements((int)mode, (UInt32)start, (UInt32)end, (Int32)count, (int)type, (IntPtr)indices);
+            }
+        }
+
+        public static 
+        void glDrawRangeElements(int mode, Int32 start, Int32 end, Int32 count, int type, IntPtr indices)
+        {
+            unsafe
+            {
+                Delegates.glDrawRangeElements((int)mode, (UInt32)start, (UInt32)end, (Int32)count, (int)type, (IntPtr)indices);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDrawRangeElements(int mode, UInt32 start, UInt32 end, Int32 count, int type, [In, Out] object indices)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glDrawRangeElements((int)mode, (UInt32)start, (UInt32)end, (Int32)count, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    indices_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glDrawRangeElements(int mode, Int32 start, Int32 end, Int32 count, int type, [In, Out] object indices)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glDrawRangeElements((int)mode, (UInt32)start, (UInt32)end, (Int32)count, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    indices_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glColorTable(int target, int internalformat, Int32 width, int format, int type, IntPtr table)
+        {
+            unsafe
+            {
+                Delegates.glColorTable((int)target, (int)internalformat, (Int32)width, (int)format, (int)type, (IntPtr)table);
+            }
+        }
+
+        public static 
+        void glColorTable(int target, int internalformat, Int32 width, int format, int type, [In, Out] object table)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle table_ptr = System.Runtime.InteropServices.GCHandle.Alloc(table, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glColorTable((int)target, (int)internalformat, (Int32)width, (int)format, (int)type, (IntPtr)table_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    table_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glColorTableParameterfv(int target, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glColorTableParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColorTableParameterfv(int target, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glColorTableParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColorTableParameterfv(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glColorTableParameterfv((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glColorTableParameteriv(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glColorTableParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColorTableParameteriv(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glColorTableParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColorTableParameteriv(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glColorTableParameteriv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glCopyColorTable(int target, int internalformat, Int32 x, Int32 y, Int32 width)
+        {
+            Delegates.glCopyColorTable((int)target, (int)internalformat, (Int32)x, (Int32)y, (Int32)width);
+        }
+
+        public static 
+        void glGetColorTable(int target, int format, int type, [Out] IntPtr table)
+        {
+            unsafe
+            {
+                Delegates.glGetColorTable((int)target, (int)format, (int)type, (IntPtr)table);
+            }
+        }
+
+        public static 
+        void glGetColorTable(int target, int format, int type, [In, Out] object table)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle table_ptr = System.Runtime.InteropServices.GCHandle.Alloc(table, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetColorTable((int)target, (int)format, (int)type, (IntPtr)table_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    table_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterfv(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetColorTableParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterfv(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetColorTableParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterfv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetColorTableParameterfv((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetColorTableParameteriv(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetColorTableParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameteriv(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetColorTableParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameteriv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetColorTableParameteriv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glColorSubTable(int target, Int32 start, Int32 count, int format, int type, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glColorSubTable((int)target, (Int32)start, (Int32)count, (int)format, (int)type, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glColorSubTable(int target, Int32 start, Int32 count, int format, int type, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glColorSubTable((int)target, (Int32)start, (Int32)count, (int)format, (int)type, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCopyColorSubTable(int target, Int32 start, Int32 x, Int32 y, Int32 width)
+        {
+            Delegates.glCopyColorSubTable((int)target, (Int32)start, (Int32)x, (Int32)y, (Int32)width);
+        }
+
+        public static 
+        void glConvolutionFilter1D(int target, int internalformat, Int32 width, int format, int type, IntPtr image)
+        {
+            unsafe
+            {
+                Delegates.glConvolutionFilter1D((int)target, (int)internalformat, (Int32)width, (int)format, (int)type, (IntPtr)image);
+            }
+        }
+
+        public static 
+        void glConvolutionFilter1D(int target, int internalformat, Int32 width, int format, int type, [In, Out] object image)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle image_ptr = System.Runtime.InteropServices.GCHandle.Alloc(image, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glConvolutionFilter1D((int)target, (int)internalformat, (Int32)width, (int)format, (int)type, (IntPtr)image_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    image_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionFilter2D(int target, int internalformat, Int32 width, Int32 height, int format, int type, IntPtr image)
+        {
+            unsafe
+            {
+                Delegates.glConvolutionFilter2D((int)target, (int)internalformat, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)image);
+            }
+        }
+
+        public static 
+        void glConvolutionFilter2D(int target, int internalformat, Int32 width, Int32 height, int format, int type, [In, Out] object image)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle image_ptr = System.Runtime.InteropServices.GCHandle.Alloc(image, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glConvolutionFilter2D((int)target, (int)internalformat, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)image_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    image_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionParameterf(int target, int pname, Single @params)
+        {
+            Delegates.glConvolutionParameterf((int)target, (int)pname, (Single)@params);
+        }
+
+        public static 
+        void glConvolutionParameterfv(int target, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glConvolutionParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionParameterfv(int target, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glConvolutionParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionParameterfv(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glConvolutionParameterfv((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glConvolutionParameteri(int target, int pname, Int32 @params)
+        {
+            Delegates.glConvolutionParameteri((int)target, (int)pname, (Int32)@params);
+        }
+
+        public static 
+        void glConvolutionParameteriv(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glConvolutionParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionParameteriv(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glConvolutionParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionParameteriv(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glConvolutionParameteriv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glCopyConvolutionFilter1D(int target, int internalformat, Int32 x, Int32 y, Int32 width)
+        {
+            Delegates.glCopyConvolutionFilter1D((int)target, (int)internalformat, (Int32)x, (Int32)y, (Int32)width);
+        }
+
+        public static 
+        void glCopyConvolutionFilter2D(int target, int internalformat, Int32 x, Int32 y, Int32 width, Int32 height)
+        {
+            Delegates.glCopyConvolutionFilter2D((int)target, (int)internalformat, (Int32)x, (Int32)y, (Int32)width, (Int32)height);
+        }
+
+        public static 
+        void glGetConvolutionFilter(int target, int format, int type, [Out] IntPtr image)
+        {
+            unsafe
+            {
+                Delegates.glGetConvolutionFilter((int)target, (int)format, (int)type, (IntPtr)image);
+            }
+        }
+
+        public static 
+        void glGetConvolutionFilter(int target, int format, int type, [In, Out] object image)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle image_ptr = System.Runtime.InteropServices.GCHandle.Alloc(image, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetConvolutionFilter((int)target, (int)format, (int)type, (IntPtr)image_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    image_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameterfv(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetConvolutionParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameterfv(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetConvolutionParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameterfv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetConvolutionParameterfv((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameteriv(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetConvolutionParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameteriv(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetConvolutionParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameteriv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetConvolutionParameteriv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetSeparableFilter(int target, int format, int type, [Out] IntPtr row, [Out] IntPtr column, [Out] IntPtr span)
+        {
+            unsafe
+            {
+                Delegates.glGetSeparableFilter((int)target, (int)format, (int)type, (IntPtr)row, (IntPtr)column, (IntPtr)span);
+            }
+        }
+
+        public static 
+        void glGetSeparableFilter(int target, int format, int type, [In, Out] object row, [In, Out] object column, [In, Out] object span)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle row_ptr = System.Runtime.InteropServices.GCHandle.Alloc(row, System.Runtime.InteropServices.GCHandleType.Pinned);
+                System.Runtime.InteropServices.GCHandle column_ptr = System.Runtime.InteropServices.GCHandle.Alloc(column, System.Runtime.InteropServices.GCHandleType.Pinned);
+                System.Runtime.InteropServices.GCHandle span_ptr = System.Runtime.InteropServices.GCHandle.Alloc(span, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetSeparableFilter((int)target, (int)format, (int)type, (IntPtr)row_ptr.AddrOfPinnedObject(), (IntPtr)column_ptr.AddrOfPinnedObject(), (IntPtr)span_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    row_ptr.Free();
+                    column_ptr.Free();
+                    span_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetSeparableFilter(int target, int format, int type, [Out] IntPtr row, [In, Out] object column, [In, Out] object span)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle column_ptr = System.Runtime.InteropServices.GCHandle.Alloc(column, System.Runtime.InteropServices.GCHandleType.Pinned);
+                System.Runtime.InteropServices.GCHandle span_ptr = System.Runtime.InteropServices.GCHandle.Alloc(span, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetSeparableFilter((int)target, (int)format, (int)type, (IntPtr)row, (IntPtr)column_ptr.AddrOfPinnedObject(), (IntPtr)span_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    column_ptr.Free();
+                    span_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glSeparableFilter2D(int target, int internalformat, Int32 width, Int32 height, int format, int type, IntPtr row, IntPtr column)
+        {
+            unsafe
+            {
+                Delegates.glSeparableFilter2D((int)target, (int)internalformat, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)row, (IntPtr)column);
+            }
+        }
+
+        public static 
+        void glSeparableFilter2D(int target, int internalformat, Int32 width, Int32 height, int format, int type, [In, Out] object row, [In, Out] object column)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle row_ptr = System.Runtime.InteropServices.GCHandle.Alloc(row, System.Runtime.InteropServices.GCHandleType.Pinned);
+                System.Runtime.InteropServices.GCHandle column_ptr = System.Runtime.InteropServices.GCHandle.Alloc(column, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glSeparableFilter2D((int)target, (int)internalformat, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)row_ptr.AddrOfPinnedObject(), (IntPtr)column_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    row_ptr.Free();
+                    column_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogram(int target, bool reset, int format, int type, [Out] IntPtr values)
+        {
+            unsafe
+            {
+                Delegates.glGetHistogram((int)target, (bool)reset, (int)format, (int)type, (IntPtr)values);
+            }
+        }
+
+        public static 
+        void glGetHistogram(int target, bool reset, int format, int type, [In, Out] object values)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle values_ptr = System.Runtime.InteropServices.GCHandle.Alloc(values, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetHistogram((int)target, (bool)reset, (int)format, (int)type, (IntPtr)values_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    values_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogramParameterfv(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetHistogramParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogramParameterfv(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetHistogramParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogramParameterfv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetHistogramParameterfv((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetHistogramParameteriv(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetHistogramParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogramParameteriv(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetHistogramParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogramParameteriv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetHistogramParameteriv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetMinmax(int target, bool reset, int format, int type, [Out] IntPtr values)
+        {
+            unsafe
+            {
+                Delegates.glGetMinmax((int)target, (bool)reset, (int)format, (int)type, (IntPtr)values);
+            }
+        }
+
+        public static 
+        void glGetMinmax(int target, bool reset, int format, int type, [In, Out] object values)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle values_ptr = System.Runtime.InteropServices.GCHandle.Alloc(values, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetMinmax((int)target, (bool)reset, (int)format, (int)type, (IntPtr)values_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    values_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameterfv(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetMinmaxParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameterfv(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetMinmaxParameterfv((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameterfv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMinmaxParameterfv((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameteriv(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetMinmaxParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameteriv(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetMinmaxParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameteriv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMinmaxParameteriv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glHistogram(int target, Int32 width, int internalformat, bool sink)
+        {
+            Delegates.glHistogram((int)target, (Int32)width, (int)internalformat, (bool)sink);
+        }
+
+        public static 
+        void glMinmax(int target, int internalformat, bool sink)
+        {
+            Delegates.glMinmax((int)target, (int)internalformat, (bool)sink);
+        }
+
+        public static 
+        void glResetHistogram(int target)
+        {
+            Delegates.glResetHistogram((int)target);
+        }
+
+        public static 
+        void glResetMinmax(int target)
+        {
+            Delegates.glResetMinmax((int)target);
+        }
+
+        public static 
+        void glTexImage3D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexImage3D((int)target, (Int32)level, (Int32)internalformat, (Int32)width, (Int32)height, (Int32)depth, (Int32)border, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexImage3D(int target, Int32 level, Int32 internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexImage3D((int)target, (Int32)level, (Int32)internalformat, (Int32)width, (Int32)height, (Int32)depth, (Int32)border, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexSubImage3D((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)width, (Int32)height, (Int32)depth, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexSubImage3D((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)width, (Int32)height, (Int32)depth, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCopyTexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 x, Int32 y, Int32 width, Int32 height)
+        {
+            Delegates.glCopyTexSubImage3D((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)x, (Int32)y, (Int32)width, (Int32)height);
+        }
+
+        public static 
+        void glActiveTexture(int texture)
+        {
+            Delegates.glActiveTexture((int)texture);
+        }
+
+        public static 
+        void glClientActiveTexture(int texture)
+        {
+            Delegates.glClientActiveTexture((int)texture);
+        }
+
+        public static 
+        void glMultiTexCoord1d(int target, Double s)
+        {
+            Delegates.glMultiTexCoord1d((int)target, (Double)s);
+        }
+
+        public static 
+        void glMultiTexCoord1dv(int target, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord1dv((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1dv(int target, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord1dv((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1dv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord1dv((int)target, (Double*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1f(int target, Single s)
+        {
+            Delegates.glMultiTexCoord1f((int)target, (Single)s);
+        }
+
+        public static 
+        void glMultiTexCoord1fv(int target, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord1fv((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1fv(int target, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord1fv((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1fv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord1fv((int)target, (Single*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1i(int target, Int32 s)
+        {
+            Delegates.glMultiTexCoord1i((int)target, (Int32)s);
+        }
+
+        public static 
+        void glMultiTexCoord1iv(int target, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord1iv((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1iv(int target, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord1iv((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1iv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord1iv((int)target, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1s(int target, Int16 s)
+        {
+            Delegates.glMultiTexCoord1s((int)target, (Int16)s);
+        }
+
+        public static 
+        void glMultiTexCoord1sv(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord1sv((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1sv(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord1sv((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1sv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord1sv((int)target, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2d(int target, Double s, Double t)
+        {
+            Delegates.glMultiTexCoord2d((int)target, (Double)s, (Double)t);
+        }
+
+        public static 
+        void glMultiTexCoord2dv(int target, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord2dv((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2dv(int target, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord2dv((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2dv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord2dv((int)target, (Double*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2f(int target, Single s, Single t)
+        {
+            Delegates.glMultiTexCoord2f((int)target, (Single)s, (Single)t);
+        }
+
+        public static 
+        void glMultiTexCoord2fv(int target, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord2fv((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2fv(int target, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord2fv((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2fv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord2fv((int)target, (Single*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2i(int target, Int32 s, Int32 t)
+        {
+            Delegates.glMultiTexCoord2i((int)target, (Int32)s, (Int32)t);
+        }
+
+        public static 
+        void glMultiTexCoord2iv(int target, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord2iv((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2iv(int target, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord2iv((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2iv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord2iv((int)target, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2s(int target, Int16 s, Int16 t)
+        {
+            Delegates.glMultiTexCoord2s((int)target, (Int16)s, (Int16)t);
+        }
+
+        public static 
+        void glMultiTexCoord2sv(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord2sv((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2sv(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord2sv((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2sv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord2sv((int)target, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3d(int target, Double s, Double t, Double r)
+        {
+            Delegates.glMultiTexCoord3d((int)target, (Double)s, (Double)t, (Double)r);
+        }
+
+        public static 
+        void glMultiTexCoord3dv(int target, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord3dv((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3dv(int target, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord3dv((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3dv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord3dv((int)target, (Double*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3f(int target, Single s, Single t, Single r)
+        {
+            Delegates.glMultiTexCoord3f((int)target, (Single)s, (Single)t, (Single)r);
+        }
+
+        public static 
+        void glMultiTexCoord3fv(int target, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord3fv((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3fv(int target, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord3fv((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3fv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord3fv((int)target, (Single*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3i(int target, Int32 s, Int32 t, Int32 r)
+        {
+            Delegates.glMultiTexCoord3i((int)target, (Int32)s, (Int32)t, (Int32)r);
+        }
+
+        public static 
+        void glMultiTexCoord3iv(int target, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord3iv((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3iv(int target, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord3iv((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3iv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord3iv((int)target, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3s(int target, Int16 s, Int16 t, Int16 r)
+        {
+            Delegates.glMultiTexCoord3s((int)target, (Int16)s, (Int16)t, (Int16)r);
+        }
+
+        public static 
+        void glMultiTexCoord3sv(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord3sv((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3sv(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord3sv((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3sv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord3sv((int)target, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4d(int target, Double s, Double t, Double r, Double q)
+        {
+            Delegates.glMultiTexCoord4d((int)target, (Double)s, (Double)t, (Double)r, (Double)q);
+        }
+
+        public static 
+        void glMultiTexCoord4dv(int target, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord4dv((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4dv(int target, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord4dv((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4dv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord4dv((int)target, (Double*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4f(int target, Single s, Single t, Single r, Single q)
+        {
+            Delegates.glMultiTexCoord4f((int)target, (Single)s, (Single)t, (Single)r, (Single)q);
+        }
+
+        public static 
+        void glMultiTexCoord4fv(int target, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord4fv((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4fv(int target, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord4fv((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4fv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord4fv((int)target, (Single*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4i(int target, Int32 s, Int32 t, Int32 r, Int32 q)
+        {
+            Delegates.glMultiTexCoord4i((int)target, (Int32)s, (Int32)t, (Int32)r, (Int32)q);
+        }
+
+        public static 
+        void glMultiTexCoord4iv(int target, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord4iv((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4iv(int target, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord4iv((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4iv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord4iv((int)target, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4s(int target, Int16 s, Int16 t, Int16 r, Int16 q)
+        {
+            Delegates.glMultiTexCoord4s((int)target, (Int16)s, (Int16)t, (Int16)r, (Int16)q);
+        }
+
+        public static 
+        void glMultiTexCoord4sv(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord4sv((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4sv(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord4sv((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4sv(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord4sv((int)target, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixf(Single[] m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = m)
+                {
+                    Delegates.glLoadTransposeMatrixf((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixf(ref Single m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = &m)
+                {
+                    Delegates.glLoadTransposeMatrixf((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixf(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glLoadTransposeMatrixf((Single*)m);
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixd(Double[] m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = m)
+                {
+                    Delegates.glLoadTransposeMatrixd((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixd(ref Double m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = &m)
+                {
+                    Delegates.glLoadTransposeMatrixd((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixd(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glLoadTransposeMatrixd((Double*)m);
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixf(Single[] m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = m)
+                {
+                    Delegates.glMultTransposeMatrixf((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixf(ref Single m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = &m)
+                {
+                    Delegates.glMultTransposeMatrixf((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixf(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glMultTransposeMatrixf((Single*)m);
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixd(Double[] m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = m)
+                {
+                    Delegates.glMultTransposeMatrixd((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixd(ref Double m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = &m)
+                {
+                    Delegates.glMultTransposeMatrixd((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixd(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glMultTransposeMatrixd((Double*)m);
+            }
+        }
+
+        public static 
+        void glSampleCoverage(Single value, bool invert)
+        {
+            Delegates.glSampleCoverage((Single)value, (bool)invert);
+        }
+
+        public static 
+        void glCompressedTexImage3D(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexImage3D((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)depth, (Int32)border, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexImage3D(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexImage3D((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)depth, (Int32)border, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCompressedTexImage2D(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 border, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexImage2D((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)border, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexImage2D(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 border, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexImage2D((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)border, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCompressedTexImage1D(int target, Int32 level, int internalformat, Int32 width, Int32 border, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexImage1D((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)border, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexImage1D(int target, Int32 level, int internalformat, Int32 width, Int32 border, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexImage1D((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)border, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexSubImage3D((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)width, (Int32)height, (Int32)depth, (int)format, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage3D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexSubImage3D((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)width, (Int32)height, (Int32)depth, (int)format, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexSubImage2D((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)width, (Int32)height, (int)format, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage2D(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexSubImage2D((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)width, (Int32)height, (int)format, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 width, int format, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexSubImage1D((int)target, (Int32)level, (Int32)xoffset, (Int32)width, (int)format, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage1D(int target, Int32 level, Int32 xoffset, Int32 width, int format, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexSubImage1D((int)target, (Int32)level, (Int32)xoffset, (Int32)width, (int)format, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetCompressedTexImage(int target, Int32 level, [Out] IntPtr img)
+        {
+            unsafe
+            {
+                Delegates.glGetCompressedTexImage((int)target, (Int32)level, (IntPtr)img);
+            }
+        }
+
+        public static 
+        void glGetCompressedTexImage(int target, Int32 level, [In, Out] object img)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle img_ptr = System.Runtime.InteropServices.GCHandle.Alloc(img, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetCompressedTexImage((int)target, (Int32)level, (IntPtr)img_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    img_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glBlendFuncSeparate(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha)
+        {
+            Delegates.glBlendFuncSeparate((int)sfactorRGB, (int)dfactorRGB, (int)sfactorAlpha, (int)dfactorAlpha);
+        }
+
+        public static 
+        void glFogCoordf(Single coord)
+        {
+            Delegates.glFogCoordf((Single)coord);
+        }
+
+        public static 
+        void glFogCoordfv(Single[] coord)
+        {
+            unsafe
+            {
+                fixed (Single* coord_ptr = coord)
+                {
+                    Delegates.glFogCoordfv((Single*)coord_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoordfv(ref Single coord)
+        {
+            unsafe
+            {
+                fixed (Single* coord_ptr = &coord)
+                {
+                    Delegates.glFogCoordfv((Single*)coord_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoordfv(IntPtr coord)
+        {
+            unsafe
+            {
+                Delegates.glFogCoordfv((Single*)coord);
+            }
+        }
+
+        public static 
+        void glFogCoordd(Double coord)
+        {
+            Delegates.glFogCoordd((Double)coord);
+        }
+
+        public static 
+        void glFogCoorddv(Double[] coord)
+        {
+            unsafe
+            {
+                fixed (Double* coord_ptr = coord)
+                {
+                    Delegates.glFogCoorddv((Double*)coord_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoorddv(ref Double coord)
+        {
+            unsafe
+            {
+                fixed (Double* coord_ptr = &coord)
+                {
+                    Delegates.glFogCoorddv((Double*)coord_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoorddv(IntPtr coord)
+        {
+            unsafe
+            {
+                Delegates.glFogCoorddv((Double*)coord);
+            }
+        }
+
+        public static 
+        void glFogCoordPointer(int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glFogCoordPointer((int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glFogCoordPointer(int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glFogCoordPointer((int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawArrays(int mode, [Out] Int32[] first, [Out] Int32[] count, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* first_ptr = first)
+                fixed (Int32* count_ptr = count)
+                {
+                    Delegates.glMultiDrawArrays((int)mode, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount);
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawArrays(int mode, [Out] out Int32 first, [Out] out Int32 count, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* first_ptr = &first)
+                fixed (Int32* count_ptr = &count)
+                {
+                    Delegates.glMultiDrawArrays((int)mode, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount);
+                    first = *first_ptr;
+                    count = *count_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawArrays(int mode, [Out] IntPtr first, [Out] IntPtr count, Int32 primcount)
+        {
+            unsafe
+            {
+                Delegates.glMultiDrawArrays((int)mode, (Int32*)first, (Int32*)count, (Int32)primcount);
+            }
+        }
+
+        public static 
+        void glMultiDrawElements(int mode, Int32[] count, int type, IntPtr indices, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = count)
+                {
+                    Delegates.glMultiDrawElements((int)mode, (Int32*)count_ptr, (int)type, (IntPtr)indices, (Int32)primcount);
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawElements(int mode, IntPtr count, int type, [In, Out] object indices, Int32 primcount)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glMultiDrawElements((int)mode, (Int32*)count, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject(), (Int32)primcount);
+                }
+                finally
+                {
+                    indices_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawElements(int mode, ref Int32 count, int type, [In, Out] object indices, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = &count)
+                {
+                    System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        Delegates.glMultiDrawElements((int)mode, (Int32*)count_ptr, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject(), (Int32)primcount);
+                    }
+                    finally
+                    {
+                        indices_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterf(int pname, Single param)
+        {
+            Delegates.glPointParameterf((int)pname, (Single)param);
+        }
+
+        public static 
+        void glPointParameterfv(int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glPointParameterfv((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterfv(int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glPointParameterfv((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterfv(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glPointParameterfv((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glPointParameteri(int pname, Int32 param)
+        {
+            Delegates.glPointParameteri((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glPointParameteriv(int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glPointParameteriv((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameteriv(int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glPointParameteriv((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameteriv(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glPointParameteriv((int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3b(SByte red, SByte green, SByte blue)
+        {
+            Delegates.glSecondaryColor3b((SByte)red, (SByte)green, (SByte)blue);
+        }
+
+        public static 
+        void glSecondaryColor3b(Byte red, Byte green, Byte blue)
+        {
+            Delegates.glSecondaryColor3b((SByte)red, (SByte)green, (SByte)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3bv(SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3bv(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3bv(ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3bv(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3bv((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3bv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3bv((SByte*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColor3d(Double red, Double green, Double blue)
+        {
+            Delegates.glSecondaryColor3d((Double)red, (Double)green, (Double)blue);
+        }
+
+        public static 
+        void glSecondaryColor3dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColor3f(Single red, Single green, Single blue)
+        {
+            Delegates.glSecondaryColor3f((Single)red, (Single)green, (Single)blue);
+        }
+
+        public static 
+        void glSecondaryColor3fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColor3i(Int32 red, Int32 green, Int32 blue)
+        {
+            Delegates.glSecondaryColor3i((Int32)red, (Int32)green, (Int32)blue);
+        }
+
+        public static 
+        void glSecondaryColor3iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColor3s(Int16 red, Int16 green, Int16 blue)
+        {
+            Delegates.glSecondaryColor3s((Int16)red, (Int16)green, (Int16)blue);
+        }
+
+        public static 
+        void glSecondaryColor3sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColor3ub(Byte red, Byte green, Byte blue)
+        {
+            Delegates.glSecondaryColor3ub((Byte)red, (Byte)green, (Byte)blue);
+        }
+
+        public static 
+        void glSecondaryColor3ubv(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3ubv((Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3ubv(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3ubv((Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3ubv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3ubv((Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3ui(UInt32 red, UInt32 green, UInt32 blue)
+        {
+            Delegates.glSecondaryColor3ui((UInt32)red, (UInt32)green, (UInt32)blue);
+        }
+
+        public static 
+        void glSecondaryColor3ui(Int32 red, Int32 green, Int32 blue)
+        {
+            Delegates.glSecondaryColor3ui((UInt32)red, (UInt32)green, (UInt32)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3uiv(UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3uiv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3uiv(ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3uiv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3uiv((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3uiv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3uiv((UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3us(UInt16 red, UInt16 green, UInt16 blue)
+        {
+            Delegates.glSecondaryColor3us((UInt16)red, (UInt16)green, (UInt16)blue);
+        }
+
+        public static 
+        void glSecondaryColor3us(Int16 red, Int16 green, Int16 blue)
+        {
+            Delegates.glSecondaryColor3us((UInt16)red, (UInt16)green, (UInt16)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3usv(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3usv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3usv(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3usv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3usv((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3usv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3usv((UInt16*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColorPointer(Int32 size, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColorPointer((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glSecondaryColorPointer(Int32 size, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glSecondaryColorPointer((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2d(Double x, Double y)
+        {
+            Delegates.glWindowPos2d((Double)x, (Double)y);
+        }
+
+        public static 
+        void glWindowPos2dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glWindowPos2dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos2f(Single x, Single y)
+        {
+            Delegates.glWindowPos2f((Single)x, (Single)y);
+        }
+
+        public static 
+        void glWindowPos2fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glWindowPos2fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos2i(Int32 x, Int32 y)
+        {
+            Delegates.glWindowPos2i((Int32)x, (Int32)y);
+        }
+
+        public static 
+        void glWindowPos2iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glWindowPos2iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos2s(Int16 x, Int16 y)
+        {
+            Delegates.glWindowPos2s((Int16)x, (Int16)y);
+        }
+
+        public static 
+        void glWindowPos2sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glWindowPos2sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2sv((Int16*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3d(Double x, Double y, Double z)
+        {
+            Delegates.glWindowPos3d((Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glWindowPos3dv(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glWindowPos3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3dv(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3dv((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3dv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3dv((Double*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3f(Single x, Single y, Single z)
+        {
+            Delegates.glWindowPos3f((Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glWindowPos3fv(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glWindowPos3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3fv(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3fv((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3fv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3fv((Single*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3i(Int32 x, Int32 y, Int32 z)
+        {
+            Delegates.glWindowPos3i((Int32)x, (Int32)y, (Int32)z);
+        }
+
+        public static 
+        void glWindowPos3iv(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glWindowPos3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3iv(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3iv((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3iv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3iv((Int32*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3s(Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glWindowPos3s((Int16)x, (Int16)y, (Int16)z);
+        }
+
+        public static 
+        void glWindowPos3sv(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glWindowPos3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3sv(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3sv((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3sv(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3sv((Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenQueries(Int32 n, [Out] UInt32[] ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = ids)
+                {
+                    Delegates.glGenQueries((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenQueries(Int32 n, [Out] Int32[] ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = ids)
+                {
+                    Delegates.glGenQueries((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenQueries(Int32 n, [Out] out UInt32 ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = &ids)
+                {
+                    Delegates.glGenQueries((Int32)n, (UInt32*)ids_ptr);
+                    ids = *ids_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenQueries(Int32 n, [Out] out Int32 ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = &ids)
+                {
+                    Delegates.glGenQueries((Int32)n, (UInt32*)ids_ptr);
+                    ids = *ids_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenQueries(Int32 n, [Out] IntPtr ids)
+        {
+            unsafe
+            {
+                Delegates.glGenQueries((Int32)n, (UInt32*)ids);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteQueries(Int32 n, UInt32[] ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = ids)
+                {
+                    Delegates.glDeleteQueries((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteQueries(Int32 n, Int32[] ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = ids)
+                {
+                    Delegates.glDeleteQueries((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteQueries(Int32 n, ref UInt32 ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = &ids)
+                {
+                    Delegates.glDeleteQueries((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteQueries(Int32 n, ref Int32 ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = &ids)
+                {
+                    Delegates.glDeleteQueries((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteQueries(Int32 n, IntPtr ids)
+        {
+            unsafe
+            {
+                Delegates.glDeleteQueries((Int32)n, (UInt32*)ids);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsQuery(UInt32 id)
+        {
+            return Delegates.glIsQuery((UInt32)id);
+        }
+
+        public static 
+        bool glIsQuery(Int32 id)
+        {
+            return Delegates.glIsQuery((UInt32)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBeginQuery(int target, UInt32 id)
+        {
+            Delegates.glBeginQuery((int)target, (UInt32)id);
+        }
+
+        public static 
+        void glBeginQuery(int target, Int32 id)
+        {
+            Delegates.glBeginQuery((int)target, (UInt32)id);
+        }
+
+        public static 
+        void glEndQuery(int target)
+        {
+            Delegates.glEndQuery((int)target);
+        }
+
+        public static 
+        void glGetQueryiv(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryiv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryiv(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryiv((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryiv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryiv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectiv(UInt32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjectiv((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjectiv(Int32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjectiv((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectiv(UInt32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjectiv((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjectiv(Int32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjectiv((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectiv(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjectiv((UInt32)id, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetQueryObjectiv(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjectiv((UInt32)id, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectuiv(UInt32 id, int pname, [Out] UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjectuiv((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjectuiv(Int32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjectuiv((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectuiv(UInt32 id, int pname, [Out] out UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjectuiv((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjectuiv(Int32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjectuiv((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectuiv(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjectuiv((UInt32)id, (int)pname, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glGetQueryObjectuiv(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjectuiv((UInt32)id, (int)pname, (UInt32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindBuffer(int target, UInt32 buffer)
+        {
+            Delegates.glBindBuffer((int)target, (UInt32)buffer);
+        }
+
+        public static 
+        void glBindBuffer(int target, Int32 buffer)
+        {
+            Delegates.glBindBuffer((int)target, (UInt32)buffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteBuffers(Int32 n, UInt32[] buffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* buffers_ptr = buffers)
+                {
+                    Delegates.glDeleteBuffers((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteBuffers(Int32 n, Int32[] buffers)
+        {
+            unsafe
+            {
+                fixed (Int32* buffers_ptr = buffers)
+                {
+                    Delegates.glDeleteBuffers((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteBuffers(Int32 n, ref UInt32 buffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* buffers_ptr = &buffers)
+                {
+                    Delegates.glDeleteBuffers((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteBuffers(Int32 n, ref Int32 buffers)
+        {
+            unsafe
+            {
+                fixed (Int32* buffers_ptr = &buffers)
+                {
+                    Delegates.glDeleteBuffers((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteBuffers(Int32 n, IntPtr buffers)
+        {
+            unsafe
+            {
+                Delegates.glDeleteBuffers((Int32)n, (UInt32*)buffers);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenBuffers(Int32 n, [Out] UInt32[] buffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* buffers_ptr = buffers)
+                {
+                    Delegates.glGenBuffers((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenBuffers(Int32 n, [Out] Int32[] buffers)
+        {
+            unsafe
+            {
+                fixed (Int32* buffers_ptr = buffers)
+                {
+                    Delegates.glGenBuffers((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenBuffers(Int32 n, [Out] out UInt32 buffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* buffers_ptr = &buffers)
+                {
+                    Delegates.glGenBuffers((Int32)n, (UInt32*)buffers_ptr);
+                    buffers = *buffers_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenBuffers(Int32 n, [Out] out Int32 buffers)
+        {
+            unsafe
+            {
+                fixed (Int32* buffers_ptr = &buffers)
+                {
+                    Delegates.glGenBuffers((Int32)n, (UInt32*)buffers_ptr);
+                    buffers = *buffers_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenBuffers(Int32 n, [Out] IntPtr buffers)
+        {
+            unsafe
+            {
+                Delegates.glGenBuffers((Int32)n, (UInt32*)buffers);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsBuffer(UInt32 buffer)
+        {
+            return Delegates.glIsBuffer((UInt32)buffer);
+        }
+
+        public static 
+        bool glIsBuffer(Int32 buffer)
+        {
+            return Delegates.glIsBuffer((UInt32)buffer);
+        }
+
+        public static 
+        void glBufferData(int target, IntPtr size, IntPtr data, int usage)
+        {
+            unsafe
+            {
+                Delegates.glBufferData((int)target, (IntPtr)size, (IntPtr)data, (int)usage);
+            }
+        }
+
+        public static 
+        void glBufferData(int target, IntPtr size, [In, Out] object data, int usage)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glBufferData((int)target, (IntPtr)size, (IntPtr)data_ptr.AddrOfPinnedObject(), (int)usage);
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glBufferSubData(int target, IntPtr offset, IntPtr size, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glBufferSubData((int)target, (IntPtr)offset, (IntPtr)size, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glBufferSubData(int target, IntPtr offset, IntPtr size, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glBufferSubData((int)target, (IntPtr)offset, (IntPtr)size, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetBufferSubData(int target, IntPtr offset, IntPtr size, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetBufferSubData((int)target, (IntPtr)offset, (IntPtr)size, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glGetBufferSubData(int target, IntPtr offset, IntPtr size, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetBufferSubData((int)target, (IntPtr)offset, (IntPtr)size, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        IntPtr glMapBuffer(int target, int access)
+        {
+            return Delegates.glMapBuffer((int)target, (int)access);
+        }
+
+        public static 
+        bool glUnmapBuffer(int target)
+        {
+            return Delegates.glUnmapBuffer((int)target);
+        }
+
+        public static 
+        void glGetBufferParameteriv(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetBufferParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetBufferParameteriv(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetBufferParameteriv((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetBufferParameteriv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetBufferParameteriv((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetBufferPointerv(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetBufferPointerv((int)target, (int)pname, (IntPtr)@params);
+            }
+        }
+
+        public static 
+        void glGetBufferPointerv(int target, int pname, [In, Out] object @params)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle @params_ptr = System.Runtime.InteropServices.GCHandle.Alloc(@params, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetBufferPointerv((int)target, (int)pname, (IntPtr)@params_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    @params_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glBlendEquationSeparate(int modeRGB, int modeAlpha)
+        {
+            Delegates.glBlendEquationSeparate((int)modeRGB, (int)modeAlpha);
+        }
+
+        public static 
+        void glDrawBuffers(Int32 n, int[] bufs)
+        {
+            unsafe
+            {
+                fixed (int* bufs_ptr = bufs)
+                {
+                    Delegates.glDrawBuffers((Int32)n, (int*)bufs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDrawBuffers(Int32 n, ref int bufs)
+        {
+            unsafe
+            {
+                fixed (int* bufs_ptr = &bufs)
+                {
+                    Delegates.glDrawBuffers((Int32)n, (int*)bufs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDrawBuffers(Int32 n, IntPtr bufs)
+        {
+            unsafe
+            {
+                Delegates.glDrawBuffers((Int32)n, (int*)bufs);
+            }
+        }
+
+        public static 
+        void glStencilOpSeparate(int face, int sfail, int dpfail, int dppass)
+        {
+            Delegates.glStencilOpSeparate((int)face, (int)sfail, (int)dpfail, (int)dppass);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glStencilFuncSeparate(int frontfunc, int backfunc, Int32 @ref, UInt32 mask)
+        {
+            Delegates.glStencilFuncSeparate((int)frontfunc, (int)backfunc, (Int32)@ref, (UInt32)mask);
+        }
+
+        public static 
+        void glStencilFuncSeparate(int frontfunc, int backfunc, Int32 @ref, Int32 mask)
+        {
+            Delegates.glStencilFuncSeparate((int)frontfunc, (int)backfunc, (Int32)@ref, (UInt32)mask);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glStencilMaskSeparate(int face, UInt32 mask)
+        {
+            Delegates.glStencilMaskSeparate((int)face, (UInt32)mask);
+        }
+
+        public static 
+        void glStencilMaskSeparate(int face, Int32 mask)
+        {
+            Delegates.glStencilMaskSeparate((int)face, (UInt32)mask);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glAttachShader(UInt32 program, UInt32 shader)
+        {
+            Delegates.glAttachShader((UInt32)program, (UInt32)shader);
+        }
+
+        public static 
+        void glAttachShader(Int32 program, Int32 shader)
+        {
+            Delegates.glAttachShader((UInt32)program, (UInt32)shader);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindAttribLocation(UInt32 program, UInt32 index, System.String name)
+        {
+            Delegates.glBindAttribLocation((UInt32)program, (UInt32)index, (System.String)name);
+        }
+
+        public static 
+        void glBindAttribLocation(Int32 program, Int32 index, System.String name)
+        {
+            Delegates.glBindAttribLocation((UInt32)program, (UInt32)index, (System.String)name);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glCompileShader(UInt32 shader)
+        {
+            Delegates.glCompileShader((UInt32)shader);
+        }
+
+        public static 
+        void glCompileShader(Int32 shader)
+        {
+            Delegates.glCompileShader((UInt32)shader);
+        }
+
+        public static 
+        Int32 glCreateProgram()
+        {
+            return Delegates.glCreateProgram();
+        }
+
+        public static 
+        Int32 glCreateShader(int type)
+        {
+            return Delegates.glCreateShader((int)type);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteProgram(UInt32 program)
+        {
+            Delegates.glDeleteProgram((UInt32)program);
+        }
+
+        public static 
+        void glDeleteProgram(Int32 program)
+        {
+            Delegates.glDeleteProgram((UInt32)program);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteShader(UInt32 shader)
+        {
+            Delegates.glDeleteShader((UInt32)shader);
+        }
+
+        public static 
+        void glDeleteShader(Int32 shader)
+        {
+            Delegates.glDeleteShader((UInt32)shader);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDetachShader(UInt32 program, UInt32 shader)
+        {
+            Delegates.glDetachShader((UInt32)program, (UInt32)shader);
+        }
+
+        public static 
+        void glDetachShader(Int32 program, Int32 shader)
+        {
+            Delegates.glDetachShader((UInt32)program, (UInt32)shader);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDisableVertexAttribArray(UInt32 index)
+        {
+            Delegates.glDisableVertexAttribArray((UInt32)index);
+        }
+
+        public static 
+        void glDisableVertexAttribArray(Int32 index)
+        {
+            Delegates.glDisableVertexAttribArray((UInt32)index);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glEnableVertexAttribArray(UInt32 index)
+        {
+            Delegates.glEnableVertexAttribArray((UInt32)index);
+        }
+
+        public static 
+        void glEnableVertexAttribArray(Int32 index)
+        {
+            Delegates.glEnableVertexAttribArray((UInt32)index);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveAttrib(UInt32 program, UInt32 index, Int32 bufSize, [Out] Int32[] length, [Out] Int32[] size, [Out] int[] type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                fixed (Int32* size_ptr = size)
+                fixed (int* type_ptr = type)
+                {
+                    Delegates.glGetActiveAttrib((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                }
+            }
+        }
+
+        public static 
+        void glGetActiveAttrib(Int32 program, Int32 index, Int32 bufSize, [Out] Int32[] length, [Out] Int32[] size, [Out] int[] type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                fixed (Int32* size_ptr = size)
+                fixed (int* type_ptr = type)
+                {
+                    Delegates.glGetActiveAttrib((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveAttrib(UInt32 program, UInt32 index, Int32 bufSize, [Out] out Int32 length, [Out] out Int32 size, [Out] out int type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                fixed (Int32* size_ptr = &size)
+                fixed (int* type_ptr = &type)
+                {
+                    Delegates.glGetActiveAttrib((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                    length = *length_ptr;
+                    size = *size_ptr;
+                    type = *type_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetActiveAttrib(Int32 program, Int32 index, Int32 bufSize, [Out] out Int32 length, [Out] out Int32 size, [Out] out int type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                fixed (Int32* size_ptr = &size)
+                fixed (int* type_ptr = &type)
+                {
+                    Delegates.glGetActiveAttrib((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                    length = *length_ptr;
+                    size = *size_ptr;
+                    type = *type_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveAttrib(UInt32 program, UInt32 index, Int32 bufSize, [Out] IntPtr length, [Out] IntPtr size, [Out] IntPtr type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                Delegates.glGetActiveAttrib((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length, (Int32*)size, (int*)type, (System.Text.StringBuilder)name);
+            }
+        }
+
+        public static 
+        void glGetActiveAttrib(Int32 program, Int32 index, Int32 bufSize, [Out] IntPtr length, [Out] IntPtr size, [Out] IntPtr type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                Delegates.glGetActiveAttrib((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length, (Int32*)size, (int*)type, (System.Text.StringBuilder)name);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveUniform(UInt32 program, UInt32 index, Int32 bufSize, [Out] Int32[] length, [Out] Int32[] size, [Out] int[] type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                fixed (Int32* size_ptr = size)
+                fixed (int* type_ptr = type)
+                {
+                    Delegates.glGetActiveUniform((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                }
+            }
+        }
+
+        public static 
+        void glGetActiveUniform(Int32 program, Int32 index, Int32 bufSize, [Out] Int32[] length, [Out] Int32[] size, [Out] int[] type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                fixed (Int32* size_ptr = size)
+                fixed (int* type_ptr = type)
+                {
+                    Delegates.glGetActiveUniform((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveUniform(UInt32 program, UInt32 index, Int32 bufSize, [Out] out Int32 length, [Out] out Int32 size, [Out] out int type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                fixed (Int32* size_ptr = &size)
+                fixed (int* type_ptr = &type)
+                {
+                    Delegates.glGetActiveUniform((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                    length = *length_ptr;
+                    size = *size_ptr;
+                    type = *type_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetActiveUniform(Int32 program, Int32 index, Int32 bufSize, [Out] out Int32 length, [Out] out Int32 size, [Out] out int type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                fixed (Int32* size_ptr = &size)
+                fixed (int* type_ptr = &type)
+                {
+                    Delegates.glGetActiveUniform((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                    length = *length_ptr;
+                    size = *size_ptr;
+                    type = *type_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveUniform(UInt32 program, UInt32 index, Int32 bufSize, [Out] IntPtr length, [Out] IntPtr size, [Out] IntPtr type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                Delegates.glGetActiveUniform((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length, (Int32*)size, (int*)type, (System.Text.StringBuilder)name);
+            }
+        }
+
+        public static 
+        void glGetActiveUniform(Int32 program, Int32 index, Int32 bufSize, [Out] IntPtr length, [Out] IntPtr size, [Out] IntPtr type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                Delegates.glGetActiveUniform((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length, (Int32*)size, (int*)type, (System.Text.StringBuilder)name);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetAttachedShaders(UInt32 program, Int32 maxCount, [Out] Int32[] count, [Out] UInt32[] obj)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = count)
+                fixed (UInt32* obj_ptr = obj)
+                {
+                    Delegates.glGetAttachedShaders((UInt32)program, (Int32)maxCount, (Int32*)count_ptr, (UInt32*)obj_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetAttachedShaders(Int32 program, Int32 maxCount, [Out] Int32[] count, [Out] Int32[] obj)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = count)
+                fixed (Int32* obj_ptr = obj)
+                {
+                    Delegates.glGetAttachedShaders((UInt32)program, (Int32)maxCount, (Int32*)count_ptr, (UInt32*)obj_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetAttachedShaders(UInt32 program, Int32 maxCount, [Out] out Int32 count, [Out] out UInt32 obj)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = &count)
+                fixed (UInt32* obj_ptr = &obj)
+                {
+                    Delegates.glGetAttachedShaders((UInt32)program, (Int32)maxCount, (Int32*)count_ptr, (UInt32*)obj_ptr);
+                    count = *count_ptr;
+                    obj = *obj_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetAttachedShaders(Int32 program, Int32 maxCount, [Out] out Int32 count, [Out] out Int32 obj)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = &count)
+                fixed (Int32* obj_ptr = &obj)
+                {
+                    Delegates.glGetAttachedShaders((UInt32)program, (Int32)maxCount, (Int32*)count_ptr, (UInt32*)obj_ptr);
+                    count = *count_ptr;
+                    obj = *obj_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetAttachedShaders(UInt32 program, Int32 maxCount, [Out] IntPtr count, [Out] IntPtr obj)
+        {
+            unsafe
+            {
+                Delegates.glGetAttachedShaders((UInt32)program, (Int32)maxCount, (Int32*)count, (UInt32*)obj);
+            }
+        }
+
+        public static 
+        void glGetAttachedShaders(Int32 program, Int32 maxCount, [Out] IntPtr count, [Out] IntPtr obj)
+        {
+            unsafe
+            {
+                Delegates.glGetAttachedShaders((UInt32)program, (Int32)maxCount, (Int32*)count, (UInt32*)obj);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glGetAttribLocation(UInt32 program, System.String name)
+        {
+            return Delegates.glGetAttribLocation((UInt32)program, (System.String)name);
+        }
+
+        public static 
+        Int32 glGetAttribLocation(Int32 program, System.String name)
+        {
+            return Delegates.glGetAttribLocation((UInt32)program, (System.String)name);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramiv(UInt32 program, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramiv((UInt32)program, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramiv(Int32 program, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramiv((UInt32)program, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramiv(UInt32 program, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramiv((UInt32)program, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramiv(Int32 program, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramiv((UInt32)program, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramiv(UInt32 program, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramiv((UInt32)program, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramiv(Int32 program, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramiv((UInt32)program, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramInfoLog(UInt32 program, Int32 bufSize, [Out] Int32[] length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glGetProgramInfoLog((UInt32)program, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramInfoLog(Int32 program, Int32 bufSize, [Out] Int32[] length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glGetProgramInfoLog((UInt32)program, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramInfoLog(UInt32 program, Int32 bufSize, [Out] out Int32 length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glGetProgramInfoLog((UInt32)program, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                    length = *length_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramInfoLog(Int32 program, Int32 bufSize, [Out] out Int32 length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glGetProgramInfoLog((UInt32)program, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                    length = *length_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramInfoLog(UInt32 program, Int32 bufSize, [Out] IntPtr length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramInfoLog((UInt32)program, (Int32)bufSize, (Int32*)length, (System.Text.StringBuilder)infoLog);
+            }
+        }
+
+        public static 
+        void glGetProgramInfoLog(Int32 program, Int32 bufSize, [Out] IntPtr length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramInfoLog((UInt32)program, (Int32)bufSize, (Int32*)length, (System.Text.StringBuilder)infoLog);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderiv(UInt32 shader, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetShaderiv((UInt32)shader, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetShaderiv(Int32 shader, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetShaderiv((UInt32)shader, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderiv(UInt32 shader, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetShaderiv((UInt32)shader, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetShaderiv(Int32 shader, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetShaderiv((UInt32)shader, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderiv(UInt32 shader, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetShaderiv((UInt32)shader, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetShaderiv(Int32 shader, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetShaderiv((UInt32)shader, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderInfoLog(UInt32 shader, Int32 bufSize, [Out] Int32[] length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glGetShaderInfoLog((UInt32)shader, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                }
+            }
+        }
+
+        public static 
+        void glGetShaderInfoLog(Int32 shader, Int32 bufSize, [Out] Int32[] length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glGetShaderInfoLog((UInt32)shader, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderInfoLog(UInt32 shader, Int32 bufSize, [Out] out Int32 length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glGetShaderInfoLog((UInt32)shader, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                    length = *length_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetShaderInfoLog(Int32 shader, Int32 bufSize, [Out] out Int32 length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glGetShaderInfoLog((UInt32)shader, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                    length = *length_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderInfoLog(UInt32 shader, Int32 bufSize, [Out] IntPtr length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                Delegates.glGetShaderInfoLog((UInt32)shader, (Int32)bufSize, (Int32*)length, (System.Text.StringBuilder)infoLog);
+            }
+        }
+
+        public static 
+        void glGetShaderInfoLog(Int32 shader, Int32 bufSize, [Out] IntPtr length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                Delegates.glGetShaderInfoLog((UInt32)shader, (Int32)bufSize, (Int32*)length, (System.Text.StringBuilder)infoLog);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderSource(UInt32 shader, Int32 bufSize, [Out] Int32[] length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glGetShaderSource((UInt32)shader, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder[])source);
+                }
+            }
+        }
+
+        public static 
+        void glGetShaderSource(Int32 shader, Int32 bufSize, [Out] Int32[] length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glGetShaderSource((UInt32)shader, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder[])source);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderSource(UInt32 shader, Int32 bufSize, [Out] out Int32 length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glGetShaderSource((UInt32)shader, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder[])source);
+                    length = *length_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetShaderSource(Int32 shader, Int32 bufSize, [Out] out Int32 length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glGetShaderSource((UInt32)shader, (Int32)bufSize, (Int32*)length_ptr, (System.Text.StringBuilder[])source);
+                    length = *length_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderSource(UInt32 shader, Int32 bufSize, [Out] IntPtr length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                Delegates.glGetShaderSource((UInt32)shader, (Int32)bufSize, (Int32*)length, (System.Text.StringBuilder[])source);
+            }
+        }
+
+        public static 
+        void glGetShaderSource(Int32 shader, Int32 bufSize, [Out] IntPtr length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                Delegates.glGetShaderSource((UInt32)shader, (Int32)bufSize, (Int32*)length, (System.Text.StringBuilder[])source);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glGetUniformLocation(UInt32 program, System.String name)
+        {
+            return Delegates.glGetUniformLocation((UInt32)program, (System.String)name);
+        }
+
+        public static 
+        Int32 glGetUniformLocation(Int32 program, System.String name)
+        {
+            return Delegates.glGetUniformLocation((UInt32)program, (System.String)name);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformfv(UInt32 program, Int32 location, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetUniformfv((UInt32)program, (Int32)location, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetUniformfv(Int32 program, Int32 location, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetUniformfv((UInt32)program, (Int32)location, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformfv(UInt32 program, Int32 location, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetUniformfv((UInt32)program, (Int32)location, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetUniformfv(Int32 program, Int32 location, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetUniformfv((UInt32)program, (Int32)location, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformfv(UInt32 program, Int32 location, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetUniformfv((UInt32)program, (Int32)location, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetUniformfv(Int32 program, Int32 location, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetUniformfv((UInt32)program, (Int32)location, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformiv(UInt32 program, Int32 location, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetUniformiv((UInt32)program, (Int32)location, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetUniformiv(Int32 program, Int32 location, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetUniformiv((UInt32)program, (Int32)location, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformiv(UInt32 program, Int32 location, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetUniformiv((UInt32)program, (Int32)location, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetUniformiv(Int32 program, Int32 location, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetUniformiv((UInt32)program, (Int32)location, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformiv(UInt32 program, Int32 location, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetUniformiv((UInt32)program, (Int32)location, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetUniformiv(Int32 program, Int32 location, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetUniformiv((UInt32)program, (Int32)location, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribdv(UInt32 index, int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribdv((UInt32)index, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribdv(Int32 index, int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribdv((UInt32)index, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribdv(UInt32 index, int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribdv((UInt32)index, (int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribdv(Int32 index, int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribdv((UInt32)index, (int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribdv(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribdv((UInt32)index, (int)pname, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribdv(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribdv((UInt32)index, (int)pname, (Double*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribfv(UInt32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribfv((UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribfv(Int32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribfv((UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribfv(UInt32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribfv((UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribfv(Int32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribfv((UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribfv(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribfv((UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribfv(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribfv((UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribiv(UInt32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribiv((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribiv(Int32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribiv((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribiv(UInt32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribiv((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribiv(Int32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribiv((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribiv(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribiv((UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribiv(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribiv((UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribPointerv(UInt32 index, int pname, [Out] IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribPointerv((UInt32)index, (int)pname, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribPointerv(Int32 index, int pname, [Out] IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribPointerv((UInt32)index, (int)pname, (IntPtr)pointer);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribPointerv(UInt32 index, int pname, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetVertexAttribPointerv((UInt32)index, (int)pname, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribPointerv(Int32 index, int pname, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetVertexAttribPointerv((UInt32)index, (int)pname, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsProgram(UInt32 program)
+        {
+            return Delegates.glIsProgram((UInt32)program);
+        }
+
+        public static 
+        bool glIsProgram(Int32 program)
+        {
+            return Delegates.glIsProgram((UInt32)program);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsShader(UInt32 shader)
+        {
+            return Delegates.glIsShader((UInt32)shader);
+        }
+
+        public static 
+        bool glIsShader(Int32 shader)
+        {
+            return Delegates.glIsShader((UInt32)shader);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glLinkProgram(UInt32 program)
+        {
+            Delegates.glLinkProgram((UInt32)program);
+        }
+
+        public static 
+        void glLinkProgram(Int32 program)
+        {
+            Delegates.glLinkProgram((UInt32)program);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glShaderSource(UInt32 shader, Int32 count, System.String[] @string, Int32[] length)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glShaderSource((UInt32)shader, (Int32)count, (System.String[])@string, (Int32*)length_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glShaderSource(Int32 shader, Int32 count, System.String[] @string, Int32[] length)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glShaderSource((UInt32)shader, (Int32)count, (System.String[])@string, (Int32*)length_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glShaderSource(UInt32 shader, Int32 count, System.String[] @string, ref Int32 length)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glShaderSource((UInt32)shader, (Int32)count, (System.String[])@string, (Int32*)length_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glShaderSource(Int32 shader, Int32 count, System.String[] @string, ref Int32 length)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glShaderSource((UInt32)shader, (Int32)count, (System.String[])@string, (Int32*)length_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glShaderSource(UInt32 shader, Int32 count, System.String[] @string, IntPtr length)
+        {
+            unsafe
+            {
+                Delegates.glShaderSource((UInt32)shader, (Int32)count, (System.String[])@string, (Int32*)length);
+            }
+        }
+
+        public static 
+        void glShaderSource(Int32 shader, Int32 count, System.String[] @string, IntPtr length)
+        {
+            unsafe
+            {
+                Delegates.glShaderSource((UInt32)shader, (Int32)count, (System.String[])@string, (Int32*)length);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUseProgram(UInt32 program)
+        {
+            Delegates.glUseProgram((UInt32)program);
+        }
+
+        public static 
+        void glUseProgram(Int32 program)
+        {
+            Delegates.glUseProgram((UInt32)program);
+        }
+
+        public static 
+        void glUniform1f(Int32 location, Single v0)
+        {
+            Delegates.glUniform1f((Int32)location, (Single)v0);
+        }
+
+        public static 
+        void glUniform2f(Int32 location, Single v0, Single v1)
+        {
+            Delegates.glUniform2f((Int32)location, (Single)v0, (Single)v1);
+        }
+
+        public static 
+        void glUniform3f(Int32 location, Single v0, Single v1, Single v2)
+        {
+            Delegates.glUniform3f((Int32)location, (Single)v0, (Single)v1, (Single)v2);
+        }
+
+        public static 
+        void glUniform4f(Int32 location, Single v0, Single v1, Single v2, Single v3)
+        {
+            Delegates.glUniform4f((Int32)location, (Single)v0, (Single)v1, (Single)v2, (Single)v3);
+        }
+
+        public static 
+        void glUniform1i(Int32 location, Int32 v0)
+        {
+            Delegates.glUniform1i((Int32)location, (Int32)v0);
+        }
+
+        public static 
+        void glUniform2i(Int32 location, Int32 v0, Int32 v1)
+        {
+            Delegates.glUniform2i((Int32)location, (Int32)v0, (Int32)v1);
+        }
+
+        public static 
+        void glUniform3i(Int32 location, Int32 v0, Int32 v1, Int32 v2)
+        {
+            Delegates.glUniform3i((Int32)location, (Int32)v0, (Int32)v1, (Int32)v2);
+        }
+
+        public static 
+        void glUniform4i(Int32 location, Int32 v0, Int32 v1, Int32 v2, Int32 v3)
+        {
+            Delegates.glUniform4i((Int32)location, (Int32)v0, (Int32)v1, (Int32)v2, (Int32)v3);
+        }
+
+        public static 
+        void glUniform1fv(Int32 location, Int32 count, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniform1fv((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1fv(Int32 location, Int32 count, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniform1fv((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1fv(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform1fv((Int32)location, (Int32)count, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniform2fv(Int32 location, Int32 count, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniform2fv((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2fv(Int32 location, Int32 count, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniform2fv((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2fv(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform2fv((Int32)location, (Int32)count, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniform3fv(Int32 location, Int32 count, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniform3fv((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3fv(Int32 location, Int32 count, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniform3fv((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3fv(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform3fv((Int32)location, (Int32)count, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniform4fv(Int32 location, Int32 count, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniform4fv((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4fv(Int32 location, Int32 count, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniform4fv((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4fv(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform4fv((Int32)location, (Int32)count, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniform1iv(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform1iv((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1iv(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform1iv((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1iv(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform1iv((Int32)location, (Int32)count, (Int32*)value);
+            }
+        }
+
+        public static 
+        void glUniform2iv(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform2iv((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2iv(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform2iv((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2iv(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform2iv((Int32)location, (Int32)count, (Int32*)value);
+            }
+        }
+
+        public static 
+        void glUniform3iv(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform3iv((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3iv(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform3iv((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3iv(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform3iv((Int32)location, (Int32)count, (Int32*)value);
+            }
+        }
+
+        public static 
+        void glUniform4iv(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform4iv((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4iv(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform4iv((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4iv(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform4iv((Int32)location, (Int32)count, (Int32*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix2fv(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix2fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix2fv(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix2fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix2fv(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix2fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix3fv(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix3fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix3fv(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix3fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix3fv(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix3fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix4fv(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix4fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix4fv(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix4fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix4fv(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix4fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glValidateProgram(UInt32 program)
+        {
+            Delegates.glValidateProgram((UInt32)program);
+        }
+
+        public static 
+        void glValidateProgram(Int32 program)
+        {
+            Delegates.glValidateProgram((UInt32)program);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1d(UInt32 index, Double x)
+        {
+            Delegates.glVertexAttrib1d((UInt32)index, (Double)x);
+        }
+
+        public static 
+        void glVertexAttrib1d(Int32 index, Double x)
+        {
+            Delegates.glVertexAttrib1d((UInt32)index, (Double)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dv(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1dv(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dv(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1dv(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1dv((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib1dv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1dv((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1f(UInt32 index, Single x)
+        {
+            Delegates.glVertexAttrib1f((UInt32)index, (Single)x);
+        }
+
+        public static 
+        void glVertexAttrib1f(Int32 index, Single x)
+        {
+            Delegates.glVertexAttrib1f((UInt32)index, (Single)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fv(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1fv(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fv(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1fv(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1fv((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib1fv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1fv((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1s(UInt32 index, Int16 x)
+        {
+            Delegates.glVertexAttrib1s((UInt32)index, (Int16)x);
+        }
+
+        public static 
+        void glVertexAttrib1s(Int32 index, Int16 x)
+        {
+            Delegates.glVertexAttrib1s((UInt32)index, (Int16)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1sv(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1sv(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1sv(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1sv(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1sv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1sv((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib1sv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1sv((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2d(UInt32 index, Double x, Double y)
+        {
+            Delegates.glVertexAttrib2d((UInt32)index, (Double)x, (Double)y);
+        }
+
+        public static 
+        void glVertexAttrib2d(Int32 index, Double x, Double y)
+        {
+            Delegates.glVertexAttrib2d((UInt32)index, (Double)x, (Double)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dv(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2dv(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dv(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2dv(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2dv((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib2dv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2dv((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2f(UInt32 index, Single x, Single y)
+        {
+            Delegates.glVertexAttrib2f((UInt32)index, (Single)x, (Single)y);
+        }
+
+        public static 
+        void glVertexAttrib2f(Int32 index, Single x, Single y)
+        {
+            Delegates.glVertexAttrib2f((UInt32)index, (Single)x, (Single)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fv(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2fv(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fv(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2fv(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2fv((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib2fv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2fv((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2s(UInt32 index, Int16 x, Int16 y)
+        {
+            Delegates.glVertexAttrib2s((UInt32)index, (Int16)x, (Int16)y);
+        }
+
+        public static 
+        void glVertexAttrib2s(Int32 index, Int16 x, Int16 y)
+        {
+            Delegates.glVertexAttrib2s((UInt32)index, (Int16)x, (Int16)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2sv(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2sv(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2sv(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2sv(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2sv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2sv((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib2sv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2sv((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3d(UInt32 index, Double x, Double y, Double z)
+        {
+            Delegates.glVertexAttrib3d((UInt32)index, (Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glVertexAttrib3d(Int32 index, Double x, Double y, Double z)
+        {
+            Delegates.glVertexAttrib3d((UInt32)index, (Double)x, (Double)y, (Double)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dv(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3dv(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dv(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3dv(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3dv((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib3dv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3dv((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3f(UInt32 index, Single x, Single y, Single z)
+        {
+            Delegates.glVertexAttrib3f((UInt32)index, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glVertexAttrib3f(Int32 index, Single x, Single y, Single z)
+        {
+            Delegates.glVertexAttrib3f((UInt32)index, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fv(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3fv(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fv(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3fv(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3fv((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib3fv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3fv((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3s(UInt32 index, Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glVertexAttrib3s((UInt32)index, (Int16)x, (Int16)y, (Int16)z);
+        }
+
+        public static 
+        void glVertexAttrib3s(Int32 index, Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glVertexAttrib3s((UInt32)index, (Int16)x, (Int16)y, (Int16)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3sv(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3sv(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3sv(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3sv(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3sv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3sv((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib3sv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3sv((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nbv(UInt32 index, SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Nbv((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nbv(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Nbv((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nbv(UInt32 index, ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Nbv((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nbv(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Nbv((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nbv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Nbv((UInt32)index, (SByte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nbv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Nbv((UInt32)index, (SByte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Niv(UInt32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Niv((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Niv(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Niv((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Niv(UInt32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Niv((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Niv(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Niv((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Niv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Niv((UInt32)index, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Niv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Niv((UInt32)index, (Int32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nsv(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Nsv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nsv(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Nsv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nsv(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Nsv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nsv(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Nsv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nsv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Nsv((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nsv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Nsv((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nub(UInt32 index, Byte x, Byte y, Byte z, Byte w)
+        {
+            Delegates.glVertexAttrib4Nub((UInt32)index, (Byte)x, (Byte)y, (Byte)z, (Byte)w);
+        }
+
+        public static 
+        void glVertexAttrib4Nub(Int32 index, Byte x, Byte y, Byte z, Byte w)
+        {
+            Delegates.glVertexAttrib4Nub((UInt32)index, (Byte)x, (Byte)y, (Byte)z, (Byte)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nubv(UInt32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Nubv((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nubv(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Nubv((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nubv(UInt32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Nubv((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nubv(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Nubv((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nubv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Nubv((UInt32)index, (Byte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nubv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Nubv((UInt32)index, (Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nuiv(UInt32 index, UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Nuiv((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nuiv(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Nuiv((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nuiv(UInt32 index, ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Nuiv((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nuiv(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Nuiv((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nuiv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Nuiv((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nuiv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Nuiv((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nusv(UInt32 index, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Nusv((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nusv(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4Nusv((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nusv(UInt32 index, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Nusv((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nusv(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4Nusv((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4Nusv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Nusv((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4Nusv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4Nusv((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4bv(UInt32 index, SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4bv((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4bv(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4bv((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4bv(UInt32 index, ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4bv((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4bv(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4bv((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4bv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4bv((UInt32)index, (SByte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4bv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4bv((UInt32)index, (SByte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4d(UInt32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glVertexAttrib4d((UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        public static 
+        void glVertexAttrib4d(Int32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glVertexAttrib4d((UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dv(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4dv(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dv(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4dv(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4dv((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4dv((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4dv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4dv((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4f(UInt32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glVertexAttrib4f((UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glVertexAttrib4f(Int32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glVertexAttrib4f((UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fv(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4fv(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fv(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4fv(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4fv((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4fv((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4fv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4fv((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4iv(UInt32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4iv((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4iv(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4iv((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4iv(UInt32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4iv((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4iv(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4iv((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4iv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4iv((UInt32)index, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4iv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4iv((UInt32)index, (Int32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4s(UInt32 index, Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glVertexAttrib4s((UInt32)index, (Int16)x, (Int16)y, (Int16)z, (Int16)w);
+        }
+
+        public static 
+        void glVertexAttrib4s(Int32 index, Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glVertexAttrib4s((UInt32)index, (Int16)x, (Int16)y, (Int16)z, (Int16)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4sv(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4sv(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4sv(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4sv(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4sv((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4sv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4sv((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4sv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4sv((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ubv(UInt32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4ubv((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ubv(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4ubv((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ubv(UInt32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4ubv((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ubv(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4ubv((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ubv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4ubv((UInt32)index, (Byte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ubv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4ubv((UInt32)index, (Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4uiv(UInt32 index, UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4uiv((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4uiv(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4uiv((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4uiv(UInt32 index, ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4uiv((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4uiv(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4uiv((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4uiv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4uiv((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4uiv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4uiv((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4usv(UInt32 index, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4usv((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4usv(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4usv((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4usv(UInt32 index, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4usv((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4usv(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4usv((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4usv(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4usv((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4usv(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4usv((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribPointer(UInt32 index, Int32 size, int type, bool normalized, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribPointer((UInt32)index, (Int32)size, (int)type, (bool)normalized, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glVertexAttribPointer(Int32 index, Int32 size, int type, bool normalized, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribPointer((UInt32)index, (Int32)size, (int)type, (bool)normalized, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribPointer(UInt32 index, Int32 size, int type, bool normalized, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexAttribPointer((UInt32)index, (Int32)size, (int)type, (bool)normalized, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribPointer(Int32 index, Int32 size, int type, bool normalized, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexAttribPointer((UInt32)index, (Int32)size, (int)type, (bool)normalized, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix2x3fv(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix2x3fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix2x3fv(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix2x3fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix2x3fv(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix2x3fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix3x2fv(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix3x2fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix3x2fv(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix3x2fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix3x2fv(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix3x2fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix2x4fv(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix2x4fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix2x4fv(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix2x4fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix2x4fv(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix2x4fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix4x2fv(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix4x2fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix4x2fv(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix4x2fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix4x2fv(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix4x2fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix3x4fv(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix3x4fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix3x4fv(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix3x4fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix3x4fv(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix3x4fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix4x3fv(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix4x3fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix4x3fv(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix4x3fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix4x3fv(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix4x3fv((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        public static 
+        void glActiveTextureARB(int texture)
+        {
+            Delegates.glActiveTextureARB((int)texture);
+        }
+
+        public static 
+        void glClientActiveTextureARB(int texture)
+        {
+            Delegates.glClientActiveTextureARB((int)texture);
+        }
+
+        public static 
+        void glMultiTexCoord1dARB(int target, Double s)
+        {
+            Delegates.glMultiTexCoord1dARB((int)target, (Double)s);
+        }
+
+        public static 
+        void glMultiTexCoord1dvARB(int target, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord1dvARB((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1dvARB(int target, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord1dvARB((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1dvARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord1dvARB((int)target, (Double*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1fARB(int target, Single s)
+        {
+            Delegates.glMultiTexCoord1fARB((int)target, (Single)s);
+        }
+
+        public static 
+        void glMultiTexCoord1fvARB(int target, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord1fvARB((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1fvARB(int target, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord1fvARB((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1fvARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord1fvARB((int)target, (Single*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1iARB(int target, Int32 s)
+        {
+            Delegates.glMultiTexCoord1iARB((int)target, (Int32)s);
+        }
+
+        public static 
+        void glMultiTexCoord1ivARB(int target, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord1ivARB((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1ivARB(int target, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord1ivARB((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1ivARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord1ivARB((int)target, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1sARB(int target, Int16 s)
+        {
+            Delegates.glMultiTexCoord1sARB((int)target, (Int16)s);
+        }
+
+        public static 
+        void glMultiTexCoord1svARB(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord1svARB((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1svARB(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord1svARB((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1svARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord1svARB((int)target, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2dARB(int target, Double s, Double t)
+        {
+            Delegates.glMultiTexCoord2dARB((int)target, (Double)s, (Double)t);
+        }
+
+        public static 
+        void glMultiTexCoord2dvARB(int target, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord2dvARB((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2dvARB(int target, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord2dvARB((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2dvARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord2dvARB((int)target, (Double*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2fARB(int target, Single s, Single t)
+        {
+            Delegates.glMultiTexCoord2fARB((int)target, (Single)s, (Single)t);
+        }
+
+        public static 
+        void glMultiTexCoord2fvARB(int target, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord2fvARB((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2fvARB(int target, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord2fvARB((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2fvARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord2fvARB((int)target, (Single*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2iARB(int target, Int32 s, Int32 t)
+        {
+            Delegates.glMultiTexCoord2iARB((int)target, (Int32)s, (Int32)t);
+        }
+
+        public static 
+        void glMultiTexCoord2ivARB(int target, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord2ivARB((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2ivARB(int target, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord2ivARB((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2ivARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord2ivARB((int)target, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2sARB(int target, Int16 s, Int16 t)
+        {
+            Delegates.glMultiTexCoord2sARB((int)target, (Int16)s, (Int16)t);
+        }
+
+        public static 
+        void glMultiTexCoord2svARB(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord2svARB((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2svARB(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord2svARB((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2svARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord2svARB((int)target, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3dARB(int target, Double s, Double t, Double r)
+        {
+            Delegates.glMultiTexCoord3dARB((int)target, (Double)s, (Double)t, (Double)r);
+        }
+
+        public static 
+        void glMultiTexCoord3dvARB(int target, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord3dvARB((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3dvARB(int target, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord3dvARB((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3dvARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord3dvARB((int)target, (Double*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3fARB(int target, Single s, Single t, Single r)
+        {
+            Delegates.glMultiTexCoord3fARB((int)target, (Single)s, (Single)t, (Single)r);
+        }
+
+        public static 
+        void glMultiTexCoord3fvARB(int target, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord3fvARB((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3fvARB(int target, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord3fvARB((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3fvARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord3fvARB((int)target, (Single*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3iARB(int target, Int32 s, Int32 t, Int32 r)
+        {
+            Delegates.glMultiTexCoord3iARB((int)target, (Int32)s, (Int32)t, (Int32)r);
+        }
+
+        public static 
+        void glMultiTexCoord3ivARB(int target, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord3ivARB((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3ivARB(int target, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord3ivARB((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3ivARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord3ivARB((int)target, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3sARB(int target, Int16 s, Int16 t, Int16 r)
+        {
+            Delegates.glMultiTexCoord3sARB((int)target, (Int16)s, (Int16)t, (Int16)r);
+        }
+
+        public static 
+        void glMultiTexCoord3svARB(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord3svARB((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3svARB(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord3svARB((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3svARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord3svARB((int)target, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4dARB(int target, Double s, Double t, Double r, Double q)
+        {
+            Delegates.glMultiTexCoord4dARB((int)target, (Double)s, (Double)t, (Double)r, (Double)q);
+        }
+
+        public static 
+        void glMultiTexCoord4dvARB(int target, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord4dvARB((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4dvARB(int target, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord4dvARB((int)target, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4dvARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord4dvARB((int)target, (Double*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4fARB(int target, Single s, Single t, Single r, Single q)
+        {
+            Delegates.glMultiTexCoord4fARB((int)target, (Single)s, (Single)t, (Single)r, (Single)q);
+        }
+
+        public static 
+        void glMultiTexCoord4fvARB(int target, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord4fvARB((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4fvARB(int target, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord4fvARB((int)target, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4fvARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord4fvARB((int)target, (Single*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4iARB(int target, Int32 s, Int32 t, Int32 r, Int32 q)
+        {
+            Delegates.glMultiTexCoord4iARB((int)target, (Int32)s, (Int32)t, (Int32)r, (Int32)q);
+        }
+
+        public static 
+        void glMultiTexCoord4ivARB(int target, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord4ivARB((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4ivARB(int target, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord4ivARB((int)target, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4ivARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord4ivARB((int)target, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4sARB(int target, Int16 s, Int16 t, Int16 r, Int16 q)
+        {
+            Delegates.glMultiTexCoord4sARB((int)target, (Int16)s, (Int16)t, (Int16)r, (Int16)q);
+        }
+
+        public static 
+        void glMultiTexCoord4svARB(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord4svARB((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4svARB(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord4svARB((int)target, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4svARB(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord4svARB((int)target, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixfARB(Single[] m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = m)
+                {
+                    Delegates.glLoadTransposeMatrixfARB((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixfARB(ref Single m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = &m)
+                {
+                    Delegates.glLoadTransposeMatrixfARB((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixfARB(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glLoadTransposeMatrixfARB((Single*)m);
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixdARB(Double[] m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = m)
+                {
+                    Delegates.glLoadTransposeMatrixdARB((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixdARB(ref Double m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = &m)
+                {
+                    Delegates.glLoadTransposeMatrixdARB((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadTransposeMatrixdARB(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glLoadTransposeMatrixdARB((Double*)m);
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixfARB(Single[] m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = m)
+                {
+                    Delegates.glMultTransposeMatrixfARB((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixfARB(ref Single m)
+        {
+            unsafe
+            {
+                fixed (Single* m_ptr = &m)
+                {
+                    Delegates.glMultTransposeMatrixfARB((Single*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixfARB(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glMultTransposeMatrixfARB((Single*)m);
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixdARB(Double[] m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = m)
+                {
+                    Delegates.glMultTransposeMatrixdARB((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixdARB(ref Double m)
+        {
+            unsafe
+            {
+                fixed (Double* m_ptr = &m)
+                {
+                    Delegates.glMultTransposeMatrixdARB((Double*)m_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultTransposeMatrixdARB(IntPtr m)
+        {
+            unsafe
+            {
+                Delegates.glMultTransposeMatrixdARB((Double*)m);
+            }
+        }
+
+        public static 
+        void glSampleCoverageARB(Single value, bool invert)
+        {
+            Delegates.glSampleCoverageARB((Single)value, (bool)invert);
+        }
+
+        public static 
+        void glCompressedTexImage3DARB(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexImage3DARB((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)depth, (Int32)border, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexImage3DARB(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexImage3DARB((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)depth, (Int32)border, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCompressedTexImage2DARB(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 border, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexImage2DARB((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)border, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexImage2DARB(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 border, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexImage2DARB((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)border, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCompressedTexImage1DARB(int target, Int32 level, int internalformat, Int32 width, Int32 border, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexImage1DARB((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)border, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexImage1DARB(int target, Int32 level, int internalformat, Int32 width, Int32 border, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexImage1DARB((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)border, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage3DARB(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexSubImage3DARB((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)width, (Int32)height, (Int32)depth, (int)format, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage3DARB(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexSubImage3DARB((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)width, (Int32)height, (Int32)depth, (int)format, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage2DARB(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexSubImage2DARB((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)width, (Int32)height, (int)format, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage2DARB(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexSubImage2DARB((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)width, (Int32)height, (int)format, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage1DARB(int target, Int32 level, Int32 xoffset, Int32 width, int format, Int32 imageSize, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glCompressedTexSubImage1DARB((int)target, (Int32)level, (Int32)xoffset, (Int32)width, (int)format, (Int32)imageSize, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glCompressedTexSubImage1DARB(int target, Int32 level, Int32 xoffset, Int32 width, int format, Int32 imageSize, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glCompressedTexSubImage1DARB((int)target, (Int32)level, (Int32)xoffset, (Int32)width, (int)format, (Int32)imageSize, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetCompressedTexImageARB(int target, Int32 level, [Out] IntPtr img)
+        {
+            unsafe
+            {
+                Delegates.glGetCompressedTexImageARB((int)target, (Int32)level, (IntPtr)img);
+            }
+        }
+
+        public static 
+        void glGetCompressedTexImageARB(int target, Int32 level, [In, Out] object img)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle img_ptr = System.Runtime.InteropServices.GCHandle.Alloc(img, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetCompressedTexImageARB((int)target, (Int32)level, (IntPtr)img_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    img_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterfARB(int pname, Single param)
+        {
+            Delegates.glPointParameterfARB((int)pname, (Single)param);
+        }
+
+        public static 
+        void glPointParameterfvARB(int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glPointParameterfvARB((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterfvARB(int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glPointParameterfvARB((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterfvARB(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glPointParameterfvARB((int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glWeightbvARB(Int32 size, SByte[] weights)
+        {
+            unsafe
+            {
+                fixed (SByte* weights_ptr = weights)
+                {
+                    Delegates.glWeightbvARB((Int32)size, (SByte*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightbvARB(Int32 size, Byte[] weights)
+        {
+            unsafe
+            {
+                fixed (Byte* weights_ptr = weights)
+                {
+                    Delegates.glWeightbvARB((Int32)size, (SByte*)weights_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glWeightbvARB(Int32 size, ref SByte weights)
+        {
+            unsafe
+            {
+                fixed (SByte* weights_ptr = &weights)
+                {
+                    Delegates.glWeightbvARB((Int32)size, (SByte*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightbvARB(Int32 size, ref Byte weights)
+        {
+            unsafe
+            {
+                fixed (Byte* weights_ptr = &weights)
+                {
+                    Delegates.glWeightbvARB((Int32)size, (SByte*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightbvARB(Int32 size, IntPtr weights)
+        {
+            unsafe
+            {
+                Delegates.glWeightbvARB((Int32)size, (SByte*)weights);
+            }
+        }
+
+        public static 
+        void glWeightsvARB(Int32 size, Int16[] weights)
+        {
+            unsafe
+            {
+                fixed (Int16* weights_ptr = weights)
+                {
+                    Delegates.glWeightsvARB((Int32)size, (Int16*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightsvARB(Int32 size, ref Int16 weights)
+        {
+            unsafe
+            {
+                fixed (Int16* weights_ptr = &weights)
+                {
+                    Delegates.glWeightsvARB((Int32)size, (Int16*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightsvARB(Int32 size, IntPtr weights)
+        {
+            unsafe
+            {
+                Delegates.glWeightsvARB((Int32)size, (Int16*)weights);
+            }
+        }
+
+        public static 
+        void glWeightivARB(Int32 size, Int32[] weights)
+        {
+            unsafe
+            {
+                fixed (Int32* weights_ptr = weights)
+                {
+                    Delegates.glWeightivARB((Int32)size, (Int32*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightivARB(Int32 size, ref Int32 weights)
+        {
+            unsafe
+            {
+                fixed (Int32* weights_ptr = &weights)
+                {
+                    Delegates.glWeightivARB((Int32)size, (Int32*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightivARB(Int32 size, IntPtr weights)
+        {
+            unsafe
+            {
+                Delegates.glWeightivARB((Int32)size, (Int32*)weights);
+            }
+        }
+
+        public static 
+        void glWeightfvARB(Int32 size, Single[] weights)
+        {
+            unsafe
+            {
+                fixed (Single* weights_ptr = weights)
+                {
+                    Delegates.glWeightfvARB((Int32)size, (Single*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightfvARB(Int32 size, ref Single weights)
+        {
+            unsafe
+            {
+                fixed (Single* weights_ptr = &weights)
+                {
+                    Delegates.glWeightfvARB((Int32)size, (Single*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightfvARB(Int32 size, IntPtr weights)
+        {
+            unsafe
+            {
+                Delegates.glWeightfvARB((Int32)size, (Single*)weights);
+            }
+        }
+
+        public static 
+        void glWeightdvARB(Int32 size, Double[] weights)
+        {
+            unsafe
+            {
+                fixed (Double* weights_ptr = weights)
+                {
+                    Delegates.glWeightdvARB((Int32)size, (Double*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightdvARB(Int32 size, ref Double weights)
+        {
+            unsafe
+            {
+                fixed (Double* weights_ptr = &weights)
+                {
+                    Delegates.glWeightdvARB((Int32)size, (Double*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightdvARB(Int32 size, IntPtr weights)
+        {
+            unsafe
+            {
+                Delegates.glWeightdvARB((Int32)size, (Double*)weights);
+            }
+        }
+
+        public static 
+        void glWeightubvARB(Int32 size, Byte[] weights)
+        {
+            unsafe
+            {
+                fixed (Byte* weights_ptr = weights)
+                {
+                    Delegates.glWeightubvARB((Int32)size, (Byte*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightubvARB(Int32 size, ref Byte weights)
+        {
+            unsafe
+            {
+                fixed (Byte* weights_ptr = &weights)
+                {
+                    Delegates.glWeightubvARB((Int32)size, (Byte*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightubvARB(Int32 size, IntPtr weights)
+        {
+            unsafe
+            {
+                Delegates.glWeightubvARB((Int32)size, (Byte*)weights);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glWeightusvARB(Int32 size, UInt16[] weights)
+        {
+            unsafe
+            {
+                fixed (UInt16* weights_ptr = weights)
+                {
+                    Delegates.glWeightusvARB((Int32)size, (UInt16*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightusvARB(Int32 size, Int16[] weights)
+        {
+            unsafe
+            {
+                fixed (Int16* weights_ptr = weights)
+                {
+                    Delegates.glWeightusvARB((Int32)size, (UInt16*)weights_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glWeightusvARB(Int32 size, ref UInt16 weights)
+        {
+            unsafe
+            {
+                fixed (UInt16* weights_ptr = &weights)
+                {
+                    Delegates.glWeightusvARB((Int32)size, (UInt16*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightusvARB(Int32 size, ref Int16 weights)
+        {
+            unsafe
+            {
+                fixed (Int16* weights_ptr = &weights)
+                {
+                    Delegates.glWeightusvARB((Int32)size, (UInt16*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightusvARB(Int32 size, IntPtr weights)
+        {
+            unsafe
+            {
+                Delegates.glWeightusvARB((Int32)size, (UInt16*)weights);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glWeightuivARB(Int32 size, UInt32[] weights)
+        {
+            unsafe
+            {
+                fixed (UInt32* weights_ptr = weights)
+                {
+                    Delegates.glWeightuivARB((Int32)size, (UInt32*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightuivARB(Int32 size, Int32[] weights)
+        {
+            unsafe
+            {
+                fixed (Int32* weights_ptr = weights)
+                {
+                    Delegates.glWeightuivARB((Int32)size, (UInt32*)weights_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glWeightuivARB(Int32 size, ref UInt32 weights)
+        {
+            unsafe
+            {
+                fixed (UInt32* weights_ptr = &weights)
+                {
+                    Delegates.glWeightuivARB((Int32)size, (UInt32*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightuivARB(Int32 size, ref Int32 weights)
+        {
+            unsafe
+            {
+                fixed (Int32* weights_ptr = &weights)
+                {
+                    Delegates.glWeightuivARB((Int32)size, (UInt32*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWeightuivARB(Int32 size, IntPtr weights)
+        {
+            unsafe
+            {
+                Delegates.glWeightuivARB((Int32)size, (UInt32*)weights);
+            }
+        }
+
+        public static 
+        void glWeightPointerARB(Int32 size, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glWeightPointerARB((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glWeightPointerARB(Int32 size, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glWeightPointerARB((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glVertexBlendARB(Int32 count)
+        {
+            Delegates.glVertexBlendARB((Int32)count);
+        }
+
+        public static 
+        void glCurrentPaletteMatrixARB(Int32 index)
+        {
+            Delegates.glCurrentPaletteMatrixARB((Int32)index);
+        }
+
+        public static 
+        void glMatrixIndexubvARB(Int32 size, Byte[] indices)
+        {
+            unsafe
+            {
+                fixed (Byte* indices_ptr = indices)
+                {
+                    Delegates.glMatrixIndexubvARB((Int32)size, (Byte*)indices_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMatrixIndexubvARB(Int32 size, ref Byte indices)
+        {
+            unsafe
+            {
+                fixed (Byte* indices_ptr = &indices)
+                {
+                    Delegates.glMatrixIndexubvARB((Int32)size, (Byte*)indices_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMatrixIndexubvARB(Int32 size, IntPtr indices)
+        {
+            unsafe
+            {
+                Delegates.glMatrixIndexubvARB((Int32)size, (Byte*)indices);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMatrixIndexusvARB(Int32 size, UInt16[] indices)
+        {
+            unsafe
+            {
+                fixed (UInt16* indices_ptr = indices)
+                {
+                    Delegates.glMatrixIndexusvARB((Int32)size, (UInt16*)indices_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMatrixIndexusvARB(Int32 size, Int16[] indices)
+        {
+            unsafe
+            {
+                fixed (Int16* indices_ptr = indices)
+                {
+                    Delegates.glMatrixIndexusvARB((Int32)size, (UInt16*)indices_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMatrixIndexusvARB(Int32 size, ref UInt16 indices)
+        {
+            unsafe
+            {
+                fixed (UInt16* indices_ptr = &indices)
+                {
+                    Delegates.glMatrixIndexusvARB((Int32)size, (UInt16*)indices_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMatrixIndexusvARB(Int32 size, ref Int16 indices)
+        {
+            unsafe
+            {
+                fixed (Int16* indices_ptr = &indices)
+                {
+                    Delegates.glMatrixIndexusvARB((Int32)size, (UInt16*)indices_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMatrixIndexusvARB(Int32 size, IntPtr indices)
+        {
+            unsafe
+            {
+                Delegates.glMatrixIndexusvARB((Int32)size, (UInt16*)indices);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMatrixIndexuivARB(Int32 size, UInt32[] indices)
+        {
+            unsafe
+            {
+                fixed (UInt32* indices_ptr = indices)
+                {
+                    Delegates.glMatrixIndexuivARB((Int32)size, (UInt32*)indices_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMatrixIndexuivARB(Int32 size, Int32[] indices)
+        {
+            unsafe
+            {
+                fixed (Int32* indices_ptr = indices)
+                {
+                    Delegates.glMatrixIndexuivARB((Int32)size, (UInt32*)indices_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMatrixIndexuivARB(Int32 size, ref UInt32 indices)
+        {
+            unsafe
+            {
+                fixed (UInt32* indices_ptr = &indices)
+                {
+                    Delegates.glMatrixIndexuivARB((Int32)size, (UInt32*)indices_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMatrixIndexuivARB(Int32 size, ref Int32 indices)
+        {
+            unsafe
+            {
+                fixed (Int32* indices_ptr = &indices)
+                {
+                    Delegates.glMatrixIndexuivARB((Int32)size, (UInt32*)indices_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMatrixIndexuivARB(Int32 size, IntPtr indices)
+        {
+            unsafe
+            {
+                Delegates.glMatrixIndexuivARB((Int32)size, (UInt32*)indices);
+            }
+        }
+
+        public static 
+        void glMatrixIndexPointerARB(Int32 size, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glMatrixIndexPointerARB((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glMatrixIndexPointerARB(Int32 size, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glMatrixIndexPointerARB((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2dARB(Double x, Double y)
+        {
+            Delegates.glWindowPos2dARB((Double)x, (Double)y);
+        }
+
+        public static 
+        void glWindowPos2dvARB(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glWindowPos2dvARB((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2dvARB(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2dvARB((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2dvARB(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2dvARB((Double*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos2fARB(Single x, Single y)
+        {
+            Delegates.glWindowPos2fARB((Single)x, (Single)y);
+        }
+
+        public static 
+        void glWindowPos2fvARB(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glWindowPos2fvARB((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2fvARB(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2fvARB((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2fvARB(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2fvARB((Single*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos2iARB(Int32 x, Int32 y)
+        {
+            Delegates.glWindowPos2iARB((Int32)x, (Int32)y);
+        }
+
+        public static 
+        void glWindowPos2ivARB(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glWindowPos2ivARB((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2ivARB(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2ivARB((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2ivARB(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2ivARB((Int32*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos2sARB(Int16 x, Int16 y)
+        {
+            Delegates.glWindowPos2sARB((Int16)x, (Int16)y);
+        }
+
+        public static 
+        void glWindowPos2svARB(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glWindowPos2svARB((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2svARB(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2svARB((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2svARB(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2svARB((Int16*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3dARB(Double x, Double y, Double z)
+        {
+            Delegates.glWindowPos3dARB((Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glWindowPos3dvARB(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glWindowPos3dvARB((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3dvARB(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3dvARB((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3dvARB(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3dvARB((Double*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3fARB(Single x, Single y, Single z)
+        {
+            Delegates.glWindowPos3fARB((Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glWindowPos3fvARB(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glWindowPos3fvARB((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3fvARB(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3fvARB((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3fvARB(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3fvARB((Single*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3iARB(Int32 x, Int32 y, Int32 z)
+        {
+            Delegates.glWindowPos3iARB((Int32)x, (Int32)y, (Int32)z);
+        }
+
+        public static 
+        void glWindowPos3ivARB(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glWindowPos3ivARB((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3ivARB(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3ivARB((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3ivARB(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3ivARB((Int32*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3sARB(Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glWindowPos3sARB((Int16)x, (Int16)y, (Int16)z);
+        }
+
+        public static 
+        void glWindowPos3svARB(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glWindowPos3svARB((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3svARB(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3svARB((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3svARB(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3svARB((Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dARB(UInt32 index, Double x)
+        {
+            Delegates.glVertexAttrib1dARB((UInt32)index, (Double)x);
+        }
+
+        public static 
+        void glVertexAttrib1dARB(Int32 index, Double x)
+        {
+            Delegates.glVertexAttrib1dARB((UInt32)index, (Double)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dvARB(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1dvARB(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dvARB(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1dvARB(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1dvARB((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib1dvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1dvARB((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fARB(UInt32 index, Single x)
+        {
+            Delegates.glVertexAttrib1fARB((UInt32)index, (Single)x);
+        }
+
+        public static 
+        void glVertexAttrib1fARB(Int32 index, Single x)
+        {
+            Delegates.glVertexAttrib1fARB((UInt32)index, (Single)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fvARB(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1fvARB(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fvARB(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1fvARB(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1fvARB((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib1fvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1fvARB((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1sARB(UInt32 index, Int16 x)
+        {
+            Delegates.glVertexAttrib1sARB((UInt32)index, (Int16)x);
+        }
+
+        public static 
+        void glVertexAttrib1sARB(Int32 index, Int16 x)
+        {
+            Delegates.glVertexAttrib1sARB((UInt32)index, (Int16)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1svARB(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1svARB(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1svARB(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1svARB(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1svARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1svARB((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib1svARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1svARB((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dARB(UInt32 index, Double x, Double y)
+        {
+            Delegates.glVertexAttrib2dARB((UInt32)index, (Double)x, (Double)y);
+        }
+
+        public static 
+        void glVertexAttrib2dARB(Int32 index, Double x, Double y)
+        {
+            Delegates.glVertexAttrib2dARB((UInt32)index, (Double)x, (Double)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dvARB(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2dvARB(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dvARB(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2dvARB(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2dvARB((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib2dvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2dvARB((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fARB(UInt32 index, Single x, Single y)
+        {
+            Delegates.glVertexAttrib2fARB((UInt32)index, (Single)x, (Single)y);
+        }
+
+        public static 
+        void glVertexAttrib2fARB(Int32 index, Single x, Single y)
+        {
+            Delegates.glVertexAttrib2fARB((UInt32)index, (Single)x, (Single)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fvARB(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2fvARB(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fvARB(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2fvARB(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2fvARB((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib2fvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2fvARB((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2sARB(UInt32 index, Int16 x, Int16 y)
+        {
+            Delegates.glVertexAttrib2sARB((UInt32)index, (Int16)x, (Int16)y);
+        }
+
+        public static 
+        void glVertexAttrib2sARB(Int32 index, Int16 x, Int16 y)
+        {
+            Delegates.glVertexAttrib2sARB((UInt32)index, (Int16)x, (Int16)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2svARB(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2svARB(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2svARB(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2svARB(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2svARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2svARB((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib2svARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2svARB((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dARB(UInt32 index, Double x, Double y, Double z)
+        {
+            Delegates.glVertexAttrib3dARB((UInt32)index, (Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glVertexAttrib3dARB(Int32 index, Double x, Double y, Double z)
+        {
+            Delegates.glVertexAttrib3dARB((UInt32)index, (Double)x, (Double)y, (Double)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dvARB(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3dvARB(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dvARB(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3dvARB(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3dvARB((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib3dvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3dvARB((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fARB(UInt32 index, Single x, Single y, Single z)
+        {
+            Delegates.glVertexAttrib3fARB((UInt32)index, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glVertexAttrib3fARB(Int32 index, Single x, Single y, Single z)
+        {
+            Delegates.glVertexAttrib3fARB((UInt32)index, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fvARB(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3fvARB(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fvARB(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3fvARB(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3fvARB((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib3fvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3fvARB((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3sARB(UInt32 index, Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glVertexAttrib3sARB((UInt32)index, (Int16)x, (Int16)y, (Int16)z);
+        }
+
+        public static 
+        void glVertexAttrib3sARB(Int32 index, Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glVertexAttrib3sARB((UInt32)index, (Int16)x, (Int16)y, (Int16)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3svARB(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3svARB(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3svARB(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3svARB(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3svARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3svARB((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib3svARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3svARB((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NbvARB(UInt32 index, SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NbvARB((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NbvARB(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NbvARB((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NbvARB(UInt32 index, ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NbvARB((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NbvARB(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NbvARB((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NbvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NbvARB((UInt32)index, (SByte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NbvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NbvARB((UInt32)index, (SByte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NivARB(UInt32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NivARB((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NivARB(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NivARB((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NivARB(UInt32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NivARB((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NivARB(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NivARB((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NivARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NivARB((UInt32)index, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NivARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NivARB((UInt32)index, (Int32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NsvARB(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NsvARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NsvARB(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NsvARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NsvARB(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NsvARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NsvARB(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NsvARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NsvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NsvARB((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NsvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NsvARB((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NubARB(UInt32 index, Byte x, Byte y, Byte z, Byte w)
+        {
+            Delegates.glVertexAttrib4NubARB((UInt32)index, (Byte)x, (Byte)y, (Byte)z, (Byte)w);
+        }
+
+        public static 
+        void glVertexAttrib4NubARB(Int32 index, Byte x, Byte y, Byte z, Byte w)
+        {
+            Delegates.glVertexAttrib4NubARB((UInt32)index, (Byte)x, (Byte)y, (Byte)z, (Byte)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NubvARB(UInt32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NubvARB((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NubvARB(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NubvARB((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NubvARB(UInt32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NubvARB((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NubvARB(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NubvARB((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NubvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NubvARB((UInt32)index, (Byte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NubvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NubvARB((UInt32)index, (Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NuivARB(UInt32 index, UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NuivARB((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NuivARB(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NuivARB((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NuivARB(UInt32 index, ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NuivARB((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NuivARB(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NuivARB((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NuivARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NuivARB((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NuivARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NuivARB((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NusvARB(UInt32 index, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NusvARB((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NusvARB(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4NusvARB((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NusvARB(UInt32 index, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NusvARB((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NusvARB(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4NusvARB((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4NusvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NusvARB((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4NusvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4NusvARB((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4bvARB(UInt32 index, SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4bvARB((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4bvARB(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4bvARB((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4bvARB(UInt32 index, ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4bvARB((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4bvARB(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4bvARB((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4bvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4bvARB((UInt32)index, (SByte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4bvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4bvARB((UInt32)index, (SByte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dARB(UInt32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glVertexAttrib4dARB((UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        public static 
+        void glVertexAttrib4dARB(Int32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glVertexAttrib4dARB((UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dvARB(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4dvARB(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dvARB(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4dvARB(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4dvARB((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4dvARB((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4dvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4dvARB((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fARB(UInt32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glVertexAttrib4fARB((UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glVertexAttrib4fARB(Int32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glVertexAttrib4fARB((UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fvARB(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4fvARB(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fvARB(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4fvARB(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4fvARB((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4fvARB((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4fvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4fvARB((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ivARB(UInt32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4ivARB((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ivARB(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4ivARB((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ivARB(UInt32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4ivARB((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ivARB(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4ivARB((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ivARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4ivARB((UInt32)index, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ivARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4ivARB((UInt32)index, (Int32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4sARB(UInt32 index, Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glVertexAttrib4sARB((UInt32)index, (Int16)x, (Int16)y, (Int16)z, (Int16)w);
+        }
+
+        public static 
+        void glVertexAttrib4sARB(Int32 index, Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glVertexAttrib4sARB((UInt32)index, (Int16)x, (Int16)y, (Int16)z, (Int16)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4svARB(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4svARB(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4svARB(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4svARB(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4svARB((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4svARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4svARB((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4svARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4svARB((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ubvARB(UInt32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4ubvARB((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ubvARB(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4ubvARB((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ubvARB(UInt32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4ubvARB((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ubvARB(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4ubvARB((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ubvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4ubvARB((UInt32)index, (Byte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ubvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4ubvARB((UInt32)index, (Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4uivARB(UInt32 index, UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4uivARB((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4uivARB(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4uivARB((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4uivARB(UInt32 index, ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4uivARB((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4uivARB(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4uivARB((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4uivARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4uivARB((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4uivARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4uivARB((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4usvARB(UInt32 index, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4usvARB((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4usvARB(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4usvARB((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4usvARB(UInt32 index, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4usvARB((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4usvARB(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4usvARB((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4usvARB(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4usvARB((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4usvARB(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4usvARB((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribPointerARB(UInt32 index, Int32 size, int type, bool normalized, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribPointerARB((UInt32)index, (Int32)size, (int)type, (bool)normalized, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glVertexAttribPointerARB(Int32 index, Int32 size, int type, bool normalized, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribPointerARB((UInt32)index, (Int32)size, (int)type, (bool)normalized, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribPointerARB(UInt32 index, Int32 size, int type, bool normalized, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexAttribPointerARB((UInt32)index, (Int32)size, (int)type, (bool)normalized, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribPointerARB(Int32 index, Int32 size, int type, bool normalized, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexAttribPointerARB((UInt32)index, (Int32)size, (int)type, (bool)normalized, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glEnableVertexAttribArrayARB(UInt32 index)
+        {
+            Delegates.glEnableVertexAttribArrayARB((UInt32)index);
+        }
+
+        public static 
+        void glEnableVertexAttribArrayARB(Int32 index)
+        {
+            Delegates.glEnableVertexAttribArrayARB((UInt32)index);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDisableVertexAttribArrayARB(UInt32 index)
+        {
+            Delegates.glDisableVertexAttribArrayARB((UInt32)index);
+        }
+
+        public static 
+        void glDisableVertexAttribArrayARB(Int32 index)
+        {
+            Delegates.glDisableVertexAttribArrayARB((UInt32)index);
+        }
+
+        public static 
+        void glProgramStringARB(int target, int format, Int32 len, IntPtr @string)
+        {
+            unsafe
+            {
+                Delegates.glProgramStringARB((int)target, (int)format, (Int32)len, (IntPtr)@string);
+            }
+        }
+
+        public static 
+        void glProgramStringARB(int target, int format, Int32 len, [In, Out] object @string)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle @string_ptr = System.Runtime.InteropServices.GCHandle.Alloc(@string, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glProgramStringARB((int)target, (int)format, (Int32)len, (IntPtr)@string_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    @string_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindProgramARB(int target, UInt32 program)
+        {
+            Delegates.glBindProgramARB((int)target, (UInt32)program);
+        }
+
+        public static 
+        void glBindProgramARB(int target, Int32 program)
+        {
+            Delegates.glBindProgramARB((int)target, (UInt32)program);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteProgramsARB(Int32 n, UInt32[] programs)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = programs)
+                {
+                    Delegates.glDeleteProgramsARB((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteProgramsARB(Int32 n, Int32[] programs)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = programs)
+                {
+                    Delegates.glDeleteProgramsARB((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteProgramsARB(Int32 n, ref UInt32 programs)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = &programs)
+                {
+                    Delegates.glDeleteProgramsARB((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteProgramsARB(Int32 n, ref Int32 programs)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = &programs)
+                {
+                    Delegates.glDeleteProgramsARB((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteProgramsARB(Int32 n, IntPtr programs)
+        {
+            unsafe
+            {
+                Delegates.glDeleteProgramsARB((Int32)n, (UInt32*)programs);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenProgramsARB(Int32 n, [Out] UInt32[] programs)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = programs)
+                {
+                    Delegates.glGenProgramsARB((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenProgramsARB(Int32 n, [Out] Int32[] programs)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = programs)
+                {
+                    Delegates.glGenProgramsARB((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenProgramsARB(Int32 n, [Out] out UInt32 programs)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = &programs)
+                {
+                    Delegates.glGenProgramsARB((Int32)n, (UInt32*)programs_ptr);
+                    programs = *programs_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenProgramsARB(Int32 n, [Out] out Int32 programs)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = &programs)
+                {
+                    Delegates.glGenProgramsARB((Int32)n, (UInt32*)programs_ptr);
+                    programs = *programs_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenProgramsARB(Int32 n, [Out] IntPtr programs)
+        {
+            unsafe
+            {
+                Delegates.glGenProgramsARB((Int32)n, (UInt32*)programs);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameter4dARB(int target, UInt32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glProgramEnvParameter4dARB((int)target, (UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        public static 
+        void glProgramEnvParameter4dARB(int target, Int32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glProgramEnvParameter4dARB((int)target, (UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameter4dvARB(int target, UInt32 index, Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParameter4dvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParameter4dvARB(int target, Int32 index, Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParameter4dvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameter4dvARB(int target, UInt32 index, ref Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParameter4dvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParameter4dvARB(int target, Int32 index, ref Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParameter4dvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameter4dvARB(int target, UInt32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParameter4dvARB((int)target, (UInt32)index, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glProgramEnvParameter4dvARB(int target, Int32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParameter4dvARB((int)target, (UInt32)index, (Double*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameter4fARB(int target, UInt32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glProgramEnvParameter4fARB((int)target, (UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glProgramEnvParameter4fARB(int target, Int32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glProgramEnvParameter4fARB((int)target, (UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameter4fvARB(int target, UInt32 index, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParameter4fvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParameter4fvARB(int target, Int32 index, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParameter4fvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameter4fvARB(int target, UInt32 index, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParameter4fvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParameter4fvARB(int target, Int32 index, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParameter4fvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameter4fvARB(int target, UInt32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParameter4fvARB((int)target, (UInt32)index, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glProgramEnvParameter4fvARB(int target, Int32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParameter4fvARB((int)target, (UInt32)index, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameter4dARB(int target, UInt32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glProgramLocalParameter4dARB((int)target, (UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        public static 
+        void glProgramLocalParameter4dARB(int target, Int32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glProgramLocalParameter4dARB((int)target, (UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameter4dvARB(int target, UInt32 index, Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParameter4dvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParameter4dvARB(int target, Int32 index, Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParameter4dvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameter4dvARB(int target, UInt32 index, ref Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParameter4dvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParameter4dvARB(int target, Int32 index, ref Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParameter4dvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameter4dvARB(int target, UInt32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParameter4dvARB((int)target, (UInt32)index, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glProgramLocalParameter4dvARB(int target, Int32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParameter4dvARB((int)target, (UInt32)index, (Double*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameter4fARB(int target, UInt32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glProgramLocalParameter4fARB((int)target, (UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glProgramLocalParameter4fARB(int target, Int32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glProgramLocalParameter4fARB((int)target, (UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameter4fvARB(int target, UInt32 index, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParameter4fvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParameter4fvARB(int target, Int32 index, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParameter4fvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameter4fvARB(int target, UInt32 index, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParameter4fvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParameter4fvARB(int target, Int32 index, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParameter4fvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameter4fvARB(int target, UInt32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParameter4fvARB((int)target, (UInt32)index, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glProgramLocalParameter4fvARB(int target, Int32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParameter4fvARB((int)target, (UInt32)index, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterdvARB(int target, UInt32 index, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramEnvParameterdvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterdvARB(int target, Int32 index, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramEnvParameterdvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterdvARB(int target, UInt32 index, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramEnvParameterdvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterdvARB(int target, Int32 index, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramEnvParameterdvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterdvARB(int target, UInt32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramEnvParameterdvARB((int)target, (UInt32)index, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterdvARB(int target, Int32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramEnvParameterdvARB((int)target, (UInt32)index, (Double*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterfvARB(int target, UInt32 index, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramEnvParameterfvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterfvARB(int target, Int32 index, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramEnvParameterfvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterfvARB(int target, UInt32 index, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramEnvParameterfvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterfvARB(int target, Int32 index, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramEnvParameterfvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterfvARB(int target, UInt32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramEnvParameterfvARB((int)target, (UInt32)index, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterfvARB(int target, Int32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramEnvParameterfvARB((int)target, (UInt32)index, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterdvARB(int target, UInt32 index, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramLocalParameterdvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterdvARB(int target, Int32 index, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramLocalParameterdvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterdvARB(int target, UInt32 index, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramLocalParameterdvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterdvARB(int target, Int32 index, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramLocalParameterdvARB((int)target, (UInt32)index, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterdvARB(int target, UInt32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramLocalParameterdvARB((int)target, (UInt32)index, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterdvARB(int target, Int32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramLocalParameterdvARB((int)target, (UInt32)index, (Double*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterfvARB(int target, UInt32 index, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramLocalParameterfvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterfvARB(int target, Int32 index, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramLocalParameterfvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterfvARB(int target, UInt32 index, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramLocalParameterfvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterfvARB(int target, Int32 index, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramLocalParameterfvARB((int)target, (UInt32)index, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterfvARB(int target, UInt32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramLocalParameterfvARB((int)target, (UInt32)index, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterfvARB(int target, Int32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramLocalParameterfvARB((int)target, (UInt32)index, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramivARB(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramivARB((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramivARB(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramivARB((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramivARB(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramivARB((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramStringARB(int target, int pname, [Out] IntPtr @string)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramStringARB((int)target, (int)pname, (IntPtr)@string);
+            }
+        }
+
+        public static 
+        void glGetProgramStringARB(int target, int pname, [In, Out] object @string)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle @string_ptr = System.Runtime.InteropServices.GCHandle.Alloc(@string, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetProgramStringARB((int)target, (int)pname, (IntPtr)@string_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    @string_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribdvARB(UInt32 index, int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribdvARB((UInt32)index, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribdvARB(Int32 index, int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribdvARB((UInt32)index, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribdvARB(UInt32 index, int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribdvARB((UInt32)index, (int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribdvARB(Int32 index, int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribdvARB((UInt32)index, (int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribdvARB(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribdvARB((UInt32)index, (int)pname, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribdvARB(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribdvARB((UInt32)index, (int)pname, (Double*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribfvARB(UInt32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribfvARB((UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribfvARB(Int32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribfvARB((UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribfvARB(UInt32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribfvARB((UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribfvARB(Int32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribfvARB((UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribfvARB(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribfvARB((UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribfvARB(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribfvARB((UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribivARB(UInt32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribivARB((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribivARB(Int32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribivARB((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribivARB(UInt32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribivARB((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribivARB(Int32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribivARB((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribivARB(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribivARB((UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribivARB(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribivARB((UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribPointervARB(UInt32 index, int pname, [Out] IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribPointervARB((UInt32)index, (int)pname, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribPointervARB(Int32 index, int pname, [Out] IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribPointervARB((UInt32)index, (int)pname, (IntPtr)pointer);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribPointervARB(UInt32 index, int pname, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetVertexAttribPointervARB((UInt32)index, (int)pname, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribPointervARB(Int32 index, int pname, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetVertexAttribPointervARB((UInt32)index, (int)pname, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsProgramARB(UInt32 program)
+        {
+            return Delegates.glIsProgramARB((UInt32)program);
+        }
+
+        public static 
+        bool glIsProgramARB(Int32 program)
+        {
+            return Delegates.glIsProgramARB((UInt32)program);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindBufferARB(int target, UInt32 buffer)
+        {
+            Delegates.glBindBufferARB((int)target, (UInt32)buffer);
+        }
+
+        public static 
+        void glBindBufferARB(int target, Int32 buffer)
+        {
+            Delegates.glBindBufferARB((int)target, (UInt32)buffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteBuffersARB(Int32 n, UInt32[] buffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* buffers_ptr = buffers)
+                {
+                    Delegates.glDeleteBuffersARB((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteBuffersARB(Int32 n, Int32[] buffers)
+        {
+            unsafe
+            {
+                fixed (Int32* buffers_ptr = buffers)
+                {
+                    Delegates.glDeleteBuffersARB((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteBuffersARB(Int32 n, ref UInt32 buffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* buffers_ptr = &buffers)
+                {
+                    Delegates.glDeleteBuffersARB((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteBuffersARB(Int32 n, ref Int32 buffers)
+        {
+            unsafe
+            {
+                fixed (Int32* buffers_ptr = &buffers)
+                {
+                    Delegates.glDeleteBuffersARB((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteBuffersARB(Int32 n, IntPtr buffers)
+        {
+            unsafe
+            {
+                Delegates.glDeleteBuffersARB((Int32)n, (UInt32*)buffers);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenBuffersARB(Int32 n, [Out] UInt32[] buffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* buffers_ptr = buffers)
+                {
+                    Delegates.glGenBuffersARB((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenBuffersARB(Int32 n, [Out] Int32[] buffers)
+        {
+            unsafe
+            {
+                fixed (Int32* buffers_ptr = buffers)
+                {
+                    Delegates.glGenBuffersARB((Int32)n, (UInt32*)buffers_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenBuffersARB(Int32 n, [Out] out UInt32 buffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* buffers_ptr = &buffers)
+                {
+                    Delegates.glGenBuffersARB((Int32)n, (UInt32*)buffers_ptr);
+                    buffers = *buffers_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenBuffersARB(Int32 n, [Out] out Int32 buffers)
+        {
+            unsafe
+            {
+                fixed (Int32* buffers_ptr = &buffers)
+                {
+                    Delegates.glGenBuffersARB((Int32)n, (UInt32*)buffers_ptr);
+                    buffers = *buffers_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenBuffersARB(Int32 n, [Out] IntPtr buffers)
+        {
+            unsafe
+            {
+                Delegates.glGenBuffersARB((Int32)n, (UInt32*)buffers);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsBufferARB(UInt32 buffer)
+        {
+            return Delegates.glIsBufferARB((UInt32)buffer);
+        }
+
+        public static 
+        bool glIsBufferARB(Int32 buffer)
+        {
+            return Delegates.glIsBufferARB((UInt32)buffer);
+        }
+
+        public static 
+        void glBufferDataARB(int target, IntPtr size, IntPtr data, int usage)
+        {
+            unsafe
+            {
+                Delegates.glBufferDataARB((int)target, (IntPtr)size, (IntPtr)data, (int)usage);
+            }
+        }
+
+        public static 
+        void glBufferDataARB(int target, IntPtr size, [In, Out] object data, int usage)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glBufferDataARB((int)target, (IntPtr)size, (IntPtr)data_ptr.AddrOfPinnedObject(), (int)usage);
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glBufferSubDataARB(int target, IntPtr offset, IntPtr size, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glBufferSubDataARB((int)target, (IntPtr)offset, (IntPtr)size, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glBufferSubDataARB(int target, IntPtr offset, IntPtr size, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glBufferSubDataARB((int)target, (IntPtr)offset, (IntPtr)size, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetBufferSubDataARB(int target, IntPtr offset, IntPtr size, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetBufferSubDataARB((int)target, (IntPtr)offset, (IntPtr)size, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glGetBufferSubDataARB(int target, IntPtr offset, IntPtr size, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetBufferSubDataARB((int)target, (IntPtr)offset, (IntPtr)size, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        IntPtr glMapBufferARB(int target, int access)
+        {
+            return Delegates.glMapBufferARB((int)target, (int)access);
+        }
+
+        public static 
+        bool glUnmapBufferARB(int target)
+        {
+            return Delegates.glUnmapBufferARB((int)target);
+        }
+
+        public static 
+        void glGetBufferParameterivARB(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetBufferParameterivARB((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetBufferParameterivARB(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetBufferParameterivARB((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetBufferParameterivARB(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetBufferParameterivARB((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetBufferPointervARB(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetBufferPointervARB((int)target, (int)pname, (IntPtr)@params);
+            }
+        }
+
+        public static 
+        void glGetBufferPointervARB(int target, int pname, [In, Out] object @params)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle @params_ptr = System.Runtime.InteropServices.GCHandle.Alloc(@params, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetBufferPointervARB((int)target, (int)pname, (IntPtr)@params_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    @params_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenQueriesARB(Int32 n, [Out] UInt32[] ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = ids)
+                {
+                    Delegates.glGenQueriesARB((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenQueriesARB(Int32 n, [Out] Int32[] ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = ids)
+                {
+                    Delegates.glGenQueriesARB((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenQueriesARB(Int32 n, [Out] out UInt32 ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = &ids)
+                {
+                    Delegates.glGenQueriesARB((Int32)n, (UInt32*)ids_ptr);
+                    ids = *ids_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenQueriesARB(Int32 n, [Out] out Int32 ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = &ids)
+                {
+                    Delegates.glGenQueriesARB((Int32)n, (UInt32*)ids_ptr);
+                    ids = *ids_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenQueriesARB(Int32 n, [Out] IntPtr ids)
+        {
+            unsafe
+            {
+                Delegates.glGenQueriesARB((Int32)n, (UInt32*)ids);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteQueriesARB(Int32 n, UInt32[] ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = ids)
+                {
+                    Delegates.glDeleteQueriesARB((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteQueriesARB(Int32 n, Int32[] ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = ids)
+                {
+                    Delegates.glDeleteQueriesARB((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteQueriesARB(Int32 n, ref UInt32 ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = &ids)
+                {
+                    Delegates.glDeleteQueriesARB((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteQueriesARB(Int32 n, ref Int32 ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = &ids)
+                {
+                    Delegates.glDeleteQueriesARB((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteQueriesARB(Int32 n, IntPtr ids)
+        {
+            unsafe
+            {
+                Delegates.glDeleteQueriesARB((Int32)n, (UInt32*)ids);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsQueryARB(UInt32 id)
+        {
+            return Delegates.glIsQueryARB((UInt32)id);
+        }
+
+        public static 
+        bool glIsQueryARB(Int32 id)
+        {
+            return Delegates.glIsQueryARB((UInt32)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBeginQueryARB(int target, UInt32 id)
+        {
+            Delegates.glBeginQueryARB((int)target, (UInt32)id);
+        }
+
+        public static 
+        void glBeginQueryARB(int target, Int32 id)
+        {
+            Delegates.glBeginQueryARB((int)target, (UInt32)id);
+        }
+
+        public static 
+        void glEndQueryARB(int target)
+        {
+            Delegates.glEndQueryARB((int)target);
+        }
+
+        public static 
+        void glGetQueryivARB(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryivARB((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryivARB(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryivARB((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryivARB(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryivARB((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectivARB(UInt32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjectivARB((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjectivARB(Int32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjectivARB((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectivARB(UInt32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjectivARB((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjectivARB(Int32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjectivARB((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectivARB(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjectivARB((UInt32)id, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetQueryObjectivARB(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjectivARB((UInt32)id, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectuivARB(UInt32 id, int pname, [Out] UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjectuivARB((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjectuivARB(Int32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjectuivARB((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectuivARB(UInt32 id, int pname, [Out] out UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjectuivARB((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjectuivARB(Int32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjectuivARB((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectuivARB(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjectuivARB((UInt32)id, (int)pname, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glGetQueryObjectuivARB(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjectuivARB((UInt32)id, (int)pname, (UInt32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteObjectARB(UInt32 obj)
+        {
+            Delegates.glDeleteObjectARB((UInt32)obj);
+        }
+
+        public static 
+        void glDeleteObjectARB(Int32 obj)
+        {
+            Delegates.glDeleteObjectARB((UInt32)obj);
+        }
+
+        public static 
+        Int32 glGetHandleARB(int pname)
+        {
+            return Delegates.glGetHandleARB((int)pname);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDetachObjectARB(UInt32 containerObj, UInt32 attachedObj)
+        {
+            Delegates.glDetachObjectARB((UInt32)containerObj, (UInt32)attachedObj);
+        }
+
+        public static 
+        void glDetachObjectARB(Int32 containerObj, Int32 attachedObj)
+        {
+            Delegates.glDetachObjectARB((UInt32)containerObj, (UInt32)attachedObj);
+        }
+
+        public static 
+        Int32 glCreateShaderObjectARB(int shaderType)
+        {
+            return Delegates.glCreateShaderObjectARB((int)shaderType);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glShaderSourceARB(UInt32 shaderObj, Int32 count, System.String[] @string, Int32[] length)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glShaderSourceARB((UInt32)shaderObj, (Int32)count, (System.String[])@string, (Int32*)length_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glShaderSourceARB(Int32 shaderObj, Int32 count, System.String[] @string, Int32[] length)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glShaderSourceARB((UInt32)shaderObj, (Int32)count, (System.String[])@string, (Int32*)length_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glShaderSourceARB(UInt32 shaderObj, Int32 count, System.String[] @string, ref Int32 length)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glShaderSourceARB((UInt32)shaderObj, (Int32)count, (System.String[])@string, (Int32*)length_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glShaderSourceARB(Int32 shaderObj, Int32 count, System.String[] @string, ref Int32 length)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glShaderSourceARB((UInt32)shaderObj, (Int32)count, (System.String[])@string, (Int32*)length_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glShaderSourceARB(UInt32 shaderObj, Int32 count, System.String[] @string, IntPtr length)
+        {
+            unsafe
+            {
+                Delegates.glShaderSourceARB((UInt32)shaderObj, (Int32)count, (System.String[])@string, (Int32*)length);
+            }
+        }
+
+        public static 
+        void glShaderSourceARB(Int32 shaderObj, Int32 count, System.String[] @string, IntPtr length)
+        {
+            unsafe
+            {
+                Delegates.glShaderSourceARB((UInt32)shaderObj, (Int32)count, (System.String[])@string, (Int32*)length);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glCompileShaderARB(UInt32 shaderObj)
+        {
+            Delegates.glCompileShaderARB((UInt32)shaderObj);
+        }
+
+        public static 
+        void glCompileShaderARB(Int32 shaderObj)
+        {
+            Delegates.glCompileShaderARB((UInt32)shaderObj);
+        }
+
+        public static 
+        Int32 glCreateProgramObjectARB()
+        {
+            return Delegates.glCreateProgramObjectARB();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glAttachObjectARB(UInt32 containerObj, UInt32 obj)
+        {
+            Delegates.glAttachObjectARB((UInt32)containerObj, (UInt32)obj);
+        }
+
+        public static 
+        void glAttachObjectARB(Int32 containerObj, Int32 obj)
+        {
+            Delegates.glAttachObjectARB((UInt32)containerObj, (UInt32)obj);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glLinkProgramARB(UInt32 programObj)
+        {
+            Delegates.glLinkProgramARB((UInt32)programObj);
+        }
+
+        public static 
+        void glLinkProgramARB(Int32 programObj)
+        {
+            Delegates.glLinkProgramARB((UInt32)programObj);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUseProgramObjectARB(UInt32 programObj)
+        {
+            Delegates.glUseProgramObjectARB((UInt32)programObj);
+        }
+
+        public static 
+        void glUseProgramObjectARB(Int32 programObj)
+        {
+            Delegates.glUseProgramObjectARB((UInt32)programObj);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glValidateProgramARB(UInt32 programObj)
+        {
+            Delegates.glValidateProgramARB((UInt32)programObj);
+        }
+
+        public static 
+        void glValidateProgramARB(Int32 programObj)
+        {
+            Delegates.glValidateProgramARB((UInt32)programObj);
+        }
+
+        public static 
+        void glUniform1fARB(Int32 location, Single v0)
+        {
+            Delegates.glUniform1fARB((Int32)location, (Single)v0);
+        }
+
+        public static 
+        void glUniform2fARB(Int32 location, Single v0, Single v1)
+        {
+            Delegates.glUniform2fARB((Int32)location, (Single)v0, (Single)v1);
+        }
+
+        public static 
+        void glUniform3fARB(Int32 location, Single v0, Single v1, Single v2)
+        {
+            Delegates.glUniform3fARB((Int32)location, (Single)v0, (Single)v1, (Single)v2);
+        }
+
+        public static 
+        void glUniform4fARB(Int32 location, Single v0, Single v1, Single v2, Single v3)
+        {
+            Delegates.glUniform4fARB((Int32)location, (Single)v0, (Single)v1, (Single)v2, (Single)v3);
+        }
+
+        public static 
+        void glUniform1iARB(Int32 location, Int32 v0)
+        {
+            Delegates.glUniform1iARB((Int32)location, (Int32)v0);
+        }
+
+        public static 
+        void glUniform2iARB(Int32 location, Int32 v0, Int32 v1)
+        {
+            Delegates.glUniform2iARB((Int32)location, (Int32)v0, (Int32)v1);
+        }
+
+        public static 
+        void glUniform3iARB(Int32 location, Int32 v0, Int32 v1, Int32 v2)
+        {
+            Delegates.glUniform3iARB((Int32)location, (Int32)v0, (Int32)v1, (Int32)v2);
+        }
+
+        public static 
+        void glUniform4iARB(Int32 location, Int32 v0, Int32 v1, Int32 v2, Int32 v3)
+        {
+            Delegates.glUniform4iARB((Int32)location, (Int32)v0, (Int32)v1, (Int32)v2, (Int32)v3);
+        }
+
+        public static 
+        void glUniform1fvARB(Int32 location, Int32 count, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniform1fvARB((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1fvARB(Int32 location, Int32 count, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniform1fvARB((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1fvARB(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform1fvARB((Int32)location, (Int32)count, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniform2fvARB(Int32 location, Int32 count, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniform2fvARB((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2fvARB(Int32 location, Int32 count, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniform2fvARB((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2fvARB(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform2fvARB((Int32)location, (Int32)count, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniform3fvARB(Int32 location, Int32 count, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniform3fvARB((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3fvARB(Int32 location, Int32 count, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniform3fvARB((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3fvARB(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform3fvARB((Int32)location, (Int32)count, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniform4fvARB(Int32 location, Int32 count, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniform4fvARB((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4fvARB(Int32 location, Int32 count, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniform4fvARB((Int32)location, (Int32)count, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4fvARB(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform4fvARB((Int32)location, (Int32)count, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniform1ivARB(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform1ivARB((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1ivARB(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform1ivARB((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1ivARB(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform1ivARB((Int32)location, (Int32)count, (Int32*)value);
+            }
+        }
+
+        public static 
+        void glUniform2ivARB(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform2ivARB((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2ivARB(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform2ivARB((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2ivARB(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform2ivARB((Int32)location, (Int32)count, (Int32*)value);
+            }
+        }
+
+        public static 
+        void glUniform3ivARB(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform3ivARB((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3ivARB(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform3ivARB((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3ivARB(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform3ivARB((Int32)location, (Int32)count, (Int32*)value);
+            }
+        }
+
+        public static 
+        void glUniform4ivARB(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform4ivARB((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4ivARB(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform4ivARB((Int32)location, (Int32)count, (Int32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4ivARB(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform4ivARB((Int32)location, (Int32)count, (Int32*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix2fvARB(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix2fvARB((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix2fvARB(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix2fvARB((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix2fvARB(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix2fvARB((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix3fvARB(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix3fvARB((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix3fvARB(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix3fvARB((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix3fvARB(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix3fvARB((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        public static 
+        void glUniformMatrix4fvARB(Int32 location, Int32 count, bool transpose, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glUniformMatrix4fvARB((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix4fvARB(Int32 location, Int32 count, bool transpose, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glUniformMatrix4fvARB((Int32)location, (Int32)count, (bool)transpose, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniformMatrix4fvARB(Int32 location, Int32 count, bool transpose, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniformMatrix4fvARB((Int32)location, (Int32)count, (bool)transpose, (Single*)value);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectParameterfvARB(UInt32 obj, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetObjectParameterfvARB((UInt32)obj, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetObjectParameterfvARB(Int32 obj, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetObjectParameterfvARB((UInt32)obj, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectParameterfvARB(UInt32 obj, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetObjectParameterfvARB((UInt32)obj, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetObjectParameterfvARB(Int32 obj, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetObjectParameterfvARB((UInt32)obj, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectParameterfvARB(UInt32 obj, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetObjectParameterfvARB((UInt32)obj, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetObjectParameterfvARB(Int32 obj, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetObjectParameterfvARB((UInt32)obj, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectParameterivARB(UInt32 obj, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetObjectParameterivARB((UInt32)obj, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetObjectParameterivARB(Int32 obj, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetObjectParameterivARB((UInt32)obj, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectParameterivARB(UInt32 obj, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetObjectParameterivARB((UInt32)obj, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetObjectParameterivARB(Int32 obj, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetObjectParameterivARB((UInt32)obj, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectParameterivARB(UInt32 obj, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetObjectParameterivARB((UInt32)obj, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetObjectParameterivARB(Int32 obj, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetObjectParameterivARB((UInt32)obj, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInfoLogARB(UInt32 obj, Int32 maxLength, [Out] Int32[] length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glGetInfoLogARB((UInt32)obj, (Int32)maxLength, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                }
+            }
+        }
+
+        public static 
+        void glGetInfoLogARB(Int32 obj, Int32 maxLength, [Out] Int32[] length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glGetInfoLogARB((UInt32)obj, (Int32)maxLength, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInfoLogARB(UInt32 obj, Int32 maxLength, [Out] out Int32 length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glGetInfoLogARB((UInt32)obj, (Int32)maxLength, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                    length = *length_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetInfoLogARB(Int32 obj, Int32 maxLength, [Out] out Int32 length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glGetInfoLogARB((UInt32)obj, (Int32)maxLength, (Int32*)length_ptr, (System.Text.StringBuilder)infoLog);
+                    length = *length_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInfoLogARB(UInt32 obj, Int32 maxLength, [Out] IntPtr length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                Delegates.glGetInfoLogARB((UInt32)obj, (Int32)maxLength, (Int32*)length, (System.Text.StringBuilder)infoLog);
+            }
+        }
+
+        public static 
+        void glGetInfoLogARB(Int32 obj, Int32 maxLength, [Out] IntPtr length, [Out] System.Text.StringBuilder infoLog)
+        {
+            unsafe
+            {
+                Delegates.glGetInfoLogARB((UInt32)obj, (Int32)maxLength, (Int32*)length, (System.Text.StringBuilder)infoLog);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetAttachedObjectsARB(UInt32 containerObj, Int32 maxCount, [Out] Int32[] count, [Out] UInt32[] obj)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = count)
+                fixed (UInt32* obj_ptr = obj)
+                {
+                    Delegates.glGetAttachedObjectsARB((UInt32)containerObj, (Int32)maxCount, (Int32*)count_ptr, (UInt32*)obj_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetAttachedObjectsARB(Int32 containerObj, Int32 maxCount, [Out] Int32[] count, [Out] Int32[] obj)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = count)
+                fixed (Int32* obj_ptr = obj)
+                {
+                    Delegates.glGetAttachedObjectsARB((UInt32)containerObj, (Int32)maxCount, (Int32*)count_ptr, (UInt32*)obj_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetAttachedObjectsARB(UInt32 containerObj, Int32 maxCount, [Out] out Int32 count, [Out] out UInt32 obj)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = &count)
+                fixed (UInt32* obj_ptr = &obj)
+                {
+                    Delegates.glGetAttachedObjectsARB((UInt32)containerObj, (Int32)maxCount, (Int32*)count_ptr, (UInt32*)obj_ptr);
+                    count = *count_ptr;
+                    obj = *obj_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetAttachedObjectsARB(Int32 containerObj, Int32 maxCount, [Out] out Int32 count, [Out] out Int32 obj)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = &count)
+                fixed (Int32* obj_ptr = &obj)
+                {
+                    Delegates.glGetAttachedObjectsARB((UInt32)containerObj, (Int32)maxCount, (Int32*)count_ptr, (UInt32*)obj_ptr);
+                    count = *count_ptr;
+                    obj = *obj_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetAttachedObjectsARB(UInt32 containerObj, Int32 maxCount, [Out] IntPtr count, [Out] IntPtr obj)
+        {
+            unsafe
+            {
+                Delegates.glGetAttachedObjectsARB((UInt32)containerObj, (Int32)maxCount, (Int32*)count, (UInt32*)obj);
+            }
+        }
+
+        public static 
+        void glGetAttachedObjectsARB(Int32 containerObj, Int32 maxCount, [Out] IntPtr count, [Out] IntPtr obj)
+        {
+            unsafe
+            {
+                Delegates.glGetAttachedObjectsARB((UInt32)containerObj, (Int32)maxCount, (Int32*)count, (UInt32*)obj);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glGetUniformLocationARB(UInt32 programObj, System.String name)
+        {
+            return Delegates.glGetUniformLocationARB((UInt32)programObj, (System.String)name);
+        }
+
+        public static 
+        Int32 glGetUniformLocationARB(Int32 programObj, System.String name)
+        {
+            return Delegates.glGetUniformLocationARB((UInt32)programObj, (System.String)name);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveUniformARB(UInt32 programObj, UInt32 index, Int32 maxLength, [Out] Int32[] length, [Out] Int32[] size, [Out] int[] type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                fixed (Int32* size_ptr = size)
+                fixed (int* type_ptr = type)
+                {
+                    Delegates.glGetActiveUniformARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                }
+            }
+        }
+
+        public static 
+        void glGetActiveUniformARB(Int32 programObj, Int32 index, Int32 maxLength, [Out] Int32[] length, [Out] Int32[] size, [Out] int[] type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                fixed (Int32* size_ptr = size)
+                fixed (int* type_ptr = type)
+                {
+                    Delegates.glGetActiveUniformARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveUniformARB(UInt32 programObj, UInt32 index, Int32 maxLength, [Out] out Int32 length, [Out] out Int32 size, [Out] out int type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                fixed (Int32* size_ptr = &size)
+                fixed (int* type_ptr = &type)
+                {
+                    Delegates.glGetActiveUniformARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                    length = *length_ptr;
+                    size = *size_ptr;
+                    type = *type_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetActiveUniformARB(Int32 programObj, Int32 index, Int32 maxLength, [Out] out Int32 length, [Out] out Int32 size, [Out] out int type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                fixed (Int32* size_ptr = &size)
+                fixed (int* type_ptr = &type)
+                {
+                    Delegates.glGetActiveUniformARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                    length = *length_ptr;
+                    size = *size_ptr;
+                    type = *type_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveUniformARB(UInt32 programObj, UInt32 index, Int32 maxLength, [Out] IntPtr length, [Out] IntPtr size, [Out] IntPtr type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                Delegates.glGetActiveUniformARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length, (Int32*)size, (int*)type, (System.Text.StringBuilder)name);
+            }
+        }
+
+        public static 
+        void glGetActiveUniformARB(Int32 programObj, Int32 index, Int32 maxLength, [Out] IntPtr length, [Out] IntPtr size, [Out] IntPtr type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                Delegates.glGetActiveUniformARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length, (Int32*)size, (int*)type, (System.Text.StringBuilder)name);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformfvARB(UInt32 programObj, Int32 location, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetUniformfvARB((UInt32)programObj, (Int32)location, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetUniformfvARB(Int32 programObj, Int32 location, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetUniformfvARB((UInt32)programObj, (Int32)location, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformfvARB(UInt32 programObj, Int32 location, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetUniformfvARB((UInt32)programObj, (Int32)location, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetUniformfvARB(Int32 programObj, Int32 location, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetUniformfvARB((UInt32)programObj, (Int32)location, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformfvARB(UInt32 programObj, Int32 location, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetUniformfvARB((UInt32)programObj, (Int32)location, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetUniformfvARB(Int32 programObj, Int32 location, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetUniformfvARB((UInt32)programObj, (Int32)location, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformivARB(UInt32 programObj, Int32 location, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetUniformivARB((UInt32)programObj, (Int32)location, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetUniformivARB(Int32 programObj, Int32 location, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetUniformivARB((UInt32)programObj, (Int32)location, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformivARB(UInt32 programObj, Int32 location, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetUniformivARB((UInt32)programObj, (Int32)location, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetUniformivARB(Int32 programObj, Int32 location, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetUniformivARB((UInt32)programObj, (Int32)location, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformivARB(UInt32 programObj, Int32 location, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetUniformivARB((UInt32)programObj, (Int32)location, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetUniformivARB(Int32 programObj, Int32 location, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetUniformivARB((UInt32)programObj, (Int32)location, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderSourceARB(UInt32 obj, Int32 maxLength, [Out] Int32[] length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glGetShaderSourceARB((UInt32)obj, (Int32)maxLength, (Int32*)length_ptr, (System.Text.StringBuilder[])source);
+                }
+            }
+        }
+
+        public static 
+        void glGetShaderSourceARB(Int32 obj, Int32 maxLength, [Out] Int32[] length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                {
+                    Delegates.glGetShaderSourceARB((UInt32)obj, (Int32)maxLength, (Int32*)length_ptr, (System.Text.StringBuilder[])source);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderSourceARB(UInt32 obj, Int32 maxLength, [Out] out Int32 length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glGetShaderSourceARB((UInt32)obj, (Int32)maxLength, (Int32*)length_ptr, (System.Text.StringBuilder[])source);
+                    length = *length_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetShaderSourceARB(Int32 obj, Int32 maxLength, [Out] out Int32 length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                {
+                    Delegates.glGetShaderSourceARB((UInt32)obj, (Int32)maxLength, (Int32*)length_ptr, (System.Text.StringBuilder[])source);
+                    length = *length_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetShaderSourceARB(UInt32 obj, Int32 maxLength, [Out] IntPtr length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                Delegates.glGetShaderSourceARB((UInt32)obj, (Int32)maxLength, (Int32*)length, (System.Text.StringBuilder[])source);
+            }
+        }
+
+        public static 
+        void glGetShaderSourceARB(Int32 obj, Int32 maxLength, [Out] IntPtr length, [Out] System.Text.StringBuilder[] source)
+        {
+            unsafe
+            {
+                Delegates.glGetShaderSourceARB((UInt32)obj, (Int32)maxLength, (Int32*)length, (System.Text.StringBuilder[])source);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindAttribLocationARB(UInt32 programObj, UInt32 index, System.String name)
+        {
+            Delegates.glBindAttribLocationARB((UInt32)programObj, (UInt32)index, (System.String)name);
+        }
+
+        public static 
+        void glBindAttribLocationARB(Int32 programObj, Int32 index, System.String name)
+        {
+            Delegates.glBindAttribLocationARB((UInt32)programObj, (UInt32)index, (System.String)name);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveAttribARB(UInt32 programObj, UInt32 index, Int32 maxLength, [Out] Int32[] length, [Out] Int32[] size, [Out] int[] type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                fixed (Int32* size_ptr = size)
+                fixed (int* type_ptr = type)
+                {
+                    Delegates.glGetActiveAttribARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                }
+            }
+        }
+
+        public static 
+        void glGetActiveAttribARB(Int32 programObj, Int32 index, Int32 maxLength, [Out] Int32[] length, [Out] Int32[] size, [Out] int[] type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                fixed (Int32* size_ptr = size)
+                fixed (int* type_ptr = type)
+                {
+                    Delegates.glGetActiveAttribARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveAttribARB(UInt32 programObj, UInt32 index, Int32 maxLength, [Out] out Int32 length, [Out] out Int32 size, [Out] out int type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                fixed (Int32* size_ptr = &size)
+                fixed (int* type_ptr = &type)
+                {
+                    Delegates.glGetActiveAttribARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                    length = *length_ptr;
+                    size = *size_ptr;
+                    type = *type_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetActiveAttribARB(Int32 programObj, Int32 index, Int32 maxLength, [Out] out Int32 length, [Out] out Int32 size, [Out] out int type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                fixed (Int32* size_ptr = &size)
+                fixed (int* type_ptr = &type)
+                {
+                    Delegates.glGetActiveAttribARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                    length = *length_ptr;
+                    size = *size_ptr;
+                    type = *type_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveAttribARB(UInt32 programObj, UInt32 index, Int32 maxLength, [Out] IntPtr length, [Out] IntPtr size, [Out] IntPtr type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                Delegates.glGetActiveAttribARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length, (Int32*)size, (int*)type, (System.Text.StringBuilder)name);
+            }
+        }
+
+        public static 
+        void glGetActiveAttribARB(Int32 programObj, Int32 index, Int32 maxLength, [Out] IntPtr length, [Out] IntPtr size, [Out] IntPtr type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                Delegates.glGetActiveAttribARB((UInt32)programObj, (UInt32)index, (Int32)maxLength, (Int32*)length, (Int32*)size, (int*)type, (System.Text.StringBuilder)name);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glGetAttribLocationARB(UInt32 programObj, System.String name)
+        {
+            return Delegates.glGetAttribLocationARB((UInt32)programObj, (System.String)name);
+        }
+
+        public static 
+        Int32 glGetAttribLocationARB(Int32 programObj, System.String name)
+        {
+            return Delegates.glGetAttribLocationARB((UInt32)programObj, (System.String)name);
+        }
+
+        public static 
+        void glDrawBuffersARB(Int32 n, int[] bufs)
+        {
+            unsafe
+            {
+                fixed (int* bufs_ptr = bufs)
+                {
+                    Delegates.glDrawBuffersARB((Int32)n, (int*)bufs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDrawBuffersARB(Int32 n, ref int bufs)
+        {
+            unsafe
+            {
+                fixed (int* bufs_ptr = &bufs)
+                {
+                    Delegates.glDrawBuffersARB((Int32)n, (int*)bufs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDrawBuffersARB(Int32 n, IntPtr bufs)
+        {
+            unsafe
+            {
+                Delegates.glDrawBuffersARB((Int32)n, (int*)bufs);
+            }
+        }
+
+        public static 
+        void glClampColorARB(int target, int clamp)
+        {
+            Delegates.glClampColorARB((int)target, (int)clamp);
+        }
+
+        public static 
+        void glBlendColorEXT(Single red, Single green, Single blue, Single alpha)
+        {
+            Delegates.glBlendColorEXT((Single)red, (Single)green, (Single)blue, (Single)alpha);
+        }
+
+        public static 
+        void glPolygonOffsetEXT(Single factor, Single bias)
+        {
+            Delegates.glPolygonOffsetEXT((Single)factor, (Single)bias);
+        }
+
+        public static 
+        void glTexImage3DEXT(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexImage3DEXT((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)depth, (Int32)border, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexImage3DEXT(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 border, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexImage3DEXT((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)depth, (Int32)border, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexSubImage3DEXT(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexSubImage3DEXT((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)width, (Int32)height, (Int32)depth, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexSubImage3DEXT(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 width, Int32 height, Int32 depth, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexSubImage3DEXT((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)width, (Int32)height, (Int32)depth, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexSubImage1DEXT(int target, Int32 level, Int32 xoffset, Int32 width, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexSubImage1DEXT((int)target, (Int32)level, (Int32)xoffset, (Int32)width, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexSubImage1DEXT(int target, Int32 level, Int32 xoffset, Int32 width, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexSubImage1DEXT((int)target, (Int32)level, (Int32)xoffset, (Int32)width, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexSubImage2DEXT(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexSubImage2DEXT((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexSubImage2DEXT(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 width, Int32 height, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexSubImage2DEXT((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCopyTexImage1DEXT(int target, Int32 level, int internalformat, Int32 x, Int32 y, Int32 width, Int32 border)
+        {
+            Delegates.glCopyTexImage1DEXT((int)target, (Int32)level, (int)internalformat, (Int32)x, (Int32)y, (Int32)width, (Int32)border);
+        }
+
+        public static 
+        void glCopyTexImage2DEXT(int target, Int32 level, int internalformat, Int32 x, Int32 y, Int32 width, Int32 height, Int32 border)
+        {
+            Delegates.glCopyTexImage2DEXT((int)target, (Int32)level, (int)internalformat, (Int32)x, (Int32)y, (Int32)width, (Int32)height, (Int32)border);
+        }
+
+        public static 
+        void glCopyTexSubImage1DEXT(int target, Int32 level, Int32 xoffset, Int32 x, Int32 y, Int32 width)
+        {
+            Delegates.glCopyTexSubImage1DEXT((int)target, (Int32)level, (Int32)xoffset, (Int32)x, (Int32)y, (Int32)width);
+        }
+
+        public static 
+        void glCopyTexSubImage2DEXT(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 x, Int32 y, Int32 width, Int32 height)
+        {
+            Delegates.glCopyTexSubImage2DEXT((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)x, (Int32)y, (Int32)width, (Int32)height);
+        }
+
+        public static 
+        void glCopyTexSubImage3DEXT(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 x, Int32 y, Int32 width, Int32 height)
+        {
+            Delegates.glCopyTexSubImage3DEXT((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)x, (Int32)y, (Int32)width, (Int32)height);
+        }
+
+        public static 
+        void glGetHistogramEXT(int target, bool reset, int format, int type, [Out] IntPtr values)
+        {
+            unsafe
+            {
+                Delegates.glGetHistogramEXT((int)target, (bool)reset, (int)format, (int)type, (IntPtr)values);
+            }
+        }
+
+        public static 
+        void glGetHistogramEXT(int target, bool reset, int format, int type, [In, Out] object values)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle values_ptr = System.Runtime.InteropServices.GCHandle.Alloc(values, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetHistogramEXT((int)target, (bool)reset, (int)format, (int)type, (IntPtr)values_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    values_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogramParameterfvEXT(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetHistogramParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogramParameterfvEXT(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetHistogramParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogramParameterfvEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetHistogramParameterfvEXT((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetHistogramParameterivEXT(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetHistogramParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogramParameterivEXT(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetHistogramParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetHistogramParameterivEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetHistogramParameterivEXT((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetMinmaxEXT(int target, bool reset, int format, int type, [Out] IntPtr values)
+        {
+            unsafe
+            {
+                Delegates.glGetMinmaxEXT((int)target, (bool)reset, (int)format, (int)type, (IntPtr)values);
+            }
+        }
+
+        public static 
+        void glGetMinmaxEXT(int target, bool reset, int format, int type, [In, Out] object values)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle values_ptr = System.Runtime.InteropServices.GCHandle.Alloc(values, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetMinmaxEXT((int)target, (bool)reset, (int)format, (int)type, (IntPtr)values_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    values_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameterfvEXT(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetMinmaxParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameterfvEXT(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetMinmaxParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameterfvEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMinmaxParameterfvEXT((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameterivEXT(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetMinmaxParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameterivEXT(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetMinmaxParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMinmaxParameterivEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMinmaxParameterivEXT((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glHistogramEXT(int target, Int32 width, int internalformat, bool sink)
+        {
+            Delegates.glHistogramEXT((int)target, (Int32)width, (int)internalformat, (bool)sink);
+        }
+
+        public static 
+        void glMinmaxEXT(int target, int internalformat, bool sink)
+        {
+            Delegates.glMinmaxEXT((int)target, (int)internalformat, (bool)sink);
+        }
+
+        public static 
+        void glResetHistogramEXT(int target)
+        {
+            Delegates.glResetHistogramEXT((int)target);
+        }
+
+        public static 
+        void glResetMinmaxEXT(int target)
+        {
+            Delegates.glResetMinmaxEXT((int)target);
+        }
+
+        public static 
+        void glConvolutionFilter1DEXT(int target, int internalformat, Int32 width, int format, int type, IntPtr image)
+        {
+            unsafe
+            {
+                Delegates.glConvolutionFilter1DEXT((int)target, (int)internalformat, (Int32)width, (int)format, (int)type, (IntPtr)image);
+            }
+        }
+
+        public static 
+        void glConvolutionFilter1DEXT(int target, int internalformat, Int32 width, int format, int type, [In, Out] object image)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle image_ptr = System.Runtime.InteropServices.GCHandle.Alloc(image, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glConvolutionFilter1DEXT((int)target, (int)internalformat, (Int32)width, (int)format, (int)type, (IntPtr)image_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    image_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionFilter2DEXT(int target, int internalformat, Int32 width, Int32 height, int format, int type, IntPtr image)
+        {
+            unsafe
+            {
+                Delegates.glConvolutionFilter2DEXT((int)target, (int)internalformat, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)image);
+            }
+        }
+
+        public static 
+        void glConvolutionFilter2DEXT(int target, int internalformat, Int32 width, Int32 height, int format, int type, [In, Out] object image)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle image_ptr = System.Runtime.InteropServices.GCHandle.Alloc(image, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glConvolutionFilter2DEXT((int)target, (int)internalformat, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)image_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    image_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionParameterfEXT(int target, int pname, Single @params)
+        {
+            Delegates.glConvolutionParameterfEXT((int)target, (int)pname, (Single)@params);
+        }
+
+        public static 
+        void glConvolutionParameterfvEXT(int target, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glConvolutionParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionParameterfvEXT(int target, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glConvolutionParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionParameterfvEXT(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glConvolutionParameterfvEXT((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glConvolutionParameteriEXT(int target, int pname, Int32 @params)
+        {
+            Delegates.glConvolutionParameteriEXT((int)target, (int)pname, (Int32)@params);
+        }
+
+        public static 
+        void glConvolutionParameterivEXT(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glConvolutionParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionParameterivEXT(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glConvolutionParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glConvolutionParameterivEXT(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glConvolutionParameterivEXT((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glCopyConvolutionFilter1DEXT(int target, int internalformat, Int32 x, Int32 y, Int32 width)
+        {
+            Delegates.glCopyConvolutionFilter1DEXT((int)target, (int)internalformat, (Int32)x, (Int32)y, (Int32)width);
+        }
+
+        public static 
+        void glCopyConvolutionFilter2DEXT(int target, int internalformat, Int32 x, Int32 y, Int32 width, Int32 height)
+        {
+            Delegates.glCopyConvolutionFilter2DEXT((int)target, (int)internalformat, (Int32)x, (Int32)y, (Int32)width, (Int32)height);
+        }
+
+        public static 
+        void glGetConvolutionFilterEXT(int target, int format, int type, [Out] IntPtr image)
+        {
+            unsafe
+            {
+                Delegates.glGetConvolutionFilterEXT((int)target, (int)format, (int)type, (IntPtr)image);
+            }
+        }
+
+        public static 
+        void glGetConvolutionFilterEXT(int target, int format, int type, [In, Out] object image)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle image_ptr = System.Runtime.InteropServices.GCHandle.Alloc(image, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetConvolutionFilterEXT((int)target, (int)format, (int)type, (IntPtr)image_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    image_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameterfvEXT(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetConvolutionParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameterfvEXT(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetConvolutionParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameterfvEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetConvolutionParameterfvEXT((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameterivEXT(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetConvolutionParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameterivEXT(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetConvolutionParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetConvolutionParameterivEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetConvolutionParameterivEXT((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetSeparableFilterEXT(int target, int format, int type, [Out] IntPtr row, [Out] IntPtr column, [Out] IntPtr span)
+        {
+            unsafe
+            {
+                Delegates.glGetSeparableFilterEXT((int)target, (int)format, (int)type, (IntPtr)row, (IntPtr)column, (IntPtr)span);
+            }
+        }
+
+        public static 
+        void glGetSeparableFilterEXT(int target, int format, int type, [In, Out] object row, [In, Out] object column, [In, Out] object span)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle row_ptr = System.Runtime.InteropServices.GCHandle.Alloc(row, System.Runtime.InteropServices.GCHandleType.Pinned);
+                System.Runtime.InteropServices.GCHandle column_ptr = System.Runtime.InteropServices.GCHandle.Alloc(column, System.Runtime.InteropServices.GCHandleType.Pinned);
+                System.Runtime.InteropServices.GCHandle span_ptr = System.Runtime.InteropServices.GCHandle.Alloc(span, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetSeparableFilterEXT((int)target, (int)format, (int)type, (IntPtr)row_ptr.AddrOfPinnedObject(), (IntPtr)column_ptr.AddrOfPinnedObject(), (IntPtr)span_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    row_ptr.Free();
+                    column_ptr.Free();
+                    span_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetSeparableFilterEXT(int target, int format, int type, [Out] IntPtr row, [In, Out] object column, [In, Out] object span)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle column_ptr = System.Runtime.InteropServices.GCHandle.Alloc(column, System.Runtime.InteropServices.GCHandleType.Pinned);
+                System.Runtime.InteropServices.GCHandle span_ptr = System.Runtime.InteropServices.GCHandle.Alloc(span, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetSeparableFilterEXT((int)target, (int)format, (int)type, (IntPtr)row, (IntPtr)column_ptr.AddrOfPinnedObject(), (IntPtr)span_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    column_ptr.Free();
+                    span_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glSeparableFilter2DEXT(int target, int internalformat, Int32 width, Int32 height, int format, int type, IntPtr row, IntPtr column)
+        {
+            unsafe
+            {
+                Delegates.glSeparableFilter2DEXT((int)target, (int)internalformat, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)row, (IntPtr)column);
+            }
+        }
+
+        public static 
+        void glSeparableFilter2DEXT(int target, int internalformat, Int32 width, Int32 height, int format, int type, [In, Out] object row, [In, Out] object column)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle row_ptr = System.Runtime.InteropServices.GCHandle.Alloc(row, System.Runtime.InteropServices.GCHandleType.Pinned);
+                System.Runtime.InteropServices.GCHandle column_ptr = System.Runtime.InteropServices.GCHandle.Alloc(column, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glSeparableFilter2DEXT((int)target, (int)internalformat, (Int32)width, (Int32)height, (int)format, (int)type, (IntPtr)row_ptr.AddrOfPinnedObject(), (IntPtr)column_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    row_ptr.Free();
+                    column_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glAreTexturesResidentEXT(Int32 n, UInt32[] textures, [Out] bool[] residences)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = textures)
+                fixed (bool* residences_ptr = residences)
+                {
+                    return Delegates.glAreTexturesResidentEXT((Int32)n, (UInt32*)textures_ptr, (bool*)residences_ptr);
+                }
+            }
+        }
+
+        public static 
+        bool glAreTexturesResidentEXT(Int32 n, Int32[] textures, [Out] bool[] residences)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = textures)
+                fixed (bool* residences_ptr = residences)
+                {
+                    return Delegates.glAreTexturesResidentEXT((Int32)n, (UInt32*)textures_ptr, (bool*)residences_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glAreTexturesResidentEXT(Int32 n, ref UInt32 textures, [Out] out bool residences)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = &textures)
+                fixed (bool* residences_ptr = &residences)
+                {
+                    bool retval = Delegates.glAreTexturesResidentEXT((Int32)n, (UInt32*)textures_ptr, (bool*)residences_ptr);
+                    residences = *residences_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        bool glAreTexturesResidentEXT(Int32 n, ref Int32 textures, [Out] out bool residences)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = &textures)
+                fixed (bool* residences_ptr = &residences)
+                {
+                    bool retval = Delegates.glAreTexturesResidentEXT((Int32)n, (UInt32*)textures_ptr, (bool*)residences_ptr);
+                    residences = *residences_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        bool glAreTexturesResidentEXT(Int32 n, IntPtr textures, [Out] IntPtr residences)
+        {
+            unsafe
+            {
+                return Delegates.glAreTexturesResidentEXT((Int32)n, (UInt32*)textures, (bool*)residences);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindTextureEXT(int target, UInt32 texture)
+        {
+            Delegates.glBindTextureEXT((int)target, (UInt32)texture);
+        }
+
+        public static 
+        void glBindTextureEXT(int target, Int32 texture)
+        {
+            Delegates.glBindTextureEXT((int)target, (UInt32)texture);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteTexturesEXT(Int32 n, UInt32[] textures)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = textures)
+                {
+                    Delegates.glDeleteTexturesEXT((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteTexturesEXT(Int32 n, Int32[] textures)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = textures)
+                {
+                    Delegates.glDeleteTexturesEXT((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteTexturesEXT(Int32 n, ref UInt32 textures)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = &textures)
+                {
+                    Delegates.glDeleteTexturesEXT((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteTexturesEXT(Int32 n, ref Int32 textures)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = &textures)
+                {
+                    Delegates.glDeleteTexturesEXT((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteTexturesEXT(Int32 n, IntPtr textures)
+        {
+            unsafe
+            {
+                Delegates.glDeleteTexturesEXT((Int32)n, (UInt32*)textures);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenTexturesEXT(Int32 n, [Out] UInt32[] textures)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = textures)
+                {
+                    Delegates.glGenTexturesEXT((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenTexturesEXT(Int32 n, [Out] Int32[] textures)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = textures)
+                {
+                    Delegates.glGenTexturesEXT((Int32)n, (UInt32*)textures_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenTexturesEXT(Int32 n, [Out] out UInt32 textures)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = &textures)
+                {
+                    Delegates.glGenTexturesEXT((Int32)n, (UInt32*)textures_ptr);
+                    textures = *textures_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenTexturesEXT(Int32 n, [Out] out Int32 textures)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = &textures)
+                {
+                    Delegates.glGenTexturesEXT((Int32)n, (UInt32*)textures_ptr);
+                    textures = *textures_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenTexturesEXT(Int32 n, [Out] IntPtr textures)
+        {
+            unsafe
+            {
+                Delegates.glGenTexturesEXT((Int32)n, (UInt32*)textures);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsTextureEXT(UInt32 texture)
+        {
+            return Delegates.glIsTextureEXT((UInt32)texture);
+        }
+
+        public static 
+        bool glIsTextureEXT(Int32 texture)
+        {
+            return Delegates.glIsTextureEXT((UInt32)texture);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPrioritizeTexturesEXT(Int32 n, UInt32[] textures, Single[] priorities)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = textures)
+                fixed (Single* priorities_ptr = priorities)
+                {
+                    Delegates.glPrioritizeTexturesEXT((Int32)n, (UInt32*)textures_ptr, (Single*)priorities_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPrioritizeTexturesEXT(Int32 n, Int32[] textures, Single[] priorities)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = textures)
+                fixed (Single* priorities_ptr = priorities)
+                {
+                    Delegates.glPrioritizeTexturesEXT((Int32)n, (UInt32*)textures_ptr, (Single*)priorities_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPrioritizeTexturesEXT(Int32 n, ref UInt32 textures, ref Single priorities)
+        {
+            unsafe
+            {
+                fixed (UInt32* textures_ptr = &textures)
+                fixed (Single* priorities_ptr = &priorities)
+                {
+                    Delegates.glPrioritizeTexturesEXT((Int32)n, (UInt32*)textures_ptr, (Single*)priorities_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPrioritizeTexturesEXT(Int32 n, ref Int32 textures, ref Single priorities)
+        {
+            unsafe
+            {
+                fixed (Int32* textures_ptr = &textures)
+                fixed (Single* priorities_ptr = &priorities)
+                {
+                    Delegates.glPrioritizeTexturesEXT((Int32)n, (UInt32*)textures_ptr, (Single*)priorities_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPrioritizeTexturesEXT(Int32 n, IntPtr textures, IntPtr priorities)
+        {
+            unsafe
+            {
+                Delegates.glPrioritizeTexturesEXT((Int32)n, (UInt32*)textures, (Single*)priorities);
+            }
+        }
+
+        public static 
+        void glArrayElementEXT(Int32 i)
+        {
+            Delegates.glArrayElementEXT((Int32)i);
+        }
+
+        public static 
+        void glColorPointerEXT(Int32 size, int type, Int32 stride, Int32 count, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glColorPointerEXT((Int32)size, (int)type, (Int32)stride, (Int32)count, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glColorPointerEXT(Int32 size, int type, Int32 stride, Int32 count, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glColorPointerEXT((Int32)size, (int)type, (Int32)stride, (Int32)count, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glDrawArraysEXT(int mode, Int32 first, Int32 count)
+        {
+            Delegates.glDrawArraysEXT((int)mode, (Int32)first, (Int32)count);
+        }
+
+        public static 
+        void glEdgeFlagPointerEXT(Int32 stride, Int32 count, bool[] pointer)
+        {
+            unsafe
+            {
+                fixed (bool* pointer_ptr = pointer)
+                {
+                    Delegates.glEdgeFlagPointerEXT((Int32)stride, (Int32)count, (bool*)pointer_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEdgeFlagPointerEXT(Int32 stride, Int32 count, ref bool pointer)
+        {
+            unsafe
+            {
+                fixed (bool* pointer_ptr = &pointer)
+                {
+                    Delegates.glEdgeFlagPointerEXT((Int32)stride, (Int32)count, (bool*)pointer_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glEdgeFlagPointerEXT(Int32 stride, Int32 count, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glEdgeFlagPointerEXT((Int32)stride, (Int32)count, (bool*)pointer);
+            }
+        }
+
+        public static 
+        void glGetPointervEXT(int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetPointervEXT((int)pname, (IntPtr)@params);
+            }
+        }
+
+        public static 
+        void glGetPointervEXT(int pname, [In, Out] object @params)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle @params_ptr = System.Runtime.InteropServices.GCHandle.Alloc(@params, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetPointervEXT((int)pname, (IntPtr)@params_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    @params_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glIndexPointerEXT(int type, Int32 stride, Int32 count, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glIndexPointerEXT((int)type, (Int32)stride, (Int32)count, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glIndexPointerEXT(int type, Int32 stride, Int32 count, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glIndexPointerEXT((int)type, (Int32)stride, (Int32)count, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glNormalPointerEXT(int type, Int32 stride, Int32 count, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glNormalPointerEXT((int)type, (Int32)stride, (Int32)count, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glNormalPointerEXT(int type, Int32 stride, Int32 count, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glNormalPointerEXT((int)type, (Int32)stride, (Int32)count, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexCoordPointerEXT(Int32 size, int type, Int32 stride, Int32 count, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glTexCoordPointerEXT((Int32)size, (int)type, (Int32)stride, (Int32)count, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glTexCoordPointerEXT(Int32 size, int type, Int32 stride, Int32 count, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexCoordPointerEXT((Int32)size, (int)type, (Int32)stride, (Int32)count, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glVertexPointerEXT(Int32 size, int type, Int32 stride, Int32 count, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexPointerEXT((Int32)size, (int)type, (Int32)stride, (Int32)count, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glVertexPointerEXT(Int32 size, int type, Int32 stride, Int32 count, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexPointerEXT((Int32)size, (int)type, (Int32)stride, (Int32)count, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glBlendEquationEXT(int mode)
+        {
+            Delegates.glBlendEquationEXT((int)mode);
+        }
+
+        public static 
+        void glPointParameterfEXT(int pname, Single param)
+        {
+            Delegates.glPointParameterfEXT((int)pname, (Single)param);
+        }
+
+        public static 
+        void glPointParameterfvEXT(int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glPointParameterfvEXT((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterfvEXT(int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glPointParameterfvEXT((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterfvEXT(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glPointParameterfvEXT((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glColorSubTableEXT(int target, Int32 start, Int32 count, int format, int type, IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glColorSubTableEXT((int)target, (Int32)start, (Int32)count, (int)format, (int)type, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glColorSubTableEXT(int target, Int32 start, Int32 count, int format, int type, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glColorSubTableEXT((int)target, (Int32)start, (Int32)count, (int)format, (int)type, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCopyColorSubTableEXT(int target, Int32 start, Int32 x, Int32 y, Int32 width)
+        {
+            Delegates.glCopyColorSubTableEXT((int)target, (Int32)start, (Int32)x, (Int32)y, (Int32)width);
+        }
+
+        public static 
+        void glColorTableEXT(int target, int internalFormat, Int32 width, int format, int type, IntPtr table)
+        {
+            unsafe
+            {
+                Delegates.glColorTableEXT((int)target, (int)internalFormat, (Int32)width, (int)format, (int)type, (IntPtr)table);
+            }
+        }
+
+        public static 
+        void glColorTableEXT(int target, int internalFormat, Int32 width, int format, int type, [In, Out] object table)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle table_ptr = System.Runtime.InteropServices.GCHandle.Alloc(table, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glColorTableEXT((int)target, (int)internalFormat, (Int32)width, (int)format, (int)type, (IntPtr)table_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    table_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableEXT(int target, int format, int type, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetColorTableEXT((int)target, (int)format, (int)type, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glGetColorTableEXT(int target, int format, int type, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetColorTableEXT((int)target, (int)format, (int)type, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterivEXT(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetColorTableParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterivEXT(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetColorTableParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterivEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetColorTableParameterivEXT((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterfvEXT(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetColorTableParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterfvEXT(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetColorTableParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterfvEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetColorTableParameterfvEXT((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glIndexMaterialEXT(int face, int mode)
+        {
+            Delegates.glIndexMaterialEXT((int)face, (int)mode);
+        }
+
+        public static 
+        void glIndexFuncEXT(int func, Single @ref)
+        {
+            Delegates.glIndexFuncEXT((int)func, (Single)@ref);
+        }
+
+        public static 
+        void glLockArraysEXT(Int32 first, Int32 count)
+        {
+            Delegates.glLockArraysEXT((Int32)first, (Int32)count);
+        }
+
+        public static 
+        void glUnlockArraysEXT()
+        {
+            Delegates.glUnlockArraysEXT();
+        }
+
+        public static 
+        void glCullParameterdvEXT(int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glCullParameterdvEXT((int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glCullParameterdvEXT(int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glCullParameterdvEXT((int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glCullParameterdvEXT(int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glCullParameterdvEXT((int)pname, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glCullParameterfvEXT(int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glCullParameterfvEXT((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glCullParameterfvEXT(int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glCullParameterfvEXT((int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glCullParameterfvEXT(int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glCullParameterfvEXT((int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDrawRangeElementsEXT(int mode, UInt32 start, UInt32 end, Int32 count, int type, IntPtr indices)
+        {
+            unsafe
+            {
+                Delegates.glDrawRangeElementsEXT((int)mode, (UInt32)start, (UInt32)end, (Int32)count, (int)type, (IntPtr)indices);
+            }
+        }
+
+        public static 
+        void glDrawRangeElementsEXT(int mode, Int32 start, Int32 end, Int32 count, int type, IntPtr indices)
+        {
+            unsafe
+            {
+                Delegates.glDrawRangeElementsEXT((int)mode, (UInt32)start, (UInt32)end, (Int32)count, (int)type, (IntPtr)indices);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDrawRangeElementsEXT(int mode, UInt32 start, UInt32 end, Int32 count, int type, [In, Out] object indices)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glDrawRangeElementsEXT((int)mode, (UInt32)start, (UInt32)end, (Int32)count, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    indices_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glDrawRangeElementsEXT(int mode, Int32 start, Int32 end, Int32 count, int type, [In, Out] object indices)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glDrawRangeElementsEXT((int)mode, (UInt32)start, (UInt32)end, (Int32)count, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    indices_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glApplyTextureEXT(int mode)
+        {
+            Delegates.glApplyTextureEXT((int)mode);
+        }
+
+        public static 
+        void glTextureLightEXT(int pname)
+        {
+            Delegates.glTextureLightEXT((int)pname);
+        }
+
+        public static 
+        void glTextureMaterialEXT(int face, int mode)
+        {
+            Delegates.glTextureMaterialEXT((int)face, (int)mode);
+        }
+
+        public static 
+        void glPixelTransformParameteriEXT(int target, int pname, Int32 param)
+        {
+            Delegates.glPixelTransformParameteriEXT((int)target, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glPixelTransformParameterfEXT(int target, int pname, Single param)
+        {
+            Delegates.glPixelTransformParameterfEXT((int)target, (int)pname, (Single)param);
+        }
+
+        public static 
+        void glPixelTransformParameterivEXT(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glPixelTransformParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelTransformParameterivEXT(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glPixelTransformParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelTransformParameterivEXT(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glPixelTransformParameterivEXT((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glPixelTransformParameterfvEXT(int target, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glPixelTransformParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelTransformParameterfvEXT(int target, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glPixelTransformParameterfvEXT((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelTransformParameterfvEXT(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glPixelTransformParameterfvEXT((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3bEXT(SByte red, SByte green, SByte blue)
+        {
+            Delegates.glSecondaryColor3bEXT((SByte)red, (SByte)green, (SByte)blue);
+        }
+
+        public static 
+        void glSecondaryColor3bEXT(Byte red, Byte green, Byte blue)
+        {
+            Delegates.glSecondaryColor3bEXT((SByte)red, (SByte)green, (SByte)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3bvEXT(SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3bvEXT(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3bvEXT(ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3bvEXT(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3bvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3bvEXT((SByte*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColor3dEXT(Double red, Double green, Double blue)
+        {
+            Delegates.glSecondaryColor3dEXT((Double)red, (Double)green, (Double)blue);
+        }
+
+        public static 
+        void glSecondaryColor3dvEXT(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3dvEXT((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3dvEXT(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3dvEXT((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3dvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3dvEXT((Double*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColor3fEXT(Single red, Single green, Single blue)
+        {
+            Delegates.glSecondaryColor3fEXT((Single)red, (Single)green, (Single)blue);
+        }
+
+        public static 
+        void glSecondaryColor3fvEXT(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3fvEXT((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3fvEXT(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3fvEXT((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3fvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3fvEXT((Single*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColor3iEXT(Int32 red, Int32 green, Int32 blue)
+        {
+            Delegates.glSecondaryColor3iEXT((Int32)red, (Int32)green, (Int32)blue);
+        }
+
+        public static 
+        void glSecondaryColor3ivEXT(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3ivEXT((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3ivEXT(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3ivEXT((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3ivEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3ivEXT((Int32*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColor3sEXT(Int16 red, Int16 green, Int16 blue)
+        {
+            Delegates.glSecondaryColor3sEXT((Int16)red, (Int16)green, (Int16)blue);
+        }
+
+        public static 
+        void glSecondaryColor3svEXT(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3svEXT((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3svEXT(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3svEXT((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3svEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3svEXT((Int16*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColor3ubEXT(Byte red, Byte green, Byte blue)
+        {
+            Delegates.glSecondaryColor3ubEXT((Byte)red, (Byte)green, (Byte)blue);
+        }
+
+        public static 
+        void glSecondaryColor3ubvEXT(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3ubvEXT((Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3ubvEXT(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3ubvEXT((Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3ubvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3ubvEXT((Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3uiEXT(UInt32 red, UInt32 green, UInt32 blue)
+        {
+            Delegates.glSecondaryColor3uiEXT((UInt32)red, (UInt32)green, (UInt32)blue);
+        }
+
+        public static 
+        void glSecondaryColor3uiEXT(Int32 red, Int32 green, Int32 blue)
+        {
+            Delegates.glSecondaryColor3uiEXT((UInt32)red, (UInt32)green, (UInt32)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3uivEXT(UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3uivEXT((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3uivEXT(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3uivEXT((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3uivEXT(ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3uivEXT((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3uivEXT(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3uivEXT((UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3uivEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3uivEXT((UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3usEXT(UInt16 red, UInt16 green, UInt16 blue)
+        {
+            Delegates.glSecondaryColor3usEXT((UInt16)red, (UInt16)green, (UInt16)blue);
+        }
+
+        public static 
+        void glSecondaryColor3usEXT(Int16 red, Int16 green, Int16 blue)
+        {
+            Delegates.glSecondaryColor3usEXT((UInt16)red, (UInt16)green, (UInt16)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3usvEXT(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3usvEXT((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3usvEXT(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3usvEXT((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3usvEXT(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3usvEXT((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3usvEXT(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3usvEXT((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3usvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3usvEXT((UInt16*)v);
+            }
+        }
+
+        public static 
+        void glSecondaryColorPointerEXT(Int32 size, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColorPointerEXT((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glSecondaryColorPointerEXT(Int32 size, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glSecondaryColorPointerEXT((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTextureNormalEXT(int mode)
+        {
+            Delegates.glTextureNormalEXT((int)mode);
+        }
+
+        public static 
+        void glMultiDrawArraysEXT(int mode, [Out] Int32[] first, [Out] Int32[] count, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* first_ptr = first)
+                fixed (Int32* count_ptr = count)
+                {
+                    Delegates.glMultiDrawArraysEXT((int)mode, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount);
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawArraysEXT(int mode, [Out] out Int32 first, [Out] out Int32 count, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* first_ptr = &first)
+                fixed (Int32* count_ptr = &count)
+                {
+                    Delegates.glMultiDrawArraysEXT((int)mode, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount);
+                    first = *first_ptr;
+                    count = *count_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawArraysEXT(int mode, [Out] IntPtr first, [Out] IntPtr count, Int32 primcount)
+        {
+            unsafe
+            {
+                Delegates.glMultiDrawArraysEXT((int)mode, (Int32*)first, (Int32*)count, (Int32)primcount);
+            }
+        }
+
+        public static 
+        void glMultiDrawElementsEXT(int mode, Int32[] count, int type, IntPtr indices, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = count)
+                {
+                    Delegates.glMultiDrawElementsEXT((int)mode, (Int32*)count_ptr, (int)type, (IntPtr)indices, (Int32)primcount);
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawElementsEXT(int mode, IntPtr count, int type, [In, Out] object indices, Int32 primcount)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glMultiDrawElementsEXT((int)mode, (Int32*)count, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject(), (Int32)primcount);
+                }
+                finally
+                {
+                    indices_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawElementsEXT(int mode, ref Int32 count, int type, [In, Out] object indices, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* count_ptr = &count)
+                {
+                    System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        Delegates.glMultiDrawElementsEXT((int)mode, (Int32*)count_ptr, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject(), (Int32)primcount);
+                    }
+                    finally
+                    {
+                        indices_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        public static 
+        void glFogCoordfEXT(Single coord)
+        {
+            Delegates.glFogCoordfEXT((Single)coord);
+        }
+
+        public static 
+        void glFogCoordfvEXT(Single[] coord)
+        {
+            unsafe
+            {
+                fixed (Single* coord_ptr = coord)
+                {
+                    Delegates.glFogCoordfvEXT((Single*)coord_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoordfvEXT(ref Single coord)
+        {
+            unsafe
+            {
+                fixed (Single* coord_ptr = &coord)
+                {
+                    Delegates.glFogCoordfvEXT((Single*)coord_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoordfvEXT(IntPtr coord)
+        {
+            unsafe
+            {
+                Delegates.glFogCoordfvEXT((Single*)coord);
+            }
+        }
+
+        public static 
+        void glFogCoorddEXT(Double coord)
+        {
+            Delegates.glFogCoorddEXT((Double)coord);
+        }
+
+        public static 
+        void glFogCoorddvEXT(Double[] coord)
+        {
+            unsafe
+            {
+                fixed (Double* coord_ptr = coord)
+                {
+                    Delegates.glFogCoorddvEXT((Double*)coord_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoorddvEXT(ref Double coord)
+        {
+            unsafe
+            {
+                fixed (Double* coord_ptr = &coord)
+                {
+                    Delegates.glFogCoorddvEXT((Double*)coord_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoorddvEXT(IntPtr coord)
+        {
+            unsafe
+            {
+                Delegates.glFogCoorddvEXT((Double*)coord);
+            }
+        }
+
+        public static 
+        void glFogCoordPointerEXT(int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glFogCoordPointerEXT((int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glFogCoordPointerEXT(int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glFogCoordPointerEXT((int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTangent3bEXT(SByte tx, SByte ty, SByte tz)
+        {
+            Delegates.glTangent3bEXT((SByte)tx, (SByte)ty, (SByte)tz);
+        }
+
+        public static 
+        void glTangent3bEXT(Byte tx, Byte ty, Byte tz)
+        {
+            Delegates.glTangent3bEXT((SByte)tx, (SByte)ty, (SByte)tz);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTangent3bvEXT(SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glTangent3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3bvEXT(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glTangent3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTangent3bvEXT(ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glTangent3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3bvEXT(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glTangent3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3bvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTangent3bvEXT((SByte*)v);
+            }
+        }
+
+        public static 
+        void glTangent3dEXT(Double tx, Double ty, Double tz)
+        {
+            Delegates.glTangent3dEXT((Double)tx, (Double)ty, (Double)tz);
+        }
+
+        public static 
+        void glTangent3dvEXT(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glTangent3dvEXT((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3dvEXT(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glTangent3dvEXT((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3dvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTangent3dvEXT((Double*)v);
+            }
+        }
+
+        public static 
+        void glTangent3fEXT(Single tx, Single ty, Single tz)
+        {
+            Delegates.glTangent3fEXT((Single)tx, (Single)ty, (Single)tz);
+        }
+
+        public static 
+        void glTangent3fvEXT(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTangent3fvEXT((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3fvEXT(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTangent3fvEXT((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3fvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTangent3fvEXT((Single*)v);
+            }
+        }
+
+        public static 
+        void glTangent3iEXT(Int32 tx, Int32 ty, Int32 tz)
+        {
+            Delegates.glTangent3iEXT((Int32)tx, (Int32)ty, (Int32)tz);
+        }
+
+        public static 
+        void glTangent3ivEXT(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glTangent3ivEXT((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3ivEXT(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glTangent3ivEXT((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3ivEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTangent3ivEXT((Int32*)v);
+            }
+        }
+
+        public static 
+        void glTangent3sEXT(Int16 tx, Int16 ty, Int16 tz)
+        {
+            Delegates.glTangent3sEXT((Int16)tx, (Int16)ty, (Int16)tz);
+        }
+
+        public static 
+        void glTangent3svEXT(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glTangent3svEXT((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3svEXT(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glTangent3svEXT((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTangent3svEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTangent3svEXT((Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBinormal3bEXT(SByte bx, SByte by, SByte bz)
+        {
+            Delegates.glBinormal3bEXT((SByte)bx, (SByte)by, (SByte)bz);
+        }
+
+        public static 
+        void glBinormal3bEXT(Byte bx, Byte by, Byte bz)
+        {
+            Delegates.glBinormal3bEXT((SByte)bx, (SByte)by, (SByte)bz);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBinormal3bvEXT(SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glBinormal3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3bvEXT(Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glBinormal3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBinormal3bvEXT(ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glBinormal3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3bvEXT(ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glBinormal3bvEXT((SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3bvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glBinormal3bvEXT((SByte*)v);
+            }
+        }
+
+        public static 
+        void glBinormal3dEXT(Double bx, Double by, Double bz)
+        {
+            Delegates.glBinormal3dEXT((Double)bx, (Double)by, (Double)bz);
+        }
+
+        public static 
+        void glBinormal3dvEXT(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glBinormal3dvEXT((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3dvEXT(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glBinormal3dvEXT((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3dvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glBinormal3dvEXT((Double*)v);
+            }
+        }
+
+        public static 
+        void glBinormal3fEXT(Single bx, Single by, Single bz)
+        {
+            Delegates.glBinormal3fEXT((Single)bx, (Single)by, (Single)bz);
+        }
+
+        public static 
+        void glBinormal3fvEXT(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glBinormal3fvEXT((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3fvEXT(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glBinormal3fvEXT((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3fvEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glBinormal3fvEXT((Single*)v);
+            }
+        }
+
+        public static 
+        void glBinormal3iEXT(Int32 bx, Int32 by, Int32 bz)
+        {
+            Delegates.glBinormal3iEXT((Int32)bx, (Int32)by, (Int32)bz);
+        }
+
+        public static 
+        void glBinormal3ivEXT(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glBinormal3ivEXT((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3ivEXT(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glBinormal3ivEXT((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3ivEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glBinormal3ivEXT((Int32*)v);
+            }
+        }
+
+        public static 
+        void glBinormal3sEXT(Int16 bx, Int16 by, Int16 bz)
+        {
+            Delegates.glBinormal3sEXT((Int16)bx, (Int16)by, (Int16)bz);
+        }
+
+        public static 
+        void glBinormal3svEXT(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glBinormal3svEXT((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3svEXT(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glBinormal3svEXT((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glBinormal3svEXT(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glBinormal3svEXT((Int16*)v);
+            }
+        }
+
+        public static 
+        void glTangentPointerEXT(int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glTangentPointerEXT((int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glTangentPointerEXT(int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTangentPointerEXT((int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glBinormalPointerEXT(int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glBinormalPointerEXT((int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glBinormalPointerEXT(int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glBinormalPointerEXT((int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glBlendFuncSeparateEXT(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha)
+        {
+            Delegates.glBlendFuncSeparateEXT((int)sfactorRGB, (int)dfactorRGB, (int)sfactorAlpha, (int)dfactorAlpha);
+        }
+
+        public static 
+        void glVertexWeightfEXT(Single weight)
+        {
+            Delegates.glVertexWeightfEXT((Single)weight);
+        }
+
+        public static 
+        void glVertexWeightfvEXT(Single[] weight)
+        {
+            unsafe
+            {
+                fixed (Single* weight_ptr = weight)
+                {
+                    Delegates.glVertexWeightfvEXT((Single*)weight_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexWeightfvEXT(ref Single weight)
+        {
+            unsafe
+            {
+                fixed (Single* weight_ptr = &weight)
+                {
+                    Delegates.glVertexWeightfvEXT((Single*)weight_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexWeightfvEXT(IntPtr weight)
+        {
+            unsafe
+            {
+                Delegates.glVertexWeightfvEXT((Single*)weight);
+            }
+        }
+
+        public static 
+        void glVertexWeightPointerEXT(Int32 size, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexWeightPointerEXT((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glVertexWeightPointerEXT(Int32 size, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexWeightPointerEXT((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glSampleMaskEXT(Single value, bool invert)
+        {
+            Delegates.glSampleMaskEXT((Single)value, (bool)invert);
+        }
+
+        public static 
+        void glSamplePatternEXT(int pattern)
+        {
+            Delegates.glSamplePatternEXT((int)pattern);
+        }
+
+        public static 
+        void glBeginVertexShaderEXT()
+        {
+            Delegates.glBeginVertexShaderEXT();
+        }
+
+        public static 
+        void glEndVertexShaderEXT()
+        {
+            Delegates.glEndVertexShaderEXT();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindVertexShaderEXT(UInt32 id)
+        {
+            Delegates.glBindVertexShaderEXT((UInt32)id);
+        }
+
+        public static 
+        void glBindVertexShaderEXT(Int32 id)
+        {
+            Delegates.glBindVertexShaderEXT((UInt32)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glGenVertexShadersEXT(UInt32 range)
+        {
+            return Delegates.glGenVertexShadersEXT((UInt32)range);
+        }
+
+        public static 
+        Int32 glGenVertexShadersEXT(Int32 range)
+        {
+            return Delegates.glGenVertexShadersEXT((UInt32)range);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteVertexShaderEXT(UInt32 id)
+        {
+            Delegates.glDeleteVertexShaderEXT((UInt32)id);
+        }
+
+        public static 
+        void glDeleteVertexShaderEXT(Int32 id)
+        {
+            Delegates.glDeleteVertexShaderEXT((UInt32)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glShaderOp1EXT(int op, UInt32 res, UInt32 arg1)
+        {
+            Delegates.glShaderOp1EXT((int)op, (UInt32)res, (UInt32)arg1);
+        }
+
+        public static 
+        void glShaderOp1EXT(int op, Int32 res, Int32 arg1)
+        {
+            Delegates.glShaderOp1EXT((int)op, (UInt32)res, (UInt32)arg1);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glShaderOp2EXT(int op, UInt32 res, UInt32 arg1, UInt32 arg2)
+        {
+            Delegates.glShaderOp2EXT((int)op, (UInt32)res, (UInt32)arg1, (UInt32)arg2);
+        }
+
+        public static 
+        void glShaderOp2EXT(int op, Int32 res, Int32 arg1, Int32 arg2)
+        {
+            Delegates.glShaderOp2EXT((int)op, (UInt32)res, (UInt32)arg1, (UInt32)arg2);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glShaderOp3EXT(int op, UInt32 res, UInt32 arg1, UInt32 arg2, UInt32 arg3)
+        {
+            Delegates.glShaderOp3EXT((int)op, (UInt32)res, (UInt32)arg1, (UInt32)arg2, (UInt32)arg3);
+        }
+
+        public static 
+        void glShaderOp3EXT(int op, Int32 res, Int32 arg1, Int32 arg2, Int32 arg3)
+        {
+            Delegates.glShaderOp3EXT((int)op, (UInt32)res, (UInt32)arg1, (UInt32)arg2, (UInt32)arg3);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSwizzleEXT(UInt32 res, UInt32 @in, int outX, int outY, int outZ, int outW)
+        {
+            Delegates.glSwizzleEXT((UInt32)res, (UInt32)@in, (int)outX, (int)outY, (int)outZ, (int)outW);
+        }
+
+        public static 
+        void glSwizzleEXT(Int32 res, Int32 @in, int outX, int outY, int outZ, int outW)
+        {
+            Delegates.glSwizzleEXT((UInt32)res, (UInt32)@in, (int)outX, (int)outY, (int)outZ, (int)outW);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glWriteMaskEXT(UInt32 res, UInt32 @in, int outX, int outY, int outZ, int outW)
+        {
+            Delegates.glWriteMaskEXT((UInt32)res, (UInt32)@in, (int)outX, (int)outY, (int)outZ, (int)outW);
+        }
+
+        public static 
+        void glWriteMaskEXT(Int32 res, Int32 @in, int outX, int outY, int outZ, int outW)
+        {
+            Delegates.glWriteMaskEXT((UInt32)res, (UInt32)@in, (int)outX, (int)outY, (int)outZ, (int)outW);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glInsertComponentEXT(UInt32 res, UInt32 src, UInt32 num)
+        {
+            Delegates.glInsertComponentEXT((UInt32)res, (UInt32)src, (UInt32)num);
+        }
+
+        public static 
+        void glInsertComponentEXT(Int32 res, Int32 src, Int32 num)
+        {
+            Delegates.glInsertComponentEXT((UInt32)res, (UInt32)src, (UInt32)num);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glExtractComponentEXT(UInt32 res, UInt32 src, UInt32 num)
+        {
+            Delegates.glExtractComponentEXT((UInt32)res, (UInt32)src, (UInt32)num);
+        }
+
+        public static 
+        void glExtractComponentEXT(Int32 res, Int32 src, Int32 num)
+        {
+            Delegates.glExtractComponentEXT((UInt32)res, (UInt32)src, (UInt32)num);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glGenSymbolsEXT(int datatype, int storagetype, int range, UInt32 components)
+        {
+            return Delegates.glGenSymbolsEXT((int)datatype, (int)storagetype, (int)range, (UInt32)components);
+        }
+
+        public static 
+        Int32 glGenSymbolsEXT(int datatype, int storagetype, int range, Int32 components)
+        {
+            return Delegates.glGenSymbolsEXT((int)datatype, (int)storagetype, (int)range, (UInt32)components);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSetInvariantEXT(UInt32 id, int type, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glSetInvariantEXT((UInt32)id, (int)type, (IntPtr)addr);
+            }
+        }
+
+        public static 
+        void glSetInvariantEXT(Int32 id, int type, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glSetInvariantEXT((UInt32)id, (int)type, (IntPtr)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSetInvariantEXT(UInt32 id, int type, [In, Out] object addr)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle addr_ptr = System.Runtime.InteropServices.GCHandle.Alloc(addr, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glSetInvariantEXT((UInt32)id, (int)type, (IntPtr)addr_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    addr_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glSetInvariantEXT(Int32 id, int type, [In, Out] object addr)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle addr_ptr = System.Runtime.InteropServices.GCHandle.Alloc(addr, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glSetInvariantEXT((UInt32)id, (int)type, (IntPtr)addr_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    addr_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSetLocalConstantEXT(UInt32 id, int type, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glSetLocalConstantEXT((UInt32)id, (int)type, (IntPtr)addr);
+            }
+        }
+
+        public static 
+        void glSetLocalConstantEXT(Int32 id, int type, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glSetLocalConstantEXT((UInt32)id, (int)type, (IntPtr)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSetLocalConstantEXT(UInt32 id, int type, [In, Out] object addr)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle addr_ptr = System.Runtime.InteropServices.GCHandle.Alloc(addr, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glSetLocalConstantEXT((UInt32)id, (int)type, (IntPtr)addr_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    addr_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glSetLocalConstantEXT(Int32 id, int type, [In, Out] object addr)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle addr_ptr = System.Runtime.InteropServices.GCHandle.Alloc(addr, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glSetLocalConstantEXT((UInt32)id, (int)type, (IntPtr)addr_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    addr_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantbvEXT(UInt32 id, SByte[] addr)
+        {
+            unsafe
+            {
+                fixed (SByte* addr_ptr = addr)
+                {
+                    Delegates.glVariantbvEXT((UInt32)id, (SByte*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantbvEXT(Int32 id, Byte[] addr)
+        {
+            unsafe
+            {
+                fixed (Byte* addr_ptr = addr)
+                {
+                    Delegates.glVariantbvEXT((UInt32)id, (SByte*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantbvEXT(UInt32 id, ref SByte addr)
+        {
+            unsafe
+            {
+                fixed (SByte* addr_ptr = &addr)
+                {
+                    Delegates.glVariantbvEXT((UInt32)id, (SByte*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantbvEXT(Int32 id, ref Byte addr)
+        {
+            unsafe
+            {
+                fixed (Byte* addr_ptr = &addr)
+                {
+                    Delegates.glVariantbvEXT((UInt32)id, (SByte*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantbvEXT(UInt32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantbvEXT((UInt32)id, (SByte*)addr);
+            }
+        }
+
+        public static 
+        void glVariantbvEXT(Int32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantbvEXT((UInt32)id, (SByte*)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantsvEXT(UInt32 id, Int16[] addr)
+        {
+            unsafe
+            {
+                fixed (Int16* addr_ptr = addr)
+                {
+                    Delegates.glVariantsvEXT((UInt32)id, (Int16*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantsvEXT(Int32 id, Int16[] addr)
+        {
+            unsafe
+            {
+                fixed (Int16* addr_ptr = addr)
+                {
+                    Delegates.glVariantsvEXT((UInt32)id, (Int16*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantsvEXT(UInt32 id, ref Int16 addr)
+        {
+            unsafe
+            {
+                fixed (Int16* addr_ptr = &addr)
+                {
+                    Delegates.glVariantsvEXT((UInt32)id, (Int16*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantsvEXT(Int32 id, ref Int16 addr)
+        {
+            unsafe
+            {
+                fixed (Int16* addr_ptr = &addr)
+                {
+                    Delegates.glVariantsvEXT((UInt32)id, (Int16*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantsvEXT(UInt32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantsvEXT((UInt32)id, (Int16*)addr);
+            }
+        }
+
+        public static 
+        void glVariantsvEXT(Int32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantsvEXT((UInt32)id, (Int16*)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantivEXT(UInt32 id, Int32[] addr)
+        {
+            unsafe
+            {
+                fixed (Int32* addr_ptr = addr)
+                {
+                    Delegates.glVariantivEXT((UInt32)id, (Int32*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantivEXT(Int32 id, Int32[] addr)
+        {
+            unsafe
+            {
+                fixed (Int32* addr_ptr = addr)
+                {
+                    Delegates.glVariantivEXT((UInt32)id, (Int32*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantivEXT(UInt32 id, ref Int32 addr)
+        {
+            unsafe
+            {
+                fixed (Int32* addr_ptr = &addr)
+                {
+                    Delegates.glVariantivEXT((UInt32)id, (Int32*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantivEXT(Int32 id, ref Int32 addr)
+        {
+            unsafe
+            {
+                fixed (Int32* addr_ptr = &addr)
+                {
+                    Delegates.glVariantivEXT((UInt32)id, (Int32*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantivEXT(UInt32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantivEXT((UInt32)id, (Int32*)addr);
+            }
+        }
+
+        public static 
+        void glVariantivEXT(Int32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantivEXT((UInt32)id, (Int32*)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantfvEXT(UInt32 id, Single[] addr)
+        {
+            unsafe
+            {
+                fixed (Single* addr_ptr = addr)
+                {
+                    Delegates.glVariantfvEXT((UInt32)id, (Single*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantfvEXT(Int32 id, Single[] addr)
+        {
+            unsafe
+            {
+                fixed (Single* addr_ptr = addr)
+                {
+                    Delegates.glVariantfvEXT((UInt32)id, (Single*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantfvEXT(UInt32 id, ref Single addr)
+        {
+            unsafe
+            {
+                fixed (Single* addr_ptr = &addr)
+                {
+                    Delegates.glVariantfvEXT((UInt32)id, (Single*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantfvEXT(Int32 id, ref Single addr)
+        {
+            unsafe
+            {
+                fixed (Single* addr_ptr = &addr)
+                {
+                    Delegates.glVariantfvEXT((UInt32)id, (Single*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantfvEXT(UInt32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantfvEXT((UInt32)id, (Single*)addr);
+            }
+        }
+
+        public static 
+        void glVariantfvEXT(Int32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantfvEXT((UInt32)id, (Single*)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantdvEXT(UInt32 id, Double[] addr)
+        {
+            unsafe
+            {
+                fixed (Double* addr_ptr = addr)
+                {
+                    Delegates.glVariantdvEXT((UInt32)id, (Double*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantdvEXT(Int32 id, Double[] addr)
+        {
+            unsafe
+            {
+                fixed (Double* addr_ptr = addr)
+                {
+                    Delegates.glVariantdvEXT((UInt32)id, (Double*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantdvEXT(UInt32 id, ref Double addr)
+        {
+            unsafe
+            {
+                fixed (Double* addr_ptr = &addr)
+                {
+                    Delegates.glVariantdvEXT((UInt32)id, (Double*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantdvEXT(Int32 id, ref Double addr)
+        {
+            unsafe
+            {
+                fixed (Double* addr_ptr = &addr)
+                {
+                    Delegates.glVariantdvEXT((UInt32)id, (Double*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantdvEXT(UInt32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantdvEXT((UInt32)id, (Double*)addr);
+            }
+        }
+
+        public static 
+        void glVariantdvEXT(Int32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantdvEXT((UInt32)id, (Double*)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantubvEXT(UInt32 id, Byte[] addr)
+        {
+            unsafe
+            {
+                fixed (Byte* addr_ptr = addr)
+                {
+                    Delegates.glVariantubvEXT((UInt32)id, (Byte*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantubvEXT(Int32 id, Byte[] addr)
+        {
+            unsafe
+            {
+                fixed (Byte* addr_ptr = addr)
+                {
+                    Delegates.glVariantubvEXT((UInt32)id, (Byte*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantubvEXT(UInt32 id, ref Byte addr)
+        {
+            unsafe
+            {
+                fixed (Byte* addr_ptr = &addr)
+                {
+                    Delegates.glVariantubvEXT((UInt32)id, (Byte*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantubvEXT(Int32 id, ref Byte addr)
+        {
+            unsafe
+            {
+                fixed (Byte* addr_ptr = &addr)
+                {
+                    Delegates.glVariantubvEXT((UInt32)id, (Byte*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantubvEXT(UInt32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantubvEXT((UInt32)id, (Byte*)addr);
+            }
+        }
+
+        public static 
+        void glVariantubvEXT(Int32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantubvEXT((UInt32)id, (Byte*)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantusvEXT(UInt32 id, UInt16[] addr)
+        {
+            unsafe
+            {
+                fixed (UInt16* addr_ptr = addr)
+                {
+                    Delegates.glVariantusvEXT((UInt32)id, (UInt16*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantusvEXT(Int32 id, Int16[] addr)
+        {
+            unsafe
+            {
+                fixed (Int16* addr_ptr = addr)
+                {
+                    Delegates.glVariantusvEXT((UInt32)id, (UInt16*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantusvEXT(UInt32 id, ref UInt16 addr)
+        {
+            unsafe
+            {
+                fixed (UInt16* addr_ptr = &addr)
+                {
+                    Delegates.glVariantusvEXT((UInt32)id, (UInt16*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantusvEXT(Int32 id, ref Int16 addr)
+        {
+            unsafe
+            {
+                fixed (Int16* addr_ptr = &addr)
+                {
+                    Delegates.glVariantusvEXT((UInt32)id, (UInt16*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantusvEXT(UInt32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantusvEXT((UInt32)id, (UInt16*)addr);
+            }
+        }
+
+        public static 
+        void glVariantusvEXT(Int32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantusvEXT((UInt32)id, (UInt16*)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantuivEXT(UInt32 id, UInt32[] addr)
+        {
+            unsafe
+            {
+                fixed (UInt32* addr_ptr = addr)
+                {
+                    Delegates.glVariantuivEXT((UInt32)id, (UInt32*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantuivEXT(Int32 id, Int32[] addr)
+        {
+            unsafe
+            {
+                fixed (Int32* addr_ptr = addr)
+                {
+                    Delegates.glVariantuivEXT((UInt32)id, (UInt32*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantuivEXT(UInt32 id, ref UInt32 addr)
+        {
+            unsafe
+            {
+                fixed (UInt32* addr_ptr = &addr)
+                {
+                    Delegates.glVariantuivEXT((UInt32)id, (UInt32*)addr_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVariantuivEXT(Int32 id, ref Int32 addr)
+        {
+            unsafe
+            {
+                fixed (Int32* addr_ptr = &addr)
+                {
+                    Delegates.glVariantuivEXT((UInt32)id, (UInt32*)addr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantuivEXT(UInt32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantuivEXT((UInt32)id, (UInt32*)addr);
+            }
+        }
+
+        public static 
+        void glVariantuivEXT(Int32 id, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantuivEXT((UInt32)id, (UInt32*)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantPointerEXT(UInt32 id, int type, UInt32 stride, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantPointerEXT((UInt32)id, (int)type, (UInt32)stride, (IntPtr)addr);
+            }
+        }
+
+        public static 
+        void glVariantPointerEXT(Int32 id, int type, Int32 stride, IntPtr addr)
+        {
+            unsafe
+            {
+                Delegates.glVariantPointerEXT((UInt32)id, (int)type, (UInt32)stride, (IntPtr)addr);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantPointerEXT(UInt32 id, int type, UInt32 stride, [In, Out] object addr)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle addr_ptr = System.Runtime.InteropServices.GCHandle.Alloc(addr, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVariantPointerEXT((UInt32)id, (int)type, (UInt32)stride, (IntPtr)addr_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    addr_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glVariantPointerEXT(Int32 id, int type, Int32 stride, [In, Out] object addr)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle addr_ptr = System.Runtime.InteropServices.GCHandle.Alloc(addr, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVariantPointerEXT((UInt32)id, (int)type, (UInt32)stride, (IntPtr)addr_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    addr_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glEnableVariantClientStateEXT(UInt32 id)
+        {
+            Delegates.glEnableVariantClientStateEXT((UInt32)id);
+        }
+
+        public static 
+        void glEnableVariantClientStateEXT(Int32 id)
+        {
+            Delegates.glEnableVariantClientStateEXT((UInt32)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDisableVariantClientStateEXT(UInt32 id)
+        {
+            Delegates.glDisableVariantClientStateEXT((UInt32)id);
+        }
+
+        public static 
+        void glDisableVariantClientStateEXT(Int32 id)
+        {
+            Delegates.glDisableVariantClientStateEXT((UInt32)id);
+        }
+
+        public static 
+        Int32 glBindLightParameterEXT(int light, int value)
+        {
+            return Delegates.glBindLightParameterEXT((int)light, (int)value);
+        }
+
+        public static 
+        Int32 glBindMaterialParameterEXT(int face, int value)
+        {
+            return Delegates.glBindMaterialParameterEXT((int)face, (int)value);
+        }
+
+        public static 
+        Int32 glBindTexGenParameterEXT(int unit, int coord, int value)
+        {
+            return Delegates.glBindTexGenParameterEXT((int)unit, (int)coord, (int)value);
+        }
+
+        public static 
+        Int32 glBindTextureUnitParameterEXT(int unit, int value)
+        {
+            return Delegates.glBindTextureUnitParameterEXT((int)unit, (int)value);
+        }
+
+        public static 
+        Int32 glBindParameterEXT(int value)
+        {
+            return Delegates.glBindParameterEXT((int)value);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsVariantEnabledEXT(UInt32 id, int cap)
+        {
+            return Delegates.glIsVariantEnabledEXT((UInt32)id, (int)cap);
+        }
+
+        public static 
+        bool glIsVariantEnabledEXT(Int32 id, int cap)
+        {
+            return Delegates.glIsVariantEnabledEXT((UInt32)id, (int)cap);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantBooleanvEXT(UInt32 id, int value, [Out] bool[] data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = data)
+                {
+                    Delegates.glGetVariantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantBooleanvEXT(Int32 id, int value, [Out] bool[] data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = data)
+                {
+                    Delegates.glGetVariantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantBooleanvEXT(UInt32 id, int value, [Out] out bool data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = &data)
+                {
+                    Delegates.glGetVariantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantBooleanvEXT(Int32 id, int value, [Out] out bool data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = &data)
+                {
+                    Delegates.glGetVariantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantBooleanvEXT(UInt32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantBooleanvEXT((UInt32)id, (int)value, (bool*)data);
+            }
+        }
+
+        public static 
+        void glGetVariantBooleanvEXT(Int32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantBooleanvEXT((UInt32)id, (int)value, (bool*)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantIntegervEXT(UInt32 id, int value, [Out] Int32[] data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = data)
+                {
+                    Delegates.glGetVariantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantIntegervEXT(Int32 id, int value, [Out] Int32[] data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = data)
+                {
+                    Delegates.glGetVariantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantIntegervEXT(UInt32 id, int value, [Out] out Int32 data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = &data)
+                {
+                    Delegates.glGetVariantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantIntegervEXT(Int32 id, int value, [Out] out Int32 data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = &data)
+                {
+                    Delegates.glGetVariantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantIntegervEXT(UInt32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantIntegervEXT((UInt32)id, (int)value, (Int32*)data);
+            }
+        }
+
+        public static 
+        void glGetVariantIntegervEXT(Int32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantIntegervEXT((UInt32)id, (int)value, (Int32*)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantFloatvEXT(UInt32 id, int value, [Out] Single[] data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = data)
+                {
+                    Delegates.glGetVariantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantFloatvEXT(Int32 id, int value, [Out] Single[] data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = data)
+                {
+                    Delegates.glGetVariantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantFloatvEXT(UInt32 id, int value, [Out] out Single data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = &data)
+                {
+                    Delegates.glGetVariantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantFloatvEXT(Int32 id, int value, [Out] out Single data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = &data)
+                {
+                    Delegates.glGetVariantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantFloatvEXT(UInt32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantFloatvEXT((UInt32)id, (int)value, (Single*)data);
+            }
+        }
+
+        public static 
+        void glGetVariantFloatvEXT(Int32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantFloatvEXT((UInt32)id, (int)value, (Single*)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantPointervEXT(UInt32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantPointervEXT((UInt32)id, (int)value, (IntPtr)data);
+            }
+        }
+
+        public static 
+        void glGetVariantPointervEXT(Int32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantPointervEXT((UInt32)id, (int)value, (IntPtr)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantPointervEXT(UInt32 id, int value, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetVariantPointervEXT((UInt32)id, (int)value, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantPointervEXT(Int32 id, int value, [In, Out] object data)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle data_ptr = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetVariantPointervEXT((UInt32)id, (int)value, (IntPtr)data_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    data_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInvariantBooleanvEXT(UInt32 id, int value, [Out] bool[] data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = data)
+                {
+                    Delegates.glGetInvariantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetInvariantBooleanvEXT(Int32 id, int value, [Out] bool[] data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = data)
+                {
+                    Delegates.glGetInvariantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInvariantBooleanvEXT(UInt32 id, int value, [Out] out bool data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = &data)
+                {
+                    Delegates.glGetInvariantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetInvariantBooleanvEXT(Int32 id, int value, [Out] out bool data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = &data)
+                {
+                    Delegates.glGetInvariantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInvariantBooleanvEXT(UInt32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetInvariantBooleanvEXT((UInt32)id, (int)value, (bool*)data);
+            }
+        }
+
+        public static 
+        void glGetInvariantBooleanvEXT(Int32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetInvariantBooleanvEXT((UInt32)id, (int)value, (bool*)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInvariantIntegervEXT(UInt32 id, int value, [Out] Int32[] data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = data)
+                {
+                    Delegates.glGetInvariantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetInvariantIntegervEXT(Int32 id, int value, [Out] Int32[] data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = data)
+                {
+                    Delegates.glGetInvariantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInvariantIntegervEXT(UInt32 id, int value, [Out] out Int32 data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = &data)
+                {
+                    Delegates.glGetInvariantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetInvariantIntegervEXT(Int32 id, int value, [Out] out Int32 data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = &data)
+                {
+                    Delegates.glGetInvariantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInvariantIntegervEXT(UInt32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetInvariantIntegervEXT((UInt32)id, (int)value, (Int32*)data);
+            }
+        }
+
+        public static 
+        void glGetInvariantIntegervEXT(Int32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetInvariantIntegervEXT((UInt32)id, (int)value, (Int32*)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInvariantFloatvEXT(UInt32 id, int value, [Out] Single[] data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = data)
+                {
+                    Delegates.glGetInvariantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetInvariantFloatvEXT(Int32 id, int value, [Out] Single[] data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = data)
+                {
+                    Delegates.glGetInvariantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInvariantFloatvEXT(UInt32 id, int value, [Out] out Single data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = &data)
+                {
+                    Delegates.glGetInvariantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetInvariantFloatvEXT(Int32 id, int value, [Out] out Single data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = &data)
+                {
+                    Delegates.glGetInvariantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetInvariantFloatvEXT(UInt32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetInvariantFloatvEXT((UInt32)id, (int)value, (Single*)data);
+            }
+        }
+
+        public static 
+        void glGetInvariantFloatvEXT(Int32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetInvariantFloatvEXT((UInt32)id, (int)value, (Single*)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetLocalConstantBooleanvEXT(UInt32 id, int value, [Out] bool[] data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = data)
+                {
+                    Delegates.glGetLocalConstantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetLocalConstantBooleanvEXT(Int32 id, int value, [Out] bool[] data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = data)
+                {
+                    Delegates.glGetLocalConstantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetLocalConstantBooleanvEXT(UInt32 id, int value, [Out] out bool data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = &data)
+                {
+                    Delegates.glGetLocalConstantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetLocalConstantBooleanvEXT(Int32 id, int value, [Out] out bool data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = &data)
+                {
+                    Delegates.glGetLocalConstantBooleanvEXT((UInt32)id, (int)value, (bool*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetLocalConstantBooleanvEXT(UInt32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetLocalConstantBooleanvEXT((UInt32)id, (int)value, (bool*)data);
+            }
+        }
+
+        public static 
+        void glGetLocalConstantBooleanvEXT(Int32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetLocalConstantBooleanvEXT((UInt32)id, (int)value, (bool*)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetLocalConstantIntegervEXT(UInt32 id, int value, [Out] Int32[] data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = data)
+                {
+                    Delegates.glGetLocalConstantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetLocalConstantIntegervEXT(Int32 id, int value, [Out] Int32[] data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = data)
+                {
+                    Delegates.glGetLocalConstantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetLocalConstantIntegervEXT(UInt32 id, int value, [Out] out Int32 data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = &data)
+                {
+                    Delegates.glGetLocalConstantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetLocalConstantIntegervEXT(Int32 id, int value, [Out] out Int32 data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = &data)
+                {
+                    Delegates.glGetLocalConstantIntegervEXT((UInt32)id, (int)value, (Int32*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetLocalConstantIntegervEXT(UInt32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetLocalConstantIntegervEXT((UInt32)id, (int)value, (Int32*)data);
+            }
+        }
+
+        public static 
+        void glGetLocalConstantIntegervEXT(Int32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetLocalConstantIntegervEXT((UInt32)id, (int)value, (Int32*)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetLocalConstantFloatvEXT(UInt32 id, int value, [Out] Single[] data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = data)
+                {
+                    Delegates.glGetLocalConstantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetLocalConstantFloatvEXT(Int32 id, int value, [Out] Single[] data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = data)
+                {
+                    Delegates.glGetLocalConstantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetLocalConstantFloatvEXT(UInt32 id, int value, [Out] out Single data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = &data)
+                {
+                    Delegates.glGetLocalConstantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetLocalConstantFloatvEXT(Int32 id, int value, [Out] out Single data)
+        {
+            unsafe
+            {
+                fixed (Single* data_ptr = &data)
+                {
+                    Delegates.glGetLocalConstantFloatvEXT((UInt32)id, (int)value, (Single*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetLocalConstantFloatvEXT(UInt32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetLocalConstantFloatvEXT((UInt32)id, (int)value, (Single*)data);
+            }
+        }
+
+        public static 
+        void glGetLocalConstantFloatvEXT(Int32 id, int value, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetLocalConstantFloatvEXT((UInt32)id, (int)value, (Single*)data);
+            }
+        }
+
+        public static 
+        void glActiveStencilFaceEXT(int face)
+        {
+            Delegates.glActiveStencilFaceEXT((int)face);
+        }
+
+        public static 
+        void glDepthBoundsEXT(Double zmin, Double zmax)
+        {
+            Delegates.glDepthBoundsEXT((Double)zmin, (Double)zmax);
+        }
+
+        public static 
+        void glBlendEquationSeparateEXT(int modeRGB, int modeAlpha)
+        {
+            Delegates.glBlendEquationSeparateEXT((int)modeRGB, (int)modeAlpha);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsRenderbufferEXT(UInt32 renderbuffer)
+        {
+            return Delegates.glIsRenderbufferEXT((UInt32)renderbuffer);
+        }
+
+        public static 
+        bool glIsRenderbufferEXT(Int32 renderbuffer)
+        {
+            return Delegates.glIsRenderbufferEXT((UInt32)renderbuffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindRenderbufferEXT(int target, UInt32 renderbuffer)
+        {
+            Delegates.glBindRenderbufferEXT((int)target, (UInt32)renderbuffer);
+        }
+
+        public static 
+        void glBindRenderbufferEXT(int target, Int32 renderbuffer)
+        {
+            Delegates.glBindRenderbufferEXT((int)target, (UInt32)renderbuffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteRenderbuffersEXT(Int32 n, UInt32[] renderbuffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* renderbuffers_ptr = renderbuffers)
+                {
+                    Delegates.glDeleteRenderbuffersEXT((Int32)n, (UInt32*)renderbuffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteRenderbuffersEXT(Int32 n, Int32[] renderbuffers)
+        {
+            unsafe
+            {
+                fixed (Int32* renderbuffers_ptr = renderbuffers)
+                {
+                    Delegates.glDeleteRenderbuffersEXT((Int32)n, (UInt32*)renderbuffers_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteRenderbuffersEXT(Int32 n, ref UInt32 renderbuffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* renderbuffers_ptr = &renderbuffers)
+                {
+                    Delegates.glDeleteRenderbuffersEXT((Int32)n, (UInt32*)renderbuffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteRenderbuffersEXT(Int32 n, ref Int32 renderbuffers)
+        {
+            unsafe
+            {
+                fixed (Int32* renderbuffers_ptr = &renderbuffers)
+                {
+                    Delegates.glDeleteRenderbuffersEXT((Int32)n, (UInt32*)renderbuffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteRenderbuffersEXT(Int32 n, IntPtr renderbuffers)
+        {
+            unsafe
+            {
+                Delegates.glDeleteRenderbuffersEXT((Int32)n, (UInt32*)renderbuffers);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenRenderbuffersEXT(Int32 n, [Out] UInt32[] renderbuffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* renderbuffers_ptr = renderbuffers)
+                {
+                    Delegates.glGenRenderbuffersEXT((Int32)n, (UInt32*)renderbuffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenRenderbuffersEXT(Int32 n, [Out] Int32[] renderbuffers)
+        {
+            unsafe
+            {
+                fixed (Int32* renderbuffers_ptr = renderbuffers)
+                {
+                    Delegates.glGenRenderbuffersEXT((Int32)n, (UInt32*)renderbuffers_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenRenderbuffersEXT(Int32 n, [Out] out UInt32 renderbuffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* renderbuffers_ptr = &renderbuffers)
+                {
+                    Delegates.glGenRenderbuffersEXT((Int32)n, (UInt32*)renderbuffers_ptr);
+                    renderbuffers = *renderbuffers_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenRenderbuffersEXT(Int32 n, [Out] out Int32 renderbuffers)
+        {
+            unsafe
+            {
+                fixed (Int32* renderbuffers_ptr = &renderbuffers)
+                {
+                    Delegates.glGenRenderbuffersEXT((Int32)n, (UInt32*)renderbuffers_ptr);
+                    renderbuffers = *renderbuffers_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenRenderbuffersEXT(Int32 n, [Out] IntPtr renderbuffers)
+        {
+            unsafe
+            {
+                Delegates.glGenRenderbuffersEXT((Int32)n, (UInt32*)renderbuffers);
+            }
+        }
+
+        public static 
+        void glRenderbufferStorageEXT(int target, int internalformat, Int32 width, Int32 height)
+        {
+            Delegates.glRenderbufferStorageEXT((int)target, (int)internalformat, (Int32)width, (Int32)height);
+        }
+
+        public static 
+        void glGetRenderbufferParameterivEXT(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetRenderbufferParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetRenderbufferParameterivEXT(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetRenderbufferParameterivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetRenderbufferParameterivEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetRenderbufferParameterivEXT((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsFramebufferEXT(UInt32 framebuffer)
+        {
+            return Delegates.glIsFramebufferEXT((UInt32)framebuffer);
+        }
+
+        public static 
+        bool glIsFramebufferEXT(Int32 framebuffer)
+        {
+            return Delegates.glIsFramebufferEXT((UInt32)framebuffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindFramebufferEXT(int target, UInt32 framebuffer)
+        {
+            Delegates.glBindFramebufferEXT((int)target, (UInt32)framebuffer);
+        }
+
+        public static 
+        void glBindFramebufferEXT(int target, Int32 framebuffer)
+        {
+            Delegates.glBindFramebufferEXT((int)target, (UInt32)framebuffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteFramebuffersEXT(Int32 n, UInt32[] framebuffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* framebuffers_ptr = framebuffers)
+                {
+                    Delegates.glDeleteFramebuffersEXT((Int32)n, (UInt32*)framebuffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteFramebuffersEXT(Int32 n, Int32[] framebuffers)
+        {
+            unsafe
+            {
+                fixed (Int32* framebuffers_ptr = framebuffers)
+                {
+                    Delegates.glDeleteFramebuffersEXT((Int32)n, (UInt32*)framebuffers_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteFramebuffersEXT(Int32 n, ref UInt32 framebuffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* framebuffers_ptr = &framebuffers)
+                {
+                    Delegates.glDeleteFramebuffersEXT((Int32)n, (UInt32*)framebuffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteFramebuffersEXT(Int32 n, ref Int32 framebuffers)
+        {
+            unsafe
+            {
+                fixed (Int32* framebuffers_ptr = &framebuffers)
+                {
+                    Delegates.glDeleteFramebuffersEXT((Int32)n, (UInt32*)framebuffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteFramebuffersEXT(Int32 n, IntPtr framebuffers)
+        {
+            unsafe
+            {
+                Delegates.glDeleteFramebuffersEXT((Int32)n, (UInt32*)framebuffers);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenFramebuffersEXT(Int32 n, [Out] UInt32[] framebuffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* framebuffers_ptr = framebuffers)
+                {
+                    Delegates.glGenFramebuffersEXT((Int32)n, (UInt32*)framebuffers_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenFramebuffersEXT(Int32 n, [Out] Int32[] framebuffers)
+        {
+            unsafe
+            {
+                fixed (Int32* framebuffers_ptr = framebuffers)
+                {
+                    Delegates.glGenFramebuffersEXT((Int32)n, (UInt32*)framebuffers_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenFramebuffersEXT(Int32 n, [Out] out UInt32 framebuffers)
+        {
+            unsafe
+            {
+                fixed (UInt32* framebuffers_ptr = &framebuffers)
+                {
+                    Delegates.glGenFramebuffersEXT((Int32)n, (UInt32*)framebuffers_ptr);
+                    framebuffers = *framebuffers_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenFramebuffersEXT(Int32 n, [Out] out Int32 framebuffers)
+        {
+            unsafe
+            {
+                fixed (Int32* framebuffers_ptr = &framebuffers)
+                {
+                    Delegates.glGenFramebuffersEXT((Int32)n, (UInt32*)framebuffers_ptr);
+                    framebuffers = *framebuffers_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenFramebuffersEXT(Int32 n, [Out] IntPtr framebuffers)
+        {
+            unsafe
+            {
+                Delegates.glGenFramebuffersEXT((Int32)n, (UInt32*)framebuffers);
+            }
+        }
+
+        public static 
+        int glCheckFramebufferStatusEXT(int target)
+        {
+            return Delegates.glCheckFramebufferStatusEXT((int)target);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFramebufferTexture1DEXT(int target, int attachment, int textarget, UInt32 texture, Int32 level)
+        {
+            Delegates.glFramebufferTexture1DEXT((int)target, (int)attachment, (int)textarget, (UInt32)texture, (Int32)level);
+        }
+
+        public static 
+        void glFramebufferTexture1DEXT(int target, int attachment, int textarget, Int32 texture, Int32 level)
+        {
+            Delegates.glFramebufferTexture1DEXT((int)target, (int)attachment, (int)textarget, (UInt32)texture, (Int32)level);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFramebufferTexture2DEXT(int target, int attachment, int textarget, UInt32 texture, Int32 level)
+        {
+            Delegates.glFramebufferTexture2DEXT((int)target, (int)attachment, (int)textarget, (UInt32)texture, (Int32)level);
+        }
+
+        public static 
+        void glFramebufferTexture2DEXT(int target, int attachment, int textarget, Int32 texture, Int32 level)
+        {
+            Delegates.glFramebufferTexture2DEXT((int)target, (int)attachment, (int)textarget, (UInt32)texture, (Int32)level);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFramebufferTexture3DEXT(int target, int attachment, int textarget, UInt32 texture, Int32 level, Int32 zoffset)
+        {
+            Delegates.glFramebufferTexture3DEXT((int)target, (int)attachment, (int)textarget, (UInt32)texture, (Int32)level, (Int32)zoffset);
+        }
+
+        public static 
+        void glFramebufferTexture3DEXT(int target, int attachment, int textarget, Int32 texture, Int32 level, Int32 zoffset)
+        {
+            Delegates.glFramebufferTexture3DEXT((int)target, (int)attachment, (int)textarget, (UInt32)texture, (Int32)level, (Int32)zoffset);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFramebufferRenderbufferEXT(int target, int attachment, int renderbuffertarget, UInt32 renderbuffer)
+        {
+            Delegates.glFramebufferRenderbufferEXT((int)target, (int)attachment, (int)renderbuffertarget, (UInt32)renderbuffer);
+        }
+
+        public static 
+        void glFramebufferRenderbufferEXT(int target, int attachment, int renderbuffertarget, Int32 renderbuffer)
+        {
+            Delegates.glFramebufferRenderbufferEXT((int)target, (int)attachment, (int)renderbuffertarget, (UInt32)renderbuffer);
+        }
+
+        public static 
+        void glGetFramebufferAttachmentParameterivEXT(int target, int attachment, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetFramebufferAttachmentParameterivEXT((int)target, (int)attachment, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetFramebufferAttachmentParameterivEXT(int target, int attachment, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetFramebufferAttachmentParameterivEXT((int)target, (int)attachment, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetFramebufferAttachmentParameterivEXT(int target, int attachment, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetFramebufferAttachmentParameterivEXT((int)target, (int)attachment, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGenerateMipmapEXT(int target)
+        {
+            Delegates.glGenerateMipmapEXT((int)target);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glStencilClearTagEXT(Int32 stencilTagBits, UInt32 stencilClearTag)
+        {
+            Delegates.glStencilClearTagEXT((Int32)stencilTagBits, (UInt32)stencilClearTag);
+        }
+
+        public static 
+        void glStencilClearTagEXT(Int32 stencilTagBits, Int32 stencilClearTag)
+        {
+            Delegates.glStencilClearTagEXT((Int32)stencilTagBits, (UInt32)stencilClearTag);
+        }
+
+        public static 
+        void glBlitFramebufferEXT(Int32 srcX0, Int32 srcY0, Int32 srcX1, Int32 srcY1, Int32 dstX0, Int32 dstY0, Int32 dstX1, Int32 dstY1, int mask, int filter)
+        {
+            Delegates.glBlitFramebufferEXT((Int32)srcX0, (Int32)srcY0, (Int32)srcX1, (Int32)srcY1, (Int32)dstX0, (Int32)dstY0, (Int32)dstX1, (Int32)dstY1, (int)mask, (int)filter);
+        }
+
+        public static 
+        void glRenderbufferStorageMultisampleEXT(int target, Int32 samples, int internalformat, Int32 width, Int32 height)
+        {
+            Delegates.glRenderbufferStorageMultisampleEXT((int)target, (Int32)samples, (int)internalformat, (Int32)width, (Int32)height);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjecti64vEXT(UInt32 id, int pname, [Out] Int64[] @params)
+        {
+            unsafe
+            {
+                fixed (Int64* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjecti64vEXT((UInt32)id, (int)pname, (Int64*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjecti64vEXT(Int32 id, int pname, [Out] Int64[] @params)
+        {
+            unsafe
+            {
+                fixed (Int64* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjecti64vEXT((UInt32)id, (int)pname, (Int64*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjecti64vEXT(UInt32 id, int pname, [Out] out Int64 @params)
+        {
+            unsafe
+            {
+                fixed (Int64* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjecti64vEXT((UInt32)id, (int)pname, (Int64*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjecti64vEXT(Int32 id, int pname, [Out] out Int64 @params)
+        {
+            unsafe
+            {
+                fixed (Int64* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjecti64vEXT((UInt32)id, (int)pname, (Int64*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjecti64vEXT(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjecti64vEXT((UInt32)id, (int)pname, (Int64*)@params);
+            }
+        }
+
+        public static 
+        void glGetQueryObjecti64vEXT(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjecti64vEXT((UInt32)id, (int)pname, (Int64*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectui64vEXT(UInt32 id, int pname, [Out] UInt64[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt64* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjectui64vEXT((UInt32)id, (int)pname, (UInt64*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjectui64vEXT(Int32 id, int pname, [Out] Int64[] @params)
+        {
+            unsafe
+            {
+                fixed (Int64* @params_ptr = @params)
+                {
+                    Delegates.glGetQueryObjectui64vEXT((UInt32)id, (int)pname, (UInt64*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectui64vEXT(UInt32 id, int pname, [Out] out UInt64 @params)
+        {
+            unsafe
+            {
+                fixed (UInt64* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjectui64vEXT((UInt32)id, (int)pname, (UInt64*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetQueryObjectui64vEXT(Int32 id, int pname, [Out] out Int64 @params)
+        {
+            unsafe
+            {
+                fixed (Int64* @params_ptr = &@params)
+                {
+                    Delegates.glGetQueryObjectui64vEXT((UInt32)id, (int)pname, (UInt64*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetQueryObjectui64vEXT(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjectui64vEXT((UInt32)id, (int)pname, (UInt64*)@params);
+            }
+        }
+
+        public static 
+        void glGetQueryObjectui64vEXT(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetQueryObjectui64vEXT((UInt32)id, (int)pname, (UInt64*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameters4fvEXT(int target, UInt32 index, Int32 count, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParameters4fvEXT(int target, Int32 index, Int32 count, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameters4fvEXT(int target, UInt32 index, Int32 count, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParameters4fvEXT(int target, Int32 index, Int32 count, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameters4fvEXT(int target, UInt32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glProgramEnvParameters4fvEXT(int target, Int32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameters4fvEXT(int target, UInt32 index, Int32 count, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParameters4fvEXT(int target, Int32 index, Int32 count, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameters4fvEXT(int target, UInt32 index, Int32 count, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParameters4fvEXT(int target, Int32 index, Int32 count, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameters4fvEXT(int target, UInt32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glProgramLocalParameters4fvEXT(int target, Int32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParameters4fvEXT((int)target, (UInt32)index, (Int32)count, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFramebufferTextureEXT(int target, int attachment, UInt32 texture, Int32 level)
+        {
+            Delegates.glFramebufferTextureEXT((int)target, (int)attachment, (UInt32)texture, (Int32)level);
+        }
+
+        public static 
+        void glFramebufferTextureEXT(int target, int attachment, Int32 texture, Int32 level)
+        {
+            Delegates.glFramebufferTextureEXT((int)target, (int)attachment, (UInt32)texture, (Int32)level);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFramebufferTextureLayerEXT(int target, int attachment, UInt32 texture, Int32 level, Int32 layer)
+        {
+            Delegates.glFramebufferTextureLayerEXT((int)target, (int)attachment, (UInt32)texture, (Int32)level, (Int32)layer);
+        }
+
+        public static 
+        void glFramebufferTextureLayerEXT(int target, int attachment, Int32 texture, Int32 level, Int32 layer)
+        {
+            Delegates.glFramebufferTextureLayerEXT((int)target, (int)attachment, (UInt32)texture, (Int32)level, (Int32)layer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFramebufferTextureFaceEXT(int target, int attachment, UInt32 texture, Int32 level, int face)
+        {
+            Delegates.glFramebufferTextureFaceEXT((int)target, (int)attachment, (UInt32)texture, (Int32)level, (int)face);
+        }
+
+        public static 
+        void glFramebufferTextureFaceEXT(int target, int attachment, Int32 texture, Int32 level, int face)
+        {
+            Delegates.glFramebufferTextureFaceEXT((int)target, (int)attachment, (UInt32)texture, (Int32)level, (int)face);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameteriEXT(UInt32 program, int pname, Int32 value)
+        {
+            Delegates.glProgramParameteriEXT((UInt32)program, (int)pname, (Int32)value);
+        }
+
+        public static 
+        void glProgramParameteriEXT(Int32 program, int pname, Int32 value)
+        {
+            Delegates.glProgramParameteriEXT((UInt32)program, (int)pname, (Int32)value);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI1iEXT(UInt32 index, Int32 x)
+        {
+            Delegates.glVertexAttribI1iEXT((UInt32)index, (Int32)x);
+        }
+
+        public static 
+        void glVertexAttribI1iEXT(Int32 index, Int32 x)
+        {
+            Delegates.glVertexAttribI1iEXT((UInt32)index, (Int32)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI2iEXT(UInt32 index, Int32 x, Int32 y)
+        {
+            Delegates.glVertexAttribI2iEXT((UInt32)index, (Int32)x, (Int32)y);
+        }
+
+        public static 
+        void glVertexAttribI2iEXT(Int32 index, Int32 x, Int32 y)
+        {
+            Delegates.glVertexAttribI2iEXT((UInt32)index, (Int32)x, (Int32)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI3iEXT(UInt32 index, Int32 x, Int32 y, Int32 z)
+        {
+            Delegates.glVertexAttribI3iEXT((UInt32)index, (Int32)x, (Int32)y, (Int32)z);
+        }
+
+        public static 
+        void glVertexAttribI3iEXT(Int32 index, Int32 x, Int32 y, Int32 z)
+        {
+            Delegates.glVertexAttribI3iEXT((UInt32)index, (Int32)x, (Int32)y, (Int32)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4iEXT(UInt32 index, Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glVertexAttribI4iEXT((UInt32)index, (Int32)x, (Int32)y, (Int32)z, (Int32)w);
+        }
+
+        public static 
+        void glVertexAttribI4iEXT(Int32 index, Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glVertexAttribI4iEXT((UInt32)index, (Int32)x, (Int32)y, (Int32)z, (Int32)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI1uiEXT(UInt32 index, UInt32 x)
+        {
+            Delegates.glVertexAttribI1uiEXT((UInt32)index, (UInt32)x);
+        }
+
+        public static 
+        void glVertexAttribI1uiEXT(Int32 index, Int32 x)
+        {
+            Delegates.glVertexAttribI1uiEXT((UInt32)index, (UInt32)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI2uiEXT(UInt32 index, UInt32 x, UInt32 y)
+        {
+            Delegates.glVertexAttribI2uiEXT((UInt32)index, (UInt32)x, (UInt32)y);
+        }
+
+        public static 
+        void glVertexAttribI2uiEXT(Int32 index, Int32 x, Int32 y)
+        {
+            Delegates.glVertexAttribI2uiEXT((UInt32)index, (UInt32)x, (UInt32)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI3uiEXT(UInt32 index, UInt32 x, UInt32 y, UInt32 z)
+        {
+            Delegates.glVertexAttribI3uiEXT((UInt32)index, (UInt32)x, (UInt32)y, (UInt32)z);
+        }
+
+        public static 
+        void glVertexAttribI3uiEXT(Int32 index, Int32 x, Int32 y, Int32 z)
+        {
+            Delegates.glVertexAttribI3uiEXT((UInt32)index, (UInt32)x, (UInt32)y, (UInt32)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4uiEXT(UInt32 index, UInt32 x, UInt32 y, UInt32 z, UInt32 w)
+        {
+            Delegates.glVertexAttribI4uiEXT((UInt32)index, (UInt32)x, (UInt32)y, (UInt32)z, (UInt32)w);
+        }
+
+        public static 
+        void glVertexAttribI4uiEXT(Int32 index, Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glVertexAttribI4uiEXT((UInt32)index, (UInt32)x, (UInt32)y, (UInt32)z, (UInt32)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI1ivEXT(UInt32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI1ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI1ivEXT(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI1ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI1ivEXT(UInt32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI1ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI1ivEXT(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI1ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI1ivEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI1ivEXT((UInt32)index, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI1ivEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI1ivEXT((UInt32)index, (Int32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI2ivEXT(UInt32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI2ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI2ivEXT(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI2ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI2ivEXT(UInt32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI2ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI2ivEXT(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI2ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI2ivEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI2ivEXT((UInt32)index, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI2ivEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI2ivEXT((UInt32)index, (Int32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI3ivEXT(UInt32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI3ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI3ivEXT(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI3ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI3ivEXT(UInt32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI3ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI3ivEXT(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI3ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI3ivEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI3ivEXT((UInt32)index, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI3ivEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI3ivEXT((UInt32)index, (Int32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4ivEXT(UInt32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4ivEXT(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4ivEXT(UInt32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4ivEXT(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4ivEXT((UInt32)index, (Int32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4ivEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4ivEXT((UInt32)index, (Int32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI4ivEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4ivEXT((UInt32)index, (Int32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI1uivEXT(UInt32 index, UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI1uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI1uivEXT(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI1uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI1uivEXT(UInt32 index, ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI1uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI1uivEXT(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI1uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI1uivEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI1uivEXT((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI1uivEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI1uivEXT((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI2uivEXT(UInt32 index, UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI2uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI2uivEXT(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI2uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI2uivEXT(UInt32 index, ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI2uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI2uivEXT(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI2uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI2uivEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI2uivEXT((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI2uivEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI2uivEXT((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI3uivEXT(UInt32 index, UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI3uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI3uivEXT(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI3uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI3uivEXT(UInt32 index, ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI3uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI3uivEXT(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI3uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI3uivEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI3uivEXT((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI3uivEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI3uivEXT((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4uivEXT(UInt32 index, UInt32[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4uivEXT(Int32 index, Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4uivEXT(UInt32 index, ref UInt32 v)
+        {
+            unsafe
+            {
+                fixed (UInt32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4uivEXT(Int32 index, ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4uivEXT((UInt32)index, (UInt32*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4uivEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4uivEXT((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI4uivEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4uivEXT((UInt32)index, (UInt32*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4bvEXT(UInt32 index, SByte[] v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4bvEXT((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4bvEXT(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4bvEXT((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4bvEXT(UInt32 index, ref SByte v)
+        {
+            unsafe
+            {
+                fixed (SByte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4bvEXT((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4bvEXT(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4bvEXT((UInt32)index, (SByte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4bvEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4bvEXT((UInt32)index, (SByte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI4bvEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4bvEXT((UInt32)index, (SByte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4svEXT(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4svEXT((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4svEXT(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4svEXT((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4svEXT(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4svEXT((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4svEXT(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4svEXT((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4svEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4svEXT((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI4svEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4svEXT((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4ubvEXT(UInt32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4ubvEXT((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4ubvEXT(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4ubvEXT((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4ubvEXT(UInt32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4ubvEXT((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4ubvEXT(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4ubvEXT((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4ubvEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4ubvEXT((UInt32)index, (Byte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI4ubvEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4ubvEXT((UInt32)index, (Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4usvEXT(UInt32 index, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4usvEXT((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4usvEXT(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribI4usvEXT((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4usvEXT(UInt32 index, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4usvEXT((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribI4usvEXT(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribI4usvEXT((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribI4usvEXT(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4usvEXT((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribI4usvEXT(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribI4usvEXT((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribIPointerEXT(UInt32 index, Int32 size, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribIPointerEXT((UInt32)index, (Int32)size, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glVertexAttribIPointerEXT(Int32 index, Int32 size, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribIPointerEXT((UInt32)index, (Int32)size, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribIPointerEXT(UInt32 index, Int32 size, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexAttribIPointerEXT((UInt32)index, (Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribIPointerEXT(Int32 index, Int32 size, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexAttribIPointerEXT((UInt32)index, (Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribIivEXT(UInt32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribIivEXT((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribIivEXT(Int32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribIivEXT((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribIivEXT(UInt32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribIivEXT((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribIivEXT(Int32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribIivEXT((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribIivEXT(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribIivEXT((UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribIivEXT(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribIivEXT((UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribIuivEXT(UInt32 index, int pname, [Out] UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribIuivEXT((UInt32)index, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribIuivEXT(Int32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribIuivEXT((UInt32)index, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribIuivEXT(UInt32 index, int pname, [Out] out UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribIuivEXT((UInt32)index, (int)pname, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribIuivEXT(Int32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribIuivEXT((UInt32)index, (int)pname, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribIuivEXT(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribIuivEXT((UInt32)index, (int)pname, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribIuivEXT(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribIuivEXT((UInt32)index, (int)pname, (UInt32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformuivEXT(UInt32 program, Int32 location, [Out] UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glGetUniformuivEXT((UInt32)program, (Int32)location, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetUniformuivEXT(Int32 program, Int32 location, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetUniformuivEXT((UInt32)program, (Int32)location, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformuivEXT(UInt32 program, Int32 location, [Out] out UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glGetUniformuivEXT((UInt32)program, (Int32)location, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetUniformuivEXT(Int32 program, Int32 location, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetUniformuivEXT((UInt32)program, (Int32)location, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetUniformuivEXT(UInt32 program, Int32 location, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetUniformuivEXT((UInt32)program, (Int32)location, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glGetUniformuivEXT(Int32 program, Int32 location, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetUniformuivEXT((UInt32)program, (Int32)location, (UInt32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindFragDataLocationEXT(UInt32 program, UInt32 color, System.String name)
+        {
+            Delegates.glBindFragDataLocationEXT((UInt32)program, (UInt32)color, (System.String)name);
+        }
+
+        public static 
+        void glBindFragDataLocationEXT(Int32 program, Int32 color, System.String name)
+        {
+            Delegates.glBindFragDataLocationEXT((UInt32)program, (UInt32)color, (System.String)name);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glGetFragDataLocationEXT(UInt32 program, System.String name)
+        {
+            return Delegates.glGetFragDataLocationEXT((UInt32)program, (System.String)name);
+        }
+
+        public static 
+        Int32 glGetFragDataLocationEXT(Int32 program, System.String name)
+        {
+            return Delegates.glGetFragDataLocationEXT((UInt32)program, (System.String)name);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform1uiEXT(Int32 location, UInt32 v0)
+        {
+            Delegates.glUniform1uiEXT((Int32)location, (UInt32)v0);
+        }
+
+        public static 
+        void glUniform1uiEXT(Int32 location, Int32 v0)
+        {
+            Delegates.glUniform1uiEXT((Int32)location, (UInt32)v0);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform2uiEXT(Int32 location, UInt32 v0, UInt32 v1)
+        {
+            Delegates.glUniform2uiEXT((Int32)location, (UInt32)v0, (UInt32)v1);
+        }
+
+        public static 
+        void glUniform2uiEXT(Int32 location, Int32 v0, Int32 v1)
+        {
+            Delegates.glUniform2uiEXT((Int32)location, (UInt32)v0, (UInt32)v1);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform3uiEXT(Int32 location, UInt32 v0, UInt32 v1, UInt32 v2)
+        {
+            Delegates.glUniform3uiEXT((Int32)location, (UInt32)v0, (UInt32)v1, (UInt32)v2);
+        }
+
+        public static 
+        void glUniform3uiEXT(Int32 location, Int32 v0, Int32 v1, Int32 v2)
+        {
+            Delegates.glUniform3uiEXT((Int32)location, (UInt32)v0, (UInt32)v1, (UInt32)v2);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform4uiEXT(Int32 location, UInt32 v0, UInt32 v1, UInt32 v2, UInt32 v3)
+        {
+            Delegates.glUniform4uiEXT((Int32)location, (UInt32)v0, (UInt32)v1, (UInt32)v2, (UInt32)v3);
+        }
+
+        public static 
+        void glUniform4uiEXT(Int32 location, Int32 v0, Int32 v1, Int32 v2, Int32 v3)
+        {
+            Delegates.glUniform4uiEXT((Int32)location, (UInt32)v0, (UInt32)v1, (UInt32)v2, (UInt32)v3);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform1uivEXT(Int32 location, Int32 count, UInt32[] value)
+        {
+            unsafe
+            {
+                fixed (UInt32* value_ptr = value)
+                {
+                    Delegates.glUniform1uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1uivEXT(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform1uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform1uivEXT(Int32 location, Int32 count, ref UInt32 value)
+        {
+            unsafe
+            {
+                fixed (UInt32* value_ptr = &value)
+                {
+                    Delegates.glUniform1uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1uivEXT(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform1uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform1uivEXT(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform1uivEXT((Int32)location, (Int32)count, (UInt32*)value);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform2uivEXT(Int32 location, Int32 count, UInt32[] value)
+        {
+            unsafe
+            {
+                fixed (UInt32* value_ptr = value)
+                {
+                    Delegates.glUniform2uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2uivEXT(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform2uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform2uivEXT(Int32 location, Int32 count, ref UInt32 value)
+        {
+            unsafe
+            {
+                fixed (UInt32* value_ptr = &value)
+                {
+                    Delegates.glUniform2uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2uivEXT(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform2uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform2uivEXT(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform2uivEXT((Int32)location, (Int32)count, (UInt32*)value);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform3uivEXT(Int32 location, Int32 count, UInt32[] value)
+        {
+            unsafe
+            {
+                fixed (UInt32* value_ptr = value)
+                {
+                    Delegates.glUniform3uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3uivEXT(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform3uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform3uivEXT(Int32 location, Int32 count, ref UInt32 value)
+        {
+            unsafe
+            {
+                fixed (UInt32* value_ptr = &value)
+                {
+                    Delegates.glUniform3uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3uivEXT(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform3uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform3uivEXT(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform3uivEXT((Int32)location, (Int32)count, (UInt32*)value);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform4uivEXT(Int32 location, Int32 count, UInt32[] value)
+        {
+            unsafe
+            {
+                fixed (UInt32* value_ptr = value)
+                {
+                    Delegates.glUniform4uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4uivEXT(Int32 location, Int32 count, Int32[] value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = value)
+                {
+                    Delegates.glUniform4uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniform4uivEXT(Int32 location, Int32 count, ref UInt32 value)
+        {
+            unsafe
+            {
+                fixed (UInt32* value_ptr = &value)
+                {
+                    Delegates.glUniform4uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4uivEXT(Int32 location, Int32 count, ref Int32 value)
+        {
+            unsafe
+            {
+                fixed (Int32* value_ptr = &value)
+                {
+                    Delegates.glUniform4uivEXT((Int32)location, (Int32)count, (UInt32*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glUniform4uivEXT(Int32 location, Int32 count, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glUniform4uivEXT((Int32)location, (Int32)count, (UInt32*)value);
+            }
+        }
+
+        public static 
+        void glDrawArraysInstancedEXT(int mode, Int32 start, Int32 count, Int32 primcount)
+        {
+            Delegates.glDrawArraysInstancedEXT((int)mode, (Int32)start, (Int32)count, (Int32)primcount);
+        }
+
+        public static 
+        void glDrawElementsInstancedEXT(int mode, Int32 count, int type, IntPtr indices, Int32 primcount)
+        {
+            unsafe
+            {
+                Delegates.glDrawElementsInstancedEXT((int)mode, (Int32)count, (int)type, (IntPtr)indices, (Int32)primcount);
+            }
+        }
+
+        public static 
+        void glDrawElementsInstancedEXT(int mode, Int32 count, int type, [In, Out] object indices, Int32 primcount)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glDrawElementsInstancedEXT((int)mode, (Int32)count, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject(), (Int32)primcount);
+                }
+                finally
+                {
+                    indices_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexBufferEXT(int target, int internalformat, UInt32 buffer)
+        {
+            Delegates.glTexBufferEXT((int)target, (int)internalformat, (UInt32)buffer);
+        }
+
+        public static 
+        void glTexBufferEXT(int target, int internalformat, Int32 buffer)
+        {
+            Delegates.glTexBufferEXT((int)target, (int)internalformat, (UInt32)buffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColorMaskIndexedEXT(UInt32 index, bool r, bool g, bool b, bool a)
+        {
+            Delegates.glColorMaskIndexedEXT((UInt32)index, (bool)r, (bool)g, (bool)b, (bool)a);
+        }
+
+        public static 
+        void glColorMaskIndexedEXT(Int32 index, bool r, bool g, bool b, bool a)
+        {
+            Delegates.glColorMaskIndexedEXT((UInt32)index, (bool)r, (bool)g, (bool)b, (bool)a);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetBooleanIndexedvEXT(int target, UInt32 index, [Out] bool[] data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = data)
+                {
+                    Delegates.glGetBooleanIndexedvEXT((int)target, (UInt32)index, (bool*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetBooleanIndexedvEXT(int target, Int32 index, [Out] bool[] data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = data)
+                {
+                    Delegates.glGetBooleanIndexedvEXT((int)target, (UInt32)index, (bool*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetBooleanIndexedvEXT(int target, UInt32 index, [Out] out bool data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = &data)
+                {
+                    Delegates.glGetBooleanIndexedvEXT((int)target, (UInt32)index, (bool*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetBooleanIndexedvEXT(int target, Int32 index, [Out] out bool data)
+        {
+            unsafe
+            {
+                fixed (bool* data_ptr = &data)
+                {
+                    Delegates.glGetBooleanIndexedvEXT((int)target, (UInt32)index, (bool*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetBooleanIndexedvEXT(int target, UInt32 index, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetBooleanIndexedvEXT((int)target, (UInt32)index, (bool*)data);
+            }
+        }
+
+        public static 
+        void glGetBooleanIndexedvEXT(int target, Int32 index, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetBooleanIndexedvEXT((int)target, (UInt32)index, (bool*)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetIntegerIndexedvEXT(int target, UInt32 index, [Out] Int32[] data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = data)
+                {
+                    Delegates.glGetIntegerIndexedvEXT((int)target, (UInt32)index, (Int32*)data_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetIntegerIndexedvEXT(int target, Int32 index, [Out] Int32[] data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = data)
+                {
+                    Delegates.glGetIntegerIndexedvEXT((int)target, (UInt32)index, (Int32*)data_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetIntegerIndexedvEXT(int target, UInt32 index, [Out] out Int32 data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = &data)
+                {
+                    Delegates.glGetIntegerIndexedvEXT((int)target, (UInt32)index, (Int32*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetIntegerIndexedvEXT(int target, Int32 index, [Out] out Int32 data)
+        {
+            unsafe
+            {
+                fixed (Int32* data_ptr = &data)
+                {
+                    Delegates.glGetIntegerIndexedvEXT((int)target, (UInt32)index, (Int32*)data_ptr);
+                    data = *data_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetIntegerIndexedvEXT(int target, UInt32 index, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetIntegerIndexedvEXT((int)target, (UInt32)index, (Int32*)data);
+            }
+        }
+
+        public static 
+        void glGetIntegerIndexedvEXT(int target, Int32 index, [Out] IntPtr data)
+        {
+            unsafe
+            {
+                Delegates.glGetIntegerIndexedvEXT((int)target, (UInt32)index, (Int32*)data);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glEnableIndexedEXT(int target, UInt32 index)
+        {
+            Delegates.glEnableIndexedEXT((int)target, (UInt32)index);
+        }
+
+        public static 
+        void glEnableIndexedEXT(int target, Int32 index)
+        {
+            Delegates.glEnableIndexedEXT((int)target, (UInt32)index);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDisableIndexedEXT(int target, UInt32 index)
+        {
+            Delegates.glDisableIndexedEXT((int)target, (UInt32)index);
+        }
+
+        public static 
+        void glDisableIndexedEXT(int target, Int32 index)
+        {
+            Delegates.glDisableIndexedEXT((int)target, (UInt32)index);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsEnabledIndexedEXT(int target, UInt32 index)
+        {
+            return Delegates.glIsEnabledIndexedEXT((int)target, (UInt32)index);
+        }
+
+        public static 
+        bool glIsEnabledIndexedEXT(int target, Int32 index)
+        {
+            return Delegates.glIsEnabledIndexedEXT((int)target, (UInt32)index);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUniformBufferEXT(UInt32 program, Int32 location, UInt32 buffer)
+        {
+            Delegates.glUniformBufferEXT((UInt32)program, (Int32)location, (UInt32)buffer);
+        }
+
+        public static 
+        void glUniformBufferEXT(Int32 program, Int32 location, Int32 buffer)
+        {
+            Delegates.glUniformBufferEXT((UInt32)program, (Int32)location, (UInt32)buffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glGetUniformBufferSizeEXT(UInt32 program, Int32 location)
+        {
+            return Delegates.glGetUniformBufferSizeEXT((UInt32)program, (Int32)location);
+        }
+
+        public static 
+        Int32 glGetUniformBufferSizeEXT(Int32 program, Int32 location)
+        {
+            return Delegates.glGetUniformBufferSizeEXT((UInt32)program, (Int32)location);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        IntPtr glGetUniformOffsetEXT(UInt32 program, Int32 location)
+        {
+            return Delegates.glGetUniformOffsetEXT((UInt32)program, (Int32)location);
+        }
+
+        public static 
+        IntPtr glGetUniformOffsetEXT(Int32 program, Int32 location)
+        {
+            return Delegates.glGetUniformOffsetEXT((UInt32)program, (Int32)location);
+        }
+
+        public static 
+        void glTexParameterIivEXT(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glTexParameterIivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexParameterIivEXT(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glTexParameterIivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexParameterIivEXT(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glTexParameterIivEXT((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexParameterIuivEXT(int target, int pname, UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glTexParameterIuivEXT((int)target, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexParameterIuivEXT(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glTexParameterIuivEXT((int)target, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexParameterIuivEXT(int target, int pname, ref UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glTexParameterIuivEXT((int)target, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexParameterIuivEXT(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glTexParameterIuivEXT((int)target, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexParameterIuivEXT(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glTexParameterIuivEXT((int)target, (int)pname, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glGetTexParameterIivEXT(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetTexParameterIivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexParameterIivEXT(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexParameterIivEXT((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexParameterIivEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexParameterIivEXT((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetTexParameterIuivEXT(int target, int pname, [Out] UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glGetTexParameterIuivEXT((int)target, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexParameterIuivEXT(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetTexParameterIuivEXT((int)target, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetTexParameterIuivEXT(int target, int pname, [Out] out UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexParameterIuivEXT((int)target, (int)pname, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexParameterIuivEXT(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetTexParameterIuivEXT((int)target, (int)pname, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexParameterIuivEXT(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTexParameterIuivEXT((int)target, (int)pname, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glClearColorIiEXT(Int32 red, Int32 green, Int32 blue, Int32 alpha)
+        {
+            Delegates.glClearColorIiEXT((Int32)red, (Int32)green, (Int32)blue, (Int32)alpha);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glClearColorIuiEXT(UInt32 red, UInt32 green, UInt32 blue, UInt32 alpha)
+        {
+            Delegates.glClearColorIuiEXT((UInt32)red, (UInt32)green, (UInt32)blue, (UInt32)alpha);
+        }
+
+        public static 
+        void glClearColorIuiEXT(Int32 red, Int32 green, Int32 blue, Int32 alpha)
+        {
+            Delegates.glClearColorIuiEXT((UInt32)red, (UInt32)green, (UInt32)blue, (UInt32)alpha);
+        }
+
+        public static 
+        void glGetTexFilterFuncSGIS(int target, int filter, [Out] Single[] weights)
+        {
+            unsafe
+            {
+                fixed (Single* weights_ptr = weights)
+                {
+                    Delegates.glGetTexFilterFuncSGIS((int)target, (int)filter, (Single*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexFilterFuncSGIS(int target, int filter, [Out] out Single weights)
+        {
+            unsafe
+            {
+                fixed (Single* weights_ptr = &weights)
+                {
+                    Delegates.glGetTexFilterFuncSGIS((int)target, (int)filter, (Single*)weights_ptr);
+                    weights = *weights_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexFilterFuncSGIS(int target, int filter, [Out] IntPtr weights)
+        {
+            unsafe
+            {
+                Delegates.glGetTexFilterFuncSGIS((int)target, (int)filter, (Single*)weights);
+            }
+        }
+
+        public static 
+        void glTexFilterFuncSGIS(int target, int filter, Int32 n, Single[] weights)
+        {
+            unsafe
+            {
+                fixed (Single* weights_ptr = weights)
+                {
+                    Delegates.glTexFilterFuncSGIS((int)target, (int)filter, (Int32)n, (Single*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexFilterFuncSGIS(int target, int filter, Int32 n, ref Single weights)
+        {
+            unsafe
+            {
+                fixed (Single* weights_ptr = &weights)
+                {
+                    Delegates.glTexFilterFuncSGIS((int)target, (int)filter, (Int32)n, (Single*)weights_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexFilterFuncSGIS(int target, int filter, Int32 n, IntPtr weights)
+        {
+            unsafe
+            {
+                Delegates.glTexFilterFuncSGIS((int)target, (int)filter, (Int32)n, (Single*)weights);
+            }
+        }
+
+        public static 
+        void glPixelTexGenParameteriSGIS(int pname, Int32 param)
+        {
+            Delegates.glPixelTexGenParameteriSGIS((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glPixelTexGenParameterivSGIS(int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glPixelTexGenParameterivSGIS((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelTexGenParameterivSGIS(int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glPixelTexGenParameterivSGIS((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelTexGenParameterivSGIS(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glPixelTexGenParameterivSGIS((int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glPixelTexGenParameterfSGIS(int pname, Single param)
+        {
+            Delegates.glPixelTexGenParameterfSGIS((int)pname, (Single)param);
+        }
+
+        public static 
+        void glPixelTexGenParameterfvSGIS(int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glPixelTexGenParameterfvSGIS((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelTexGenParameterfvSGIS(int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glPixelTexGenParameterfvSGIS((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPixelTexGenParameterfvSGIS(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glPixelTexGenParameterfvSGIS((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetPixelTexGenParameterivSGIS(int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetPixelTexGenParameterivSGIS((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelTexGenParameterivSGIS(int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetPixelTexGenParameterivSGIS((int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelTexGenParameterivSGIS(int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetPixelTexGenParameterivSGIS((int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetPixelTexGenParameterfvSGIS(int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetPixelTexGenParameterfvSGIS((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelTexGenParameterfvSGIS(int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetPixelTexGenParameterfvSGIS((int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetPixelTexGenParameterfvSGIS(int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetPixelTexGenParameterfvSGIS((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glTexImage4DSGIS(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 size4d, Int32 border, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexImage4DSGIS((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)depth, (Int32)size4d, (Int32)border, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexImage4DSGIS(int target, Int32 level, int internalformat, Int32 width, Int32 height, Int32 depth, Int32 size4d, Int32 border, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexImage4DSGIS((int)target, (Int32)level, (int)internalformat, (Int32)width, (Int32)height, (Int32)depth, (Int32)size4d, (Int32)border, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexSubImage4DSGIS(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 woffset, Int32 width, Int32 height, Int32 depth, Int32 size4d, int format, int type, IntPtr pixels)
+        {
+            unsafe
+            {
+                Delegates.glTexSubImage4DSGIS((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)woffset, (Int32)width, (Int32)height, (Int32)depth, (Int32)size4d, (int)format, (int)type, (IntPtr)pixels);
+            }
+        }
+
+        public static 
+        void glTexSubImage4DSGIS(int target, Int32 level, Int32 xoffset, Int32 yoffset, Int32 zoffset, Int32 woffset, Int32 width, Int32 height, Int32 depth, Int32 size4d, int format, int type, [In, Out] object pixels)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pixels_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pixels, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexSubImage4DSGIS((int)target, (Int32)level, (Int32)xoffset, (Int32)yoffset, (Int32)zoffset, (Int32)woffset, (Int32)width, (Int32)height, (Int32)depth, (Int32)size4d, (int)format, (int)type, (IntPtr)pixels_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pixels_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glDetailTexFuncSGIS(int target, Int32 n, Single[] points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = points)
+                {
+                    Delegates.glDetailTexFuncSGIS((int)target, (Int32)n, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDetailTexFuncSGIS(int target, Int32 n, ref Single points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = &points)
+                {
+                    Delegates.glDetailTexFuncSGIS((int)target, (Int32)n, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDetailTexFuncSGIS(int target, Int32 n, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glDetailTexFuncSGIS((int)target, (Int32)n, (Single*)points);
+            }
+        }
+
+        public static 
+        void glGetDetailTexFuncSGIS(int target, [Out] Single[] points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = points)
+                {
+                    Delegates.glGetDetailTexFuncSGIS((int)target, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetDetailTexFuncSGIS(int target, [Out] out Single points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = &points)
+                {
+                    Delegates.glGetDetailTexFuncSGIS((int)target, (Single*)points_ptr);
+                    points = *points_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetDetailTexFuncSGIS(int target, [Out] IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glGetDetailTexFuncSGIS((int)target, (Single*)points);
+            }
+        }
+
+        public static 
+        void glSharpenTexFuncSGIS(int target, Int32 n, Single[] points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = points)
+                {
+                    Delegates.glSharpenTexFuncSGIS((int)target, (Int32)n, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSharpenTexFuncSGIS(int target, Int32 n, ref Single points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = &points)
+                {
+                    Delegates.glSharpenTexFuncSGIS((int)target, (Int32)n, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSharpenTexFuncSGIS(int target, Int32 n, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glSharpenTexFuncSGIS((int)target, (Int32)n, (Single*)points);
+            }
+        }
+
+        public static 
+        void glGetSharpenTexFuncSGIS(int target, [Out] Single[] points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = points)
+                {
+                    Delegates.glGetSharpenTexFuncSGIS((int)target, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetSharpenTexFuncSGIS(int target, [Out] out Single points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = &points)
+                {
+                    Delegates.glGetSharpenTexFuncSGIS((int)target, (Single*)points_ptr);
+                    points = *points_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetSharpenTexFuncSGIS(int target, [Out] IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glGetSharpenTexFuncSGIS((int)target, (Single*)points);
+            }
+        }
+
+        public static 
+        void glSampleMaskSGIS(Single value, bool invert)
+        {
+            Delegates.glSampleMaskSGIS((Single)value, (bool)invert);
+        }
+
+        public static 
+        void glSamplePatternSGIS(int pattern)
+        {
+            Delegates.glSamplePatternSGIS((int)pattern);
+        }
+
+        public static 
+        void glPointParameterfSGIS(int pname, Single param)
+        {
+            Delegates.glPointParameterfSGIS((int)pname, (Single)param);
+        }
+
+        public static 
+        void glPointParameterfvSGIS(int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glPointParameterfvSGIS((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterfvSGIS(int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glPointParameterfvSGIS((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterfvSGIS(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glPointParameterfvSGIS((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glFogFuncSGIS(Int32 n, Single[] points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = points)
+                {
+                    Delegates.glFogFuncSGIS((Int32)n, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogFuncSGIS(Int32 n, ref Single points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = &points)
+                {
+                    Delegates.glFogFuncSGIS((Int32)n, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogFuncSGIS(Int32 n, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glFogFuncSGIS((Int32)n, (Single*)points);
+            }
+        }
+
+        public static 
+        void glGetFogFuncSGIS([Out] Single[] points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = points)
+                {
+                    Delegates.glGetFogFuncSGIS((Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetFogFuncSGIS([Out] out Single points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = &points)
+                {
+                    Delegates.glGetFogFuncSGIS((Single*)points_ptr);
+                    points = *points_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetFogFuncSGIS([Out] IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glGetFogFuncSGIS((Single*)points);
+            }
+        }
+
+        public static 
+        void glTextureColorMaskSGIS(bool red, bool green, bool blue, bool alpha)
+        {
+            Delegates.glTextureColorMaskSGIS((bool)red, (bool)green, (bool)blue, (bool)alpha);
+        }
+
+        public static 
+        void glColorTableSGI(int target, int internalformat, Int32 width, int format, int type, IntPtr table)
+        {
+            unsafe
+            {
+                Delegates.glColorTableSGI((int)target, (int)internalformat, (Int32)width, (int)format, (int)type, (IntPtr)table);
+            }
+        }
+
+        public static 
+        void glColorTableSGI(int target, int internalformat, Int32 width, int format, int type, [In, Out] object table)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle table_ptr = System.Runtime.InteropServices.GCHandle.Alloc(table, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glColorTableSGI((int)target, (int)internalformat, (Int32)width, (int)format, (int)type, (IntPtr)table_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    table_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glColorTableParameterfvSGI(int target, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glColorTableParameterfvSGI((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColorTableParameterfvSGI(int target, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glColorTableParameterfvSGI((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColorTableParameterfvSGI(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glColorTableParameterfvSGI((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glColorTableParameterivSGI(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glColorTableParameterivSGI((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColorTableParameterivSGI(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glColorTableParameterivSGI((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColorTableParameterivSGI(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glColorTableParameterivSGI((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glCopyColorTableSGI(int target, int internalformat, Int32 x, Int32 y, Int32 width)
+        {
+            Delegates.glCopyColorTableSGI((int)target, (int)internalformat, (Int32)x, (Int32)y, (Int32)width);
+        }
+
+        public static 
+        void glGetColorTableSGI(int target, int format, int type, [Out] IntPtr table)
+        {
+            unsafe
+            {
+                Delegates.glGetColorTableSGI((int)target, (int)format, (int)type, (IntPtr)table);
+            }
+        }
+
+        public static 
+        void glGetColorTableSGI(int target, int format, int type, [In, Out] object table)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle table_ptr = System.Runtime.InteropServices.GCHandle.Alloc(table, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetColorTableSGI((int)target, (int)format, (int)type, (IntPtr)table_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    table_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterfvSGI(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetColorTableParameterfvSGI((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterfvSGI(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetColorTableParameterfvSGI((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterfvSGI(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetColorTableParameterfvSGI((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterivSGI(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetColorTableParameterivSGI((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterivSGI(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetColorTableParameterivSGI((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetColorTableParameterivSGI(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetColorTableParameterivSGI((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glPixelTexGenSGIX(int mode)
+        {
+            Delegates.glPixelTexGenSGIX((int)mode);
+        }
+
+        public static 
+        void glSpriteParameterfSGIX(int pname, Single param)
+        {
+            Delegates.glSpriteParameterfSGIX((int)pname, (Single)param);
+        }
+
+        public static 
+        void glSpriteParameterfvSGIX(int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glSpriteParameterfvSGIX((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSpriteParameterfvSGIX(int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glSpriteParameterfvSGIX((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSpriteParameterfvSGIX(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glSpriteParameterfvSGIX((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glSpriteParameteriSGIX(int pname, Int32 param)
+        {
+            Delegates.glSpriteParameteriSGIX((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glSpriteParameterivSGIX(int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glSpriteParameterivSGIX((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSpriteParameterivSGIX(int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glSpriteParameterivSGIX((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSpriteParameterivSGIX(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glSpriteParameterivSGIX((int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        Int32 glGetInstrumentsSGIX()
+        {
+            return Delegates.glGetInstrumentsSGIX();
+        }
+
+        public static 
+        void glInstrumentsBufferSGIX(Int32 size, [Out] Int32[] buffer)
+        {
+            unsafe
+            {
+                fixed (Int32* buffer_ptr = buffer)
+                {
+                    Delegates.glInstrumentsBufferSGIX((Int32)size, (Int32*)buffer_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glInstrumentsBufferSGIX(Int32 size, [Out] out Int32 buffer)
+        {
+            unsafe
+            {
+                fixed (Int32* buffer_ptr = &buffer)
+                {
+                    Delegates.glInstrumentsBufferSGIX((Int32)size, (Int32*)buffer_ptr);
+                    buffer = *buffer_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glInstrumentsBufferSGIX(Int32 size, [Out] IntPtr buffer)
+        {
+            unsafe
+            {
+                Delegates.glInstrumentsBufferSGIX((Int32)size, (Int32*)buffer);
+            }
+        }
+
+        public static 
+        Int32 glPollInstrumentsSGIX([Out] Int32[] marker_p)
+        {
+            unsafe
+            {
+                fixed (Int32* marker_p_ptr = marker_p)
+                {
+                    return Delegates.glPollInstrumentsSGIX((Int32*)marker_p_ptr);
+                }
+            }
+        }
+
+        public static 
+        Int32 glPollInstrumentsSGIX([Out] out Int32 marker_p)
+        {
+            unsafe
+            {
+                fixed (Int32* marker_p_ptr = &marker_p)
+                {
+                    Int32 retval = Delegates.glPollInstrumentsSGIX((Int32*)marker_p_ptr);
+                    marker_p = *marker_p_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Int32 glPollInstrumentsSGIX([Out] IntPtr marker_p)
+        {
+            unsafe
+            {
+                return Delegates.glPollInstrumentsSGIX((Int32*)marker_p);
+            }
+        }
+
+        public static 
+        void glReadInstrumentsSGIX(Int32 marker)
+        {
+            Delegates.glReadInstrumentsSGIX((Int32)marker);
+        }
+
+        public static 
+        void glStartInstrumentsSGIX()
+        {
+            Delegates.glStartInstrumentsSGIX();
+        }
+
+        public static 
+        void glStopInstrumentsSGIX(Int32 marker)
+        {
+            Delegates.glStopInstrumentsSGIX((Int32)marker);
+        }
+
+        public static 
+        void glFrameZoomSGIX(Int32 factor)
+        {
+            Delegates.glFrameZoomSGIX((Int32)factor);
+        }
+
+        public static 
+        void glTagSampleBufferSGIX()
+        {
+            Delegates.glTagSampleBufferSGIX();
+        }
+
+        public static 
+        void glDeformationMap3dSGIX(int target, Double u1, Double u2, Int32 ustride, Int32 uorder, Double v1, Double v2, Int32 vstride, Int32 vorder, Double w1, Double w2, Int32 wstride, Int32 worder, Double[] points)
+        {
+            unsafe
+            {
+                fixed (Double* points_ptr = points)
+                {
+                    Delegates.glDeformationMap3dSGIX((int)target, (Double)u1, (Double)u2, (Int32)ustride, (Int32)uorder, (Double)v1, (Double)v2, (Int32)vstride, (Int32)vorder, (Double)w1, (Double)w2, (Int32)wstride, (Int32)worder, (Double*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeformationMap3dSGIX(int target, Double u1, Double u2, Int32 ustride, Int32 uorder, Double v1, Double v2, Int32 vstride, Int32 vorder, Double w1, Double w2, Int32 wstride, Int32 worder, ref Double points)
+        {
+            unsafe
+            {
+                fixed (Double* points_ptr = &points)
+                {
+                    Delegates.glDeformationMap3dSGIX((int)target, (Double)u1, (Double)u2, (Int32)ustride, (Int32)uorder, (Double)v1, (Double)v2, (Int32)vstride, (Int32)vorder, (Double)w1, (Double)w2, (Int32)wstride, (Int32)worder, (Double*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeformationMap3dSGIX(int target, Double u1, Double u2, Int32 ustride, Int32 uorder, Double v1, Double v2, Int32 vstride, Int32 vorder, Double w1, Double w2, Int32 wstride, Int32 worder, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glDeformationMap3dSGIX((int)target, (Double)u1, (Double)u2, (Int32)ustride, (Int32)uorder, (Double)v1, (Double)v2, (Int32)vstride, (Int32)vorder, (Double)w1, (Double)w2, (Int32)wstride, (Int32)worder, (Double*)points);
+            }
+        }
+
+        public static 
+        void glDeformationMap3fSGIX(int target, Single u1, Single u2, Int32 ustride, Int32 uorder, Single v1, Single v2, Int32 vstride, Int32 vorder, Single w1, Single w2, Int32 wstride, Int32 worder, Single[] points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = points)
+                {
+                    Delegates.glDeformationMap3fSGIX((int)target, (Single)u1, (Single)u2, (Int32)ustride, (Int32)uorder, (Single)v1, (Single)v2, (Int32)vstride, (Int32)vorder, (Single)w1, (Single)w2, (Int32)wstride, (Int32)worder, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeformationMap3fSGIX(int target, Single u1, Single u2, Int32 ustride, Int32 uorder, Single v1, Single v2, Int32 vstride, Int32 vorder, Single w1, Single w2, Int32 wstride, Int32 worder, ref Single points)
+        {
+            unsafe
+            {
+                fixed (Single* points_ptr = &points)
+                {
+                    Delegates.glDeformationMap3fSGIX((int)target, (Single)u1, (Single)u2, (Int32)ustride, (Int32)uorder, (Single)v1, (Single)v2, (Int32)vstride, (Int32)vorder, (Single)w1, (Single)w2, (Int32)wstride, (Int32)worder, (Single*)points_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeformationMap3fSGIX(int target, Single u1, Single u2, Int32 ustride, Int32 uorder, Single v1, Single v2, Int32 vstride, Int32 vorder, Single w1, Single w2, Int32 wstride, Int32 worder, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glDeformationMap3fSGIX((int)target, (Single)u1, (Single)u2, (Int32)ustride, (Int32)uorder, (Single)v1, (Single)v2, (Int32)vstride, (Int32)vorder, (Single)w1, (Single)w2, (Int32)wstride, (Int32)worder, (Single*)points);
+            }
+        }
+
+        public static 
+        void glDeformSGIX(int mask)
+        {
+            Delegates.glDeformSGIX((int)mask);
+        }
+
+        public static 
+        void glLoadIdentityDeformationMapSGIX(int mask)
+        {
+            Delegates.glLoadIdentityDeformationMapSGIX((int)mask);
+        }
+
+        public static 
+        void glReferencePlaneSGIX(Double[] equation)
+        {
+            unsafe
+            {
+                fixed (Double* equation_ptr = equation)
+                {
+                    Delegates.glReferencePlaneSGIX((Double*)equation_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReferencePlaneSGIX(ref Double equation)
+        {
+            unsafe
+            {
+                fixed (Double* equation_ptr = &equation)
+                {
+                    Delegates.glReferencePlaneSGIX((Double*)equation_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReferencePlaneSGIX(IntPtr equation)
+        {
+            unsafe
+            {
+                Delegates.glReferencePlaneSGIX((Double*)equation);
+            }
+        }
+
+        public static 
+        void glFlushRasterSGIX()
+        {
+            Delegates.glFlushRasterSGIX();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetListParameterfvSGIX(UInt32 list, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetListParameterfvSGIX(Int32 list, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetListParameterfvSGIX(UInt32 list, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetListParameterfvSGIX(Int32 list, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetListParameterfvSGIX(UInt32 list, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetListParameterfvSGIX(Int32 list, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetListParameterivSGIX(UInt32 list, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetListParameterivSGIX(Int32 list, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetListParameterivSGIX(UInt32 list, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetListParameterivSGIX(Int32 list, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetListParameterivSGIX(UInt32 list, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetListParameterivSGIX(Int32 list, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glListParameterfSGIX(UInt32 list, int pname, Single param)
+        {
+            Delegates.glListParameterfSGIX((UInt32)list, (int)pname, (Single)param);
+        }
+
+        public static 
+        void glListParameterfSGIX(Int32 list, int pname, Single param)
+        {
+            Delegates.glListParameterfSGIX((UInt32)list, (int)pname, (Single)param);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glListParameterfvSGIX(UInt32 list, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glListParameterfvSGIX(Int32 list, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glListParameterfvSGIX(UInt32 list, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glListParameterfvSGIX(Int32 list, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glListParameterfvSGIX(UInt32 list, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glListParameterfvSGIX(Int32 list, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glListParameterfvSGIX((UInt32)list, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glListParameteriSGIX(UInt32 list, int pname, Int32 param)
+        {
+            Delegates.glListParameteriSGIX((UInt32)list, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glListParameteriSGIX(Int32 list, int pname, Int32 param)
+        {
+            Delegates.glListParameteriSGIX((UInt32)list, (int)pname, (Int32)param);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glListParameterivSGIX(UInt32 list, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glListParameterivSGIX(Int32 list, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glListParameterivSGIX(UInt32 list, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glListParameterivSGIX(Int32 list, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glListParameterivSGIX(UInt32 list, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glListParameterivSGIX(Int32 list, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glListParameterivSGIX((UInt32)list, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glFragmentColorMaterialSGIX(int face, int mode)
+        {
+            Delegates.glFragmentColorMaterialSGIX((int)face, (int)mode);
+        }
+
+        public static 
+        void glFragmentLightfSGIX(int light, int pname, Single param)
+        {
+            Delegates.glFragmentLightfSGIX((int)light, (int)pname, (Single)param);
+        }
+
+        public static 
+        void glFragmentLightfvSGIX(int light, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glFragmentLightfvSGIX((int)light, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentLightfvSGIX(int light, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glFragmentLightfvSGIX((int)light, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentLightfvSGIX(int light, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glFragmentLightfvSGIX((int)light, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glFragmentLightiSGIX(int light, int pname, Int32 param)
+        {
+            Delegates.glFragmentLightiSGIX((int)light, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glFragmentLightivSGIX(int light, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glFragmentLightivSGIX((int)light, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentLightivSGIX(int light, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glFragmentLightivSGIX((int)light, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentLightivSGIX(int light, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glFragmentLightivSGIX((int)light, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glFragmentLightModelfSGIX(int pname, Single param)
+        {
+            Delegates.glFragmentLightModelfSGIX((int)pname, (Single)param);
+        }
+
+        public static 
+        void glFragmentLightModelfvSGIX(int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glFragmentLightModelfvSGIX((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentLightModelfvSGIX(int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glFragmentLightModelfvSGIX((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentLightModelfvSGIX(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glFragmentLightModelfvSGIX((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glFragmentLightModeliSGIX(int pname, Int32 param)
+        {
+            Delegates.glFragmentLightModeliSGIX((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glFragmentLightModelivSGIX(int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glFragmentLightModelivSGIX((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentLightModelivSGIX(int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glFragmentLightModelivSGIX((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentLightModelivSGIX(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glFragmentLightModelivSGIX((int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glFragmentMaterialfSGIX(int face, int pname, Single param)
+        {
+            Delegates.glFragmentMaterialfSGIX((int)face, (int)pname, (Single)param);
+        }
+
+        public static 
+        void glFragmentMaterialfvSGIX(int face, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glFragmentMaterialfvSGIX((int)face, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentMaterialfvSGIX(int face, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glFragmentMaterialfvSGIX((int)face, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentMaterialfvSGIX(int face, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glFragmentMaterialfvSGIX((int)face, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glFragmentMaterialiSGIX(int face, int pname, Int32 param)
+        {
+            Delegates.glFragmentMaterialiSGIX((int)face, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glFragmentMaterialivSGIX(int face, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glFragmentMaterialivSGIX((int)face, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentMaterialivSGIX(int face, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glFragmentMaterialivSGIX((int)face, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFragmentMaterialivSGIX(int face, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glFragmentMaterialivSGIX((int)face, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetFragmentLightfvSGIX(int light, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetFragmentLightfvSGIX((int)light, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetFragmentLightfvSGIX(int light, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetFragmentLightfvSGIX((int)light, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetFragmentLightfvSGIX(int light, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetFragmentLightfvSGIX((int)light, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetFragmentLightivSGIX(int light, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetFragmentLightivSGIX((int)light, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetFragmentLightivSGIX(int light, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetFragmentLightivSGIX((int)light, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetFragmentLightivSGIX(int light, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetFragmentLightivSGIX((int)light, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetFragmentMaterialfvSGIX(int face, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetFragmentMaterialfvSGIX((int)face, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetFragmentMaterialfvSGIX(int face, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetFragmentMaterialfvSGIX((int)face, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetFragmentMaterialfvSGIX(int face, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetFragmentMaterialfvSGIX((int)face, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetFragmentMaterialivSGIX(int face, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetFragmentMaterialivSGIX((int)face, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetFragmentMaterialivSGIX(int face, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetFragmentMaterialivSGIX((int)face, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetFragmentMaterialivSGIX(int face, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetFragmentMaterialivSGIX((int)face, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glLightEnviSGIX(int pname, Int32 param)
+        {
+            Delegates.glLightEnviSGIX((int)pname, (Int32)param);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glAsyncMarkerSGIX(UInt32 marker)
+        {
+            Delegates.glAsyncMarkerSGIX((UInt32)marker);
+        }
+
+        public static 
+        void glAsyncMarkerSGIX(Int32 marker)
+        {
+            Delegates.glAsyncMarkerSGIX((UInt32)marker);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glFinishAsyncSGIX([Out] UInt32[] markerp)
+        {
+            unsafe
+            {
+                fixed (UInt32* markerp_ptr = markerp)
+                {
+                    return Delegates.glFinishAsyncSGIX((UInt32*)markerp_ptr);
+                }
+            }
+        }
+
+        public static 
+        Int32 glFinishAsyncSGIX([Out] Int32[] markerp)
+        {
+            unsafe
+            {
+                fixed (Int32* markerp_ptr = markerp)
+                {
+                    return Delegates.glFinishAsyncSGIX((UInt32*)markerp_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glFinishAsyncSGIX([Out] out UInt32 markerp)
+        {
+            unsafe
+            {
+                fixed (UInt32* markerp_ptr = &markerp)
+                {
+                    Int32 retval = Delegates.glFinishAsyncSGIX((UInt32*)markerp_ptr);
+                    markerp = *markerp_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Int32 glFinishAsyncSGIX([Out] out Int32 markerp)
+        {
+            unsafe
+            {
+                fixed (Int32* markerp_ptr = &markerp)
+                {
+                    Int32 retval = Delegates.glFinishAsyncSGIX((UInt32*)markerp_ptr);
+                    markerp = *markerp_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Int32 glFinishAsyncSGIX([Out] IntPtr markerp)
+        {
+            unsafe
+            {
+                return Delegates.glFinishAsyncSGIX((UInt32*)markerp);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glPollAsyncSGIX([Out] UInt32[] markerp)
+        {
+            unsafe
+            {
+                fixed (UInt32* markerp_ptr = markerp)
+                {
+                    return Delegates.glPollAsyncSGIX((UInt32*)markerp_ptr);
+                }
+            }
+        }
+
+        public static 
+        Int32 glPollAsyncSGIX([Out] Int32[] markerp)
+        {
+            unsafe
+            {
+                fixed (Int32* markerp_ptr = markerp)
+                {
+                    return Delegates.glPollAsyncSGIX((UInt32*)markerp_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glPollAsyncSGIX([Out] out UInt32 markerp)
+        {
+            unsafe
+            {
+                fixed (UInt32* markerp_ptr = &markerp)
+                {
+                    Int32 retval = Delegates.glPollAsyncSGIX((UInt32*)markerp_ptr);
+                    markerp = *markerp_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Int32 glPollAsyncSGIX([Out] out Int32 markerp)
+        {
+            unsafe
+            {
+                fixed (Int32* markerp_ptr = &markerp)
+                {
+                    Int32 retval = Delegates.glPollAsyncSGIX((UInt32*)markerp_ptr);
+                    markerp = *markerp_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Int32 glPollAsyncSGIX([Out] IntPtr markerp)
+        {
+            unsafe
+            {
+                return Delegates.glPollAsyncSGIX((UInt32*)markerp);
+            }
+        }
+
+        public static 
+        Int32 glGenAsyncMarkersSGIX(Int32 range)
+        {
+            return Delegates.glGenAsyncMarkersSGIX((Int32)range);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteAsyncMarkersSGIX(UInt32 marker, Int32 range)
+        {
+            Delegates.glDeleteAsyncMarkersSGIX((UInt32)marker, (Int32)range);
+        }
+
+        public static 
+        void glDeleteAsyncMarkersSGIX(Int32 marker, Int32 range)
+        {
+            Delegates.glDeleteAsyncMarkersSGIX((UInt32)marker, (Int32)range);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsAsyncMarkerSGIX(UInt32 marker)
+        {
+            return Delegates.glIsAsyncMarkerSGIX((UInt32)marker);
+        }
+
+        public static 
+        bool glIsAsyncMarkerSGIX(Int32 marker)
+        {
+            return Delegates.glIsAsyncMarkerSGIX((UInt32)marker);
+        }
+
+        public static 
+        void glIglooInterfaceSGIX(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glIglooInterfaceSGIX((int)pname, (IntPtr)@params);
+            }
+        }
+
+        public static 
+        void glIglooInterfaceSGIX(int pname, [In, Out] object @params)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle @params_ptr = System.Runtime.InteropServices.GCHandle.Alloc(@params, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glIglooInterfaceSGIX((int)pname, (IntPtr)@params_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    @params_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glImageTransformParameteriHP(int target, int pname, Int32 param)
+        {
+            Delegates.glImageTransformParameteriHP((int)target, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glImageTransformParameterfHP(int target, int pname, Single param)
+        {
+            Delegates.glImageTransformParameterfHP((int)target, (int)pname, (Single)param);
+        }
+
+        public static 
+        void glImageTransformParameterivHP(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glImageTransformParameterivHP((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glImageTransformParameterivHP(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glImageTransformParameterivHP((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glImageTransformParameterivHP(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glImageTransformParameterivHP((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glImageTransformParameterfvHP(int target, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glImageTransformParameterfvHP((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glImageTransformParameterfvHP(int target, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glImageTransformParameterfvHP((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glImageTransformParameterfvHP(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glImageTransformParameterfvHP((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetImageTransformParameterivHP(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetImageTransformParameterivHP((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetImageTransformParameterivHP(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetImageTransformParameterivHP((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetImageTransformParameterivHP(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetImageTransformParameterivHP((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetImageTransformParameterfvHP(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetImageTransformParameterfvHP((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetImageTransformParameterfvHP(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetImageTransformParameterfvHP((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetImageTransformParameterfvHP(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetImageTransformParameterfvHP((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glHintPGI(int target, Int32 mode)
+        {
+            Delegates.glHintPGI((int)target, (Int32)mode);
+        }
+
+        public static 
+        void glVertexPointervINTEL(Int32 size, int type, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexPointervINTEL((Int32)size, (int)type, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glVertexPointervINTEL(Int32 size, int type, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexPointervINTEL((Int32)size, (int)type, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glNormalPointervINTEL(int type, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glNormalPointervINTEL((int)type, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glNormalPointervINTEL(int type, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glNormalPointervINTEL((int)type, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glColorPointervINTEL(Int32 size, int type, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glColorPointervINTEL((Int32)size, (int)type, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glColorPointervINTEL(Int32 size, int type, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glColorPointervINTEL((Int32)size, (int)type, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexCoordPointervINTEL(Int32 size, int type, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glTexCoordPointervINTEL((Int32)size, (int)type, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glTexCoordPointervINTEL(Int32 size, int type, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexCoordPointervINTEL((Int32)size, (int)type, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glFinishTextureSUNX()
+        {
+            Delegates.glFinishTextureSUNX();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGlobalAlphaFactorbSUN(SByte factor)
+        {
+            Delegates.glGlobalAlphaFactorbSUN((SByte)factor);
+        }
+
+        public static 
+        void glGlobalAlphaFactorbSUN(Byte factor)
+        {
+            Delegates.glGlobalAlphaFactorbSUN((SByte)factor);
+        }
+
+        public static 
+        void glGlobalAlphaFactorsSUN(Int16 factor)
+        {
+            Delegates.glGlobalAlphaFactorsSUN((Int16)factor);
+        }
+
+        public static 
+        void glGlobalAlphaFactoriSUN(Int32 factor)
+        {
+            Delegates.glGlobalAlphaFactoriSUN((Int32)factor);
+        }
+
+        public static 
+        void glGlobalAlphaFactorfSUN(Single factor)
+        {
+            Delegates.glGlobalAlphaFactorfSUN((Single)factor);
+        }
+
+        public static 
+        void glGlobalAlphaFactordSUN(Double factor)
+        {
+            Delegates.glGlobalAlphaFactordSUN((Double)factor);
+        }
+
+        public static 
+        void glGlobalAlphaFactorubSUN(Byte factor)
+        {
+            Delegates.glGlobalAlphaFactorubSUN((Byte)factor);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGlobalAlphaFactorusSUN(UInt16 factor)
+        {
+            Delegates.glGlobalAlphaFactorusSUN((UInt16)factor);
+        }
+
+        public static 
+        void glGlobalAlphaFactorusSUN(Int16 factor)
+        {
+            Delegates.glGlobalAlphaFactorusSUN((UInt16)factor);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGlobalAlphaFactoruiSUN(UInt32 factor)
+        {
+            Delegates.glGlobalAlphaFactoruiSUN((UInt32)factor);
+        }
+
+        public static 
+        void glGlobalAlphaFactoruiSUN(Int32 factor)
+        {
+            Delegates.glGlobalAlphaFactoruiSUN((UInt32)factor);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiSUN(UInt32 code)
+        {
+            Delegates.glReplacementCodeuiSUN((UInt32)code);
+        }
+
+        public static 
+        void glReplacementCodeuiSUN(Int32 code)
+        {
+            Delegates.glReplacementCodeuiSUN((UInt32)code);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeusSUN(UInt16 code)
+        {
+            Delegates.glReplacementCodeusSUN((UInt16)code);
+        }
+
+        public static 
+        void glReplacementCodeusSUN(Int16 code)
+        {
+            Delegates.glReplacementCodeusSUN((UInt16)code);
+        }
+
+        public static 
+        void glReplacementCodeubSUN(Byte code)
+        {
+            Delegates.glReplacementCodeubSUN((Byte)code);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuivSUN(UInt32[] code)
+        {
+            unsafe
+            {
+                fixed (UInt32* code_ptr = code)
+                {
+                    Delegates.glReplacementCodeuivSUN((UInt32*)code_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuivSUN(Int32[] code)
+        {
+            unsafe
+            {
+                fixed (Int32* code_ptr = code)
+                {
+                    Delegates.glReplacementCodeuivSUN((UInt32*)code_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuivSUN(ref UInt32 code)
+        {
+            unsafe
+            {
+                fixed (UInt32* code_ptr = &code)
+                {
+                    Delegates.glReplacementCodeuivSUN((UInt32*)code_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuivSUN(ref Int32 code)
+        {
+            unsafe
+            {
+                fixed (Int32* code_ptr = &code)
+                {
+                    Delegates.glReplacementCodeuivSUN((UInt32*)code_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuivSUN(IntPtr code)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeuivSUN((UInt32*)code);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeusvSUN(UInt16[] code)
+        {
+            unsafe
+            {
+                fixed (UInt16* code_ptr = code)
+                {
+                    Delegates.glReplacementCodeusvSUN((UInt16*)code_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeusvSUN(Int16[] code)
+        {
+            unsafe
+            {
+                fixed (Int16* code_ptr = code)
+                {
+                    Delegates.glReplacementCodeusvSUN((UInt16*)code_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeusvSUN(ref UInt16 code)
+        {
+            unsafe
+            {
+                fixed (UInt16* code_ptr = &code)
+                {
+                    Delegates.glReplacementCodeusvSUN((UInt16*)code_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeusvSUN(ref Int16 code)
+        {
+            unsafe
+            {
+                fixed (Int16* code_ptr = &code)
+                {
+                    Delegates.glReplacementCodeusvSUN((UInt16*)code_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeusvSUN(IntPtr code)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeusvSUN((UInt16*)code);
+            }
+        }
+
+        public static 
+        void glReplacementCodeubvSUN(Byte[] code)
+        {
+            unsafe
+            {
+                fixed (Byte* code_ptr = code)
+                {
+                    Delegates.glReplacementCodeubvSUN((Byte*)code_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeubvSUN(ref Byte code)
+        {
+            unsafe
+            {
+                fixed (Byte* code_ptr = &code)
+                {
+                    Delegates.glReplacementCodeubvSUN((Byte*)code_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeubvSUN(IntPtr code)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeubvSUN((Byte*)code);
+            }
+        }
+
+        public static 
+        void glReplacementCodePointerSUN(int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodePointerSUN((int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glReplacementCodePointerSUN(int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glReplacementCodePointerSUN((int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glColor4ubVertex2fSUN(Byte r, Byte g, Byte b, Byte a, Single x, Single y)
+        {
+            Delegates.glColor4ubVertex2fSUN((Byte)r, (Byte)g, (Byte)b, (Byte)a, (Single)x, (Single)y);
+        }
+
+        public static 
+        void glColor4ubVertex2fvSUN(Byte[] c, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* c_ptr = c)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glColor4ubVertex2fvSUN((Byte*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4ubVertex2fvSUN(ref Byte c, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Byte* c_ptr = &c)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glColor4ubVertex2fvSUN((Byte*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4ubVertex2fvSUN(IntPtr c, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4ubVertex2fvSUN((Byte*)c, (Single*)v);
+            }
+        }
+
+        public static 
+        void glColor4ubVertex3fSUN(Byte r, Byte g, Byte b, Byte a, Single x, Single y, Single z)
+        {
+            Delegates.glColor4ubVertex3fSUN((Byte)r, (Byte)g, (Byte)b, (Byte)a, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glColor4ubVertex3fvSUN(Byte[] c, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* c_ptr = c)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glColor4ubVertex3fvSUN((Byte*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4ubVertex3fvSUN(ref Byte c, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Byte* c_ptr = &c)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glColor4ubVertex3fvSUN((Byte*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4ubVertex3fvSUN(IntPtr c, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4ubVertex3fvSUN((Byte*)c, (Single*)v);
+            }
+        }
+
+        public static 
+        void glColor3fVertex3fSUN(Single r, Single g, Single b, Single x, Single y, Single z)
+        {
+            Delegates.glColor3fVertex3fSUN((Single)r, (Single)g, (Single)b, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glColor3fVertex3fvSUN(Single[] c, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* c_ptr = c)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glColor3fVertex3fvSUN((Single*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3fVertex3fvSUN(ref Single c, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* c_ptr = &c)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glColor3fVertex3fvSUN((Single*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3fVertex3fvSUN(IntPtr c, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor3fVertex3fvSUN((Single*)c, (Single*)v);
+            }
+        }
+
+        public static 
+        void glNormal3fVertex3fSUN(Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glNormal3fVertex3fSUN((Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glNormal3fVertex3fvSUN(Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glNormal3fVertex3fvSUN((Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3fVertex3fvSUN(ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glNormal3fVertex3fvSUN((Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3fVertex3fvSUN(IntPtr n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glNormal3fVertex3fvSUN((Single*)n, (Single*)v);
+            }
+        }
+
+        public static 
+        void glColor4fNormal3fVertex3fSUN(Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glColor4fNormal3fVertex3fSUN((Single)r, (Single)g, (Single)b, (Single)a, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glColor4fNormal3fVertex3fvSUN(Single[] c, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* c_ptr = c)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glColor4fNormal3fVertex3fvSUN((Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4fNormal3fVertex3fvSUN(ref Single c, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* c_ptr = &c)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glColor4fNormal3fVertex3fvSUN((Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4fNormal3fVertex3fvSUN(IntPtr c, IntPtr n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4fNormal3fVertex3fvSUN((Single*)c, (Single*)n, (Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord2fVertex3fSUN(Single s, Single t, Single x, Single y, Single z)
+        {
+            Delegates.glTexCoord2fVertex3fSUN((Single)s, (Single)t, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glTexCoord2fVertex3fvSUN(Single[] tc, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord2fVertex3fvSUN((Single*)tc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fVertex3fvSUN(ref Single tc, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2fVertex3fvSUN((Single*)tc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fVertex3fvSUN(IntPtr tc, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord2fVertex3fvSUN((Single*)tc, (Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord4fVertex4fSUN(Single s, Single t, Single p, Single q, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glTexCoord4fVertex4fSUN((Single)s, (Single)t, (Single)p, (Single)q, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glTexCoord4fVertex4fvSUN(Single[] tc, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord4fVertex4fvSUN((Single*)tc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4fVertex4fvSUN(ref Single tc, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord4fVertex4fvSUN((Single*)tc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4fVertex4fvSUN(IntPtr tc, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord4fVertex4fvSUN((Single*)tc, (Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord2fColor4ubVertex3fSUN(Single s, Single t, Byte r, Byte g, Byte b, Byte a, Single x, Single y, Single z)
+        {
+            Delegates.glTexCoord2fColor4ubVertex3fSUN((Single)s, (Single)t, (Byte)r, (Byte)g, (Byte)b, (Byte)a, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glTexCoord2fColor4ubVertex3fvSUN(Single[] tc, Byte[] c, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = tc)
+                fixed (Byte* c_ptr = c)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord2fColor4ubVertex3fvSUN((Single*)tc_ptr, (Byte*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fColor4ubVertex3fvSUN(ref Single tc, ref Byte c, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = &tc)
+                fixed (Byte* c_ptr = &c)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2fColor4ubVertex3fvSUN((Single*)tc_ptr, (Byte*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fColor4ubVertex3fvSUN(IntPtr tc, IntPtr c, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord2fColor4ubVertex3fvSUN((Single*)tc, (Byte*)c, (Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord2fColor3fVertex3fSUN(Single s, Single t, Single r, Single g, Single b, Single x, Single y, Single z)
+        {
+            Delegates.glTexCoord2fColor3fVertex3fSUN((Single)s, (Single)t, (Single)r, (Single)g, (Single)b, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glTexCoord2fColor3fVertex3fvSUN(Single[] tc, Single[] c, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* c_ptr = c)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord2fColor3fVertex3fvSUN((Single*)tc_ptr, (Single*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fColor3fVertex3fvSUN(ref Single tc, ref Single c, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* c_ptr = &c)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2fColor3fVertex3fvSUN((Single*)tc_ptr, (Single*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fColor3fVertex3fvSUN(IntPtr tc, IntPtr c, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord2fColor3fVertex3fvSUN((Single*)tc, (Single*)c, (Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord2fNormal3fVertex3fSUN(Single s, Single t, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glTexCoord2fNormal3fVertex3fSUN((Single)s, (Single)t, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glTexCoord2fNormal3fVertex3fvSUN(Single[] tc, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord2fNormal3fVertex3fvSUN((Single*)tc_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fNormal3fVertex3fvSUN(ref Single tc, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2fNormal3fVertex3fvSUN((Single*)tc_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fNormal3fVertex3fvSUN(IntPtr tc, IntPtr n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord2fNormal3fVertex3fvSUN((Single*)tc, (Single*)n, (Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord2fColor4fNormal3fVertex3fSUN(Single s, Single t, Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glTexCoord2fColor4fNormal3fVertex3fSUN((Single)s, (Single)t, (Single)r, (Single)g, (Single)b, (Single)a, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glTexCoord2fColor4fNormal3fVertex3fvSUN(Single[] tc, Single[] c, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* c_ptr = c)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord2fColor4fNormal3fVertex3fvSUN((Single*)tc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fColor4fNormal3fVertex3fvSUN(ref Single tc, ref Single c, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* c_ptr = &c)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2fColor4fNormal3fVertex3fvSUN((Single*)tc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2fColor4fNormal3fVertex3fvSUN(IntPtr tc, IntPtr c, IntPtr n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord2fColor4fNormal3fVertex3fvSUN((Single*)tc, (Single*)c, (Single*)n, (Single*)v);
+            }
+        }
+
+        public static 
+        void glTexCoord4fColor4fNormal3fVertex4fSUN(Single s, Single t, Single p, Single q, Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glTexCoord4fColor4fNormal3fVertex4fSUN((Single)s, (Single)t, (Single)p, (Single)q, (Single)r, (Single)g, (Single)b, (Single)a, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glTexCoord4fColor4fNormal3fVertex4fvSUN(Single[] tc, Single[] c, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* c_ptr = c)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glTexCoord4fColor4fNormal3fVertex4fvSUN((Single*)tc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4fColor4fNormal3fVertex4fvSUN(ref Single tc, ref Single c, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* c_ptr = &c)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glTexCoord4fColor4fNormal3fVertex4fvSUN((Single*)tc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4fColor4fNormal3fVertex4fvSUN(IntPtr tc, IntPtr c, IntPtr n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord4fColor4fNormal3fVertex4fvSUN((Single*)tc, (Single*)c, (Single*)n, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiVertex3fSUN(UInt32 rc, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiVertex3fSUN((UInt32)rc, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glReplacementCodeuiVertex3fSUN(Int32 rc, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiVertex3fSUN((UInt32)rc, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiVertex3fvSUN(UInt32[] rc, Single[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = rc)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiVertex3fvSUN((UInt32*)rc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiVertex3fvSUN(Int32[] rc, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = rc)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiVertex3fvSUN((UInt32*)rc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiVertex3fvSUN(ref UInt32 rc, ref Single v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = &rc)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiVertex3fvSUN((UInt32*)rc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiVertex3fvSUN(ref Int32 rc, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = &rc)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiVertex3fvSUN((UInt32*)rc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiVertex3fvSUN(IntPtr rc, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeuiVertex3fvSUN((UInt32*)rc, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiColor4ubVertex3fSUN(UInt32 rc, Byte r, Byte g, Byte b, Byte a, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiColor4ubVertex3fSUN((UInt32)rc, (Byte)r, (Byte)g, (Byte)b, (Byte)a, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glReplacementCodeuiColor4ubVertex3fSUN(Int32 rc, Byte r, Byte g, Byte b, Byte a, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiColor4ubVertex3fSUN((UInt32)rc, (Byte)r, (Byte)g, (Byte)b, (Byte)a, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiColor4ubVertex3fvSUN(UInt32[] rc, Byte[] c, Single[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = rc)
+                fixed (Byte* c_ptr = c)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiColor4ubVertex3fvSUN((UInt32*)rc_ptr, (Byte*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiColor4ubVertex3fvSUN(Int32[] rc, Byte[] c, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = rc)
+                fixed (Byte* c_ptr = c)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiColor4ubVertex3fvSUN((UInt32*)rc_ptr, (Byte*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiColor4ubVertex3fvSUN(ref UInt32 rc, ref Byte c, ref Single v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = &rc)
+                fixed (Byte* c_ptr = &c)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiColor4ubVertex3fvSUN((UInt32*)rc_ptr, (Byte*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiColor4ubVertex3fvSUN(ref Int32 rc, ref Byte c, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = &rc)
+                fixed (Byte* c_ptr = &c)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiColor4ubVertex3fvSUN((UInt32*)rc_ptr, (Byte*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiColor4ubVertex3fvSUN(IntPtr rc, IntPtr c, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeuiColor4ubVertex3fvSUN((UInt32*)rc, (Byte*)c, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiColor3fVertex3fSUN(UInt32 rc, Single r, Single g, Single b, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiColor3fVertex3fSUN((UInt32)rc, (Single)r, (Single)g, (Single)b, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glReplacementCodeuiColor3fVertex3fSUN(Int32 rc, Single r, Single g, Single b, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiColor3fVertex3fSUN((UInt32)rc, (Single)r, (Single)g, (Single)b, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiColor3fVertex3fvSUN(UInt32[] rc, Single[] c, Single[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = rc)
+                fixed (Single* c_ptr = c)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiColor3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiColor3fVertex3fvSUN(Int32[] rc, Single[] c, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = rc)
+                fixed (Single* c_ptr = c)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiColor3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiColor3fVertex3fvSUN(ref UInt32 rc, ref Single c, ref Single v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = &rc)
+                fixed (Single* c_ptr = &c)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiColor3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiColor3fVertex3fvSUN(ref Int32 rc, ref Single c, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = &rc)
+                fixed (Single* c_ptr = &c)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiColor3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)c_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiColor3fVertex3fvSUN(IntPtr rc, IntPtr c, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeuiColor3fVertex3fvSUN((UInt32*)rc, (Single*)c, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiNormal3fVertex3fSUN(UInt32 rc, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiNormal3fVertex3fSUN((UInt32)rc, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glReplacementCodeuiNormal3fVertex3fSUN(Int32 rc, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiNormal3fVertex3fSUN((UInt32)rc, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiNormal3fVertex3fvSUN(UInt32[] rc, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = rc)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiNormal3fVertex3fvSUN(Int32[] rc, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = rc)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiNormal3fVertex3fvSUN(ref UInt32 rc, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = &rc)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiNormal3fVertex3fvSUN(ref Int32 rc, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = &rc)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiNormal3fVertex3fvSUN(IntPtr rc, IntPtr n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeuiNormal3fVertex3fvSUN((UInt32*)rc, (Single*)n, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiColor4fNormal3fVertex3fSUN(UInt32 rc, Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiColor4fNormal3fVertex3fSUN((UInt32)rc, (Single)r, (Single)g, (Single)b, (Single)a, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glReplacementCodeuiColor4fNormal3fVertex3fSUN(Int32 rc, Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiColor4fNormal3fVertex3fSUN((UInt32)rc, (Single)r, (Single)g, (Single)b, (Single)a, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiColor4fNormal3fVertex3fvSUN(UInt32[] rc, Single[] c, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = rc)
+                fixed (Single* c_ptr = c)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiColor4fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiColor4fNormal3fVertex3fvSUN(Int32[] rc, Single[] c, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = rc)
+                fixed (Single* c_ptr = c)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiColor4fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiColor4fNormal3fVertex3fvSUN(ref UInt32 rc, ref Single c, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = &rc)
+                fixed (Single* c_ptr = &c)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiColor4fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiColor4fNormal3fVertex3fvSUN(ref Int32 rc, ref Single c, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = &rc)
+                fixed (Single* c_ptr = &c)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiColor4fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiColor4fNormal3fVertex3fvSUN(IntPtr rc, IntPtr c, IntPtr n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeuiColor4fNormal3fVertex3fvSUN((UInt32*)rc, (Single*)c, (Single*)n, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiTexCoord2fVertex3fSUN(UInt32 rc, Single s, Single t, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiTexCoord2fVertex3fSUN((UInt32)rc, (Single)s, (Single)t, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fVertex3fSUN(Int32 rc, Single s, Single t, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiTexCoord2fVertex3fSUN((UInt32)rc, (Single)s, (Single)t, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiTexCoord2fVertex3fvSUN(UInt32[] rc, Single[] tc, Single[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = rc)
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fVertex3fvSUN(Int32[] rc, Single[] tc, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = rc)
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiTexCoord2fVertex3fvSUN(ref UInt32 rc, ref Single tc, ref Single v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = &rc)
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fVertex3fvSUN(ref Int32 rc, ref Single tc, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = &rc)
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fVertex3fvSUN(IntPtr rc, IntPtr tc, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeuiTexCoord2fVertex3fvSUN((UInt32*)rc, (Single*)tc, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(UInt32 rc, Single s, Single t, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN((UInt32)rc, (Single)s, (Single)t, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(Int32 rc, Single s, Single t, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN((UInt32)rc, (Single)s, (Single)t, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(UInt32[] rc, Single[] tc, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = rc)
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(Int32[] rc, Single[] tc, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = rc)
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(ref UInt32 rc, ref Single tc, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = &rc)
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(ref Int32 rc, ref Single tc, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = &rc)
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(IntPtr rc, IntPtr tc, IntPtr n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN((UInt32*)rc, (Single*)tc, (Single*)n, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(UInt32 rc, Single s, Single t, Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN((UInt32)rc, (Single)s, (Single)t, (Single)r, (Single)g, (Single)b, (Single)a, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(Int32 rc, Single s, Single t, Single r, Single g, Single b, Single a, Single nx, Single ny, Single nz, Single x, Single y, Single z)
+        {
+            Delegates.glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN((UInt32)rc, (Single)s, (Single)t, (Single)r, (Single)g, (Single)b, (Single)a, (Single)nx, (Single)ny, (Single)nz, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(UInt32[] rc, Single[] tc, Single[] c, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = rc)
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* c_ptr = c)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(Int32[] rc, Single[] tc, Single[] c, Single[] n, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = rc)
+                fixed (Single* tc_ptr = tc)
+                fixed (Single* c_ptr = c)
+                fixed (Single* n_ptr = n)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(ref UInt32 rc, ref Single tc, ref Single c, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (UInt32* rc_ptr = &rc)
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* c_ptr = &c)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(ref Int32 rc, ref Single tc, ref Single c, ref Single n, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Int32* rc_ptr = &rc)
+                fixed (Single* tc_ptr = &tc)
+                fixed (Single* c_ptr = &c)
+                fixed (Single* n_ptr = &n)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN((UInt32*)rc_ptr, (Single*)tc_ptr, (Single*)c_ptr, (Single*)n_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(IntPtr rc, IntPtr tc, IntPtr c, IntPtr n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN((UInt32*)rc, (Single*)tc, (Single*)c, (Single*)n, (Single*)v);
+            }
+        }
+
+        public static 
+        void glDrawMeshArraysSUN(int mode, Int32 first, Int32 count, Int32 width)
+        {
+            Delegates.glDrawMeshArraysSUN((int)mode, (Int32)first, (Int32)count, (Int32)width);
+        }
+
+        public static 
+        void glBlendFuncSeparateINGR(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha)
+        {
+            Delegates.glBlendFuncSeparateINGR((int)sfactorRGB, (int)dfactorRGB, (int)sfactorAlpha, (int)dfactorAlpha);
+        }
+
+        public static 
+        void glFlushVertexArrayRangeNV()
+        {
+            Delegates.glFlushVertexArrayRangeNV();
+        }
+
+        public static 
+        void glVertexArrayRangeNV(Int32 length, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexArrayRangeNV((Int32)length, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glVertexArrayRangeNV(Int32 length, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexArrayRangeNV((Int32)length, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glCombinerParameterfvNV(int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glCombinerParameterfvNV((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glCombinerParameterfvNV(int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glCombinerParameterfvNV((int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glCombinerParameterfvNV(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glCombinerParameterfvNV((int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glCombinerParameterfNV(int pname, Single param)
+        {
+            Delegates.glCombinerParameterfNV((int)pname, (Single)param);
+        }
+
+        public static 
+        void glCombinerParameterivNV(int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glCombinerParameterivNV((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glCombinerParameterivNV(int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glCombinerParameterivNV((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glCombinerParameterivNV(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glCombinerParameterivNV((int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glCombinerParameteriNV(int pname, Int32 param)
+        {
+            Delegates.glCombinerParameteriNV((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glCombinerInputNV(int stage, int portion, int variable, int input, int mapping, int componentUsage)
+        {
+            Delegates.glCombinerInputNV((int)stage, (int)portion, (int)variable, (int)input, (int)mapping, (int)componentUsage);
+        }
+
+        public static 
+        void glCombinerOutputNV(int stage, int portion, int abOutput, int cdOutput, int sumOutput, int scale, int bias, bool abDotProduct, bool cdDotProduct, bool muxSum)
+        {
+            Delegates.glCombinerOutputNV((int)stage, (int)portion, (int)abOutput, (int)cdOutput, (int)sumOutput, (int)scale, (int)bias, (bool)abDotProduct, (bool)cdDotProduct, (bool)muxSum);
+        }
+
+        public static 
+        void glFinalCombinerInputNV(int variable, int input, int mapping, int componentUsage)
+        {
+            Delegates.glFinalCombinerInputNV((int)variable, (int)input, (int)mapping, (int)componentUsage);
+        }
+
+        public static 
+        void glGetCombinerInputParameterfvNV(int stage, int portion, int variable, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetCombinerInputParameterfvNV((int)stage, (int)portion, (int)variable, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetCombinerInputParameterfvNV(int stage, int portion, int variable, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetCombinerInputParameterfvNV((int)stage, (int)portion, (int)variable, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetCombinerInputParameterfvNV(int stage, int portion, int variable, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetCombinerInputParameterfvNV((int)stage, (int)portion, (int)variable, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetCombinerInputParameterivNV(int stage, int portion, int variable, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetCombinerInputParameterivNV((int)stage, (int)portion, (int)variable, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetCombinerInputParameterivNV(int stage, int portion, int variable, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetCombinerInputParameterivNV((int)stage, (int)portion, (int)variable, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetCombinerInputParameterivNV(int stage, int portion, int variable, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetCombinerInputParameterivNV((int)stage, (int)portion, (int)variable, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetCombinerOutputParameterfvNV(int stage, int portion, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetCombinerOutputParameterfvNV((int)stage, (int)portion, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetCombinerOutputParameterfvNV(int stage, int portion, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetCombinerOutputParameterfvNV((int)stage, (int)portion, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetCombinerOutputParameterfvNV(int stage, int portion, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetCombinerOutputParameterfvNV((int)stage, (int)portion, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetCombinerOutputParameterivNV(int stage, int portion, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetCombinerOutputParameterivNV((int)stage, (int)portion, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetCombinerOutputParameterivNV(int stage, int portion, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetCombinerOutputParameterivNV((int)stage, (int)portion, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetCombinerOutputParameterivNV(int stage, int portion, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetCombinerOutputParameterivNV((int)stage, (int)portion, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetFinalCombinerInputParameterfvNV(int variable, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetFinalCombinerInputParameterfvNV((int)variable, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetFinalCombinerInputParameterfvNV(int variable, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetFinalCombinerInputParameterfvNV((int)variable, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetFinalCombinerInputParameterfvNV(int variable, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetFinalCombinerInputParameterfvNV((int)variable, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetFinalCombinerInputParameterivNV(int variable, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetFinalCombinerInputParameterivNV((int)variable, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetFinalCombinerInputParameterivNV(int variable, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetFinalCombinerInputParameterivNV((int)variable, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetFinalCombinerInputParameterivNV(int variable, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetFinalCombinerInputParameterivNV((int)variable, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteFencesNV(Int32 n, UInt32[] fences)
+        {
+            unsafe
+            {
+                fixed (UInt32* fences_ptr = fences)
+                {
+                    Delegates.glDeleteFencesNV((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteFencesNV(Int32 n, Int32[] fences)
+        {
+            unsafe
+            {
+                fixed (Int32* fences_ptr = fences)
+                {
+                    Delegates.glDeleteFencesNV((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteFencesNV(Int32 n, ref UInt32 fences)
+        {
+            unsafe
+            {
+                fixed (UInt32* fences_ptr = &fences)
+                {
+                    Delegates.glDeleteFencesNV((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteFencesNV(Int32 n, ref Int32 fences)
+        {
+            unsafe
+            {
+                fixed (Int32* fences_ptr = &fences)
+                {
+                    Delegates.glDeleteFencesNV((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteFencesNV(Int32 n, IntPtr fences)
+        {
+            unsafe
+            {
+                Delegates.glDeleteFencesNV((Int32)n, (UInt32*)fences);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenFencesNV(Int32 n, [Out] UInt32[] fences)
+        {
+            unsafe
+            {
+                fixed (UInt32* fences_ptr = fences)
+                {
+                    Delegates.glGenFencesNV((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenFencesNV(Int32 n, [Out] Int32[] fences)
+        {
+            unsafe
+            {
+                fixed (Int32* fences_ptr = fences)
+                {
+                    Delegates.glGenFencesNV((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenFencesNV(Int32 n, [Out] out UInt32 fences)
+        {
+            unsafe
+            {
+                fixed (UInt32* fences_ptr = &fences)
+                {
+                    Delegates.glGenFencesNV((Int32)n, (UInt32*)fences_ptr);
+                    fences = *fences_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenFencesNV(Int32 n, [Out] out Int32 fences)
+        {
+            unsafe
+            {
+                fixed (Int32* fences_ptr = &fences)
+                {
+                    Delegates.glGenFencesNV((Int32)n, (UInt32*)fences_ptr);
+                    fences = *fences_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenFencesNV(Int32 n, [Out] IntPtr fences)
+        {
+            unsafe
+            {
+                Delegates.glGenFencesNV((Int32)n, (UInt32*)fences);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsFenceNV(UInt32 fence)
+        {
+            return Delegates.glIsFenceNV((UInt32)fence);
+        }
+
+        public static 
+        bool glIsFenceNV(Int32 fence)
+        {
+            return Delegates.glIsFenceNV((UInt32)fence);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glTestFenceNV(UInt32 fence)
+        {
+            return Delegates.glTestFenceNV((UInt32)fence);
+        }
+
+        public static 
+        bool glTestFenceNV(Int32 fence)
+        {
+            return Delegates.glTestFenceNV((UInt32)fence);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetFenceivNV(UInt32 fence, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetFenceivNV((UInt32)fence, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetFenceivNV(Int32 fence, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetFenceivNV((UInt32)fence, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetFenceivNV(UInt32 fence, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetFenceivNV((UInt32)fence, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetFenceivNV(Int32 fence, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetFenceivNV((UInt32)fence, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetFenceivNV(UInt32 fence, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetFenceivNV((UInt32)fence, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetFenceivNV(Int32 fence, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetFenceivNV((UInt32)fence, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFinishFenceNV(UInt32 fence)
+        {
+            Delegates.glFinishFenceNV((UInt32)fence);
+        }
+
+        public static 
+        void glFinishFenceNV(Int32 fence)
+        {
+            Delegates.glFinishFenceNV((UInt32)fence);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSetFenceNV(UInt32 fence, int condition)
+        {
+            Delegates.glSetFenceNV((UInt32)fence, (int)condition);
+        }
+
+        public static 
+        void glSetFenceNV(Int32 fence, int condition)
+        {
+            Delegates.glSetFenceNV((UInt32)fence, (int)condition);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMapControlPointsNV(int target, UInt32 index, int type, Int32 ustride, Int32 vstride, Int32 uorder, Int32 vorder, bool packed, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glMapControlPointsNV((int)target, (UInt32)index, (int)type, (Int32)ustride, (Int32)vstride, (Int32)uorder, (Int32)vorder, (bool)packed, (IntPtr)points);
+            }
+        }
+
+        public static 
+        void glMapControlPointsNV(int target, Int32 index, int type, Int32 ustride, Int32 vstride, Int32 uorder, Int32 vorder, bool packed, IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glMapControlPointsNV((int)target, (UInt32)index, (int)type, (Int32)ustride, (Int32)vstride, (Int32)uorder, (Int32)vorder, (bool)packed, (IntPtr)points);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMapControlPointsNV(int target, UInt32 index, int type, Int32 ustride, Int32 vstride, Int32 uorder, Int32 vorder, bool packed, [In, Out] object points)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle points_ptr = System.Runtime.InteropServices.GCHandle.Alloc(points, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glMapControlPointsNV((int)target, (UInt32)index, (int)type, (Int32)ustride, (Int32)vstride, (Int32)uorder, (Int32)vorder, (bool)packed, (IntPtr)points_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    points_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glMapControlPointsNV(int target, Int32 index, int type, Int32 ustride, Int32 vstride, Int32 uorder, Int32 vorder, bool packed, [In, Out] object points)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle points_ptr = System.Runtime.InteropServices.GCHandle.Alloc(points, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glMapControlPointsNV((int)target, (UInt32)index, (int)type, (Int32)ustride, (Int32)vstride, (Int32)uorder, (Int32)vorder, (bool)packed, (IntPtr)points_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    points_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glMapParameterivNV(int target, int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glMapParameterivNV((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMapParameterivNV(int target, int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glMapParameterivNV((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMapParameterivNV(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glMapParameterivNV((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glMapParameterfvNV(int target, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glMapParameterfvNV((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMapParameterfvNV(int target, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glMapParameterfvNV((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMapParameterfvNV(int target, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glMapParameterfvNV((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetMapControlPointsNV(int target, UInt32 index, int type, Int32 ustride, Int32 vstride, bool packed, [Out] IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glGetMapControlPointsNV((int)target, (UInt32)index, (int)type, (Int32)ustride, (Int32)vstride, (bool)packed, (IntPtr)points);
+            }
+        }
+
+        public static 
+        void glGetMapControlPointsNV(int target, Int32 index, int type, Int32 ustride, Int32 vstride, bool packed, [Out] IntPtr points)
+        {
+            unsafe
+            {
+                Delegates.glGetMapControlPointsNV((int)target, (UInt32)index, (int)type, (Int32)ustride, (Int32)vstride, (bool)packed, (IntPtr)points);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetMapControlPointsNV(int target, UInt32 index, int type, Int32 ustride, Int32 vstride, bool packed, [In, Out] object points)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle points_ptr = System.Runtime.InteropServices.GCHandle.Alloc(points, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetMapControlPointsNV((int)target, (UInt32)index, (int)type, (Int32)ustride, (Int32)vstride, (bool)packed, (IntPtr)points_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    points_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetMapControlPointsNV(int target, Int32 index, int type, Int32 ustride, Int32 vstride, bool packed, [In, Out] object points)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle points_ptr = System.Runtime.InteropServices.GCHandle.Alloc(points, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetMapControlPointsNV((int)target, (UInt32)index, (int)type, (Int32)ustride, (Int32)vstride, (bool)packed, (IntPtr)points_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    points_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetMapParameterivNV(int target, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetMapParameterivNV((int)target, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMapParameterivNV(int target, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetMapParameterivNV((int)target, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMapParameterivNV(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMapParameterivNV((int)target, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetMapParameterfvNV(int target, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetMapParameterfvNV((int)target, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMapParameterfvNV(int target, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetMapParameterfvNV((int)target, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMapParameterfvNV(int target, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMapParameterfvNV((int)target, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetMapAttribParameterivNV(int target, UInt32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetMapAttribParameterivNV((int)target, (UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMapAttribParameterivNV(int target, Int32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetMapAttribParameterivNV((int)target, (UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetMapAttribParameterivNV(int target, UInt32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetMapAttribParameterivNV((int)target, (UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMapAttribParameterivNV(int target, Int32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetMapAttribParameterivNV((int)target, (UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetMapAttribParameterivNV(int target, UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMapAttribParameterivNV((int)target, (UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetMapAttribParameterivNV(int target, Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMapAttribParameterivNV((int)target, (UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetMapAttribParameterfvNV(int target, UInt32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetMapAttribParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetMapAttribParameterfvNV(int target, Int32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetMapAttribParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetMapAttribParameterfvNV(int target, UInt32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetMapAttribParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetMapAttribParameterfvNV(int target, Int32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetMapAttribParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetMapAttribParameterfvNV(int target, UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMapAttribParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetMapAttribParameterfvNV(int target, Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetMapAttribParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glEvalMapsNV(int target, int mode)
+        {
+            Delegates.glEvalMapsNV((int)target, (int)mode);
+        }
+
+        public static 
+        void glCombinerStageParameterfvNV(int stage, int pname, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glCombinerStageParameterfvNV((int)stage, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glCombinerStageParameterfvNV(int stage, int pname, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glCombinerStageParameterfvNV((int)stage, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glCombinerStageParameterfvNV(int stage, int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glCombinerStageParameterfvNV((int)stage, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetCombinerStageParameterfvNV(int stage, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetCombinerStageParameterfvNV((int)stage, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetCombinerStageParameterfvNV(int stage, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetCombinerStageParameterfvNV((int)stage, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetCombinerStageParameterfvNV(int stage, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetCombinerStageParameterfvNV((int)stage, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glAreProgramsResidentNV(Int32 n, UInt32[] programs, [Out] bool[] residences)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = programs)
+                fixed (bool* residences_ptr = residences)
+                {
+                    return Delegates.glAreProgramsResidentNV((Int32)n, (UInt32*)programs_ptr, (bool*)residences_ptr);
+                }
+            }
+        }
+
+        public static 
+        bool glAreProgramsResidentNV(Int32 n, Int32[] programs, [Out] bool[] residences)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = programs)
+                fixed (bool* residences_ptr = residences)
+                {
+                    return Delegates.glAreProgramsResidentNV((Int32)n, (UInt32*)programs_ptr, (bool*)residences_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glAreProgramsResidentNV(Int32 n, ref UInt32 programs, [Out] out bool residences)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = &programs)
+                fixed (bool* residences_ptr = &residences)
+                {
+                    bool retval = Delegates.glAreProgramsResidentNV((Int32)n, (UInt32*)programs_ptr, (bool*)residences_ptr);
+                    residences = *residences_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        bool glAreProgramsResidentNV(Int32 n, ref Int32 programs, [Out] out bool residences)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = &programs)
+                fixed (bool* residences_ptr = &residences)
+                {
+                    bool retval = Delegates.glAreProgramsResidentNV((Int32)n, (UInt32*)programs_ptr, (bool*)residences_ptr);
+                    residences = *residences_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        bool glAreProgramsResidentNV(Int32 n, IntPtr programs, [Out] IntPtr residences)
+        {
+            unsafe
+            {
+                return Delegates.glAreProgramsResidentNV((Int32)n, (UInt32*)programs, (bool*)residences);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindProgramNV(int target, UInt32 id)
+        {
+            Delegates.glBindProgramNV((int)target, (UInt32)id);
+        }
+
+        public static 
+        void glBindProgramNV(int target, Int32 id)
+        {
+            Delegates.glBindProgramNV((int)target, (UInt32)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteProgramsNV(Int32 n, UInt32[] programs)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = programs)
+                {
+                    Delegates.glDeleteProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteProgramsNV(Int32 n, Int32[] programs)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = programs)
+                {
+                    Delegates.glDeleteProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteProgramsNV(Int32 n, ref UInt32 programs)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = &programs)
+                {
+                    Delegates.glDeleteProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteProgramsNV(Int32 n, ref Int32 programs)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = &programs)
+                {
+                    Delegates.glDeleteProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteProgramsNV(Int32 n, IntPtr programs)
+        {
+            unsafe
+            {
+                Delegates.glDeleteProgramsNV((Int32)n, (UInt32*)programs);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glExecuteProgramNV(int target, UInt32 id, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glExecuteProgramNV((int)target, (UInt32)id, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glExecuteProgramNV(int target, Int32 id, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glExecuteProgramNV((int)target, (UInt32)id, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glExecuteProgramNV(int target, UInt32 id, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glExecuteProgramNV((int)target, (UInt32)id, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glExecuteProgramNV(int target, Int32 id, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glExecuteProgramNV((int)target, (UInt32)id, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glExecuteProgramNV(int target, UInt32 id, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glExecuteProgramNV((int)target, (UInt32)id, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glExecuteProgramNV(int target, Int32 id, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glExecuteProgramNV((int)target, (UInt32)id, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenProgramsNV(Int32 n, [Out] UInt32[] programs)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = programs)
+                {
+                    Delegates.glGenProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenProgramsNV(Int32 n, [Out] Int32[] programs)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = programs)
+                {
+                    Delegates.glGenProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenProgramsNV(Int32 n, [Out] out UInt32 programs)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = &programs)
+                {
+                    Delegates.glGenProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                    programs = *programs_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenProgramsNV(Int32 n, [Out] out Int32 programs)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = &programs)
+                {
+                    Delegates.glGenProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                    programs = *programs_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenProgramsNV(Int32 n, [Out] IntPtr programs)
+        {
+            unsafe
+            {
+                Delegates.glGenProgramsNV((Int32)n, (UInt32*)programs);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramParameterdvNV(int target, UInt32 index, int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramParameterdvNV((int)target, (UInt32)index, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramParameterdvNV(int target, Int32 index, int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramParameterdvNV((int)target, (UInt32)index, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramParameterdvNV(int target, UInt32 index, int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramParameterdvNV((int)target, (UInt32)index, (int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramParameterdvNV(int target, Int32 index, int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramParameterdvNV((int)target, (UInt32)index, (int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramParameterdvNV(int target, UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramParameterdvNV((int)target, (UInt32)index, (int)pname, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramParameterdvNV(int target, Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramParameterdvNV((int)target, (UInt32)index, (int)pname, (Double*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramParameterfvNV(int target, UInt32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramParameterfvNV(int target, Int32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramParameterfvNV(int target, UInt32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramParameterfvNV(int target, Int32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramParameterfvNV(int target, UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramParameterfvNV(int target, Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramParameterfvNV((int)target, (UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramivNV(UInt32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramivNV((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramivNV(Int32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramivNV((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramivNV(UInt32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramivNV((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramivNV(Int32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramivNV((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramivNV(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramivNV((UInt32)id, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramivNV(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramivNV((UInt32)id, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramStringNV(UInt32 id, int pname, [Out] Byte[] program)
+        {
+            unsafe
+            {
+                fixed (Byte* program_ptr = program)
+                {
+                    Delegates.glGetProgramStringNV((UInt32)id, (int)pname, (Byte*)program_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramStringNV(Int32 id, int pname, [Out] Byte[] program)
+        {
+            unsafe
+            {
+                fixed (Byte* program_ptr = program)
+                {
+                    Delegates.glGetProgramStringNV((UInt32)id, (int)pname, (Byte*)program_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramStringNV(UInt32 id, int pname, [Out] out Byte program)
+        {
+            unsafe
+            {
+                fixed (Byte* program_ptr = &program)
+                {
+                    Delegates.glGetProgramStringNV((UInt32)id, (int)pname, (Byte*)program_ptr);
+                    program = *program_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramStringNV(Int32 id, int pname, [Out] out Byte program)
+        {
+            unsafe
+            {
+                fixed (Byte* program_ptr = &program)
+                {
+                    Delegates.glGetProgramStringNV((UInt32)id, (int)pname, (Byte*)program_ptr);
+                    program = *program_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramStringNV(UInt32 id, int pname, [Out] IntPtr program)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramStringNV((UInt32)id, (int)pname, (Byte*)program);
+            }
+        }
+
+        public static 
+        void glGetProgramStringNV(Int32 id, int pname, [Out] IntPtr program)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramStringNV((UInt32)id, (int)pname, (Byte*)program);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetTrackMatrixivNV(int target, UInt32 address, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetTrackMatrixivNV((int)target, (UInt32)address, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTrackMatrixivNV(int target, Int32 address, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetTrackMatrixivNV((int)target, (UInt32)address, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetTrackMatrixivNV(int target, UInt32 address, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetTrackMatrixivNV((int)target, (UInt32)address, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTrackMatrixivNV(int target, Int32 address, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetTrackMatrixivNV((int)target, (UInt32)address, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetTrackMatrixivNV(int target, UInt32 address, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTrackMatrixivNV((int)target, (UInt32)address, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetTrackMatrixivNV(int target, Int32 address, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetTrackMatrixivNV((int)target, (UInt32)address, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribdvNV(UInt32 index, int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribdvNV((UInt32)index, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribdvNV(Int32 index, int pname, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribdvNV((UInt32)index, (int)pname, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribdvNV(UInt32 index, int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribdvNV((UInt32)index, (int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribdvNV(Int32 index, int pname, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribdvNV((UInt32)index, (int)pname, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribdvNV(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribdvNV((UInt32)index, (int)pname, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribdvNV(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribdvNV((UInt32)index, (int)pname, (Double*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribfvNV(UInt32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribfvNV((UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribfvNV(Int32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribfvNV((UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribfvNV(UInt32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribfvNV((UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribfvNV(Int32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribfvNV((UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribfvNV(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribfvNV((UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribfvNV(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribfvNV((UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribivNV(UInt32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribivNV((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribivNV(Int32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribivNV((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribivNV(UInt32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribivNV((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribivNV(Int32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribivNV((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribivNV(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribivNV((UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribivNV(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribivNV((UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribPointervNV(UInt32 index, int pname, [Out] IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribPointervNV((UInt32)index, (int)pname, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribPointervNV(Int32 index, int pname, [Out] IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribPointervNV((UInt32)index, (int)pname, (IntPtr)pointer);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribPointervNV(UInt32 index, int pname, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetVertexAttribPointervNV((UInt32)index, (int)pname, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribPointervNV(Int32 index, int pname, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glGetVertexAttribPointervNV((UInt32)index, (int)pname, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsProgramNV(UInt32 id)
+        {
+            return Delegates.glIsProgramNV((UInt32)id);
+        }
+
+        public static 
+        bool glIsProgramNV(Int32 id)
+        {
+            return Delegates.glIsProgramNV((UInt32)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glLoadProgramNV(int target, UInt32 id, Int32 len, Byte[] program)
+        {
+            unsafe
+            {
+                fixed (Byte* program_ptr = program)
+                {
+                    Delegates.glLoadProgramNV((int)target, (UInt32)id, (Int32)len, (Byte*)program_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadProgramNV(int target, Int32 id, Int32 len, Byte[] program)
+        {
+            unsafe
+            {
+                fixed (Byte* program_ptr = program)
+                {
+                    Delegates.glLoadProgramNV((int)target, (UInt32)id, (Int32)len, (Byte*)program_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glLoadProgramNV(int target, UInt32 id, Int32 len, ref Byte program)
+        {
+            unsafe
+            {
+                fixed (Byte* program_ptr = &program)
+                {
+                    Delegates.glLoadProgramNV((int)target, (UInt32)id, (Int32)len, (Byte*)program_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glLoadProgramNV(int target, Int32 id, Int32 len, ref Byte program)
+        {
+            unsafe
+            {
+                fixed (Byte* program_ptr = &program)
+                {
+                    Delegates.glLoadProgramNV((int)target, (UInt32)id, (Int32)len, (Byte*)program_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glLoadProgramNV(int target, UInt32 id, Int32 len, IntPtr program)
+        {
+            unsafe
+            {
+                Delegates.glLoadProgramNV((int)target, (UInt32)id, (Int32)len, (Byte*)program);
+            }
+        }
+
+        public static 
+        void glLoadProgramNV(int target, Int32 id, Int32 len, IntPtr program)
+        {
+            unsafe
+            {
+                Delegates.glLoadProgramNV((int)target, (UInt32)id, (Int32)len, (Byte*)program);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameter4dNV(int target, UInt32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glProgramParameter4dNV((int)target, (UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        public static 
+        void glProgramParameter4dNV(int target, Int32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glProgramParameter4dNV((int)target, (UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameter4dvNV(int target, UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glProgramParameter4dvNV((int)target, (UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramParameter4dvNV(int target, Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glProgramParameter4dvNV((int)target, (UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameter4dvNV(int target, UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glProgramParameter4dvNV((int)target, (UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramParameter4dvNV(int target, Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glProgramParameter4dvNV((int)target, (UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameter4dvNV(int target, UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramParameter4dvNV((int)target, (UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glProgramParameter4dvNV(int target, Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramParameter4dvNV((int)target, (UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameter4fNV(int target, UInt32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glProgramParameter4fNV((int)target, (UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glProgramParameter4fNV(int target, Int32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glProgramParameter4fNV((int)target, (UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameter4fvNV(int target, UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glProgramParameter4fvNV((int)target, (UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramParameter4fvNV(int target, Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glProgramParameter4fvNV((int)target, (UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameter4fvNV(int target, UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glProgramParameter4fvNV((int)target, (UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramParameter4fvNV(int target, Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glProgramParameter4fvNV((int)target, (UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameter4fvNV(int target, UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramParameter4fvNV((int)target, (UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glProgramParameter4fvNV(int target, Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramParameter4fvNV((int)target, (UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameters4dvNV(int target, UInt32 index, UInt32 count, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glProgramParameters4dvNV((int)target, (UInt32)index, (UInt32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramParameters4dvNV(int target, Int32 index, Int32 count, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glProgramParameters4dvNV((int)target, (UInt32)index, (UInt32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameters4dvNV(int target, UInt32 index, UInt32 count, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glProgramParameters4dvNV((int)target, (UInt32)index, (UInt32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramParameters4dvNV(int target, Int32 index, Int32 count, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glProgramParameters4dvNV((int)target, (UInt32)index, (UInt32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameters4dvNV(int target, UInt32 index, UInt32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramParameters4dvNV((int)target, (UInt32)index, (UInt32)count, (Double*)v);
+            }
+        }
+
+        public static 
+        void glProgramParameters4dvNV(int target, Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramParameters4dvNV((int)target, (UInt32)index, (UInt32)count, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameters4fvNV(int target, UInt32 index, UInt32 count, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glProgramParameters4fvNV((int)target, (UInt32)index, (UInt32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramParameters4fvNV(int target, Int32 index, Int32 count, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glProgramParameters4fvNV((int)target, (UInt32)index, (UInt32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameters4fvNV(int target, UInt32 index, UInt32 count, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glProgramParameters4fvNV((int)target, (UInt32)index, (UInt32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramParameters4fvNV(int target, Int32 index, Int32 count, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glProgramParameters4fvNV((int)target, (UInt32)index, (UInt32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramParameters4fvNV(int target, UInt32 index, UInt32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramParameters4fvNV((int)target, (UInt32)index, (UInt32)count, (Single*)v);
+            }
+        }
+
+        public static 
+        void glProgramParameters4fvNV(int target, Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramParameters4fvNV((int)target, (UInt32)index, (UInt32)count, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glRequestResidentProgramsNV(Int32 n, UInt32[] programs)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = programs)
+                {
+                    Delegates.glRequestResidentProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRequestResidentProgramsNV(Int32 n, Int32[] programs)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = programs)
+                {
+                    Delegates.glRequestResidentProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glRequestResidentProgramsNV(Int32 n, ref UInt32 programs)
+        {
+            unsafe
+            {
+                fixed (UInt32* programs_ptr = &programs)
+                {
+                    Delegates.glRequestResidentProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRequestResidentProgramsNV(Int32 n, ref Int32 programs)
+        {
+            unsafe
+            {
+                fixed (Int32* programs_ptr = &programs)
+                {
+                    Delegates.glRequestResidentProgramsNV((Int32)n, (UInt32*)programs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glRequestResidentProgramsNV(Int32 n, IntPtr programs)
+        {
+            unsafe
+            {
+                Delegates.glRequestResidentProgramsNV((Int32)n, (UInt32*)programs);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTrackMatrixNV(int target, UInt32 address, int matrix, int transform)
+        {
+            Delegates.glTrackMatrixNV((int)target, (UInt32)address, (int)matrix, (int)transform);
+        }
+
+        public static 
+        void glTrackMatrixNV(int target, Int32 address, int matrix, int transform)
+        {
+            Delegates.glTrackMatrixNV((int)target, (UInt32)address, (int)matrix, (int)transform);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribPointerNV(UInt32 index, Int32 fsize, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribPointerNV((UInt32)index, (Int32)fsize, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glVertexAttribPointerNV(Int32 index, Int32 fsize, int type, Int32 stride, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribPointerNV((UInt32)index, (Int32)fsize, (int)type, (Int32)stride, (IntPtr)pointer);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribPointerNV(UInt32 index, Int32 fsize, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexAttribPointerNV((UInt32)index, (Int32)fsize, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribPointerNV(Int32 index, Int32 fsize, int type, Int32 stride, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexAttribPointerNV((UInt32)index, (Int32)fsize, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dNV(UInt32 index, Double x)
+        {
+            Delegates.glVertexAttrib1dNV((UInt32)index, (Double)x);
+        }
+
+        public static 
+        void glVertexAttrib1dNV(Int32 index, Double x)
+        {
+            Delegates.glVertexAttrib1dNV((UInt32)index, (Double)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dvNV(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1dvNV(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dvNV(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1dvNV(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1dvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1dvNV((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib1dvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1dvNV((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fNV(UInt32 index, Single x)
+        {
+            Delegates.glVertexAttrib1fNV((UInt32)index, (Single)x);
+        }
+
+        public static 
+        void glVertexAttrib1fNV(Int32 index, Single x)
+        {
+            Delegates.glVertexAttrib1fNV((UInt32)index, (Single)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fvNV(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1fvNV(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fvNV(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1fvNV(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1fvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1fvNV((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib1fvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1fvNV((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1sNV(UInt32 index, Int16 x)
+        {
+            Delegates.glVertexAttrib1sNV((UInt32)index, (Int16)x);
+        }
+
+        public static 
+        void glVertexAttrib1sNV(Int32 index, Int16 x)
+        {
+            Delegates.glVertexAttrib1sNV((UInt32)index, (Int16)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1svNV(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1svNV(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1svNV(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1svNV(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1svNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1svNV((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib1svNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1svNV((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dNV(UInt32 index, Double x, Double y)
+        {
+            Delegates.glVertexAttrib2dNV((UInt32)index, (Double)x, (Double)y);
+        }
+
+        public static 
+        void glVertexAttrib2dNV(Int32 index, Double x, Double y)
+        {
+            Delegates.glVertexAttrib2dNV((UInt32)index, (Double)x, (Double)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dvNV(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2dvNV(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dvNV(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2dvNV(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2dvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2dvNV((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib2dvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2dvNV((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fNV(UInt32 index, Single x, Single y)
+        {
+            Delegates.glVertexAttrib2fNV((UInt32)index, (Single)x, (Single)y);
+        }
+
+        public static 
+        void glVertexAttrib2fNV(Int32 index, Single x, Single y)
+        {
+            Delegates.glVertexAttrib2fNV((UInt32)index, (Single)x, (Single)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fvNV(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2fvNV(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fvNV(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2fvNV(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2fvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2fvNV((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib2fvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2fvNV((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2sNV(UInt32 index, Int16 x, Int16 y)
+        {
+            Delegates.glVertexAttrib2sNV((UInt32)index, (Int16)x, (Int16)y);
+        }
+
+        public static 
+        void glVertexAttrib2sNV(Int32 index, Int16 x, Int16 y)
+        {
+            Delegates.glVertexAttrib2sNV((UInt32)index, (Int16)x, (Int16)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2svNV(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2svNV(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2svNV(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2svNV(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2svNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2svNV((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib2svNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2svNV((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dNV(UInt32 index, Double x, Double y, Double z)
+        {
+            Delegates.glVertexAttrib3dNV((UInt32)index, (Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glVertexAttrib3dNV(Int32 index, Double x, Double y, Double z)
+        {
+            Delegates.glVertexAttrib3dNV((UInt32)index, (Double)x, (Double)y, (Double)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dvNV(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3dvNV(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dvNV(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3dvNV(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3dvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3dvNV((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib3dvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3dvNV((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fNV(UInt32 index, Single x, Single y, Single z)
+        {
+            Delegates.glVertexAttrib3fNV((UInt32)index, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glVertexAttrib3fNV(Int32 index, Single x, Single y, Single z)
+        {
+            Delegates.glVertexAttrib3fNV((UInt32)index, (Single)x, (Single)y, (Single)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fvNV(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3fvNV(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fvNV(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3fvNV(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3fvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3fvNV((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib3fvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3fvNV((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3sNV(UInt32 index, Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glVertexAttrib3sNV((UInt32)index, (Int16)x, (Int16)y, (Int16)z);
+        }
+
+        public static 
+        void glVertexAttrib3sNV(Int32 index, Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glVertexAttrib3sNV((UInt32)index, (Int16)x, (Int16)y, (Int16)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3svNV(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3svNV(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3svNV(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3svNV(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3svNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3svNV((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib3svNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3svNV((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dNV(UInt32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glVertexAttrib4dNV((UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        public static 
+        void glVertexAttrib4dNV(Int32 index, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glVertexAttrib4dNV((UInt32)index, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dvNV(UInt32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4dvNV(Int32 index, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dvNV(UInt32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4dvNV(Int32 index, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4dvNV((UInt32)index, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4dvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4dvNV((UInt32)index, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4dvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4dvNV((UInt32)index, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fNV(UInt32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glVertexAttrib4fNV((UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glVertexAttrib4fNV(Int32 index, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glVertexAttrib4fNV((UInt32)index, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fvNV(UInt32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4fvNV(Int32 index, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fvNV(UInt32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4fvNV(Int32 index, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4fvNV((UInt32)index, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4fvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4fvNV((UInt32)index, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4fvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4fvNV((UInt32)index, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4sNV(UInt32 index, Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glVertexAttrib4sNV((UInt32)index, (Int16)x, (Int16)y, (Int16)z, (Int16)w);
+        }
+
+        public static 
+        void glVertexAttrib4sNV(Int32 index, Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glVertexAttrib4sNV((UInt32)index, (Int16)x, (Int16)y, (Int16)z, (Int16)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4svNV(UInt32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4svNV(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4svNV(UInt32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4svNV(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4svNV((UInt32)index, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4svNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4svNV((UInt32)index, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4svNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4svNV((UInt32)index, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ubNV(UInt32 index, Byte x, Byte y, Byte z, Byte w)
+        {
+            Delegates.glVertexAttrib4ubNV((UInt32)index, (Byte)x, (Byte)y, (Byte)z, (Byte)w);
+        }
+
+        public static 
+        void glVertexAttrib4ubNV(Int32 index, Byte x, Byte y, Byte z, Byte w)
+        {
+            Delegates.glVertexAttrib4ubNV((UInt32)index, (Byte)x, (Byte)y, (Byte)z, (Byte)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ubvNV(UInt32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4ubvNV((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ubvNV(Int32 index, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4ubvNV((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ubvNV(UInt32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4ubvNV((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ubvNV(Int32 index, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4ubvNV((UInt32)index, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4ubvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4ubvNV((UInt32)index, (Byte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4ubvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4ubvNV((UInt32)index, (Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1dvNV(UInt32 index, Int32 count, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs1dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs1dvNV(Int32 index, Int32 count, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs1dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1dvNV(UInt32 index, Int32 count, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs1dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs1dvNV(Int32 index, Int32 count, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs1dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1dvNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs1dvNV((UInt32)index, (Int32)count, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs1dvNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs1dvNV((UInt32)index, (Int32)count, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1fvNV(UInt32 index, Int32 count, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs1fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs1fvNV(Int32 index, Int32 count, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs1fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1fvNV(UInt32 index, Int32 count, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs1fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs1fvNV(Int32 index, Int32 count, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs1fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1fvNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs1fvNV((UInt32)index, (Int32)count, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs1fvNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs1fvNV((UInt32)index, (Int32)count, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1svNV(UInt32 index, Int32 count, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs1svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs1svNV(Int32 index, Int32 count, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs1svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1svNV(UInt32 index, Int32 count, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs1svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs1svNV(Int32 index, Int32 count, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs1svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1svNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs1svNV((UInt32)index, (Int32)count, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs1svNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs1svNV((UInt32)index, (Int32)count, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2dvNV(UInt32 index, Int32 count, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs2dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs2dvNV(Int32 index, Int32 count, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs2dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2dvNV(UInt32 index, Int32 count, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs2dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs2dvNV(Int32 index, Int32 count, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs2dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2dvNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs2dvNV((UInt32)index, (Int32)count, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs2dvNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs2dvNV((UInt32)index, (Int32)count, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2fvNV(UInt32 index, Int32 count, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs2fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs2fvNV(Int32 index, Int32 count, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs2fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2fvNV(UInt32 index, Int32 count, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs2fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs2fvNV(Int32 index, Int32 count, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs2fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2fvNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs2fvNV((UInt32)index, (Int32)count, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs2fvNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs2fvNV((UInt32)index, (Int32)count, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2svNV(UInt32 index, Int32 count, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs2svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs2svNV(Int32 index, Int32 count, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs2svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2svNV(UInt32 index, Int32 count, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs2svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs2svNV(Int32 index, Int32 count, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs2svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2svNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs2svNV((UInt32)index, (Int32)count, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs2svNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs2svNV((UInt32)index, (Int32)count, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3dvNV(UInt32 index, Int32 count, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs3dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs3dvNV(Int32 index, Int32 count, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs3dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3dvNV(UInt32 index, Int32 count, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs3dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs3dvNV(Int32 index, Int32 count, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs3dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3dvNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs3dvNV((UInt32)index, (Int32)count, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs3dvNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs3dvNV((UInt32)index, (Int32)count, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3fvNV(UInt32 index, Int32 count, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs3fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs3fvNV(Int32 index, Int32 count, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs3fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3fvNV(UInt32 index, Int32 count, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs3fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs3fvNV(Int32 index, Int32 count, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs3fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3fvNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs3fvNV((UInt32)index, (Int32)count, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs3fvNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs3fvNV((UInt32)index, (Int32)count, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3svNV(UInt32 index, Int32 count, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs3svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs3svNV(Int32 index, Int32 count, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs3svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3svNV(UInt32 index, Int32 count, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs3svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs3svNV(Int32 index, Int32 count, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs3svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3svNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs3svNV((UInt32)index, (Int32)count, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs3svNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs3svNV((UInt32)index, (Int32)count, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4dvNV(UInt32 index, Int32 count, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs4dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs4dvNV(Int32 index, Int32 count, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs4dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4dvNV(UInt32 index, Int32 count, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs4dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs4dvNV(Int32 index, Int32 count, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs4dvNV((UInt32)index, (Int32)count, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4dvNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs4dvNV((UInt32)index, (Int32)count, (Double*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs4dvNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs4dvNV((UInt32)index, (Int32)count, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4fvNV(UInt32 index, Int32 count, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs4fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs4fvNV(Int32 index, Int32 count, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs4fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4fvNV(UInt32 index, Int32 count, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs4fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs4fvNV(Int32 index, Int32 count, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs4fvNV((UInt32)index, (Int32)count, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4fvNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs4fvNV((UInt32)index, (Int32)count, (Single*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs4fvNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs4fvNV((UInt32)index, (Int32)count, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4svNV(UInt32 index, Int32 count, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs4svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs4svNV(Int32 index, Int32 count, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs4svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4svNV(UInt32 index, Int32 count, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs4svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs4svNV(Int32 index, Int32 count, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs4svNV((UInt32)index, (Int32)count, (Int16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4svNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs4svNV((UInt32)index, (Int32)count, (Int16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs4svNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs4svNV((UInt32)index, (Int32)count, (Int16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4ubvNV(UInt32 index, Int32 count, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs4ubvNV((UInt32)index, (Int32)count, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs4ubvNV(Int32 index, Int32 count, Byte[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs4ubvNV((UInt32)index, (Int32)count, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4ubvNV(UInt32 index, Int32 count, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs4ubvNV((UInt32)index, (Int32)count, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs4ubvNV(Int32 index, Int32 count, ref Byte v)
+        {
+            unsafe
+            {
+                fixed (Byte* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs4ubvNV((UInt32)index, (Int32)count, (Byte*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4ubvNV(UInt32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs4ubvNV((UInt32)index, (Int32)count, (Byte*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs4ubvNV(Int32 index, Int32 count, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs4ubvNV((UInt32)index, (Int32)count, (Byte*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenOcclusionQueriesNV(Int32 n, [Out] UInt32[] ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = ids)
+                {
+                    Delegates.glGenOcclusionQueriesNV((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenOcclusionQueriesNV(Int32 n, [Out] Int32[] ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = ids)
+                {
+                    Delegates.glGenOcclusionQueriesNV((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenOcclusionQueriesNV(Int32 n, [Out] out UInt32 ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = &ids)
+                {
+                    Delegates.glGenOcclusionQueriesNV((Int32)n, (UInt32*)ids_ptr);
+                    ids = *ids_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenOcclusionQueriesNV(Int32 n, [Out] out Int32 ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = &ids)
+                {
+                    Delegates.glGenOcclusionQueriesNV((Int32)n, (UInt32*)ids_ptr);
+                    ids = *ids_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenOcclusionQueriesNV(Int32 n, [Out] IntPtr ids)
+        {
+            unsafe
+            {
+                Delegates.glGenOcclusionQueriesNV((Int32)n, (UInt32*)ids);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteOcclusionQueriesNV(Int32 n, UInt32[] ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = ids)
+                {
+                    Delegates.glDeleteOcclusionQueriesNV((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteOcclusionQueriesNV(Int32 n, Int32[] ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = ids)
+                {
+                    Delegates.glDeleteOcclusionQueriesNV((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteOcclusionQueriesNV(Int32 n, ref UInt32 ids)
+        {
+            unsafe
+            {
+                fixed (UInt32* ids_ptr = &ids)
+                {
+                    Delegates.glDeleteOcclusionQueriesNV((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteOcclusionQueriesNV(Int32 n, ref Int32 ids)
+        {
+            unsafe
+            {
+                fixed (Int32* ids_ptr = &ids)
+                {
+                    Delegates.glDeleteOcclusionQueriesNV((Int32)n, (UInt32*)ids_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteOcclusionQueriesNV(Int32 n, IntPtr ids)
+        {
+            unsafe
+            {
+                Delegates.glDeleteOcclusionQueriesNV((Int32)n, (UInt32*)ids);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsOcclusionQueryNV(UInt32 id)
+        {
+            return Delegates.glIsOcclusionQueryNV((UInt32)id);
+        }
+
+        public static 
+        bool glIsOcclusionQueryNV(Int32 id)
+        {
+            return Delegates.glIsOcclusionQueryNV((UInt32)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBeginOcclusionQueryNV(UInt32 id)
+        {
+            Delegates.glBeginOcclusionQueryNV((UInt32)id);
+        }
+
+        public static 
+        void glBeginOcclusionQueryNV(Int32 id)
+        {
+            Delegates.glBeginOcclusionQueryNV((UInt32)id);
+        }
+
+        public static 
+        void glEndOcclusionQueryNV()
+        {
+            Delegates.glEndOcclusionQueryNV();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetOcclusionQueryivNV(UInt32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetOcclusionQueryivNV((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetOcclusionQueryivNV(Int32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetOcclusionQueryivNV((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetOcclusionQueryivNV(UInt32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetOcclusionQueryivNV((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetOcclusionQueryivNV(Int32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetOcclusionQueryivNV((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetOcclusionQueryivNV(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetOcclusionQueryivNV((UInt32)id, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetOcclusionQueryivNV(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetOcclusionQueryivNV((UInt32)id, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetOcclusionQueryuivNV(UInt32 id, int pname, [Out] UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glGetOcclusionQueryuivNV((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetOcclusionQueryuivNV(Int32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetOcclusionQueryuivNV((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetOcclusionQueryuivNV(UInt32 id, int pname, [Out] out UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glGetOcclusionQueryuivNV((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetOcclusionQueryuivNV(Int32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetOcclusionQueryuivNV((UInt32)id, (int)pname, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetOcclusionQueryuivNV(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetOcclusionQueryuivNV((UInt32)id, (int)pname, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glGetOcclusionQueryuivNV(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetOcclusionQueryuivNV((UInt32)id, (int)pname, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glPointParameteriNV(int pname, Int32 param)
+        {
+            Delegates.glPointParameteriNV((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glPointParameterivNV(int pname, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glPointParameterivNV((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterivNV(int pname, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glPointParameterivNV((int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glPointParameterivNV(int pname, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glPointParameterivNV((int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4fNV(UInt32 id, Int32 len, Byte[] name, Single x, Single y, Single z, Single w)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                {
+                    Delegates.glProgramNamedParameter4fNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single)x, (Single)y, (Single)z, (Single)w);
+                }
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4fNV(Int32 id, Int32 len, Byte[] name, Single x, Single y, Single z, Single w)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                {
+                    Delegates.glProgramNamedParameter4fNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single)x, (Single)y, (Single)z, (Single)w);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4fNV(UInt32 id, Int32 len, ref Byte name, Single x, Single y, Single z, Single w)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                {
+                    Delegates.glProgramNamedParameter4fNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single)x, (Single)y, (Single)z, (Single)w);
+                }
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4fNV(Int32 id, Int32 len, ref Byte name, Single x, Single y, Single z, Single w)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                {
+                    Delegates.glProgramNamedParameter4fNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single)x, (Single)y, (Single)z, (Single)w);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4fNV(UInt32 id, Int32 len, IntPtr name, Single x, Single y, Single z, Single w)
+        {
+            unsafe
+            {
+                Delegates.glProgramNamedParameter4fNV((UInt32)id, (Int32)len, (Byte*)name, (Single)x, (Single)y, (Single)z, (Single)w);
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4fNV(Int32 id, Int32 len, IntPtr name, Single x, Single y, Single z, Single w)
+        {
+            unsafe
+            {
+                Delegates.glProgramNamedParameter4fNV((UInt32)id, (Int32)len, (Byte*)name, (Single)x, (Single)y, (Single)z, (Single)w);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4dNV(UInt32 id, Int32 len, Byte[] name, Double x, Double y, Double z, Double w)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                {
+                    Delegates.glProgramNamedParameter4dNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double)x, (Double)y, (Double)z, (Double)w);
+                }
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4dNV(Int32 id, Int32 len, Byte[] name, Double x, Double y, Double z, Double w)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                {
+                    Delegates.glProgramNamedParameter4dNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double)x, (Double)y, (Double)z, (Double)w);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4dNV(UInt32 id, Int32 len, ref Byte name, Double x, Double y, Double z, Double w)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                {
+                    Delegates.glProgramNamedParameter4dNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double)x, (Double)y, (Double)z, (Double)w);
+                }
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4dNV(Int32 id, Int32 len, ref Byte name, Double x, Double y, Double z, Double w)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                {
+                    Delegates.glProgramNamedParameter4dNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double)x, (Double)y, (Double)z, (Double)w);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4dNV(UInt32 id, Int32 len, IntPtr name, Double x, Double y, Double z, Double w)
+        {
+            unsafe
+            {
+                Delegates.glProgramNamedParameter4dNV((UInt32)id, (Int32)len, (Byte*)name, (Double)x, (Double)y, (Double)z, (Double)w);
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4dNV(Int32 id, Int32 len, IntPtr name, Double x, Double y, Double z, Double w)
+        {
+            unsafe
+            {
+                Delegates.glProgramNamedParameter4dNV((UInt32)id, (Int32)len, (Byte*)name, (Double)x, (Double)y, (Double)z, (Double)w);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4fvNV(UInt32 id, Int32 len, Byte[] name, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glProgramNamedParameter4fvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4fvNV(Int32 id, Int32 len, Byte[] name, Single[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glProgramNamedParameter4fvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4fvNV(UInt32 id, Int32 len, ref Byte name, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glProgramNamedParameter4fvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4fvNV(Int32 id, Int32 len, ref Byte name, ref Single v)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glProgramNamedParameter4fvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4fvNV(UInt32 id, Int32 len, IntPtr name, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramNamedParameter4fvNV((UInt32)id, (Int32)len, (Byte*)name, (Single*)v);
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4fvNV(Int32 id, Int32 len, IntPtr name, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramNamedParameter4fvNV((UInt32)id, (Int32)len, (Byte*)name, (Single*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4dvNV(UInt32 id, Int32 len, Byte[] name, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glProgramNamedParameter4dvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4dvNV(Int32 id, Int32 len, Byte[] name, Double[] v)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glProgramNamedParameter4dvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4dvNV(UInt32 id, Int32 len, ref Byte name, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glProgramNamedParameter4dvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4dvNV(Int32 id, Int32 len, ref Byte name, ref Double v)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glProgramNamedParameter4dvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramNamedParameter4dvNV(UInt32 id, Int32 len, IntPtr name, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramNamedParameter4dvNV((UInt32)id, (Int32)len, (Byte*)name, (Double*)v);
+            }
+        }
+
+        public static 
+        void glProgramNamedParameter4dvNV(Int32 id, Int32 len, IntPtr name, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glProgramNamedParameter4dvNV((UInt32)id, (Int32)len, (Byte*)name, (Double*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramNamedParameterfvNV(UInt32 id, Int32 len, Byte[] name, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramNamedParameterfvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramNamedParameterfvNV(Int32 id, Int32 len, Byte[] name, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramNamedParameterfvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramNamedParameterfvNV(UInt32 id, Int32 len, ref Byte name, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramNamedParameterfvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramNamedParameterfvNV(Int32 id, Int32 len, ref Byte name, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramNamedParameterfvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramNamedParameterfvNV(UInt32 id, Int32 len, IntPtr name, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramNamedParameterfvNV((UInt32)id, (Int32)len, (Byte*)name, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramNamedParameterfvNV(Int32 id, Int32 len, IntPtr name, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramNamedParameterfvNV((UInt32)id, (Int32)len, (Byte*)name, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramNamedParameterdvNV(UInt32 id, Int32 len, Byte[] name, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramNamedParameterdvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramNamedParameterdvNV(Int32 id, Int32 len, Byte[] name, [Out] Double[] @params)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = name)
+                fixed (Double* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramNamedParameterdvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramNamedParameterdvNV(UInt32 id, Int32 len, ref Byte name, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramNamedParameterdvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramNamedParameterdvNV(Int32 id, Int32 len, ref Byte name, [Out] out Double @params)
+        {
+            unsafe
+            {
+                fixed (Byte* name_ptr = &name)
+                fixed (Double* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramNamedParameterdvNV((UInt32)id, (Int32)len, (Byte*)name_ptr, (Double*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramNamedParameterdvNV(UInt32 id, Int32 len, IntPtr name, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramNamedParameterdvNV((UInt32)id, (Int32)len, (Byte*)name, (Double*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramNamedParameterdvNV(Int32 id, Int32 len, IntPtr name, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramNamedParameterdvNV((UInt32)id, (Int32)len, (Byte*)name, (Double*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertex2hNV(UInt16 x, UInt16 y)
+        {
+            Delegates.glVertex2hNV((UInt16)x, (UInt16)y);
+        }
+
+        public static 
+        void glVertex2hNV(Int16 x, Int16 y)
+        {
+            Delegates.glVertex2hNV((UInt16)x, (UInt16)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertex2hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertex2hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertex2hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertex2hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertex2hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertex2hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex2hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex2hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertex3hNV(UInt16 x, UInt16 y, UInt16 z)
+        {
+            Delegates.glVertex3hNV((UInt16)x, (UInt16)y, (UInt16)z);
+        }
+
+        public static 
+        void glVertex3hNV(Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glVertex3hNV((UInt16)x, (UInt16)y, (UInt16)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertex3hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertex3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertex3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertex3hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertex3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertex3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex3hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex3hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertex4hNV(UInt16 x, UInt16 y, UInt16 z, UInt16 w)
+        {
+            Delegates.glVertex4hNV((UInt16)x, (UInt16)y, (UInt16)z, (UInt16)w);
+        }
+
+        public static 
+        void glVertex4hNV(Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glVertex4hNV((UInt16)x, (UInt16)y, (UInt16)z, (UInt16)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertex4hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertex4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertex4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertex4hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertex4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertex4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertex4hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertex4hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glNormal3hNV(UInt16 nx, UInt16 ny, UInt16 nz)
+        {
+            Delegates.glNormal3hNV((UInt16)nx, (UInt16)ny, (UInt16)nz);
+        }
+
+        public static 
+        void glNormal3hNV(Int16 nx, Int16 ny, Int16 nz)
+        {
+            Delegates.glNormal3hNV((UInt16)nx, (UInt16)ny, (UInt16)nz);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glNormal3hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glNormal3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glNormal3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glNormal3hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glNormal3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glNormal3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormal3hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glNormal3hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3hNV(UInt16 red, UInt16 green, UInt16 blue)
+        {
+            Delegates.glColor3hNV((UInt16)red, (UInt16)green, (UInt16)blue);
+        }
+
+        public static 
+        void glColor3hNV(Int16 red, Int16 green, Int16 blue)
+        {
+            Delegates.glColor3hNV((UInt16)red, (UInt16)green, (UInt16)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glColor3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glColor3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor3hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glColor3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glColor3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor3hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor3hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4hNV(UInt16 red, UInt16 green, UInt16 blue, UInt16 alpha)
+        {
+            Delegates.glColor4hNV((UInt16)red, (UInt16)green, (UInt16)blue, (UInt16)alpha);
+        }
+
+        public static 
+        void glColor4hNV(Int16 red, Int16 green, Int16 blue, Int16 alpha)
+        {
+            Delegates.glColor4hNV((UInt16)red, (UInt16)green, (UInt16)blue, (UInt16)alpha);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glColor4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glColor4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColor4hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glColor4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glColor4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glColor4hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glColor4hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord1hNV(UInt16 s)
+        {
+            Delegates.glTexCoord1hNV((UInt16)s);
+        }
+
+        public static 
+        void glTexCoord1hNV(Int16 s)
+        {
+            Delegates.glTexCoord1hNV((UInt16)s);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord1hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glTexCoord1hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glTexCoord1hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord1hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord1hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord1hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord1hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord1hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord2hNV(UInt16 s, UInt16 t)
+        {
+            Delegates.glTexCoord2hNV((UInt16)s, (UInt16)t);
+        }
+
+        public static 
+        void glTexCoord2hNV(Int16 s, Int16 t)
+        {
+            Delegates.glTexCoord2hNV((UInt16)s, (UInt16)t);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord2hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glTexCoord2hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glTexCoord2hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord2hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord2hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord2hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord2hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord3hNV(UInt16 s, UInt16 t, UInt16 r)
+        {
+            Delegates.glTexCoord3hNV((UInt16)s, (UInt16)t, (UInt16)r);
+        }
+
+        public static 
+        void glTexCoord3hNV(Int16 s, Int16 t, Int16 r)
+        {
+            Delegates.glTexCoord3hNV((UInt16)s, (UInt16)t, (UInt16)r);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord3hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glTexCoord3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glTexCoord3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord3hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord3hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord3hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord4hNV(UInt16 s, UInt16 t, UInt16 r, UInt16 q)
+        {
+            Delegates.glTexCoord4hNV((UInt16)s, (UInt16)t, (UInt16)r, (UInt16)q);
+        }
+
+        public static 
+        void glTexCoord4hNV(Int16 s, Int16 t, Int16 r, Int16 q)
+        {
+            Delegates.glTexCoord4hNV((UInt16)s, (UInt16)t, (UInt16)r, (UInt16)q);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord4hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glTexCoord4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glTexCoord4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTexCoord4hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glTexCoord4hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexCoord4hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glTexCoord4hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord1hNV(int target, UInt16 s)
+        {
+            Delegates.glMultiTexCoord1hNV((int)target, (UInt16)s);
+        }
+
+        public static 
+        void glMultiTexCoord1hNV(int target, Int16 s)
+        {
+            Delegates.glMultiTexCoord1hNV((int)target, (UInt16)s);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord1hvNV(int target, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord1hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1hvNV(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord1hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord1hvNV(int target, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord1hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1hvNV(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord1hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord1hvNV(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord1hvNV((int)target, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord2hNV(int target, UInt16 s, UInt16 t)
+        {
+            Delegates.glMultiTexCoord2hNV((int)target, (UInt16)s, (UInt16)t);
+        }
+
+        public static 
+        void glMultiTexCoord2hNV(int target, Int16 s, Int16 t)
+        {
+            Delegates.glMultiTexCoord2hNV((int)target, (UInt16)s, (UInt16)t);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord2hvNV(int target, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord2hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2hvNV(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord2hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord2hvNV(int target, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord2hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2hvNV(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord2hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord2hvNV(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord2hvNV((int)target, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord3hNV(int target, UInt16 s, UInt16 t, UInt16 r)
+        {
+            Delegates.glMultiTexCoord3hNV((int)target, (UInt16)s, (UInt16)t, (UInt16)r);
+        }
+
+        public static 
+        void glMultiTexCoord3hNV(int target, Int16 s, Int16 t, Int16 r)
+        {
+            Delegates.glMultiTexCoord3hNV((int)target, (UInt16)s, (UInt16)t, (UInt16)r);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord3hvNV(int target, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord3hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3hvNV(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord3hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord3hvNV(int target, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord3hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3hvNV(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord3hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord3hvNV(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord3hvNV((int)target, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord4hNV(int target, UInt16 s, UInt16 t, UInt16 r, UInt16 q)
+        {
+            Delegates.glMultiTexCoord4hNV((int)target, (UInt16)s, (UInt16)t, (UInt16)r, (UInt16)q);
+        }
+
+        public static 
+        void glMultiTexCoord4hNV(int target, Int16 s, Int16 t, Int16 r, Int16 q)
+        {
+            Delegates.glMultiTexCoord4hNV((int)target, (UInt16)s, (UInt16)t, (UInt16)r, (UInt16)q);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord4hvNV(int target, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord4hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4hvNV(int target, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glMultiTexCoord4hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiTexCoord4hvNV(int target, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord4hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4hvNV(int target, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glMultiTexCoord4hvNV((int)target, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glMultiTexCoord4hvNV(int target, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glMultiTexCoord4hvNV((int)target, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFogCoordhNV(UInt16 fog)
+        {
+            Delegates.glFogCoordhNV((UInt16)fog);
+        }
+
+        public static 
+        void glFogCoordhNV(Int16 fog)
+        {
+            Delegates.glFogCoordhNV((UInt16)fog);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFogCoordhvNV(UInt16[] fog)
+        {
+            unsafe
+            {
+                fixed (UInt16* fog_ptr = fog)
+                {
+                    Delegates.glFogCoordhvNV((UInt16*)fog_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoordhvNV(Int16[] fog)
+        {
+            unsafe
+            {
+                fixed (Int16* fog_ptr = fog)
+                {
+                    Delegates.glFogCoordhvNV((UInt16*)fog_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFogCoordhvNV(ref UInt16 fog)
+        {
+            unsafe
+            {
+                fixed (UInt16* fog_ptr = &fog)
+                {
+                    Delegates.glFogCoordhvNV((UInt16*)fog_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoordhvNV(ref Int16 fog)
+        {
+            unsafe
+            {
+                fixed (Int16* fog_ptr = &fog)
+                {
+                    Delegates.glFogCoordhvNV((UInt16*)fog_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glFogCoordhvNV(IntPtr fog)
+        {
+            unsafe
+            {
+                Delegates.glFogCoordhvNV((UInt16*)fog);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3hNV(UInt16 red, UInt16 green, UInt16 blue)
+        {
+            Delegates.glSecondaryColor3hNV((UInt16)red, (UInt16)green, (UInt16)blue);
+        }
+
+        public static 
+        void glSecondaryColor3hNV(Int16 red, Int16 green, Int16 blue)
+        {
+            Delegates.glSecondaryColor3hNV((UInt16)red, (UInt16)green, (UInt16)blue);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3hvNV(UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3hvNV(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glSecondaryColor3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSecondaryColor3hvNV(ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3hvNV(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glSecondaryColor3hvNV((UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColor3hvNV(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColor3hvNV((UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexWeighthNV(UInt16 weight)
+        {
+            Delegates.glVertexWeighthNV((UInt16)weight);
+        }
+
+        public static 
+        void glVertexWeighthNV(Int16 weight)
+        {
+            Delegates.glVertexWeighthNV((UInt16)weight);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexWeighthvNV(UInt16[] weight)
+        {
+            unsafe
+            {
+                fixed (UInt16* weight_ptr = weight)
+                {
+                    Delegates.glVertexWeighthvNV((UInt16*)weight_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexWeighthvNV(Int16[] weight)
+        {
+            unsafe
+            {
+                fixed (Int16* weight_ptr = weight)
+                {
+                    Delegates.glVertexWeighthvNV((UInt16*)weight_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexWeighthvNV(ref UInt16 weight)
+        {
+            unsafe
+            {
+                fixed (UInt16* weight_ptr = &weight)
+                {
+                    Delegates.glVertexWeighthvNV((UInt16*)weight_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexWeighthvNV(ref Int16 weight)
+        {
+            unsafe
+            {
+                fixed (Int16* weight_ptr = &weight)
+                {
+                    Delegates.glVertexWeighthvNV((UInt16*)weight_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexWeighthvNV(IntPtr weight)
+        {
+            unsafe
+            {
+                Delegates.glVertexWeighthvNV((UInt16*)weight);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1hNV(UInt32 index, UInt16 x)
+        {
+            Delegates.glVertexAttrib1hNV((UInt32)index, (UInt16)x);
+        }
+
+        public static 
+        void glVertexAttrib1hNV(Int32 index, Int16 x)
+        {
+            Delegates.glVertexAttrib1hNV((UInt32)index, (UInt16)x);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1hvNV(UInt32 index, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1hvNV(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib1hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1hvNV(UInt32 index, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib1hvNV(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib1hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib1hvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1hvNV((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib1hvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib1hvNV((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2hNV(UInt32 index, UInt16 x, UInt16 y)
+        {
+            Delegates.glVertexAttrib2hNV((UInt32)index, (UInt16)x, (UInt16)y);
+        }
+
+        public static 
+        void glVertexAttrib2hNV(Int32 index, Int16 x, Int16 y)
+        {
+            Delegates.glVertexAttrib2hNV((UInt32)index, (UInt16)x, (UInt16)y);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2hvNV(UInt32 index, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2hvNV(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib2hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2hvNV(UInt32 index, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib2hvNV(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib2hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib2hvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2hvNV((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib2hvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib2hvNV((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3hNV(UInt32 index, UInt16 x, UInt16 y, UInt16 z)
+        {
+            Delegates.glVertexAttrib3hNV((UInt32)index, (UInt16)x, (UInt16)y, (UInt16)z);
+        }
+
+        public static 
+        void glVertexAttrib3hNV(Int32 index, Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glVertexAttrib3hNV((UInt32)index, (UInt16)x, (UInt16)y, (UInt16)z);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3hvNV(UInt32 index, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3hvNV(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib3hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3hvNV(UInt32 index, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib3hvNV(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib3hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib3hvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3hvNV((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib3hvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib3hvNV((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4hNV(UInt32 index, UInt16 x, UInt16 y, UInt16 z, UInt16 w)
+        {
+            Delegates.glVertexAttrib4hNV((UInt32)index, (UInt16)x, (UInt16)y, (UInt16)z, (UInt16)w);
+        }
+
+        public static 
+        void glVertexAttrib4hNV(Int32 index, Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glVertexAttrib4hNV((UInt32)index, (UInt16)x, (UInt16)y, (UInt16)z, (UInt16)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4hvNV(UInt32 index, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4hvNV(Int32 index, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttrib4hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4hvNV(UInt32 index, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttrib4hvNV(Int32 index, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttrib4hvNV((UInt32)index, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttrib4hvNV(UInt32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4hvNV((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttrib4hvNV(Int32 index, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttrib4hvNV((UInt32)index, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1hvNV(UInt32 index, Int32 n, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs1hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs1hvNV(Int32 index, Int32 n, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs1hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1hvNV(UInt32 index, Int32 n, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs1hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs1hvNV(Int32 index, Int32 n, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs1hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs1hvNV(UInt32 index, Int32 n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs1hvNV((UInt32)index, (Int32)n, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs1hvNV(Int32 index, Int32 n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs1hvNV((UInt32)index, (Int32)n, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2hvNV(UInt32 index, Int32 n, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs2hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs2hvNV(Int32 index, Int32 n, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs2hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2hvNV(UInt32 index, Int32 n, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs2hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs2hvNV(Int32 index, Int32 n, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs2hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs2hvNV(UInt32 index, Int32 n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs2hvNV((UInt32)index, (Int32)n, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs2hvNV(Int32 index, Int32 n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs2hvNV((UInt32)index, (Int32)n, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3hvNV(UInt32 index, Int32 n, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs3hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs3hvNV(Int32 index, Int32 n, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs3hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3hvNV(UInt32 index, Int32 n, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs3hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs3hvNV(Int32 index, Int32 n, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs3hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs3hvNV(UInt32 index, Int32 n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs3hvNV((UInt32)index, (Int32)n, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs3hvNV(Int32 index, Int32 n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs3hvNV((UInt32)index, (Int32)n, (UInt16*)v);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4hvNV(UInt32 index, Int32 n, UInt16[] v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs4hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs4hvNV(Int32 index, Int32 n, Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glVertexAttribs4hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4hvNV(UInt32 index, Int32 n, ref UInt16 v)
+        {
+            unsafe
+            {
+                fixed (UInt16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs4hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexAttribs4hvNV(Int32 index, Int32 n, ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glVertexAttribs4hvNV((UInt32)index, (Int32)n, (UInt16*)v_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribs4hvNV(UInt32 index, Int32 n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs4hvNV((UInt32)index, (Int32)n, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glVertexAttribs4hvNV(Int32 index, Int32 n, IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glVertexAttribs4hvNV((UInt32)index, (Int32)n, (UInt16*)v);
+            }
+        }
+
+        public static 
+        void glPixelDataRangeNV(int target, Int32 length, [Out] IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glPixelDataRangeNV((int)target, (Int32)length, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glPixelDataRangeNV(int target, Int32 length, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glPixelDataRangeNV((int)target, (Int32)length, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glFlushPixelDataRangeNV(int target)
+        {
+            Delegates.glFlushPixelDataRangeNV((int)target);
+        }
+
+        public static 
+        void glPrimitiveRestartNV()
+        {
+            Delegates.glPrimitiveRestartNV();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPrimitiveRestartIndexNV(UInt32 index)
+        {
+            Delegates.glPrimitiveRestartIndexNV((UInt32)index);
+        }
+
+        public static 
+        void glPrimitiveRestartIndexNV(Int32 index)
+        {
+            Delegates.glPrimitiveRestartIndexNV((UInt32)index);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameterI4iNV(int target, UInt32 index, Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glProgramLocalParameterI4iNV((int)target, (UInt32)index, (Int32)x, (Int32)y, (Int32)z, (Int32)w);
+        }
+
+        public static 
+        void glProgramLocalParameterI4iNV(int target, Int32 index, Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glProgramLocalParameterI4iNV((int)target, (UInt32)index, (Int32)x, (Int32)y, (Int32)z, (Int32)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameterI4ivNV(int target, UInt32 index, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParameterI4ivNV(int target, Int32 index, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameterI4ivNV(int target, UInt32 index, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParameterI4ivNV(int target, Int32 index, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameterI4ivNV(int target, UInt32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramLocalParameterI4ivNV(int target, Int32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParametersI4ivNV(int target, UInt32 index, Int32 count, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParametersI4ivNV(int target, Int32 index, Int32 count, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParametersI4ivNV(int target, UInt32 index, Int32 count, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParametersI4ivNV(int target, Int32 index, Int32 count, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParametersI4ivNV(int target, UInt32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramLocalParametersI4ivNV(int target, Int32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameterI4uiNV(int target, UInt32 index, UInt32 x, UInt32 y, UInt32 z, UInt32 w)
+        {
+            Delegates.glProgramLocalParameterI4uiNV((int)target, (UInt32)index, (UInt32)x, (UInt32)y, (UInt32)z, (UInt32)w);
+        }
+
+        public static 
+        void glProgramLocalParameterI4uiNV(int target, Int32 index, Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glProgramLocalParameterI4uiNV((int)target, (UInt32)index, (UInt32)x, (UInt32)y, (UInt32)z, (UInt32)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameterI4uivNV(int target, UInt32 index, UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParameterI4uivNV(int target, Int32 index, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameterI4uivNV(int target, UInt32 index, ref UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParameterI4uivNV(int target, Int32 index, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParameterI4uivNV(int target, UInt32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramLocalParameterI4uivNV(int target, Int32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParametersI4uivNV(int target, UInt32 index, Int32 count, UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParametersI4uivNV(int target, Int32 index, Int32 count, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramLocalParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParametersI4uivNV(int target, UInt32 index, Int32 count, ref UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramLocalParametersI4uivNV(int target, Int32 index, Int32 count, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramLocalParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramLocalParametersI4uivNV(int target, UInt32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramLocalParametersI4uivNV(int target, Int32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramLocalParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameterI4iNV(int target, UInt32 index, Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glProgramEnvParameterI4iNV((int)target, (UInt32)index, (Int32)x, (Int32)y, (Int32)z, (Int32)w);
+        }
+
+        public static 
+        void glProgramEnvParameterI4iNV(int target, Int32 index, Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glProgramEnvParameterI4iNV((int)target, (UInt32)index, (Int32)x, (Int32)y, (Int32)z, (Int32)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameterI4ivNV(int target, UInt32 index, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParameterI4ivNV(int target, Int32 index, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameterI4ivNV(int target, UInt32 index, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParameterI4ivNV(int target, Int32 index, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameterI4ivNV(int target, UInt32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramEnvParameterI4ivNV(int target, Int32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParameterI4ivNV((int)target, (UInt32)index, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParametersI4ivNV(int target, UInt32 index, Int32 count, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParametersI4ivNV(int target, Int32 index, Int32 count, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParametersI4ivNV(int target, UInt32 index, Int32 count, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParametersI4ivNV(int target, Int32 index, Int32 count, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParametersI4ivNV(int target, UInt32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramEnvParametersI4ivNV(int target, Int32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParametersI4ivNV((int)target, (UInt32)index, (Int32)count, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameterI4uiNV(int target, UInt32 index, UInt32 x, UInt32 y, UInt32 z, UInt32 w)
+        {
+            Delegates.glProgramEnvParameterI4uiNV((int)target, (UInt32)index, (UInt32)x, (UInt32)y, (UInt32)z, (UInt32)w);
+        }
+
+        public static 
+        void glProgramEnvParameterI4uiNV(int target, Int32 index, Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glProgramEnvParameterI4uiNV((int)target, (UInt32)index, (UInt32)x, (UInt32)y, (UInt32)z, (UInt32)w);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameterI4uivNV(int target, UInt32 index, UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParameterI4uivNV(int target, Int32 index, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameterI4uivNV(int target, UInt32 index, ref UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParameterI4uivNV(int target, Int32 index, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParameterI4uivNV(int target, UInt32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramEnvParameterI4uivNV(int target, Int32 index, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParameterI4uivNV((int)target, (UInt32)index, (UInt32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParametersI4uivNV(int target, UInt32 index, Int32 count, UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParametersI4uivNV(int target, Int32 index, Int32 count, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramEnvParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParametersI4uivNV(int target, UInt32 index, Int32 count, ref UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramEnvParametersI4uivNV(int target, Int32 index, Int32 count, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramEnvParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramEnvParametersI4uivNV(int target, UInt32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramEnvParametersI4uivNV(int target, Int32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramEnvParametersI4uivNV((int)target, (UInt32)index, (Int32)count, (UInt32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterIivNV(int target, UInt32 index, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramLocalParameterIivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterIivNV(int target, Int32 index, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramLocalParameterIivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterIivNV(int target, UInt32 index, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramLocalParameterIivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterIivNV(int target, Int32 index, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramLocalParameterIivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterIivNV(int target, UInt32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramLocalParameterIivNV((int)target, (UInt32)index, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterIivNV(int target, Int32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramLocalParameterIivNV((int)target, (UInt32)index, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterIuivNV(int target, UInt32 index, [Out] UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramLocalParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterIuivNV(int target, Int32 index, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramLocalParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterIuivNV(int target, UInt32 index, [Out] out UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramLocalParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterIuivNV(int target, Int32 index, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramLocalParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramLocalParameterIuivNV(int target, UInt32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramLocalParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramLocalParameterIuivNV(int target, Int32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramLocalParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterIivNV(int target, UInt32 index, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramEnvParameterIivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterIivNV(int target, Int32 index, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramEnvParameterIivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterIivNV(int target, UInt32 index, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramEnvParameterIivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterIivNV(int target, Int32 index, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramEnvParameterIivNV((int)target, (UInt32)index, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterIivNV(int target, UInt32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramEnvParameterIivNV((int)target, (UInt32)index, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterIivNV(int target, Int32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramEnvParameterIivNV((int)target, (UInt32)index, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterIuivNV(int target, UInt32 index, [Out] UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramEnvParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterIuivNV(int target, Int32 index, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetProgramEnvParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterIuivNV(int target, UInt32 index, [Out] out UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramEnvParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterIuivNV(int target, Int32 index, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetProgramEnvParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetProgramEnvParameterIuivNV(int target, UInt32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramEnvParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glGetProgramEnvParameterIuivNV(int target, Int32 index, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetProgramEnvParameterIuivNV((int)target, (UInt32)index, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramVertexLimitNV(int target, Int32 limit)
+        {
+            Delegates.glProgramVertexLimitNV((int)target, (Int32)limit);
+        }
+
+        public static 
+        void glDepthRangedNV(Double zNear, Double zFar)
+        {
+            Delegates.glDepthRangedNV((Double)zNear, (Double)zFar);
+        }
+
+        public static 
+        void glClearDepthdNV(Double depth)
+        {
+            Delegates.glClearDepthdNV((Double)depth);
+        }
+
+        public static 
+        void glDepthBoundsdNV(Double zmin, Double zmax)
+        {
+            Delegates.glDepthBoundsdNV((Double)zmin, (Double)zmax);
+        }
+
+        public static 
+        void glRenderbufferStorageMultisampleCoverageNV(int target, Int32 coverageSamples, Int32 colorSamples, int internalformat, Int32 width, Int32 height)
+        {
+            Delegates.glRenderbufferStorageMultisampleCoverageNV((int)target, (Int32)coverageSamples, (Int32)colorSamples, (int)internalformat, (Int32)width, (Int32)height);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramBufferParametersfvNV(int target, UInt32 buffer, UInt32 index, Int32 count, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glProgramBufferParametersfvNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramBufferParametersfvNV(int target, Int32 buffer, Int32 index, Int32 count, Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glProgramBufferParametersfvNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramBufferParametersfvNV(int target, UInt32 buffer, UInt32 index, Int32 count, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glProgramBufferParametersfvNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramBufferParametersfvNV(int target, Int32 buffer, Int32 index, Int32 count, ref Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glProgramBufferParametersfvNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramBufferParametersfvNV(int target, UInt32 buffer, UInt32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramBufferParametersfvNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glProgramBufferParametersfvNV(int target, Int32 buffer, Int32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramBufferParametersfvNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramBufferParametersIivNV(int target, UInt32 buffer, UInt32 index, Int32 count, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramBufferParametersIivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramBufferParametersIivNV(int target, Int32 buffer, Int32 index, Int32 count, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramBufferParametersIivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramBufferParametersIivNV(int target, UInt32 buffer, UInt32 index, Int32 count, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramBufferParametersIivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramBufferParametersIivNV(int target, Int32 buffer, Int32 index, Int32 count, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramBufferParametersIivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramBufferParametersIivNV(int target, UInt32 buffer, UInt32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramBufferParametersIivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramBufferParametersIivNV(int target, Int32 buffer, Int32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramBufferParametersIivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramBufferParametersIuivNV(int target, UInt32 buffer, UInt32 index, Int32 count, UInt32[] @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = @params)
+                {
+                    Delegates.glProgramBufferParametersIuivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramBufferParametersIuivNV(int target, Int32 buffer, Int32 index, Int32 count, Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glProgramBufferParametersIuivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramBufferParametersIuivNV(int target, UInt32 buffer, UInt32 index, Int32 count, ref UInt32 @params)
+        {
+            unsafe
+            {
+                fixed (UInt32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramBufferParametersIuivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glProgramBufferParametersIuivNV(int target, Int32 buffer, Int32 index, Int32 count, ref Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glProgramBufferParametersIuivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (UInt32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glProgramBufferParametersIuivNV(int target, UInt32 buffer, UInt32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramBufferParametersIuivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glProgramBufferParametersIuivNV(int target, Int32 buffer, Int32 index, Int32 count, IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glProgramBufferParametersIuivNV((int)target, (UInt32)buffer, (UInt32)index, (Int32)count, (UInt32*)@params);
+            }
+        }
+
+        public static 
+        void glBeginTransformFeedbackNV(int primitiveMode)
+        {
+            Delegates.glBeginTransformFeedbackNV((int)primitiveMode);
+        }
+
+        public static 
+        void glEndTransformFeedbackNV()
+        {
+            Delegates.glEndTransformFeedbackNV();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTransformFeedbackAttribsNV(UInt32 count, Int32[] attribs, int bufferMode)
+        {
+            unsafe
+            {
+                fixed (Int32* attribs_ptr = attribs)
+                {
+                    Delegates.glTransformFeedbackAttribsNV((UInt32)count, (Int32*)attribs_ptr, (int)bufferMode);
+                }
+            }
+        }
+
+        public static 
+        void glTransformFeedbackAttribsNV(Int32 count, Int32[] attribs, int bufferMode)
+        {
+            unsafe
+            {
+                fixed (Int32* attribs_ptr = attribs)
+                {
+                    Delegates.glTransformFeedbackAttribsNV((UInt32)count, (Int32*)attribs_ptr, (int)bufferMode);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTransformFeedbackAttribsNV(UInt32 count, ref Int32 attribs, int bufferMode)
+        {
+            unsafe
+            {
+                fixed (Int32* attribs_ptr = &attribs)
+                {
+                    Delegates.glTransformFeedbackAttribsNV((UInt32)count, (Int32*)attribs_ptr, (int)bufferMode);
+                }
+            }
+        }
+
+        public static 
+        void glTransformFeedbackAttribsNV(Int32 count, ref Int32 attribs, int bufferMode)
+        {
+            unsafe
+            {
+                fixed (Int32* attribs_ptr = &attribs)
+                {
+                    Delegates.glTransformFeedbackAttribsNV((UInt32)count, (Int32*)attribs_ptr, (int)bufferMode);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTransformFeedbackAttribsNV(UInt32 count, IntPtr attribs, int bufferMode)
+        {
+            unsafe
+            {
+                Delegates.glTransformFeedbackAttribsNV((UInt32)count, (Int32*)attribs, (int)bufferMode);
+            }
+        }
+
+        public static 
+        void glTransformFeedbackAttribsNV(Int32 count, IntPtr attribs, int bufferMode)
+        {
+            unsafe
+            {
+                Delegates.glTransformFeedbackAttribsNV((UInt32)count, (Int32*)attribs, (int)bufferMode);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindBufferRangeNV(int target, UInt32 index, UInt32 buffer, IntPtr offset, IntPtr size)
+        {
+            Delegates.glBindBufferRangeNV((int)target, (UInt32)index, (UInt32)buffer, (IntPtr)offset, (IntPtr)size);
+        }
+
+        public static 
+        void glBindBufferRangeNV(int target, Int32 index, Int32 buffer, IntPtr offset, IntPtr size)
+        {
+            Delegates.glBindBufferRangeNV((int)target, (UInt32)index, (UInt32)buffer, (IntPtr)offset, (IntPtr)size);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindBufferOffsetNV(int target, UInt32 index, UInt32 buffer, IntPtr offset)
+        {
+            Delegates.glBindBufferOffsetNV((int)target, (UInt32)index, (UInt32)buffer, (IntPtr)offset);
+        }
+
+        public static 
+        void glBindBufferOffsetNV(int target, Int32 index, Int32 buffer, IntPtr offset)
+        {
+            Delegates.glBindBufferOffsetNV((int)target, (UInt32)index, (UInt32)buffer, (IntPtr)offset);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindBufferBaseNV(int target, UInt32 index, UInt32 buffer)
+        {
+            Delegates.glBindBufferBaseNV((int)target, (UInt32)index, (UInt32)buffer);
+        }
+
+        public static 
+        void glBindBufferBaseNV(int target, Int32 index, Int32 buffer)
+        {
+            Delegates.glBindBufferBaseNV((int)target, (UInt32)index, (UInt32)buffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTransformFeedbackVaryingsNV(UInt32 program, Int32 count, Int32[] locations, int bufferMode)
+        {
+            unsafe
+            {
+                fixed (Int32* locations_ptr = locations)
+                {
+                    Delegates.glTransformFeedbackVaryingsNV((UInt32)program, (Int32)count, (Int32*)locations_ptr, (int)bufferMode);
+                }
+            }
+        }
+
+        public static 
+        void glTransformFeedbackVaryingsNV(Int32 program, Int32 count, Int32[] locations, int bufferMode)
+        {
+            unsafe
+            {
+                fixed (Int32* locations_ptr = locations)
+                {
+                    Delegates.glTransformFeedbackVaryingsNV((UInt32)program, (Int32)count, (Int32*)locations_ptr, (int)bufferMode);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTransformFeedbackVaryingsNV(UInt32 program, Int32 count, ref Int32 locations, int bufferMode)
+        {
+            unsafe
+            {
+                fixed (Int32* locations_ptr = &locations)
+                {
+                    Delegates.glTransformFeedbackVaryingsNV((UInt32)program, (Int32)count, (Int32*)locations_ptr, (int)bufferMode);
+                }
+            }
+        }
+
+        public static 
+        void glTransformFeedbackVaryingsNV(Int32 program, Int32 count, ref Int32 locations, int bufferMode)
+        {
+            unsafe
+            {
+                fixed (Int32* locations_ptr = &locations)
+                {
+                    Delegates.glTransformFeedbackVaryingsNV((UInt32)program, (Int32)count, (Int32*)locations_ptr, (int)bufferMode);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTransformFeedbackVaryingsNV(UInt32 program, Int32 count, IntPtr locations, int bufferMode)
+        {
+            unsafe
+            {
+                Delegates.glTransformFeedbackVaryingsNV((UInt32)program, (Int32)count, (Int32*)locations, (int)bufferMode);
+            }
+        }
+
+        public static 
+        void glTransformFeedbackVaryingsNV(Int32 program, Int32 count, IntPtr locations, int bufferMode)
+        {
+            unsafe
+            {
+                Delegates.glTransformFeedbackVaryingsNV((UInt32)program, (Int32)count, (Int32*)locations, (int)bufferMode);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glActiveVaryingNV(UInt32 program, System.String name)
+        {
+            Delegates.glActiveVaryingNV((UInt32)program, (System.String)name);
+        }
+
+        public static 
+        void glActiveVaryingNV(Int32 program, System.String name)
+        {
+            Delegates.glActiveVaryingNV((UInt32)program, (System.String)name);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glGetVaryingLocationNV(UInt32 program, System.String name)
+        {
+            return Delegates.glGetVaryingLocationNV((UInt32)program, (System.String)name);
+        }
+
+        public static 
+        Int32 glGetVaryingLocationNV(Int32 program, System.String name)
+        {
+            return Delegates.glGetVaryingLocationNV((UInt32)program, (System.String)name);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveVaryingNV(UInt32 program, UInt32 index, Int32 bufSize, [Out] Int32[] length, [Out] Int32[] size, [Out] int[] type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                fixed (Int32* size_ptr = size)
+                fixed (int* type_ptr = type)
+                {
+                    Delegates.glGetActiveVaryingNV((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                }
+            }
+        }
+
+        public static 
+        void glGetActiveVaryingNV(Int32 program, Int32 index, Int32 bufSize, [Out] Int32[] length, [Out] Int32[] size, [Out] int[] type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = length)
+                fixed (Int32* size_ptr = size)
+                fixed (int* type_ptr = type)
+                {
+                    Delegates.glGetActiveVaryingNV((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveVaryingNV(UInt32 program, UInt32 index, Int32 bufSize, [Out] out Int32 length, [Out] out Int32 size, [Out] out int type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                fixed (Int32* size_ptr = &size)
+                fixed (int* type_ptr = &type)
+                {
+                    Delegates.glGetActiveVaryingNV((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                    length = *length_ptr;
+                    size = *size_ptr;
+                    type = *type_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetActiveVaryingNV(Int32 program, Int32 index, Int32 bufSize, [Out] out Int32 length, [Out] out Int32 size, [Out] out int type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                fixed (Int32* length_ptr = &length)
+                fixed (Int32* size_ptr = &size)
+                fixed (int* type_ptr = &type)
+                {
+                    Delegates.glGetActiveVaryingNV((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length_ptr, (Int32*)size_ptr, (int*)type_ptr, (System.Text.StringBuilder)name);
+                    length = *length_ptr;
+                    size = *size_ptr;
+                    type = *type_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetActiveVaryingNV(UInt32 program, UInt32 index, Int32 bufSize, [Out] IntPtr length, [Out] IntPtr size, [Out] IntPtr type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                Delegates.glGetActiveVaryingNV((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length, (Int32*)size, (int*)type, (System.Text.StringBuilder)name);
+            }
+        }
+
+        public static 
+        void glGetActiveVaryingNV(Int32 program, Int32 index, Int32 bufSize, [Out] IntPtr length, [Out] IntPtr size, [Out] IntPtr type, [Out] System.Text.StringBuilder name)
+        {
+            unsafe
+            {
+                Delegates.glGetActiveVaryingNV((UInt32)program, (UInt32)index, (Int32)bufSize, (Int32*)length, (Int32*)size, (int*)type, (System.Text.StringBuilder)name);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetTransformFeedbackVaryingNV(UInt32 program, UInt32 index, [Out] Int32[] location)
+        {
+            unsafe
+            {
+                fixed (Int32* location_ptr = location)
+                {
+                    Delegates.glGetTransformFeedbackVaryingNV((UInt32)program, (UInt32)index, (Int32*)location_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTransformFeedbackVaryingNV(Int32 program, Int32 index, [Out] Int32[] location)
+        {
+            unsafe
+            {
+                fixed (Int32* location_ptr = location)
+                {
+                    Delegates.glGetTransformFeedbackVaryingNV((UInt32)program, (UInt32)index, (Int32*)location_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetTransformFeedbackVaryingNV(UInt32 program, UInt32 index, [Out] out Int32 location)
+        {
+            unsafe
+            {
+                fixed (Int32* location_ptr = &location)
+                {
+                    Delegates.glGetTransformFeedbackVaryingNV((UInt32)program, (UInt32)index, (Int32*)location_ptr);
+                    location = *location_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTransformFeedbackVaryingNV(Int32 program, Int32 index, [Out] out Int32 location)
+        {
+            unsafe
+            {
+                fixed (Int32* location_ptr = &location)
+                {
+                    Delegates.glGetTransformFeedbackVaryingNV((UInt32)program, (UInt32)index, (Int32*)location_ptr);
+                    location = *location_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetTransformFeedbackVaryingNV(UInt32 program, UInt32 index, [Out] IntPtr location)
+        {
+            unsafe
+            {
+                Delegates.glGetTransformFeedbackVaryingNV((UInt32)program, (UInt32)index, (Int32*)location);
+            }
+        }
+
+        public static 
+        void glGetTransformFeedbackVaryingNV(Int32 program, Int32 index, [Out] IntPtr location)
+        {
+            unsafe
+            {
+                Delegates.glGetTransformFeedbackVaryingNV((UInt32)program, (UInt32)index, (Int32*)location);
+            }
+        }
+
+        public static 
+        void glResizeBuffersMESA()
+        {
+            Delegates.glResizeBuffersMESA();
+        }
+
+        public static 
+        void glWindowPos2dMESA(Double x, Double y)
+        {
+            Delegates.glWindowPos2dMESA((Double)x, (Double)y);
+        }
+
+        public static 
+        void glWindowPos2dvMESA(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glWindowPos2dvMESA((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2dvMESA(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2dvMESA((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2dvMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2dvMESA((Double*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos2fMESA(Single x, Single y)
+        {
+            Delegates.glWindowPos2fMESA((Single)x, (Single)y);
+        }
+
+        public static 
+        void glWindowPos2fvMESA(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glWindowPos2fvMESA((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2fvMESA(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2fvMESA((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2fvMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2fvMESA((Single*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos2iMESA(Int32 x, Int32 y)
+        {
+            Delegates.glWindowPos2iMESA((Int32)x, (Int32)y);
+        }
+
+        public static 
+        void glWindowPos2ivMESA(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glWindowPos2ivMESA((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2ivMESA(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2ivMESA((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2ivMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2ivMESA((Int32*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos2sMESA(Int16 x, Int16 y)
+        {
+            Delegates.glWindowPos2sMESA((Int16)x, (Int16)y);
+        }
+
+        public static 
+        void glWindowPos2svMESA(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glWindowPos2svMESA((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2svMESA(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glWindowPos2svMESA((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos2svMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos2svMESA((Int16*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3dMESA(Double x, Double y, Double z)
+        {
+            Delegates.glWindowPos3dMESA((Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glWindowPos3dvMESA(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glWindowPos3dvMESA((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3dvMESA(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3dvMESA((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3dvMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3dvMESA((Double*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3fMESA(Single x, Single y, Single z)
+        {
+            Delegates.glWindowPos3fMESA((Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glWindowPos3fvMESA(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glWindowPos3fvMESA((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3fvMESA(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3fvMESA((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3fvMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3fvMESA((Single*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3iMESA(Int32 x, Int32 y, Int32 z)
+        {
+            Delegates.glWindowPos3iMESA((Int32)x, (Int32)y, (Int32)z);
+        }
+
+        public static 
+        void glWindowPos3ivMESA(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glWindowPos3ivMESA((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3ivMESA(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3ivMESA((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3ivMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3ivMESA((Int32*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos3sMESA(Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glWindowPos3sMESA((Int16)x, (Int16)y, (Int16)z);
+        }
+
+        public static 
+        void glWindowPos3svMESA(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glWindowPos3svMESA((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3svMESA(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glWindowPos3svMESA((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos3svMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos3svMESA((Int16*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos4dMESA(Double x, Double y, Double z, Double w)
+        {
+            Delegates.glWindowPos4dMESA((Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        public static 
+        void glWindowPos4dvMESA(Double[] v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = v)
+                {
+                    Delegates.glWindowPos4dvMESA((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos4dvMESA(ref Double v)
+        {
+            unsafe
+            {
+                fixed (Double* v_ptr = &v)
+                {
+                    Delegates.glWindowPos4dvMESA((Double*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos4dvMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos4dvMESA((Double*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos4fMESA(Single x, Single y, Single z, Single w)
+        {
+            Delegates.glWindowPos4fMESA((Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glWindowPos4fvMESA(Single[] v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = v)
+                {
+                    Delegates.glWindowPos4fvMESA((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos4fvMESA(ref Single v)
+        {
+            unsafe
+            {
+                fixed (Single* v_ptr = &v)
+                {
+                    Delegates.glWindowPos4fvMESA((Single*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos4fvMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos4fvMESA((Single*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos4iMESA(Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glWindowPos4iMESA((Int32)x, (Int32)y, (Int32)z, (Int32)w);
+        }
+
+        public static 
+        void glWindowPos4ivMESA(Int32[] v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = v)
+                {
+                    Delegates.glWindowPos4ivMESA((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos4ivMESA(ref Int32 v)
+        {
+            unsafe
+            {
+                fixed (Int32* v_ptr = &v)
+                {
+                    Delegates.glWindowPos4ivMESA((Int32*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos4ivMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos4ivMESA((Int32*)v);
+            }
+        }
+
+        public static 
+        void glWindowPos4sMESA(Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glWindowPos4sMESA((Int16)x, (Int16)y, (Int16)z, (Int16)w);
+        }
+
+        public static 
+        void glWindowPos4svMESA(Int16[] v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = v)
+                {
+                    Delegates.glWindowPos4svMESA((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos4svMESA(ref Int16 v)
+        {
+            unsafe
+            {
+                fixed (Int16* v_ptr = &v)
+                {
+                    Delegates.glWindowPos4svMESA((Int16*)v_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glWindowPos4svMESA(IntPtr v)
+        {
+            unsafe
+            {
+                Delegates.glWindowPos4svMESA((Int16*)v);
+            }
+        }
+
+        public static 
+        void glMultiModeDrawArraysIBM(int[] mode, Int32[] first, Int32[] count, Int32 primcount, Int32 modestride)
+        {
+            unsafe
+            {
+                fixed (int* mode_ptr = mode)
+                fixed (Int32* first_ptr = first)
+                fixed (Int32* count_ptr = count)
+                {
+                    Delegates.glMultiModeDrawArraysIBM((int*)mode_ptr, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount, (Int32)modestride);
+                }
+            }
+        }
+
+        public static 
+        void glMultiModeDrawArraysIBM(ref int mode, ref Int32 first, ref Int32 count, Int32 primcount, Int32 modestride)
+        {
+            unsafe
+            {
+                fixed (int* mode_ptr = &mode)
+                fixed (Int32* first_ptr = &first)
+                fixed (Int32* count_ptr = &count)
+                {
+                    Delegates.glMultiModeDrawArraysIBM((int*)mode_ptr, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount, (Int32)modestride);
+                }
+            }
+        }
+
+        public static 
+        void glMultiModeDrawArraysIBM(IntPtr mode, IntPtr first, IntPtr count, Int32 primcount, Int32 modestride)
+        {
+            unsafe
+            {
+                Delegates.glMultiModeDrawArraysIBM((int*)mode, (Int32*)first, (Int32*)count, (Int32)primcount, (Int32)modestride);
+            }
+        }
+
+        public static 
+        void glMultiModeDrawElementsIBM(int[] mode, Int32[] count, int type, IntPtr indices, Int32 primcount, Int32 modestride)
+        {
+            unsafe
+            {
+                fixed (int* mode_ptr = mode)
+                fixed (Int32* count_ptr = count)
+                {
+                    Delegates.glMultiModeDrawElementsIBM((int*)mode_ptr, (Int32*)count_ptr, (int)type, (IntPtr)indices, (Int32)primcount, (Int32)modestride);
+                }
+            }
+        }
+
+        public static 
+        void glMultiModeDrawElementsIBM(IntPtr mode, IntPtr count, int type, [In, Out] object indices, Int32 primcount, Int32 modestride)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glMultiModeDrawElementsIBM((int*)mode, (Int32*)count, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject(), (Int32)primcount, (Int32)modestride);
+                }
+                finally
+                {
+                    indices_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glMultiModeDrawElementsIBM(ref int mode, ref Int32 count, int type, [In, Out] object indices, Int32 primcount, Int32 modestride)
+        {
+            unsafe
+            {
+                fixed (int* mode_ptr = &mode)
+                fixed (Int32* count_ptr = &count)
+                {
+                    System.Runtime.InteropServices.GCHandle indices_ptr = System.Runtime.InteropServices.GCHandle.Alloc(indices, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        Delegates.glMultiModeDrawElementsIBM((int*)mode_ptr, (Int32*)count_ptr, (int)type, (IntPtr)indices_ptr.AddrOfPinnedObject(), (Int32)primcount, (Int32)modestride);
+                    }
+                    finally
+                    {
+                        indices_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        public static 
+        void glColorPointerListIBM(Int32 size, int type, Int32 stride, IntPtr pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                Delegates.glColorPointerListIBM((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer, (Int32)ptrstride);
+            }
+        }
+
+        public static 
+        void glColorPointerListIBM(Int32 size, int type, Int32 stride, [In, Out] object pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glColorPointerListIBM((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject(), (Int32)ptrstride);
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glSecondaryColorPointerListIBM(Int32 size, int type, Int32 stride, IntPtr pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                Delegates.glSecondaryColorPointerListIBM((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer, (Int32)ptrstride);
+            }
+        }
+
+        public static 
+        void glSecondaryColorPointerListIBM(Int32 size, int type, Int32 stride, [In, Out] object pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glSecondaryColorPointerListIBM((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject(), (Int32)ptrstride);
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glEdgeFlagPointerListIBM(Int32 stride, bool[] pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                fixed (bool* pointer_ptr = pointer)
+                {
+                    Delegates.glEdgeFlagPointerListIBM((Int32)stride, (bool*)pointer_ptr, (Int32)ptrstride);
+                }
+            }
+        }
+
+        public static 
+        void glEdgeFlagPointerListIBM(Int32 stride, ref bool pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                fixed (bool* pointer_ptr = &pointer)
+                {
+                    Delegates.glEdgeFlagPointerListIBM((Int32)stride, (bool*)pointer_ptr, (Int32)ptrstride);
+                }
+            }
+        }
+
+        public static 
+        void glEdgeFlagPointerListIBM(Int32 stride, IntPtr pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                Delegates.glEdgeFlagPointerListIBM((Int32)stride, (bool*)pointer, (Int32)ptrstride);
+            }
+        }
+
+        public static 
+        void glFogCoordPointerListIBM(int type, Int32 stride, IntPtr pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                Delegates.glFogCoordPointerListIBM((int)type, (Int32)stride, (IntPtr)pointer, (Int32)ptrstride);
+            }
+        }
+
+        public static 
+        void glFogCoordPointerListIBM(int type, Int32 stride, [In, Out] object pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glFogCoordPointerListIBM((int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject(), (Int32)ptrstride);
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glIndexPointerListIBM(int type, Int32 stride, IntPtr pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                Delegates.glIndexPointerListIBM((int)type, (Int32)stride, (IntPtr)pointer, (Int32)ptrstride);
+            }
+        }
+
+        public static 
+        void glIndexPointerListIBM(int type, Int32 stride, [In, Out] object pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glIndexPointerListIBM((int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject(), (Int32)ptrstride);
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glNormalPointerListIBM(int type, Int32 stride, IntPtr pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                Delegates.glNormalPointerListIBM((int)type, (Int32)stride, (IntPtr)pointer, (Int32)ptrstride);
+            }
+        }
+
+        public static 
+        void glNormalPointerListIBM(int type, Int32 stride, [In, Out] object pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glNormalPointerListIBM((int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject(), (Int32)ptrstride);
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glTexCoordPointerListIBM(Int32 size, int type, Int32 stride, IntPtr pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                Delegates.glTexCoordPointerListIBM((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer, (Int32)ptrstride);
+            }
+        }
+
+        public static 
+        void glTexCoordPointerListIBM(Int32 size, int type, Int32 stride, [In, Out] object pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glTexCoordPointerListIBM((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject(), (Int32)ptrstride);
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glVertexPointerListIBM(Int32 size, int type, Int32 stride, IntPtr pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                Delegates.glVertexPointerListIBM((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer, (Int32)ptrstride);
+            }
+        }
+
+        public static 
+        void glVertexPointerListIBM(Int32 size, int type, Int32 stride, [In, Out] object pointer, Int32 ptrstride)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexPointerListIBM((Int32)size, (int)type, (Int32)stride, (IntPtr)pointer_ptr.AddrOfPinnedObject(), (Int32)ptrstride);
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glTbufferMask3DFX(UInt32 mask)
+        {
+            Delegates.glTbufferMask3DFX((UInt32)mask);
+        }
+
+        public static 
+        void glTbufferMask3DFX(Int32 mask)
+        {
+            Delegates.glTbufferMask3DFX((UInt32)mask);
+        }
+
+        public static 
+        void glTexBumpParameterivATI(int pname, Int32[] param)
+        {
+            unsafe
+            {
+                fixed (Int32* param_ptr = param)
+                {
+                    Delegates.glTexBumpParameterivATI((int)pname, (Int32*)param_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexBumpParameterivATI(int pname, ref Int32 param)
+        {
+            unsafe
+            {
+                fixed (Int32* param_ptr = &param)
+                {
+                    Delegates.glTexBumpParameterivATI((int)pname, (Int32*)param_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexBumpParameterivATI(int pname, IntPtr param)
+        {
+            unsafe
+            {
+                Delegates.glTexBumpParameterivATI((int)pname, (Int32*)param);
+            }
+        }
+
+        public static 
+        void glTexBumpParameterfvATI(int pname, Single[] param)
+        {
+            unsafe
+            {
+                fixed (Single* param_ptr = param)
+                {
+                    Delegates.glTexBumpParameterfvATI((int)pname, (Single*)param_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexBumpParameterfvATI(int pname, ref Single param)
+        {
+            unsafe
+            {
+                fixed (Single* param_ptr = &param)
+                {
+                    Delegates.glTexBumpParameterfvATI((int)pname, (Single*)param_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glTexBumpParameterfvATI(int pname, IntPtr param)
+        {
+            unsafe
+            {
+                Delegates.glTexBumpParameterfvATI((int)pname, (Single*)param);
+            }
+        }
+
+        public static 
+        void glGetTexBumpParameterivATI(int pname, [Out] Int32[] param)
+        {
+            unsafe
+            {
+                fixed (Int32* param_ptr = param)
+                {
+                    Delegates.glGetTexBumpParameterivATI((int)pname, (Int32*)param_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexBumpParameterivATI(int pname, [Out] out Int32 param)
+        {
+            unsafe
+            {
+                fixed (Int32* param_ptr = &param)
+                {
+                    Delegates.glGetTexBumpParameterivATI((int)pname, (Int32*)param_ptr);
+                    param = *param_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexBumpParameterivATI(int pname, [Out] IntPtr param)
+        {
+            unsafe
+            {
+                Delegates.glGetTexBumpParameterivATI((int)pname, (Int32*)param);
+            }
+        }
+
+        public static 
+        void glGetTexBumpParameterfvATI(int pname, [Out] Single[] param)
+        {
+            unsafe
+            {
+                fixed (Single* param_ptr = param)
+                {
+                    Delegates.glGetTexBumpParameterfvATI((int)pname, (Single*)param_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetTexBumpParameterfvATI(int pname, [Out] out Single param)
+        {
+            unsafe
+            {
+                fixed (Single* param_ptr = &param)
+                {
+                    Delegates.glGetTexBumpParameterfvATI((int)pname, (Single*)param_ptr);
+                    param = *param_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetTexBumpParameterfvATI(int pname, [Out] IntPtr param)
+        {
+            unsafe
+            {
+                Delegates.glGetTexBumpParameterfvATI((int)pname, (Single*)param);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Int32 glGenFragmentShadersATI(UInt32 range)
+        {
+            return Delegates.glGenFragmentShadersATI((UInt32)range);
+        }
+
+        public static 
+        Int32 glGenFragmentShadersATI(Int32 range)
+        {
+            return Delegates.glGenFragmentShadersATI((UInt32)range);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindFragmentShaderATI(UInt32 id)
+        {
+            Delegates.glBindFragmentShaderATI((UInt32)id);
+        }
+
+        public static 
+        void glBindFragmentShaderATI(Int32 id)
+        {
+            Delegates.glBindFragmentShaderATI((UInt32)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteFragmentShaderATI(UInt32 id)
+        {
+            Delegates.glDeleteFragmentShaderATI((UInt32)id);
+        }
+
+        public static 
+        void glDeleteFragmentShaderATI(Int32 id)
+        {
+            Delegates.glDeleteFragmentShaderATI((UInt32)id);
+        }
+
+        public static 
+        void glBeginFragmentShaderATI()
+        {
+            Delegates.glBeginFragmentShaderATI();
+        }
+
+        public static 
+        void glEndFragmentShaderATI()
+        {
+            Delegates.glEndFragmentShaderATI();
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glPassTexCoordATI(UInt32 dst, UInt32 coord, int swizzle)
+        {
+            Delegates.glPassTexCoordATI((UInt32)dst, (UInt32)coord, (int)swizzle);
+        }
+
+        public static 
+        void glPassTexCoordATI(Int32 dst, Int32 coord, int swizzle)
+        {
+            Delegates.glPassTexCoordATI((UInt32)dst, (UInt32)coord, (int)swizzle);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSampleMapATI(UInt32 dst, UInt32 interp, int swizzle)
+        {
+            Delegates.glSampleMapATI((UInt32)dst, (UInt32)interp, (int)swizzle);
+        }
+
+        public static 
+        void glSampleMapATI(Int32 dst, Int32 interp, int swizzle)
+        {
+            Delegates.glSampleMapATI((UInt32)dst, (UInt32)interp, (int)swizzle);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColorFragmentOp1ATI(int op, UInt32 dst, UInt32 dstMask, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod)
+        {
+            Delegates.glColorFragmentOp1ATI((int)op, (UInt32)dst, (UInt32)dstMask, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod);
+        }
+
+        public static 
+        void glColorFragmentOp1ATI(int op, Int32 dst, Int32 dstMask, Int32 dstMod, Int32 arg1, Int32 arg1Rep, Int32 arg1Mod)
+        {
+            Delegates.glColorFragmentOp1ATI((int)op, (UInt32)dst, (UInt32)dstMask, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColorFragmentOp2ATI(int op, UInt32 dst, UInt32 dstMask, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod, UInt32 arg2, UInt32 arg2Rep, UInt32 arg2Mod)
+        {
+            Delegates.glColorFragmentOp2ATI((int)op, (UInt32)dst, (UInt32)dstMask, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod, (UInt32)arg2, (UInt32)arg2Rep, (UInt32)arg2Mod);
+        }
+
+        public static 
+        void glColorFragmentOp2ATI(int op, Int32 dst, Int32 dstMask, Int32 dstMod, Int32 arg1, Int32 arg1Rep, Int32 arg1Mod, Int32 arg2, Int32 arg2Rep, Int32 arg2Mod)
+        {
+            Delegates.glColorFragmentOp2ATI((int)op, (UInt32)dst, (UInt32)dstMask, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod, (UInt32)arg2, (UInt32)arg2Rep, (UInt32)arg2Mod);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glColorFragmentOp3ATI(int op, UInt32 dst, UInt32 dstMask, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod, UInt32 arg2, UInt32 arg2Rep, UInt32 arg2Mod, UInt32 arg3, UInt32 arg3Rep, UInt32 arg3Mod)
+        {
+            Delegates.glColorFragmentOp3ATI((int)op, (UInt32)dst, (UInt32)dstMask, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod, (UInt32)arg2, (UInt32)arg2Rep, (UInt32)arg2Mod, (UInt32)arg3, (UInt32)arg3Rep, (UInt32)arg3Mod);
+        }
+
+        public static 
+        void glColorFragmentOp3ATI(int op, Int32 dst, Int32 dstMask, Int32 dstMod, Int32 arg1, Int32 arg1Rep, Int32 arg1Mod, Int32 arg2, Int32 arg2Rep, Int32 arg2Mod, Int32 arg3, Int32 arg3Rep, Int32 arg3Mod)
+        {
+            Delegates.glColorFragmentOp3ATI((int)op, (UInt32)dst, (UInt32)dstMask, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod, (UInt32)arg2, (UInt32)arg2Rep, (UInt32)arg2Mod, (UInt32)arg3, (UInt32)arg3Rep, (UInt32)arg3Mod);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glAlphaFragmentOp1ATI(int op, UInt32 dst, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod)
+        {
+            Delegates.glAlphaFragmentOp1ATI((int)op, (UInt32)dst, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod);
+        }
+
+        public static 
+        void glAlphaFragmentOp1ATI(int op, Int32 dst, Int32 dstMod, Int32 arg1, Int32 arg1Rep, Int32 arg1Mod)
+        {
+            Delegates.glAlphaFragmentOp1ATI((int)op, (UInt32)dst, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glAlphaFragmentOp2ATI(int op, UInt32 dst, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod, UInt32 arg2, UInt32 arg2Rep, UInt32 arg2Mod)
+        {
+            Delegates.glAlphaFragmentOp2ATI((int)op, (UInt32)dst, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod, (UInt32)arg2, (UInt32)arg2Rep, (UInt32)arg2Mod);
+        }
+
+        public static 
+        void glAlphaFragmentOp2ATI(int op, Int32 dst, Int32 dstMod, Int32 arg1, Int32 arg1Rep, Int32 arg1Mod, Int32 arg2, Int32 arg2Rep, Int32 arg2Mod)
+        {
+            Delegates.glAlphaFragmentOp2ATI((int)op, (UInt32)dst, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod, (UInt32)arg2, (UInt32)arg2Rep, (UInt32)arg2Mod);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glAlphaFragmentOp3ATI(int op, UInt32 dst, UInt32 dstMod, UInt32 arg1, UInt32 arg1Rep, UInt32 arg1Mod, UInt32 arg2, UInt32 arg2Rep, UInt32 arg2Mod, UInt32 arg3, UInt32 arg3Rep, UInt32 arg3Mod)
+        {
+            Delegates.glAlphaFragmentOp3ATI((int)op, (UInt32)dst, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod, (UInt32)arg2, (UInt32)arg2Rep, (UInt32)arg2Mod, (UInt32)arg3, (UInt32)arg3Rep, (UInt32)arg3Mod);
+        }
+
+        public static 
+        void glAlphaFragmentOp3ATI(int op, Int32 dst, Int32 dstMod, Int32 arg1, Int32 arg1Rep, Int32 arg1Mod, Int32 arg2, Int32 arg2Rep, Int32 arg2Mod, Int32 arg3, Int32 arg3Rep, Int32 arg3Mod)
+        {
+            Delegates.glAlphaFragmentOp3ATI((int)op, (UInt32)dst, (UInt32)dstMod, (UInt32)arg1, (UInt32)arg1Rep, (UInt32)arg1Mod, (UInt32)arg2, (UInt32)arg2Rep, (UInt32)arg2Mod, (UInt32)arg3, (UInt32)arg3Rep, (UInt32)arg3Mod);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSetFragmentShaderConstantATI(UInt32 dst, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glSetFragmentShaderConstantATI((UInt32)dst, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSetFragmentShaderConstantATI(Int32 dst, Single[] value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = value)
+                {
+                    Delegates.glSetFragmentShaderConstantATI((UInt32)dst, (Single*)value_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSetFragmentShaderConstantATI(UInt32 dst, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glSetFragmentShaderConstantATI((UInt32)dst, (Single*)value_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glSetFragmentShaderConstantATI(Int32 dst, ref Single value)
+        {
+            unsafe
+            {
+                fixed (Single* value_ptr = &value)
+                {
+                    Delegates.glSetFragmentShaderConstantATI((UInt32)dst, (Single*)value_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSetFragmentShaderConstantATI(UInt32 dst, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glSetFragmentShaderConstantATI((UInt32)dst, (Single*)value);
+            }
+        }
+
+        public static 
+        void glSetFragmentShaderConstantATI(Int32 dst, IntPtr value)
+        {
+            unsafe
+            {
+                Delegates.glSetFragmentShaderConstantATI((UInt32)dst, (Single*)value);
+            }
+        }
+
+        public static 
+        void glPNTrianglesiATI(int pname, Int32 param)
+        {
+            Delegates.glPNTrianglesiATI((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glPNTrianglesfATI(int pname, Single param)
+        {
+            Delegates.glPNTrianglesfATI((int)pname, (Single)param);
+        }
+
+        public static 
+        Int32 glNewObjectBufferATI(Int32 size, IntPtr pointer, int usage)
+        {
+            unsafe
+            {
+                return Delegates.glNewObjectBufferATI((Int32)size, (IntPtr)pointer, (int)usage);
+            }
+        }
+
+        public static 
+        Int32 glNewObjectBufferATI(Int32 size, [In, Out] object pointer, int usage)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    return Delegates.glNewObjectBufferATI((Int32)size, (IntPtr)pointer_ptr.AddrOfPinnedObject(), (int)usage);
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsObjectBufferATI(UInt32 buffer)
+        {
+            return Delegates.glIsObjectBufferATI((UInt32)buffer);
+        }
+
+        public static 
+        bool glIsObjectBufferATI(Int32 buffer)
+        {
+            return Delegates.glIsObjectBufferATI((UInt32)buffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUpdateObjectBufferATI(UInt32 buffer, UInt32 offset, Int32 size, IntPtr pointer, int preserve)
+        {
+            unsafe
+            {
+                Delegates.glUpdateObjectBufferATI((UInt32)buffer, (UInt32)offset, (Int32)size, (IntPtr)pointer, (int)preserve);
+            }
+        }
+
+        public static 
+        void glUpdateObjectBufferATI(Int32 buffer, Int32 offset, Int32 size, IntPtr pointer, int preserve)
+        {
+            unsafe
+            {
+                Delegates.glUpdateObjectBufferATI((UInt32)buffer, (UInt32)offset, (Int32)size, (IntPtr)pointer, (int)preserve);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUpdateObjectBufferATI(UInt32 buffer, UInt32 offset, Int32 size, [In, Out] object pointer, int preserve)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glUpdateObjectBufferATI((UInt32)buffer, (UInt32)offset, (Int32)size, (IntPtr)pointer_ptr.AddrOfPinnedObject(), (int)preserve);
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glUpdateObjectBufferATI(Int32 buffer, Int32 offset, Int32 size, [In, Out] object pointer, int preserve)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glUpdateObjectBufferATI((UInt32)buffer, (UInt32)offset, (Int32)size, (IntPtr)pointer_ptr.AddrOfPinnedObject(), (int)preserve);
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectBufferfvATI(UInt32 buffer, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetObjectBufferfvATI((UInt32)buffer, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetObjectBufferfvATI(Int32 buffer, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetObjectBufferfvATI((UInt32)buffer, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectBufferfvATI(UInt32 buffer, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetObjectBufferfvATI((UInt32)buffer, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetObjectBufferfvATI(Int32 buffer, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetObjectBufferfvATI((UInt32)buffer, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectBufferfvATI(UInt32 buffer, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetObjectBufferfvATI((UInt32)buffer, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetObjectBufferfvATI(Int32 buffer, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetObjectBufferfvATI((UInt32)buffer, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectBufferivATI(UInt32 buffer, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetObjectBufferivATI((UInt32)buffer, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetObjectBufferivATI(Int32 buffer, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetObjectBufferivATI((UInt32)buffer, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectBufferivATI(UInt32 buffer, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetObjectBufferivATI((UInt32)buffer, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetObjectBufferivATI(Int32 buffer, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetObjectBufferivATI((UInt32)buffer, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetObjectBufferivATI(UInt32 buffer, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetObjectBufferivATI((UInt32)buffer, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetObjectBufferivATI(Int32 buffer, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetObjectBufferivATI((UInt32)buffer, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFreeObjectBufferATI(UInt32 buffer)
+        {
+            Delegates.glFreeObjectBufferATI((UInt32)buffer);
+        }
+
+        public static 
+        void glFreeObjectBufferATI(Int32 buffer)
+        {
+            Delegates.glFreeObjectBufferATI((UInt32)buffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glArrayObjectATI(int array, Int32 size, int type, Int32 stride, UInt32 buffer, UInt32 offset)
+        {
+            Delegates.glArrayObjectATI((int)array, (Int32)size, (int)type, (Int32)stride, (UInt32)buffer, (UInt32)offset);
+        }
+
+        public static 
+        void glArrayObjectATI(int array, Int32 size, int type, Int32 stride, Int32 buffer, Int32 offset)
+        {
+            Delegates.glArrayObjectATI((int)array, (Int32)size, (int)type, (Int32)stride, (UInt32)buffer, (UInt32)offset);
+        }
+
+        public static 
+        void glGetArrayObjectfvATI(int array, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetArrayObjectfvATI((int)array, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetArrayObjectfvATI(int array, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetArrayObjectfvATI((int)array, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetArrayObjectfvATI(int array, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetArrayObjectfvATI((int)array, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetArrayObjectivATI(int array, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetArrayObjectivATI((int)array, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetArrayObjectivATI(int array, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetArrayObjectivATI((int)array, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetArrayObjectivATI(int array, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetArrayObjectivATI((int)array, (int)pname, (Int32*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVariantArrayObjectATI(UInt32 id, int type, Int32 stride, UInt32 buffer, UInt32 offset)
+        {
+            Delegates.glVariantArrayObjectATI((UInt32)id, (int)type, (Int32)stride, (UInt32)buffer, (UInt32)offset);
+        }
+
+        public static 
+        void glVariantArrayObjectATI(Int32 id, int type, Int32 stride, Int32 buffer, Int32 offset)
+        {
+            Delegates.glVariantArrayObjectATI((UInt32)id, (int)type, (Int32)stride, (UInt32)buffer, (UInt32)offset);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantArrayObjectfvATI(UInt32 id, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetVariantArrayObjectfvATI((UInt32)id, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantArrayObjectfvATI(Int32 id, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetVariantArrayObjectfvATI((UInt32)id, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantArrayObjectfvATI(UInt32 id, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetVariantArrayObjectfvATI((UInt32)id, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantArrayObjectfvATI(Int32 id, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetVariantArrayObjectfvATI((UInt32)id, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantArrayObjectfvATI(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantArrayObjectfvATI((UInt32)id, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetVariantArrayObjectfvATI(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantArrayObjectfvATI((UInt32)id, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantArrayObjectivATI(UInt32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVariantArrayObjectivATI((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantArrayObjectivATI(Int32 id, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVariantArrayObjectivATI((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantArrayObjectivATI(UInt32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVariantArrayObjectivATI((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVariantArrayObjectivATI(Int32 id, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVariantArrayObjectivATI((UInt32)id, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVariantArrayObjectivATI(UInt32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantArrayObjectivATI((UInt32)id, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetVariantArrayObjectivATI(Int32 id, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVariantArrayObjectivATI((UInt32)id, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glVertexStream1sATI(int stream, Int16 x)
+        {
+            Delegates.glVertexStream1sATI((int)stream, (Int16)x);
+        }
+
+        public static 
+        void glVertexStream1svATI(int stream, Int16[] coords)
+        {
+            unsafe
+            {
+                fixed (Int16* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream1svATI((int)stream, (Int16*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream1svATI(int stream, ref Int16 coords)
+        {
+            unsafe
+            {
+                fixed (Int16* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream1svATI((int)stream, (Int16*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream1svATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream1svATI((int)stream, (Int16*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream1iATI(int stream, Int32 x)
+        {
+            Delegates.glVertexStream1iATI((int)stream, (Int32)x);
+        }
+
+        public static 
+        void glVertexStream1ivATI(int stream, Int32[] coords)
+        {
+            unsafe
+            {
+                fixed (Int32* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream1ivATI((int)stream, (Int32*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream1ivATI(int stream, ref Int32 coords)
+        {
+            unsafe
+            {
+                fixed (Int32* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream1ivATI((int)stream, (Int32*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream1ivATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream1ivATI((int)stream, (Int32*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream1fATI(int stream, Single x)
+        {
+            Delegates.glVertexStream1fATI((int)stream, (Single)x);
+        }
+
+        public static 
+        void glVertexStream1fvATI(int stream, Single[] coords)
+        {
+            unsafe
+            {
+                fixed (Single* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream1fvATI((int)stream, (Single*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream1fvATI(int stream, ref Single coords)
+        {
+            unsafe
+            {
+                fixed (Single* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream1fvATI((int)stream, (Single*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream1fvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream1fvATI((int)stream, (Single*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream1dATI(int stream, Double x)
+        {
+            Delegates.glVertexStream1dATI((int)stream, (Double)x);
+        }
+
+        public static 
+        void glVertexStream1dvATI(int stream, Double[] coords)
+        {
+            unsafe
+            {
+                fixed (Double* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream1dvATI((int)stream, (Double*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream1dvATI(int stream, ref Double coords)
+        {
+            unsafe
+            {
+                fixed (Double* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream1dvATI((int)stream, (Double*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream1dvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream1dvATI((int)stream, (Double*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream2sATI(int stream, Int16 x, Int16 y)
+        {
+            Delegates.glVertexStream2sATI((int)stream, (Int16)x, (Int16)y);
+        }
+
+        public static 
+        void glVertexStream2svATI(int stream, Int16[] coords)
+        {
+            unsafe
+            {
+                fixed (Int16* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream2svATI((int)stream, (Int16*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream2svATI(int stream, ref Int16 coords)
+        {
+            unsafe
+            {
+                fixed (Int16* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream2svATI((int)stream, (Int16*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream2svATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream2svATI((int)stream, (Int16*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream2iATI(int stream, Int32 x, Int32 y)
+        {
+            Delegates.glVertexStream2iATI((int)stream, (Int32)x, (Int32)y);
+        }
+
+        public static 
+        void glVertexStream2ivATI(int stream, Int32[] coords)
+        {
+            unsafe
+            {
+                fixed (Int32* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream2ivATI((int)stream, (Int32*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream2ivATI(int stream, ref Int32 coords)
+        {
+            unsafe
+            {
+                fixed (Int32* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream2ivATI((int)stream, (Int32*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream2ivATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream2ivATI((int)stream, (Int32*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream2fATI(int stream, Single x, Single y)
+        {
+            Delegates.glVertexStream2fATI((int)stream, (Single)x, (Single)y);
+        }
+
+        public static 
+        void glVertexStream2fvATI(int stream, Single[] coords)
+        {
+            unsafe
+            {
+                fixed (Single* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream2fvATI((int)stream, (Single*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream2fvATI(int stream, ref Single coords)
+        {
+            unsafe
+            {
+                fixed (Single* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream2fvATI((int)stream, (Single*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream2fvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream2fvATI((int)stream, (Single*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream2dATI(int stream, Double x, Double y)
+        {
+            Delegates.glVertexStream2dATI((int)stream, (Double)x, (Double)y);
+        }
+
+        public static 
+        void glVertexStream2dvATI(int stream, Double[] coords)
+        {
+            unsafe
+            {
+                fixed (Double* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream2dvATI((int)stream, (Double*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream2dvATI(int stream, ref Double coords)
+        {
+            unsafe
+            {
+                fixed (Double* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream2dvATI((int)stream, (Double*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream2dvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream2dvATI((int)stream, (Double*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream3sATI(int stream, Int16 x, Int16 y, Int16 z)
+        {
+            Delegates.glVertexStream3sATI((int)stream, (Int16)x, (Int16)y, (Int16)z);
+        }
+
+        public static 
+        void glVertexStream3svATI(int stream, Int16[] coords)
+        {
+            unsafe
+            {
+                fixed (Int16* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream3svATI((int)stream, (Int16*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream3svATI(int stream, ref Int16 coords)
+        {
+            unsafe
+            {
+                fixed (Int16* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream3svATI((int)stream, (Int16*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream3svATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream3svATI((int)stream, (Int16*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream3iATI(int stream, Int32 x, Int32 y, Int32 z)
+        {
+            Delegates.glVertexStream3iATI((int)stream, (Int32)x, (Int32)y, (Int32)z);
+        }
+
+        public static 
+        void glVertexStream3ivATI(int stream, Int32[] coords)
+        {
+            unsafe
+            {
+                fixed (Int32* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream3ivATI((int)stream, (Int32*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream3ivATI(int stream, ref Int32 coords)
+        {
+            unsafe
+            {
+                fixed (Int32* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream3ivATI((int)stream, (Int32*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream3ivATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream3ivATI((int)stream, (Int32*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream3fATI(int stream, Single x, Single y, Single z)
+        {
+            Delegates.glVertexStream3fATI((int)stream, (Single)x, (Single)y, (Single)z);
+        }
+
+        public static 
+        void glVertexStream3fvATI(int stream, Single[] coords)
+        {
+            unsafe
+            {
+                fixed (Single* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream3fvATI((int)stream, (Single*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream3fvATI(int stream, ref Single coords)
+        {
+            unsafe
+            {
+                fixed (Single* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream3fvATI((int)stream, (Single*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream3fvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream3fvATI((int)stream, (Single*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream3dATI(int stream, Double x, Double y, Double z)
+        {
+            Delegates.glVertexStream3dATI((int)stream, (Double)x, (Double)y, (Double)z);
+        }
+
+        public static 
+        void glVertexStream3dvATI(int stream, Double[] coords)
+        {
+            unsafe
+            {
+                fixed (Double* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream3dvATI((int)stream, (Double*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream3dvATI(int stream, ref Double coords)
+        {
+            unsafe
+            {
+                fixed (Double* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream3dvATI((int)stream, (Double*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream3dvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream3dvATI((int)stream, (Double*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream4sATI(int stream, Int16 x, Int16 y, Int16 z, Int16 w)
+        {
+            Delegates.glVertexStream4sATI((int)stream, (Int16)x, (Int16)y, (Int16)z, (Int16)w);
+        }
+
+        public static 
+        void glVertexStream4svATI(int stream, Int16[] coords)
+        {
+            unsafe
+            {
+                fixed (Int16* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream4svATI((int)stream, (Int16*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream4svATI(int stream, ref Int16 coords)
+        {
+            unsafe
+            {
+                fixed (Int16* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream4svATI((int)stream, (Int16*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream4svATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream4svATI((int)stream, (Int16*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream4iATI(int stream, Int32 x, Int32 y, Int32 z, Int32 w)
+        {
+            Delegates.glVertexStream4iATI((int)stream, (Int32)x, (Int32)y, (Int32)z, (Int32)w);
+        }
+
+        public static 
+        void glVertexStream4ivATI(int stream, Int32[] coords)
+        {
+            unsafe
+            {
+                fixed (Int32* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream4ivATI((int)stream, (Int32*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream4ivATI(int stream, ref Int32 coords)
+        {
+            unsafe
+            {
+                fixed (Int32* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream4ivATI((int)stream, (Int32*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream4ivATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream4ivATI((int)stream, (Int32*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream4fATI(int stream, Single x, Single y, Single z, Single w)
+        {
+            Delegates.glVertexStream4fATI((int)stream, (Single)x, (Single)y, (Single)z, (Single)w);
+        }
+
+        public static 
+        void glVertexStream4fvATI(int stream, Single[] coords)
+        {
+            unsafe
+            {
+                fixed (Single* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream4fvATI((int)stream, (Single*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream4fvATI(int stream, ref Single coords)
+        {
+            unsafe
+            {
+                fixed (Single* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream4fvATI((int)stream, (Single*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream4fvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream4fvATI((int)stream, (Single*)coords);
+            }
+        }
+
+        public static 
+        void glVertexStream4dATI(int stream, Double x, Double y, Double z, Double w)
+        {
+            Delegates.glVertexStream4dATI((int)stream, (Double)x, (Double)y, (Double)z, (Double)w);
+        }
+
+        public static 
+        void glVertexStream4dvATI(int stream, Double[] coords)
+        {
+            unsafe
+            {
+                fixed (Double* coords_ptr = coords)
+                {
+                    Delegates.glVertexStream4dvATI((int)stream, (Double*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream4dvATI(int stream, ref Double coords)
+        {
+            unsafe
+            {
+                fixed (Double* coords_ptr = &coords)
+                {
+                    Delegates.glVertexStream4dvATI((int)stream, (Double*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glVertexStream4dvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glVertexStream4dvATI((int)stream, (Double*)coords);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glNormalStream3bATI(int stream, SByte nx, SByte ny, SByte nz)
+        {
+            Delegates.glNormalStream3bATI((int)stream, (SByte)nx, (SByte)ny, (SByte)nz);
+        }
+
+        public static 
+        void glNormalStream3bATI(int stream, Byte nx, Byte ny, Byte nz)
+        {
+            Delegates.glNormalStream3bATI((int)stream, (SByte)nx, (SByte)ny, (SByte)nz);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glNormalStream3bvATI(int stream, SByte[] coords)
+        {
+            unsafe
+            {
+                fixed (SByte* coords_ptr = coords)
+                {
+                    Delegates.glNormalStream3bvATI((int)stream, (SByte*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3bvATI(int stream, Byte[] coords)
+        {
+            unsafe
+            {
+                fixed (Byte* coords_ptr = coords)
+                {
+                    Delegates.glNormalStream3bvATI((int)stream, (SByte*)coords_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glNormalStream3bvATI(int stream, ref SByte coords)
+        {
+            unsafe
+            {
+                fixed (SByte* coords_ptr = &coords)
+                {
+                    Delegates.glNormalStream3bvATI((int)stream, (SByte*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3bvATI(int stream, ref Byte coords)
+        {
+            unsafe
+            {
+                fixed (Byte* coords_ptr = &coords)
+                {
+                    Delegates.glNormalStream3bvATI((int)stream, (SByte*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3bvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glNormalStream3bvATI((int)stream, (SByte*)coords);
+            }
+        }
+
+        public static 
+        void glNormalStream3sATI(int stream, Int16 nx, Int16 ny, Int16 nz)
+        {
+            Delegates.glNormalStream3sATI((int)stream, (Int16)nx, (Int16)ny, (Int16)nz);
+        }
+
+        public static 
+        void glNormalStream3svATI(int stream, Int16[] coords)
+        {
+            unsafe
+            {
+                fixed (Int16* coords_ptr = coords)
+                {
+                    Delegates.glNormalStream3svATI((int)stream, (Int16*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3svATI(int stream, ref Int16 coords)
+        {
+            unsafe
+            {
+                fixed (Int16* coords_ptr = &coords)
+                {
+                    Delegates.glNormalStream3svATI((int)stream, (Int16*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3svATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glNormalStream3svATI((int)stream, (Int16*)coords);
+            }
+        }
+
+        public static 
+        void glNormalStream3iATI(int stream, Int32 nx, Int32 ny, Int32 nz)
+        {
+            Delegates.glNormalStream3iATI((int)stream, (Int32)nx, (Int32)ny, (Int32)nz);
+        }
+
+        public static 
+        void glNormalStream3ivATI(int stream, Int32[] coords)
+        {
+            unsafe
+            {
+                fixed (Int32* coords_ptr = coords)
+                {
+                    Delegates.glNormalStream3ivATI((int)stream, (Int32*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3ivATI(int stream, ref Int32 coords)
+        {
+            unsafe
+            {
+                fixed (Int32* coords_ptr = &coords)
+                {
+                    Delegates.glNormalStream3ivATI((int)stream, (Int32*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3ivATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glNormalStream3ivATI((int)stream, (Int32*)coords);
+            }
+        }
+
+        public static 
+        void glNormalStream3fATI(int stream, Single nx, Single ny, Single nz)
+        {
+            Delegates.glNormalStream3fATI((int)stream, (Single)nx, (Single)ny, (Single)nz);
+        }
+
+        public static 
+        void glNormalStream3fvATI(int stream, Single[] coords)
+        {
+            unsafe
+            {
+                fixed (Single* coords_ptr = coords)
+                {
+                    Delegates.glNormalStream3fvATI((int)stream, (Single*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3fvATI(int stream, ref Single coords)
+        {
+            unsafe
+            {
+                fixed (Single* coords_ptr = &coords)
+                {
+                    Delegates.glNormalStream3fvATI((int)stream, (Single*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3fvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glNormalStream3fvATI((int)stream, (Single*)coords);
+            }
+        }
+
+        public static 
+        void glNormalStream3dATI(int stream, Double nx, Double ny, Double nz)
+        {
+            Delegates.glNormalStream3dATI((int)stream, (Double)nx, (Double)ny, (Double)nz);
+        }
+
+        public static 
+        void glNormalStream3dvATI(int stream, Double[] coords)
+        {
+            unsafe
+            {
+                fixed (Double* coords_ptr = coords)
+                {
+                    Delegates.glNormalStream3dvATI((int)stream, (Double*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3dvATI(int stream, ref Double coords)
+        {
+            unsafe
+            {
+                fixed (Double* coords_ptr = &coords)
+                {
+                    Delegates.glNormalStream3dvATI((int)stream, (Double*)coords_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glNormalStream3dvATI(int stream, IntPtr coords)
+        {
+            unsafe
+            {
+                Delegates.glNormalStream3dvATI((int)stream, (Double*)coords);
+            }
+        }
+
+        public static 
+        void glClientActiveVertexStreamATI(int stream)
+        {
+            Delegates.glClientActiveVertexStreamATI((int)stream);
+        }
+
+        public static 
+        void glVertexBlendEnviATI(int pname, Int32 param)
+        {
+            Delegates.glVertexBlendEnviATI((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glVertexBlendEnvfATI(int pname, Single param)
+        {
+            Delegates.glVertexBlendEnvfATI((int)pname, (Single)param);
+        }
+
+        public static 
+        void glElementPointerATI(int type, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glElementPointerATI((int)type, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glElementPointerATI(int type, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glElementPointerATI((int)type, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glDrawElementArrayATI(int mode, Int32 count)
+        {
+            Delegates.glDrawElementArrayATI((int)mode, (Int32)count);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDrawRangeElementArrayATI(int mode, UInt32 start, UInt32 end, Int32 count)
+        {
+            Delegates.glDrawRangeElementArrayATI((int)mode, (UInt32)start, (UInt32)end, (Int32)count);
+        }
+
+        public static 
+        void glDrawRangeElementArrayATI(int mode, Int32 start, Int32 end, Int32 count)
+        {
+            Delegates.glDrawRangeElementArrayATI((int)mode, (UInt32)start, (UInt32)end, (Int32)count);
+        }
+
+        public static 
+        void glDrawBuffersATI(Int32 n, int[] bufs)
+        {
+            unsafe
+            {
+                fixed (int* bufs_ptr = bufs)
+                {
+                    Delegates.glDrawBuffersATI((Int32)n, (int*)bufs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDrawBuffersATI(Int32 n, ref int bufs)
+        {
+            unsafe
+            {
+                fixed (int* bufs_ptr = &bufs)
+                {
+                    Delegates.glDrawBuffersATI((Int32)n, (int*)bufs_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDrawBuffersATI(Int32 n, IntPtr bufs)
+        {
+            unsafe
+            {
+                Delegates.glDrawBuffersATI((Int32)n, (int*)bufs);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        IntPtr glMapObjectBufferATI(UInt32 buffer)
+        {
+            return Delegates.glMapObjectBufferATI((UInt32)buffer);
+        }
+
+        public static 
+        IntPtr glMapObjectBufferATI(Int32 buffer)
+        {
+            return Delegates.glMapObjectBufferATI((UInt32)buffer);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glUnmapObjectBufferATI(UInt32 buffer)
+        {
+            Delegates.glUnmapObjectBufferATI((UInt32)buffer);
+        }
+
+        public static 
+        void glUnmapObjectBufferATI(Int32 buffer)
+        {
+            Delegates.glUnmapObjectBufferATI((UInt32)buffer);
+        }
+
+        public static 
+        void glStencilOpSeparateATI(int face, int sfail, int dpfail, int dppass)
+        {
+            Delegates.glStencilOpSeparateATI((int)face, (int)sfail, (int)dpfail, (int)dppass);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glStencilFuncSeparateATI(int frontfunc, int backfunc, Int32 @ref, UInt32 mask)
+        {
+            Delegates.glStencilFuncSeparateATI((int)frontfunc, (int)backfunc, (Int32)@ref, (UInt32)mask);
+        }
+
+        public static 
+        void glStencilFuncSeparateATI(int frontfunc, int backfunc, Int32 @ref, Int32 mask)
+        {
+            Delegates.glStencilFuncSeparateATI((int)frontfunc, (int)backfunc, (Int32)@ref, (UInt32)mask);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glVertexAttribArrayObjectATI(UInt32 index, Int32 size, int type, bool normalized, Int32 stride, UInt32 buffer, UInt32 offset)
+        {
+            Delegates.glVertexAttribArrayObjectATI((UInt32)index, (Int32)size, (int)type, (bool)normalized, (Int32)stride, (UInt32)buffer, (UInt32)offset);
+        }
+
+        public static 
+        void glVertexAttribArrayObjectATI(Int32 index, Int32 size, int type, bool normalized, Int32 stride, Int32 buffer, Int32 offset)
+        {
+            Delegates.glVertexAttribArrayObjectATI((UInt32)index, (Int32)size, (int)type, (bool)normalized, (Int32)stride, (UInt32)buffer, (UInt32)offset);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribArrayObjectfvATI(UInt32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribArrayObjectfvATI((UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribArrayObjectfvATI(Int32 index, int pname, [Out] Single[] @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribArrayObjectfvATI((UInt32)index, (int)pname, (Single*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribArrayObjectfvATI(UInt32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribArrayObjectfvATI((UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribArrayObjectfvATI(Int32 index, int pname, [Out] out Single @params)
+        {
+            unsafe
+            {
+                fixed (Single* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribArrayObjectfvATI((UInt32)index, (int)pname, (Single*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribArrayObjectfvATI(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribArrayObjectfvATI((UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribArrayObjectfvATI(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribArrayObjectfvATI((UInt32)index, (int)pname, (Single*)@params);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribArrayObjectivATI(UInt32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribArrayObjectivATI((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribArrayObjectivATI(Int32 index, int pname, [Out] Int32[] @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = @params)
+                {
+                    Delegates.glGetVertexAttribArrayObjectivATI((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribArrayObjectivATI(UInt32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribArrayObjectivATI((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGetVertexAttribArrayObjectivATI(Int32 index, int pname, [Out] out Int32 @params)
+        {
+            unsafe
+            {
+                fixed (Int32* @params_ptr = &@params)
+                {
+                    Delegates.glGetVertexAttribArrayObjectivATI((UInt32)index, (int)pname, (Int32*)@params_ptr);
+                    @params = *@params_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGetVertexAttribArrayObjectivATI(UInt32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribArrayObjectivATI((UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glGetVertexAttribArrayObjectivATI(Int32 index, int pname, [Out] IntPtr @params)
+        {
+            unsafe
+            {
+                Delegates.glGetVertexAttribArrayObjectivATI((UInt32)index, (int)pname, (Int32*)@params);
+            }
+        }
+
+        public static 
+        void glElementPointerAPPLE(int type, IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glElementPointerAPPLE((int)type, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glElementPointerAPPLE(int type, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glElementPointerAPPLE((int)type, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glDrawElementArrayAPPLE(int mode, Int32 first, Int32 count)
+        {
+            Delegates.glDrawElementArrayAPPLE((int)mode, (Int32)first, (Int32)count);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDrawRangeElementArrayAPPLE(int mode, UInt32 start, UInt32 end, Int32 first, Int32 count)
+        {
+            Delegates.glDrawRangeElementArrayAPPLE((int)mode, (UInt32)start, (UInt32)end, (Int32)first, (Int32)count);
+        }
+
+        public static 
+        void glDrawRangeElementArrayAPPLE(int mode, Int32 start, Int32 end, Int32 first, Int32 count)
+        {
+            Delegates.glDrawRangeElementArrayAPPLE((int)mode, (UInt32)start, (UInt32)end, (Int32)first, (Int32)count);
+        }
+
+        public static 
+        void glMultiDrawElementArrayAPPLE(int mode, Int32[] first, Int32[] count, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* first_ptr = first)
+                fixed (Int32* count_ptr = count)
+                {
+                    Delegates.glMultiDrawElementArrayAPPLE((int)mode, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount);
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawElementArrayAPPLE(int mode, ref Int32 first, ref Int32 count, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* first_ptr = &first)
+                fixed (Int32* count_ptr = &count)
+                {
+                    Delegates.glMultiDrawElementArrayAPPLE((int)mode, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount);
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawElementArrayAPPLE(int mode, IntPtr first, IntPtr count, Int32 primcount)
+        {
+            unsafe
+            {
+                Delegates.glMultiDrawElementArrayAPPLE((int)mode, (Int32*)first, (Int32*)count, (Int32)primcount);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiDrawRangeElementArrayAPPLE(int mode, UInt32 start, UInt32 end, Int32[] first, Int32[] count, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* first_ptr = first)
+                fixed (Int32* count_ptr = count)
+                {
+                    Delegates.glMultiDrawRangeElementArrayAPPLE((int)mode, (UInt32)start, (UInt32)end, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount);
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawRangeElementArrayAPPLE(int mode, Int32 start, Int32 end, Int32[] first, Int32[] count, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* first_ptr = first)
+                fixed (Int32* count_ptr = count)
+                {
+                    Delegates.glMultiDrawRangeElementArrayAPPLE((int)mode, (UInt32)start, (UInt32)end, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiDrawRangeElementArrayAPPLE(int mode, UInt32 start, UInt32 end, ref Int32 first, ref Int32 count, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* first_ptr = &first)
+                fixed (Int32* count_ptr = &count)
+                {
+                    Delegates.glMultiDrawRangeElementArrayAPPLE((int)mode, (UInt32)start, (UInt32)end, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount);
+                }
+            }
+        }
+
+        public static 
+        void glMultiDrawRangeElementArrayAPPLE(int mode, Int32 start, Int32 end, ref Int32 first, ref Int32 count, Int32 primcount)
+        {
+            unsafe
+            {
+                fixed (Int32* first_ptr = &first)
+                fixed (Int32* count_ptr = &count)
+                {
+                    Delegates.glMultiDrawRangeElementArrayAPPLE((int)mode, (UInt32)start, (UInt32)end, (Int32*)first_ptr, (Int32*)count_ptr, (Int32)primcount);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glMultiDrawRangeElementArrayAPPLE(int mode, UInt32 start, UInt32 end, IntPtr first, IntPtr count, Int32 primcount)
+        {
+            unsafe
+            {
+                Delegates.glMultiDrawRangeElementArrayAPPLE((int)mode, (UInt32)start, (UInt32)end, (Int32*)first, (Int32*)count, (Int32)primcount);
+            }
+        }
+
+        public static 
+        void glMultiDrawRangeElementArrayAPPLE(int mode, Int32 start, Int32 end, IntPtr first, IntPtr count, Int32 primcount)
+        {
+            unsafe
+            {
+                Delegates.glMultiDrawRangeElementArrayAPPLE((int)mode, (UInt32)start, (UInt32)end, (Int32*)first, (Int32*)count, (Int32)primcount);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenFencesAPPLE(Int32 n, [Out] UInt32[] fences)
+        {
+            unsafe
+            {
+                fixed (UInt32* fences_ptr = fences)
+                {
+                    Delegates.glGenFencesAPPLE((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenFencesAPPLE(Int32 n, [Out] Int32[] fences)
+        {
+            unsafe
+            {
+                fixed (Int32* fences_ptr = fences)
+                {
+                    Delegates.glGenFencesAPPLE((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenFencesAPPLE(Int32 n, [Out] out UInt32 fences)
+        {
+            unsafe
+            {
+                fixed (UInt32* fences_ptr = &fences)
+                {
+                    Delegates.glGenFencesAPPLE((Int32)n, (UInt32*)fences_ptr);
+                    fences = *fences_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenFencesAPPLE(Int32 n, [Out] out Int32 fences)
+        {
+            unsafe
+            {
+                fixed (Int32* fences_ptr = &fences)
+                {
+                    Delegates.glGenFencesAPPLE((Int32)n, (UInt32*)fences_ptr);
+                    fences = *fences_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenFencesAPPLE(Int32 n, [Out] IntPtr fences)
+        {
+            unsafe
+            {
+                Delegates.glGenFencesAPPLE((Int32)n, (UInt32*)fences);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteFencesAPPLE(Int32 n, UInt32[] fences)
+        {
+            unsafe
+            {
+                fixed (UInt32* fences_ptr = fences)
+                {
+                    Delegates.glDeleteFencesAPPLE((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteFencesAPPLE(Int32 n, Int32[] fences)
+        {
+            unsafe
+            {
+                fixed (Int32* fences_ptr = fences)
+                {
+                    Delegates.glDeleteFencesAPPLE((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteFencesAPPLE(Int32 n, ref UInt32 fences)
+        {
+            unsafe
+            {
+                fixed (UInt32* fences_ptr = &fences)
+                {
+                    Delegates.glDeleteFencesAPPLE((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteFencesAPPLE(Int32 n, ref Int32 fences)
+        {
+            unsafe
+            {
+                fixed (Int32* fences_ptr = &fences)
+                {
+                    Delegates.glDeleteFencesAPPLE((Int32)n, (UInt32*)fences_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteFencesAPPLE(Int32 n, IntPtr fences)
+        {
+            unsafe
+            {
+                Delegates.glDeleteFencesAPPLE((Int32)n, (UInt32*)fences);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glSetFenceAPPLE(UInt32 fence)
+        {
+            Delegates.glSetFenceAPPLE((UInt32)fence);
+        }
+
+        public static 
+        void glSetFenceAPPLE(Int32 fence)
+        {
+            Delegates.glSetFenceAPPLE((UInt32)fence);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsFenceAPPLE(UInt32 fence)
+        {
+            return Delegates.glIsFenceAPPLE((UInt32)fence);
+        }
+
+        public static 
+        bool glIsFenceAPPLE(Int32 fence)
+        {
+            return Delegates.glIsFenceAPPLE((UInt32)fence);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glTestFenceAPPLE(UInt32 fence)
+        {
+            return Delegates.glTestFenceAPPLE((UInt32)fence);
+        }
+
+        public static 
+        bool glTestFenceAPPLE(Int32 fence)
+        {
+            return Delegates.glTestFenceAPPLE((UInt32)fence);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glFinishFenceAPPLE(UInt32 fence)
+        {
+            Delegates.glFinishFenceAPPLE((UInt32)fence);
+        }
+
+        public static 
+        void glFinishFenceAPPLE(Int32 fence)
+        {
+            Delegates.glFinishFenceAPPLE((UInt32)fence);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glTestObjectAPPLE(int @object, UInt32 name)
+        {
+            return Delegates.glTestObjectAPPLE((int)@object, (UInt32)name);
+        }
+
+        public static 
+        bool glTestObjectAPPLE(int @object, Int32 name)
+        {
+            return Delegates.glTestObjectAPPLE((int)@object, (UInt32)name);
+        }
+
+        public static 
+        void glFinishObjectAPPLE(int @object, Int32 name)
+        {
+            Delegates.glFinishObjectAPPLE((int)@object, (Int32)name);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glBindVertexArrayAPPLE(UInt32 array)
+        {
+            Delegates.glBindVertexArrayAPPLE((UInt32)array);
+        }
+
+        public static 
+        void glBindVertexArrayAPPLE(Int32 array)
+        {
+            Delegates.glBindVertexArrayAPPLE((UInt32)array);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteVertexArraysAPPLE(Int32 n, UInt32[] arrays)
+        {
+            unsafe
+            {
+                fixed (UInt32* arrays_ptr = arrays)
+                {
+                    Delegates.glDeleteVertexArraysAPPLE((Int32)n, (UInt32*)arrays_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteVertexArraysAPPLE(Int32 n, Int32[] arrays)
+        {
+            unsafe
+            {
+                fixed (Int32* arrays_ptr = arrays)
+                {
+                    Delegates.glDeleteVertexArraysAPPLE((Int32)n, (UInt32*)arrays_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glDeleteVertexArraysAPPLE(Int32 n, ref UInt32 arrays)
+        {
+            unsafe
+            {
+                fixed (UInt32* arrays_ptr = &arrays)
+                {
+                    Delegates.glDeleteVertexArraysAPPLE((Int32)n, (UInt32*)arrays_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteVertexArraysAPPLE(Int32 n, ref Int32 arrays)
+        {
+            unsafe
+            {
+                fixed (Int32* arrays_ptr = &arrays)
+                {
+                    Delegates.glDeleteVertexArraysAPPLE((Int32)n, (UInt32*)arrays_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glDeleteVertexArraysAPPLE(Int32 n, IntPtr arrays)
+        {
+            unsafe
+            {
+                Delegates.glDeleteVertexArraysAPPLE((Int32)n, (UInt32*)arrays);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenVertexArraysAPPLE(Int32 n, [Out] UInt32[] arrays)
+        {
+            unsafe
+            {
+                fixed (UInt32* arrays_ptr = arrays)
+                {
+                    Delegates.glGenVertexArraysAPPLE((Int32)n, (UInt32*)arrays_ptr);
+                }
+            }
+        }
+
+        public static 
+        void glGenVertexArraysAPPLE(Int32 n, [Out] Int32[] arrays)
+        {
+            unsafe
+            {
+                fixed (Int32* arrays_ptr = arrays)
+                {
+                    Delegates.glGenVertexArraysAPPLE((Int32)n, (UInt32*)arrays_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void glGenVertexArraysAPPLE(Int32 n, [Out] out UInt32 arrays)
+        {
+            unsafe
+            {
+                fixed (UInt32* arrays_ptr = &arrays)
+                {
+                    Delegates.glGenVertexArraysAPPLE((Int32)n, (UInt32*)arrays_ptr);
+                    arrays = *arrays_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenVertexArraysAPPLE(Int32 n, [Out] out Int32 arrays)
+        {
+            unsafe
+            {
+                fixed (Int32* arrays_ptr = &arrays)
+                {
+                    Delegates.glGenVertexArraysAPPLE((Int32)n, (UInt32*)arrays_ptr);
+                    arrays = *arrays_ptr;
+                }
+            }
+        }
+
+        public static 
+        void glGenVertexArraysAPPLE(Int32 n, [Out] IntPtr arrays)
+        {
+            unsafe
+            {
+                Delegates.glGenVertexArraysAPPLE((Int32)n, (UInt32*)arrays);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool glIsVertexArrayAPPLE(UInt32 array)
+        {
+            return Delegates.glIsVertexArrayAPPLE((UInt32)array);
+        }
+
+        public static 
+        bool glIsVertexArrayAPPLE(Int32 array)
+        {
+            return Delegates.glIsVertexArrayAPPLE((UInt32)array);
+        }
+
+        public static 
+        void glVertexArrayRangeAPPLE(Int32 length, [Out] IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glVertexArrayRangeAPPLE((Int32)length, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glVertexArrayRangeAPPLE(Int32 length, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glVertexArrayRangeAPPLE((Int32)length, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glFlushVertexArrayRangeAPPLE(Int32 length, [Out] IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.glFlushVertexArrayRangeAPPLE((Int32)length, (IntPtr)pointer);
+            }
+        }
+
+        public static 
+        void glFlushVertexArrayRangeAPPLE(Int32 length, [In, Out] object pointer)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pointer_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pointer, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glFlushVertexArrayRangeAPPLE((Int32)length, (IntPtr)pointer_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pointer_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glVertexArrayParameteriAPPLE(int pname, Int32 param)
+        {
+            Delegates.glVertexArrayParameteriAPPLE((int)pname, (Int32)param);
+        }
+
+        public static 
+        void glBufferParameteriAPPLE(int target, int pname, Int32 param)
+        {
+            Delegates.glBufferParameteriAPPLE((int)target, (int)pname, (Int32)param);
+        }
+
+        public static 
+        void glFlushMappedBufferRangeAPPLE(int target, IntPtr offset, IntPtr size)
+        {
+            Delegates.glFlushMappedBufferRangeAPPLE((int)target, (IntPtr)offset, (IntPtr)size);
+        }
+
+        public static 
+        void glStringMarkerGREMEDY(Int32 len, IntPtr @string)
+        {
+            unsafe
+            {
+                Delegates.glStringMarkerGREMEDY((Int32)len, (IntPtr)@string);
+            }
+        }
+
+        public static 
+        void glStringMarkerGREMEDY(Int32 len, [In, Out] object @string)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle @string_ptr = System.Runtime.InteropServices.GCHandle.Alloc(@string, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    Delegates.glStringMarkerGREMEDY((Int32)len, (IntPtr)@string_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    @string_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        void glFrameTerminatorGREMEDY()
+        {
+            Delegates.glFrameTerminatorGREMEDY();
+        }
+
+    }
+}
diff --git a/src/Tao.OpenGl/GlExtensionLoader.cs b/src/Tao.OpenGl/GlExtensionLoader.cs
new file mode 100644
index 0000000..5c9c599
--- /dev/null
+++ b/src/Tao.OpenGl/GlExtensionLoader.cs
@@ -0,0 +1,498 @@
+#region License
+/*
+
+MIT License
+Copyright (c) 2004  Vladimir Vukicevic  <vladimir at pobox.com>
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections;
+using System.Runtime.InteropServices;
+using System.Reflection;
+
+namespace Tao.OpenGl
+{
+
+    //
+    // This attribute is used to decorate OpenGL extension entry points.
+    // It specifies both the extension name (full name, with GL_ prefix)
+    // as well as the library entry point that should be queried for a
+    // a particular method.  The field it's applied to will receive the
+    // address of the function, whereas the method is only used before
+    // postprocessing to tie a particular method with a particular extension.
+    //
+    /// <summary>
+    /// 
+    /// </summary>
+    [Obsolete("This attribute is obsolete. Extension loading is now handled by the Tao.OpenGl.Gl class")]
+    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method)]
+    public class OpenGLExtensionImport : Attribute
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public string ExtensionName;
+        /// <summary>
+        /// 
+        /// </summary>
+        public string EntryPoint;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="ExtensionName"></param>
+        /// <param name="EntryPoint"></param>
+        public OpenGLExtensionImport(string ExtensionName, string EntryPoint)
+        {
+            this.ExtensionName = ExtensionName;
+            this.EntryPoint = EntryPoint;
+        }
+    }
+
+    //
+    // The GlExtensionLoader singleton, available through GetInstance(),
+    // is responsible for loading extensions.
+    //
+    /// <summary>
+    /// 
+    /// </summary>
+    [Obsolete("This class is obsolete. Extension loading is now handled by the Tao.OpenGl.Gl class")]
+    public class GlExtensionLoader
+    {
+        //
+        // Data for a particular context; available extensions,
+        // already-loaded extensions, etc.
+        //
+
+        internal class GlContextInfo
+        {
+            public Hashtable AvailableExtensions;
+            public Hashtable LoadedExtensions;
+
+            public GlContextInfo()
+            {
+                AvailableExtensions = new Hashtable();
+                LoadedExtensions = new Hashtable();
+
+                ParseAvailableExtensions();
+            }
+
+            public void ParseAvailableExtensions()
+            {
+                // assumes that the context is already made current
+                IntPtr extstrptr = glGetString(0x00001f03); // GL_EXTENSIONS
+                if (extstrptr == IntPtr.Zero)
+                    return;               // no extensions are available
+
+                string extstr = Marshal.PtrToStringAnsi(extstrptr);
+
+                string[] exts = extstr.Split(' ');
+                foreach (string ext in exts)
+                {
+                    AvailableExtensions[ext] = true;
+                }
+
+                IntPtr verstrptr = glGetString(0x1F02); // GL_VERSION
+                if (verstrptr == IntPtr.Zero)
+                    return;               // this shoudn't happen
+
+                string verstr = Marshal.PtrToStringAnsi(verstrptr).Trim(new char[] { ' ' });
+
+                if (verstr.StartsWith("1.2"))
+                {
+                    AvailableExtensions["GL_VERSION_1_2"] = true;
+                }
+                else if (verstr.StartsWith("1.3"))
+                {
+                    AvailableExtensions["GL_VERSION_1_2"] = true;
+                    AvailableExtensions["GL_VERSION_1_3"] = true;
+                }
+                else if (verstr.StartsWith("1.4"))
+                {
+                    AvailableExtensions["GL_VERSION_1_2"] = true;
+                    AvailableExtensions["GL_VERSION_1_3"] = true;
+                    AvailableExtensions["GL_VERSION_1_4"] = true;
+                }
+                else if (verstr.StartsWith("1.5"))
+                {
+                    AvailableExtensions["GL_VERSION_1_2"] = true;
+                    AvailableExtensions["GL_VERSION_1_3"] = true;
+                    AvailableExtensions["GL_VERSION_1_4"] = true;
+                    AvailableExtensions["GL_VERSION_1_5"] = true;
+                }
+                else if (verstr.StartsWith("2"))
+                {
+                    AvailableExtensions["GL_VERSION_1_2"] = true;
+                    AvailableExtensions["GL_VERSION_1_3"] = true;
+                    AvailableExtensions["GL_VERSION_1_4"] = true;
+                    AvailableExtensions["GL_VERSION_1_5"] = true;
+                    AvailableExtensions["GL_VERSION_2_0"] = true;
+                }
+            }
+        }
+
+        // key -> GlContextInfo
+        // 0 is special key for the static context
+        private static Hashtable ContextInfo;
+
+        static GlExtensionLoader()
+        {
+            ContextInfo = new Hashtable();
+        }
+
+        // we can't depend on any symbols from Tao.OpenGl.Gl
+
+        // linux
+        [DllImport("libGL.so.1", EntryPoint = "glXGetProcAddress")]
+        internal static extern IntPtr glxGetProcAddress(string s);
+
+        // also linux, for our ARB-y friends
+        [DllImport("libGL.so.1", EntryPoint = "glXGetProcAddressARB")]
+        internal static extern IntPtr glxGetProcAddressARB(string s);
+
+        // windows
+        [DllImport("opengl32.dll", EntryPoint = "wglGetProcAddress")]
+        internal static extern IntPtr wglGetProcAddress(string s);
+
+        // osx gets complicated
+        [DllImport("libdl.dylib", EntryPoint = "NSIsSymbolNameDefined")]
+        internal static extern bool NSIsSymbolNameDefined(string s);
+        [DllImport("libdl.dylib", EntryPoint = "NSLookupAndBindSymbol")]
+        internal static extern IntPtr NSLookupAndBindSymbol(string s);
+        [DllImport("libdl.dylib", EntryPoint = "NSAddressOfSymbol")]
+        internal static extern IntPtr NSAddressOfSymbol(IntPtr symbol);
+
+        // we can't depend on Tao.OpenGl.Gl for this
+
+        [DllImport("opengl32.dll")]
+        internal static extern IntPtr glGetString(uint name);
+
+        internal static IntPtr aglGetProcAddress(string s)
+        {
+            string fname = "_" + s;
+            if (!NSIsSymbolNameDefined(fname))
+                return IntPtr.Zero;
+
+            IntPtr symbol = NSLookupAndBindSymbol(fname);
+            if (symbol != IntPtr.Zero)
+                symbol = NSAddressOfSymbol(symbol);
+
+            return symbol;
+        }
+
+        internal static GlContextInfo GetContextInfo(object ctx)
+        {
+            // use "0" to mean no context
+            if (ctx == null)
+                ctx = 0;
+
+            if (!ContextInfo.ContainsKey(ctx))
+            {
+                ContextInfo[ctx] = new GlContextInfo();
+            }
+
+            return ContextInfo[ctx] as GlContextInfo;
+        }
+
+        //
+        // the public entry point for a cross-platform GetProcAddress
+        //
+        enum GetProcAddressPlatform
+        {
+            Unknown,
+            Windows,
+            X11,
+            X11_ARB,
+            OSX
+        };
+
+        static GetProcAddressPlatform gpaPlatform = GetProcAddressPlatform.Unknown;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="s"></param>
+        /// <returns></returns>
+        public static IntPtr GetProcAddress(string s)
+        {
+            if (gpaPlatform == GetProcAddressPlatform.Unknown)
+            {
+                IntPtr result = IntPtr.Zero;
+
+                // WGL?
+                try
+                {
+                    result = wglGetProcAddress(s);
+                    gpaPlatform = GetProcAddressPlatform.Windows;
+                    return result;
+                }
+                catch (Exception)
+                {
+                }
+
+                // AGL? (before X11, since GLX might exist on OSX)
+                try
+                {
+                    result = aglGetProcAddress(s);
+                    gpaPlatform = GetProcAddressPlatform.OSX;
+                    return result;
+                }
+                catch (Exception)
+                {
+                }
+
+                // X11?
+                try
+                {
+                    result = glxGetProcAddress(s);
+                    gpaPlatform = GetProcAddressPlatform.X11;
+                    return result;
+                }
+                catch (Exception)
+                {
+                }
+
+                // X11 ARB?
+                try
+                {
+                    result = glxGetProcAddressARB(s);
+                    gpaPlatform = GetProcAddressPlatform.X11_ARB;
+                    return result;
+                }
+                catch (Exception)
+                {
+                }
+
+                // Ack!
+                throw new NotSupportedException("Can't figure out how to call GetProcAddress on this platform!");
+            }
+            else if (gpaPlatform == GetProcAddressPlatform.Windows)
+            {
+                return wglGetProcAddress(s);
+            }
+            else if (gpaPlatform == GetProcAddressPlatform.OSX)
+            {
+                return aglGetProcAddress(s);
+            }
+            else if (gpaPlatform == GetProcAddressPlatform.X11)
+            {
+                return glxGetProcAddress(s);
+            }
+            else if (gpaPlatform == GetProcAddressPlatform.X11_ARB)
+            {
+                return glxGetProcAddressARB(s);
+            }
+
+            throw new NotSupportedException("Shouldn't get here..");
+        }
+
+        private GlExtensionLoader()
+        {
+        }
+
+        /// <summary>
+        /// Returns trueif the extension with the given name is supported
+        /// in the global static context.
+        /// </summary>
+        /// <param name="extname">The extension name.</param>
+        /// <returns></returns>
+        public static bool IsExtensionSupported(string extname)
+        {
+            return IsExtensionSupported(null, extname);
+        }
+
+        /// <summary>
+        /// Returns true if the extension with the given name is supported
+        /// in the given context.
+        /// </summary>
+        /// <param name="contextGl">The context which to query.</param>
+        /// <param name="extname">The extension name.</param>
+        /// <returns></returns>
+        public static bool IsExtensionSupported(object contextGl, string extname)
+        {
+            GlContextInfo gci = GetContextInfo(contextGl);
+            if (gci.AvailableExtensions.ContainsKey(extname))
+                return true;
+            return false;
+        }
+
+        /// <summary>
+        /// Attempt to load the extension with the specified name into the
+        /// global static context.  Returns true on success.
+        /// </summary>
+        /// <param name="extname">The extension name.</param>
+        /// <returns></returns>
+        public static bool LoadExtension(string extname)
+        {
+            return LoadExtension(null, extname, false);
+        }
+
+        //
+        // LoadExtension
+        //
+        // Attempt to load the extension with the specified name into the
+        // given context, which must have already been made current.  The
+        // object passed in ought to be an instance of
+        // Tao.OpenGl.ContextGl, or null.
+        //
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="contextGl"></param>
+        /// <param name="extname"></param>
+        /// <returns></returns>
+        public static bool LoadExtension(object contextGl, string extname)
+        {
+            return LoadExtension(contextGl, extname, false);
+        }
+
+        //
+        // LoadExtension
+        //
+        // Attempt to load the extension with the specified name into the
+        // given context, which must have already been made current.  The
+        // object passed in ought to be an instance of
+        // Tao.OpenGl.ContextGl, or null. If forceLoad is set, attempt
+        // to obtain function pointers even if the runtime claims that the
+        // extension is not supported.
+        //
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="contextGl"></param>
+        /// <param name="extname"></param>
+        /// <param name="forceLoad"></param>
+        /// <returns></returns>
+        public static bool LoadExtension(object contextGl, string extname, bool forceLoad)
+        {
+            GlContextInfo gci = GetContextInfo(contextGl);
+            if (gci.LoadedExtensions.ContainsKey(extname))
+            {
+                return (bool)gci.LoadedExtensions[extname];
+            }
+
+            if (!forceLoad && !gci.AvailableExtensions.ContainsKey(extname))
+            {
+                return false;
+            }
+
+            // this will get us either the Tao.OpenGl.Gl or
+            // Tao.OpenGl.ContextGl class
+            Type glt;
+            if (contextGl != null)
+            {
+                glt = contextGl.GetType();
+            }
+            else
+            {
+                glt = StaticGlType;
+                if (glt == null)
+                {
+                    Console.WriteLine("GL type is null!");
+                }
+            }
+
+            FieldInfo[] fis = glt.GetFields(BindingFlags.Public |
+                                              BindingFlags.DeclaredOnly |
+                                              BindingFlags.Static |
+                                              BindingFlags.Instance);
+
+            foreach (FieldInfo fi in fis)
+            {
+                object[] attrs = fi.GetCustomAttributes(typeof(OpenGLExtensionImport), false);
+                if (attrs.Length == 0)
+                    continue;
+
+                OpenGLExtensionImport oglext = attrs[0] as OpenGLExtensionImport;
+                if (oglext.ExtensionName == extname)
+                {
+                    // did we already load this somehow?
+                    if (((IntPtr)fi.GetValue(contextGl)) != IntPtr.Zero)
+                        continue;
+
+                    //Console.WriteLine ("Loading " + oglext.EntryPoint + " for " + extname);
+                    IntPtr procaddr = GetProcAddress(oglext.EntryPoint);
+                    if (procaddr == IntPtr.Zero)
+                    {
+                        Console.WriteLine("OpenGL claimed that '{0}' was supported, but couldn't find '{1}' entry point",
+                                           extname, oglext.EntryPoint);
+                        // we crash if anyone tries to call this method, but that's ok
+                        continue;
+                    }
+
+                    fi.SetValue(contextGl, procaddr);
+                }
+            }
+
+            gci.LoadedExtensions[extname] = true;
+            return true;
+        }
+
+        //
+        // LoadAllExtensions
+        //
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public static void LoadAllExtensions()
+        {
+            LoadAllExtensions(null);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="contextGl"></param>
+        public static void LoadAllExtensions(object contextGl)
+        {
+            GlContextInfo gci = GetContextInfo(contextGl);
+
+            foreach (string ext in gci.AvailableExtensions.Keys)
+                LoadExtension(contextGl, ext, false);
+        }
+
+        //
+        // Find the Tao.OpenGl.Gl type
+        //
+        static Type mStaticGlType;
+        static Type StaticGlType
+        {
+            get
+            {
+                if (mStaticGlType != null)
+                    return mStaticGlType;
+
+                foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
+                {
+                    mStaticGlType = asm.GetType("Tao.OpenGl.Gl");
+                    if (mStaticGlType != null)
+                        return mStaticGlType;
+                }
+
+                throw new InvalidProgramException("Can't find Tao.OpenGl.Gl type in any loaded assembly!");
+            }
+        }
+    }
+}
diff --git a/src/Tao.OpenGl/GlHelper.cs b/src/Tao.OpenGl/GlHelper.cs
new file mode 100644
index 0000000..4faea60
--- /dev/null
+++ b/src/Tao.OpenGl/GlHelper.cs
@@ -0,0 +1,554 @@
+#region License
+/*
+MIT License
+Copyright �2003-2007 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#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;
+using System.IO;
+
+#endregion
+
+namespace Tao.OpenGl
+{
+    /// <summary>
+    /// OpenGL binding for .NET, implementing OpenGL 2.1, plus extensions.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This class contains all OpenGL enums and functions defined in the 2.1 specification.
+    /// The official .spec files can be found at: http://opengl.org/registry/.
+    /// </para>
+    /// <para>
+    /// We rely on static initialization to obtain the entry points for OpenGL functions.
+    /// Please ensure that a valid OpenGL context has been made current in the pertinent thread <b>before</b>
+    /// any OpenGL functions are called (toolkits like GLUT, SDL or GLFW will automatically take care of
+    /// the context initialization process). Without a valid OpenGL context, we will only be able
+    /// to retrieve statically exported entry points (typically corresponding to OpenGL version 1.1 under Windows,
+    /// 1.3 under Linux and 1.4 under Windows Vista), and extension methods will need to be loaded manually.
+    /// </para>
+    /// <para>
+    /// If you prefer to have more control on extension loading, you can use the
+    /// ReloadFunctions or ReloadFunction methods to manually force the initialisation of OpenGL entry points.
+    /// The ReloadFunctions method should be called whenever you change an existing visual or pixelformat. This
+    /// generally happens when you change the color/stencil/depth buffer associated with a window (but probably
+    /// not the resolution). This may or may not be necessary under Linux/MacOS, but is generally required for
+    /// Windows.
+    /// </para>
+    /// <para>
+    /// You can use the Gl.IsExtensionSupported method to check whether any given category of extension functions
+    /// exists in the current OpenGL context. The results can be cached to speed up future searches.
+    /// 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.
+    /// </para>
+    /// <para>
+    /// You may retrieve the entry point for an OpenGL function using the Gl.GetDelegate method.
+    /// </para>
+    /// <para>
+    /// <see href="http://opengl.org/registry/"/>
+    /// <seealso cref="Gl.IsExtensionSupported"/>
+    /// <seealso cref="Gl.GetDelegate"/>
+    /// <seealso cref="Gl.ReloadFunctions"/>
+    /// </para>
+    /// </remarks>
+    public static partial class Gl
+    {
+        #region --- Fields ---
+
+        static StringBuilder sb = new StringBuilder();
+        static object gl_lock = new object();
+
+        internal const string Library = "opengl32.dll";
+
+        //private static Dictionary<string, bool> AvailableExtensions = new Dictionary<string, bool>();
+        private static SortedList<string, bool> AvailableExtensions = new SortedList<string, bool>();
+        private static bool rebuildExtensionList;
+
+        private static Type glClass;
+        private static Type delegatesClass;
+        private static Type importsClass;
+        private static FieldInfo[] delegates;
+
+        #endregion
+
+        #region --- Static Constructor ---
+
+        static Gl()
+        {
+            glClass = typeof(Gl);
+            delegatesClass = glClass.GetNestedType("Delegates", BindingFlags.Static | BindingFlags.NonPublic);
+            importsClass = glClass.GetNestedType("Imports", BindingFlags.Static | BindingFlags.NonPublic);
+            // 'Touch' Imports class to force initialization. We don't want anything yet, just to have
+            // this class ready.
+            if (Imports.FunctionMap != null) { }
+            ReloadFunctions();
+        }
+
+        #endregion
+
+        #region --- Methods ---
+
+        #region internal static partial class Imports
+
+        /// <summary>
+        /// Contains DllImports for the core OpenGL functions.
+        /// </summary>
+        internal static partial class Imports
+        {
+            /// <summary>
+            ///  Build a string->MethodInfo map to speed up extension loading.
+            /// </summary>
+            internal static SortedList<string, MethodInfo> FunctionMap;  // This is faster than either Dictionary or SortedDictionary
+            static Imports()
+            {
+                MethodInfo[] methods = importsClass.GetMethods(BindingFlags.Static | BindingFlags.NonPublic);
+                FunctionMap = new SortedList<string, MethodInfo>(methods.Length);
+                foreach (MethodInfo m in methods)
+                    FunctionMap.Add(m.Name, m);
+            }
+        }
+
+        #endregion
+
+        #region public static bool IsExtensionSupported(string name)
+
+        /// <summary>
+        /// Determines whether the specified OpenGL extension category is available in
+        /// the current OpenGL context. Equivalent to IsExtensionSupported(name, true)
+        /// </summary>
+        /// <param name="name">The string for the OpenGL extension category (eg. "GL_ARB_multitexture")</param>
+        /// <returns>True if the specified extension is available, false otherwise.</returns>
+        public static bool IsExtensionSupported(string name)
+        {
+            if (rebuildExtensionList)
+                BuildExtensionList();
+
+            lock (gl_lock)
+            {
+                sb.Remove(0, sb.Length);
+                if (!name.StartsWith("GL_"))
+                    sb.Append("gl_");
+                sb.Append(name.ToLower());
+
+                // Search the cache for the string.
+                return AvailableExtensions.ContainsKey(sb.ToString());
+            }
+        }
+
+        #endregion
+
+        #region public static Delegate GetDelegate(string name, Type signature)
+
+        /// <summary>
+        /// Creates a System.Delegate that can be used to call an OpenGL function, core or extension.
+        /// </summary>
+        /// <param name="name">The name of the OpenGL function (eg. "glNewList")</param>
+        /// <param name="signature">The signature of the OpenGL function.</param>
+        /// <returns>
+        /// 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.
+        /// </returns>
+        public static Delegate GetDelegate(string name, Type signature)
+        {
+            MethodInfo m;
+            return GetExtensionDelegate(name, signature) ??
+                  (Imports.FunctionMap.TryGetValue((name.Substring(2)), out m) ?
+                   Delegate.CreateDelegate(signature, m) : null);
+        }
+
+        #endregion
+
+        #region public static void ReloadFunctions()
+
+        /// <summary>
+        /// Loads all OpenGL functions (core and extensions).
+        /// </summary>
+        /// <remarks>
+        /// <para>
+        /// This function will be automatically called the first time you use any opengl function. There is 
+        /// </para>
+        /// <para>
+        /// 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.
+        /// </para>
+        /// </remarks>
+        public static void ReloadFunctions()
+        {
+            // Using reflection is more than 3 times faster than directly loading delegates on the first
+            // run, probably due to code generation overhead. Subsequent runs are faster with direct loading
+            // than with reflection, but the first time is more significant.
+
+            if (delegates == null)
+                delegates = delegatesClass.GetFields(BindingFlags.Static | BindingFlags.NonPublic);
+
+            foreach (FieldInfo f in delegates)
+                f.SetValue(null, GetDelegate(f.Name, f.FieldType));
+
+            rebuildExtensionList = true;
+        }
+
+        static void set(object d, Delegate value)
+        {
+            d = value;
+        }
+
+        #endregion
+
+        #region public static bool ReloadFunction(string function)
+
+        /// <summary>
+        /// Tries to reload the given OpenGL function (core or extension).
+        /// </summary>
+        /// <param name="function">The name of the OpenGL function (i.e. glShaderSource)</param>
+        /// <returns>True if the function was found and reloaded, false otherwise.</returns>
+        /// <remarks>
+        /// <para>
+        /// Use this function if you require greater granularity when loading OpenGL entry points.
+        /// </para>
+        /// <para>
+        /// 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.
+        /// </para>
+        /// <para>
+        /// This function returns true if the given OpenGL function is supported, false otherwise.
+        /// </para>
+        /// <para>
+        /// To query for supported extensions use the IsExtensionSupported() function instead.
+        /// </para>
+        /// </remarks>
+        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 = GetDelegate(f.Name, f.FieldType);
+            if (old.Target != @new.Target)
+            {
+                f.SetValue(null, @new);
+                rebuildExtensionList = true;
+            }
+            return @new != null;
+        }
+
+        #endregion
+
+        #region private static void BuildExtensionList()
+
+        /// <summary>
+        /// Builds a cache of all supported extensions.
+        /// </summary>
+        private static void BuildExtensionList()
+        {
+            // Assumes there is an opengl context current.
+            AvailableExtensions.Clear();
+            string version_string = Gl.glGetString(Gl.GL_VERSION);
+            if (String.IsNullOrEmpty(version_string))
+                throw new ApplicationException("Failed to retrieve OpenGL version. 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).".
+            // We'll do some trickery to get the second version number (2.1), but this may break on
+            // some implementations...
+            // This works on Ati, Mesa, Nvidia, but I'd like someone to test on Intel, too.
+            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(' ');
+
+            // Ugh, this look ugly.
+            if (version.StartsWith("1.2"))
+            {
+                AvailableExtensions.Add("gl_version_1_1", true);
+                AvailableExtensions.Add("gl_version_1_2", true);
+            }
+            else if (version.StartsWith("1.3"))
+            {
+                AvailableExtensions.Add("gl_version_1_1", true);
+                AvailableExtensions.Add("gl_version_1_2", true);
+                AvailableExtensions.Add("gl_version_1_3", true);
+            }
+            else if (version.StartsWith("1.4"))
+            {
+                AvailableExtensions.Add("gl_version_1_1", true);
+                AvailableExtensions.Add("gl_version_1_2", true);
+                AvailableExtensions.Add("gl_version_1_3", true);
+                AvailableExtensions.Add("gl_version_1_4", true);
+            }
+            else if (version.StartsWith("1.5"))
+            {
+                AvailableExtensions.Add("gl_version_1_1", true);
+                AvailableExtensions.Add("gl_version_1_2", true);
+                AvailableExtensions.Add("gl_version_1_3", true);
+                AvailableExtensions.Add("gl_version_1_4", true);
+                AvailableExtensions.Add("gl_version_1_5", true);
+            }
+            else if (version.StartsWith("2.0"))
+            {
+                AvailableExtensions.Add("gl_version_1_1", true);
+                AvailableExtensions.Add("gl_version_1_2", true);
+                AvailableExtensions.Add("gl_version_1_3", true);
+                AvailableExtensions.Add("gl_version_1_4", true);
+                AvailableExtensions.Add("gl_version_1_5", true);
+                AvailableExtensions.Add("gl_version_2_0", true);
+            }
+            else if (version.StartsWith("2.1"))
+            {
+                AvailableExtensions.Add("gl_version_1_1", true);
+                AvailableExtensions.Add("gl_version_1_2", true);
+                AvailableExtensions.Add("gl_version_1_3", true);
+                AvailableExtensions.Add("gl_version_1_4", true);
+                AvailableExtensions.Add("gl_version_1_5", true);
+                AvailableExtensions.Add("gl_version_2_0", true);
+                AvailableExtensions.Add("gl_version_2_1", true);
+            }
+
+            string extension_string = Gl.glGetString(Gl.GL_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.ToLower(), true);
+
+            rebuildExtensionList = false;
+        }
+
+        #endregion
+
+        #endregion
+
+        #region --- GetProcAddress ---
+
+        private static IGetProcAddress getProcAddress;
+
+        internal interface IGetProcAddress
+        {
+            IntPtr GetProcAddress(string function);
+        }
+
+        internal class GetProcAddressWindows : IGetProcAddress
+        {
+            [System.Runtime.InteropServices.DllImport(Library, EntryPoint = "wglGetProcAddress", ExactSpelling = true)]
+            private static extern IntPtr wglGetProcAddress(String lpszProc);
+
+            public IntPtr GetProcAddress(string function)
+            {
+                return wglGetProcAddress(function);
+            }
+        }
+
+        internal class GetProcAddressX11 : IGetProcAddress
+        {
+            [DllImport(Library, EntryPoint = "glXGetProcAddress")]
+            private static extern IntPtr glxGetProcAddress([MarshalAs(UnmanagedType.LPTStr)] string procName);
+
+            public IntPtr GetProcAddress(string function)
+            {
+                return glxGetProcAddress(function);
+            }
+        }
+
+        internal class GetProcAddressOSX : IGetProcAddress
+        {
+            private const string Library = "libdl.dylib";
+
+            [DllImport(Library, EntryPoint = "NSIsSymbolNameDefined")]
+            private static extern bool NSIsSymbolNameDefined(string s);
+            [DllImport(Library, EntryPoint = "NSLookupAndBindSymbol")]
+            private static extern IntPtr NSLookupAndBindSymbol(string s);
+            [DllImport(Library, EntryPoint = "NSAddressOfSymbol")]
+            private static extern IntPtr NSAddressOfSymbol(IntPtr symbol);
+
+            public IntPtr GetProcAddress(string function)
+            {
+                string fname = "_" + function;
+                if (!NSIsSymbolNameDefined(fname))
+                    return IntPtr.Zero;
+
+                IntPtr symbol = NSLookupAndBindSymbol(fname);
+                if (symbol != IntPtr.Zero)
+                    symbol = NSAddressOfSymbol(symbol);
+
+                return symbol;
+            }
+        }
+
+        #region private static IntPtr GetAddress(string function)
+
+        /// <summary>
+        /// Retrieves the entry point for a dynamically exported OpenGL function.
+        /// </summary>
+        /// <param name="function">The function string for the OpenGL function (eg. "glNewList")</param>
+        /// <returns>
+        /// An IntPtr contaning the address for the entry point, or IntPtr.Zero if the specified
+        /// OpenGL function is not dynamically exported.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// The Marshal.GetDelegateForFunctionPointer method can be used to turn the return value
+        /// into a call-able delegate.
+        /// </para>
+        /// <para>
+        /// 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.
+        /// </para>
+        /// <see cref="Marshal.GetDelegateForFunctionPointer"/>
+        /// </remarks>
+        private static IntPtr GetAddress(string function)
+        {
+            if (getProcAddress == null)
+            {
+                if (System.Environment.OSVersion.Platform == PlatformID.Win32NT ||
+                    System.Environment.OSVersion.Platform == PlatformID.Win32S ||
+                    System.Environment.OSVersion.Platform == PlatformID.Win32Windows ||
+                    System.Environment.OSVersion.Platform == PlatformID.WinCE)
+                {
+                    getProcAddress = new GetProcAddressWindows();
+                }
+                else if (System.Environment.OSVersion.Platform == PlatformID.Unix ||
+                         System.Environment.OSVersion.Platform == (PlatformID)4)
+                {
+                    // Distinguish between Unix and Mac OS X kernels.
+                    switch (DetectUnixKernel())
+                    {
+                        case "Unix":
+                        case "Linux":
+                            getProcAddress = new GetProcAddressX11();
+                            break;
+
+                        case "Darwin":
+                            getProcAddress = new GetProcAddressOSX();
+                            break;
+
+                        default:
+                            throw new PlatformNotSupportedException(
+                                DetectUnixKernel() + ": Unknown Unix platform - cannot load extensions. Please report a bug at http://taoframework.com");
+                    }
+                }
+                else
+                {
+                    throw new PlatformNotSupportedException(
+                        "Extension loading is only supported under Mac OS X, Unix/X11 and Windows. We are sorry for the inconvience.");
+                }
+            }
+
+            return getProcAddress.GetProcAddress(function);
+        }
+
+        #endregion
+
+        #region private static string DetectUnixKernel()
+
+        /// <summary>
+        /// Executes "uname" which returns a string representing the name of the
+        /// underlying Unix kernel.
+        /// </summary>
+        /// <returns>"Unix", "Linux", "Darwin" or null.</returns>
+        /// <remarks>Source code from "Mono: A Developer's Notebook"</remarks>
+        private static string DetectUnixKernel()
+        {
+            ProcessStartInfo startInfo = new ProcessStartInfo();
+            startInfo.Arguments = "-s";
+            startInfo.RedirectStandardOutput = true;
+            startInfo.RedirectStandardError = true;
+            startInfo.UseShellExecute = false;
+            foreach (string unameprog in new string[] { "/usr/bin/uname", "/bin/uname", "uname" })
+            {
+                try
+                {
+                    startInfo.FileName = unameprog;
+                    Process uname = Process.Start(startInfo);
+                    StreamReader stdout = uname.StandardOutput;
+                    return stdout.ReadLine().Trim();
+                }
+                catch (System.IO.FileNotFoundException)
+                {
+                    // The requested executable doesn't exist, try next one.
+                    continue;
+                }
+                catch (System.ComponentModel.Win32Exception)
+                {
+                    continue;
+                }
+            }
+            return null;
+        }
+
+        #endregion
+
+        #region internal static Delegate GetExtensionDelegate(string name, Type signature)
+
+        /// <summary>
+        /// Creates a System.Delegate that can be used to call a dynamically exported OpenGL function.
+        /// </summary>
+        /// <param name="name">The name of the OpenGL function (eg. "glNewList")</param>
+        /// <param name="signature">The signature of the OpenGL function.</param>
+        /// <returns>
+        /// 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.
+        /// </returns>
+        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
+    }
+}
diff --git a/src/Tao.OpenGl/Glu.cs b/src/Tao.OpenGl/Glu.cs
new file mode 100644
index 0000000..53d8437
--- /dev/null
+++ b/src/Tao.OpenGl/Glu.cs
@@ -0,0 +1,48360 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.OpenGl {
+    #region Class Documentation
+    /// <summary>
+    ///     GLU (OpenGL Utility) binding for .NET, implementing GLU 1.3.
+    /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Binds functions and definitions in glu32.dll or libGLU.so.
+    ///     </para>
+    ///     <para>
+    ///         The OpenGL Utility (GLU) library contains several groups of functions that
+    ///         complement the core OpenGL interface by providing support for auxiliary features.
+    ///         These features include: mipmapping, matrix manipulation, polygon tessellation,
+    ///         quadrics, NURBS, and error handling.
+    ///     </para>
+    ///     <para>
+    ///         Mipmapping routines include image scaling and automatic mipmap generation.  A
+    ///         variety of matrix manipulation functions build projection and viewing matrices,
+    ///         or project vertices from one coordinate system to another.  Polygon tessellation
+    ///         routines convert concave polygons into triangles for easy rendering.  Quadrics
+    ///         support renders a few basic quadrics such as spheres and cones.  NURBS code maps
+    ///         complicated NURBS curves and trimmed surfaces into simpler OpenGL evaluators.
+    ///         Lastly, an error lookup routine translates OpenGL and GLU error codes into
+    ///         strings.  GLU library routines may call OpenGL library routines.  Thus, an OpenGL
+    ///         context should be made current before calling any GLU functions.  Otherwise an
+    ///         OpenGL error may occur.
+    ///     </para>
+    ///     <para>
+    ///         These utility functions make use of core OpenGL functions, so any OpenGL
+    ///         implementation is guaranteed to support the utility functions.
+    ///     </para>
+    /// </remarks>
+    #endregion Class Documentation
+    public static class Glu
+    {
+        // --- Fields ---
+        #region Private Constants
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Winapi" /> for Windows and
+        ///     Linux, to indicate that the default should be used.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.Winapi;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+
+        #region Public Constants
+        #region Version
+        #region bool GLU_VERSION_1_1
+        /// <summary>
+        ///     GLU API revision.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies GLU 1.1.
+        /// </remarks>
+        // #define GLU_VERSION_1_1 1
+        public const bool GLU_VERSION_1_1 = true;
+        #endregion bool GLU_VERSION_1_1
+
+        #region bool GLU_VERSION_1_2
+        /// <summary>
+        ///     GLU API revision.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies GLU 1.2.
+        /// </remarks>
+        // #define GLU_VERSION_1_2 1
+        public const bool GLU_VERSION_1_2 = true;
+        #endregion bool GLU_VERSION_1_2
+
+        #region bool GLU_VERSION_1_3
+        /// <summary>
+        ///     GLU API revision.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies GLU 1.3.
+        /// </remarks>
+        // #define GLU_VERSION_1_3 1
+        public const bool GLU_VERSION_1_3 = true;
+        #endregion bool GLU_VERSION_1_3
+        #endregion Version
+
+        #region Errors
+        #region int GLU_INVALID_ENUM
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_INVALID_ENUM 100900
+        public const int GLU_INVALID_ENUM = 100900;
+        #endregion int GLU_INVALID_ENUM
+
+        #region int GLU_INVALID_VALUE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_INVALID_VALUE 100901
+        public const int GLU_INVALID_VALUE = 100901;
+        #endregion int GLU_INVALID_VALUE
+
+        #region int GLU_OUT_OF_MEMORY
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_OUT_OF_MEMORY 100902
+        public const int GLU_OUT_OF_MEMORY = 100902;
+        #endregion int GLU_OUT_OF_MEMORY
+
+        #region int GLU_INCOMPATIBLE_GL_VERSION
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_INCOMPATIBLE_GL_VERSION 100903
+        public const int GLU_INCOMPATIBLE_GL_VERSION = 100903;
+        #endregion int GLU_INCOMPATIBLE_GL_VERSION
+
+        #region int GLU_INVALID_OPERATION
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_INVALID_OPERATION 100904
+        public const int GLU_INVALID_OPERATION = 100904;
+        #endregion int GLU_INVALID_OPERATION
+        #endregion Errors
+
+        #region StringName
+        #region int GLU_VERSION
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_VERSION 100800
+        public const int GLU_VERSION = 100800;
+        #endregion int GLU_VERSION
+
+        #region int GLU_EXTENSIONS
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_EXTENSIONS 100801
+        public const int GLU_EXTENSIONS = 100801;
+        #endregion int GLU_EXTENSIONS
+        #endregion StringName
+
+        #region bool
+        #region int GLU_TRUE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TRUE GL_TRUE
+        public const int GLU_TRUE = 1;
+        #endregion int GLU_TRUE
+
+        #region int GLU_FALSE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_FALSE GL_FALSE
+        public const int GLU_FALSE = 0;
+        #endregion int GLU_FALSE
+        #endregion bool
+
+        #region QuadricNormal
+        #region int GLU_SMOOTH
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_SMOOTH 100000
+        public const int GLU_SMOOTH = 100000;
+        #endregion int GLU_SMOOTH
+
+        #region int GLU_FLAT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_FLAT 100001
+        public const int GLU_FLAT = 100001;
+        #endregion int GLU_FLAT
+
+        #region int GLU_NONE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NONE 100002
+        public const int GLU_NONE = 100002;
+        #endregion int GLU_NONE
+        #endregion QuadricNormal
+
+        #region QuadricDrawStyle
+        #region int GLU_POINT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_POINT 100010
+        public const int GLU_POINT = 100010;
+        #endregion int GLU_POINT
+
+        #region int GLU_LINE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_LINE 100011
+        public const int GLU_LINE = 100011;
+        #endregion int GLU_LINE
+
+        #region int GLU_FILL
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_FILL 100012
+        public const int GLU_FILL = 100012;
+        #endregion int GLU_FILL
+
+        #region int GLU_SILHOUETTE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_SILHOUETTE 100013
+        public const int GLU_SILHOUETTE = 100013;
+        #endregion int GLU_SILHOUETTE
+        #endregion QuadricDrawStyle
+
+        #region QuadraticOrientation
+        #region int GLU_OUTSIDE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_OUTSIDE 100020
+        public const int GLU_OUTSIDE = 100020;
+        #endregion int GLU_OUTSIDE
+
+        #region int GLU_INSIDE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_INSIDE 100021
+        public const int GLU_INSIDE = 100021;
+        #endregion int GLU_INSIDE
+        #endregion QuadraticOrientation
+
+        #region Tesselation Limits
+        #region double GLU_TESS_MAX_COORD
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_MAX_COORD 1.0e150
+        public const double GLU_TESS_MAX_COORD = 1.0e150;
+        #endregion double GLU_TESS_MAX_COORD
+        #endregion Tesselation Limits
+
+        #region TessProperty
+        #region int GLU_TESS_WINDING_RULE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_WINDING_RULE 100140
+        public const int GLU_TESS_WINDING_RULE = 100140;
+        #endregion int GLU_TESS_WINDING_RULE
+
+        #region int GLU_TESS_BOUNDARY_ONLY
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_BOUNDARY_ONLY 100141
+        public const int GLU_TESS_BOUNDARY_ONLY = 100141;
+        #endregion int GLU_TESS_BOUNDARY_ONLY
+
+        #region int GLU_TESS_TOLERANCE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_TOLERANCE 100142
+        public const int GLU_TESS_TOLERANCE = 100142;
+        #endregion int GLU_TESS_TOLERANCE
+        #endregion TessProperty
+
+        #region TessWinding
+        #region int GLU_TESS_WINDING_ODD
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_WINDING_ODD 100130
+        public const int GLU_TESS_WINDING_ODD = 100130;
+        #endregion int GLU_TESS_WINDING_ODD
+
+        #region int GLU_TESS_WINDING_NONZERO
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_WINDING_NONZERO 100131
+        public const int GLU_TESS_WINDING_NONZERO = 100131;
+        #endregion int GLU_TESS_WINDING_NONZERO
+
+        #region int GLU_TESS_WINDING_POSITIVE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_WINDING_POSITIVE 100132
+        public const int GLU_TESS_WINDING_POSITIVE = 100132;
+        #endregion int GLU_TESS_WINDING_POSITIVE
+
+        #region int GLU_TESS_WINDING_NEGATIVE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_WINDING_NEGATIVE 100133
+        public const int GLU_TESS_WINDING_NEGATIVE = 100133;
+        #endregion int GLU_TESS_WINDING_NEGATIVE
+
+        #region int GLU_TESS_WINDING_ABS_GEQ_TWO
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_WINDING_ABS_GEQ_TWO 100134
+        public const int GLU_TESS_WINDING_ABS_GEQ_TWO = 100134;
+        #endregion int GLU_TESS_WINDING_ABS_GEQ_TWO
+        #endregion TessWinding
+
+        #region TessCallback
+        #region int GLU_TESS_BEGIN
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_BEGIN 100100
+        public const int GLU_TESS_BEGIN = 100100;
+        #endregion int GLU_TESS_BEGIN
+
+        #region int GLU_BEGIN
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_BEGIN 100100
+        public const int GLU_BEGIN = 100100;
+        #endregion int GLU_BEGIN
+
+        #region int GLU_TESS_VERTEX
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_VERTEX 100101
+        public const int GLU_TESS_VERTEX = 100101;
+        #endregion int GLU_TESS_VERTEX
+
+        #region int GLU_VERTEX
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_VERTEX 100101
+        public const int GLU_VERTEX = 100101;
+        #endregion int GLU_VERTEX
+
+        #region int GLU_TESS_END
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_END 100102
+        public const int GLU_TESS_END = 100102;
+        #endregion int GLU_TESS_END
+
+        #region int GLU_END
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_END 100102
+        public const int GLU_END = 100102;
+        #endregion int GLU_END
+
+        #region int GLU_TESS_ERROR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_ERROR 100103
+        public const int GLU_TESS_ERROR = 100103;
+        #endregion int GLU_TESS_ERROR
+
+        #region int GLU_TESS_EDGE_FLAG
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_EDGE_FLAG 100104
+        public const int GLU_TESS_EDGE_FLAG = 100104;
+        #endregion int GLU_TESS_EDGE_FLAG
+
+        #region int GLU_EDGE_FLAG
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_EDGE_FLAG 100104
+        public const int GLU_EDGE_FLAG = 100104;
+        #endregion int GLU_EDGE_FLAG
+
+        #region int GLU_TESS_COMBINE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_COMBINE 100105
+        public const int GLU_TESS_COMBINE = 100105;
+        #endregion int GLU_TESS_COMBINE
+
+        #region int GLU_TESS_BEGIN_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_BEGIN_DATA 100106
+        public const int GLU_TESS_BEGIN_DATA = 100106;
+        #endregion int GLU_TESS_BEGIN_DATA
+
+        #region int GLU_TESS_VERTEX_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_VERTEX_DATA 100107
+        public const int GLU_TESS_VERTEX_DATA = 100107;
+        #endregion int GLU_TESS_VERTEX_DATA
+
+        #region int GLU_TESS_END_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_END_DATA 100108
+        public const int GLU_TESS_END_DATA = 100108;
+        #endregion int GLU_TESS_END_DATA
+
+        #region int GLU_TESS_ERROR_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_ERROR_DATA 100109
+        public const int GLU_TESS_ERROR_DATA = 100109;
+        #endregion int GLU_TESS_ERROR_DATA
+
+        #region int GLU_TESS_EDGE_FLAG_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_EDGE_FLAG_DATA 100110
+        public const int GLU_TESS_EDGE_FLAG_DATA = 100110;
+        #endregion int GLU_TESS_EDGE_FLAG_DATA
+
+        #region int GLU_TESS_COMBINE_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_COMBINE_DATA 100111
+        public const int GLU_TESS_COMBINE_DATA = 100111;
+        #endregion int GLU_TESS_COMBINE_DATA
+        #endregion TessCallback
+
+        #region TessError
+        #region int GLU_TESS_ERROR1
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_ERROR1 100151
+        public const int GLU_TESS_ERROR1 = 100151;
+        #endregion int GLU_TESS_ERROR1
+
+        #region int GLU_TESS_ERROR2
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_ERROR2 100152
+        public const int GLU_TESS_ERROR2 = 100152;
+        #endregion int GLU_TESS_ERROR2
+
+        #region int GLU_TESS_ERROR3
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_ERROR3 100153
+        public const int GLU_TESS_ERROR3 = 100153;
+        #endregion int GLU_TESS_ERROR3
+
+        #region int GLU_TESS_ERROR4
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_ERROR4 100154
+        public const int GLU_TESS_ERROR4 = 100154;
+        #endregion int GLU_TESS_ERROR4
+
+        #region int GLU_TESS_ERROR5
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_ERROR5 100155
+        public const int GLU_TESS_ERROR5 = 100155;
+        #endregion int GLU_TESS_ERROR5
+
+        #region int GLU_TESS_ERROR6
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_ERROR6 100156
+        public const int GLU_TESS_ERROR6 = 100156;
+        #endregion int GLU_TESS_ERROR6
+
+        #region int GLU_TESS_ERROR7
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_ERROR7 100157
+        public const int GLU_TESS_ERROR7 = 100157;
+        #endregion int GLU_TESS_ERROR7
+
+        #region int GLU_TESS_ERROR8
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_ERROR8 100158
+        public const int GLU_TESS_ERROR8 = 100158;
+        #endregion int GLU_TESS_ERROR8
+
+        #region int GLU_TESS_MISSING_BEGIN_POLYGON
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_MISSING_BEGIN_POLYGON GLU_TESS_ERROR1
+        public const int GLU_TESS_MISSING_BEGIN_POLYGON = GLU_TESS_ERROR1;
+        #endregion int GLU_TESS_MISSING_BEGIN_POLYGON
+
+        #region int GLU_TESS_MISSING_BEGIN_CONTOUR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_MISSING_BEGIN_CONTOUR GLU_TESS_ERROR2
+        public const int GLU_TESS_MISSING_BEGIN_CONTOUR = GLU_TESS_ERROR2;
+        #endregion int GLU_TESS_MISSING_BEGIN_CONTOUR
+
+        #region int GLU_TESS_MISSING_END_POLYGON
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_MISSING_END_POLYGON GLU_TESS_ERROR3
+        public const int GLU_TESS_MISSING_END_POLYGON = GLU_TESS_ERROR3;
+        #endregion int GLU_TESS_MISSING_END_POLYGON
+
+        #region int GLU_TESS_MISSING_END_CONTOUR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_MISSING_END_CONTOUR GLU_TESS_ERROR4
+        public const int GLU_TESS_MISSING_END_CONTOUR = GLU_TESS_ERROR4;
+        #endregion int GLU_TESS_MISSING_END_CONTOUR
+
+        #region int GLU_TESS_COORD_TOO_LARGE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_COORD_TOO_LARGE GLU_TESS_ERROR5
+        public const int GLU_TESS_COORD_TOO_LARGE = GLU_TESS_ERROR5;
+        #endregion int GLU_TESS_COORD_TOO_LARGE
+
+        #region int GLU_TESS_NEED_COMBINE_CALLBACK
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_TESS_NEED_COMBINE_CALLBACK GLU_TESS_ERROR6
+        public const int GLU_TESS_NEED_COMBINE_CALLBACK = GLU_TESS_ERROR6;
+        #endregion int GLU_TESS_NEED_COMBINE_CALLBACK
+        #endregion TessError
+
+        #region NurbsProperty
+        #region int GLU_AUTO_LOAD_MATRIX
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_AUTO_LOAD_MATRIX 100200
+        public const int GLU_AUTO_LOAD_MATRIX = 100200;
+        #endregion int GLU_AUTO_LOAD_MATRIX
+
+        #region int GLU_CULLING
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_CULLING 100201
+        public const int GLU_CULLING = 100201;
+        #endregion int GLU_CULLING
+
+        #region int GLU_PARAMETRIC_TOLERANCE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_PARAMETRIC_TOLERANCE 100202
+        public const int GLU_PARAMETRIC_TOLERANCE = 100202;
+        #endregion int GLU_PARAMETRIC_TOLERANCE
+
+        #region int GLU_SAMPLING_TOLERANCE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_SAMPLING_TOLERANCE 100203
+        public const int GLU_SAMPLING_TOLERANCE = 100203;
+        #endregion int GLU_SAMPLING_TOLERANCE
+
+        #region int GLU_DISPLAY_MODE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_DISPLAY_MODE 100204
+        public const int GLU_DISPLAY_MODE = 100204;
+        #endregion int GLU_DISPLAY_MODE
+
+        #region int GLU_SAMPLING_METHOD
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_SAMPLING_METHOD 100205
+        public const int GLU_SAMPLING_METHOD = 100205;
+        #endregion int GLU_SAMPLING_METHOD
+
+        #region int GLU_U_STEP
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_U_STEP 100206
+        public const int GLU_U_STEP = 100206;
+        #endregion int GLU_U_STEP
+
+        #region int GLU_V_STEP
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_V_STEP 100207
+        public const int GLU_V_STEP = 100207;
+        #endregion int GLU_V_STEP
+
+        #region int GLU_NURBS_MODE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_MODE 100160
+        public const int GLU_NURBS_MODE = 100160;
+        #endregion int GLU_NURBS_MODE
+
+        #region int GLU_NURBS_MODE_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_MODE_EXT 100160
+        public const int GLU_NURBS_MODE_EXT = 100160;
+        #endregion int GLU_NURBS_MODE_EXT
+
+        #region int GLU_NURBS_TESSELLATOR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_TESSELLATOR 100161
+        public const int GLU_NURBS_TESSELLATOR = 100161;
+        #endregion int GLU_NURBS_TESSELLATOR
+
+        #region int GLU_NURBS_TESSELLATOR_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_TESSELLATOR_EXT 100161
+        public const int GLU_NURBS_TESSELLATOR_EXT = 100161;
+        #endregion int GLU_NURBS_TESSELLATOR_EXT
+
+        #region int GLU_NURBS_RENDERER
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_RENDERER 100162
+        public const int GLU_NURBS_RENDERER = 100162;
+        #endregion int GLU_NURBS_RENDERER
+
+        #region int GLU_NURBS_RENDERER_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_RENDERER_EXT 100162
+        public const int GLU_NURBS_RENDERER_EXT = 100162;
+        #endregion int GLU_NURBS_RENDERER_EXT
+        #endregion NurbsProperty
+
+        #region NurbsSampling
+        #region int GLU_OBJECT_PARAMETRIC_ERROR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_OBJECT_PARAMETRIC_ERROR 100208
+        public const int GLU_OBJECT_PARAMETRIC_ERROR = 100208;
+        #endregion int GLU_OBJECT_PARAMETRIC_ERROR
+
+        #region int GLU_OBJECT_PARAMETRIC_ERROR_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_OBJECT_PARAMETRIC_ERROR_EXT 100208
+        public const int GLU_OBJECT_PARAMETRIC_ERROR_EXT = 100208;
+        #endregion int GLU_OBJECT_PARAMETRIC_ERROR_EXT
+
+        #region int GLU_OBJECT_PATH_LENGTH
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_OBJECT_PATH_LENGTH 100209
+        public const int GLU_OBJECT_PATH_LENGTH = 100209;
+        #endregion int GLU_OBJECT_PATH_LENGTH
+
+        #region int GLU_OBJECT_PATH_LENGTH_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_OBJECT_PATH_LENGTH_EXT 100209
+        public const int GLU_OBJECT_PATH_LENGTH_EXT = 100209;
+        #endregion int GLU_OBJECT_PATH_LENGTH_EXT
+
+        #region int GLU_PATH_LENGTH
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_PATH_LENGTH 100215
+        public const int GLU_PATH_LENGTH = 100215;
+        #endregion int GLU_PATH_LENGTH
+
+        #region int GLU_PARAMETRIC_ERROR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_PARAMETRIC_ERROR 100216
+        public const int GLU_PARAMETRIC_ERROR = 100216;
+        #endregion int GLU_PARAMETRIC_ERROR
+
+        #region int GLU_DOMAIN_DISTANCE
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_DOMAIN_DISTANCE 100217
+        public const int GLU_DOMAIN_DISTANCE = 100217;
+        #endregion int GLU_DOMAIN_DISTANCE
+        #endregion NurbsSampling
+
+        #region NurbsTrim
+        #region int GLU_MAP1_TRIM_2
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_MAP1_TRIM_2 100210
+        public const int GLU_MAP1_TRIM_2 = 100210;
+        #endregion int GLU_MAP1_TRIM_2
+
+        #region int GLU_MAP1_TRIM_3
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_MAP1_TRIM_3 100211
+        public const int GLU_MAP1_TRIM_3 = 100211;
+        #endregion int GLU_MAP1_TRIM_3
+        #endregion NurbsTrim
+
+        #region NurbsDisplay
+        #region int GLU_OUTLINE_POLYGON
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_OUTLINE_POLYGON 100240
+        public const int GLU_OUTLINE_POLYGON = 100240;
+        #endregion int GLU_OUTLINE_POLYGON
+
+        #region int GLU_OUTLINE_PATCH
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_OUTLINE_PATCH 100241
+        public const int GLU_OUTLINE_PATCH = 100241;
+        #endregion int GLU_OUTLINE_PATCH
+        #endregion NurbsDisplay
+
+        #region NurbsCallback
+        #region int GLU_NURBS_ERROR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR 100103
+        public const int GLU_NURBS_ERROR = 100103;
+        #endregion int GLU_NURBS_ERROR
+
+        #region int GLU_ERROR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_ERROR 100103
+        public const int GLU_ERROR = 100103;
+        #endregion int GLU_ERROR
+
+        #region int GLU_NURBS_BEGIN
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_BEGIN 100164
+        public const int GLU_NURBS_BEGIN = 100164;
+        #endregion int GLU_NURBS_BEGIN
+
+        #region int GLU_NURBS_BEGIN_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_BEGIN_EXT 100164
+        public const int GLU_NURBS_BEGIN_EXT = 100164;
+        #endregion int GLU_NURBS_BEGIN_EXT
+
+        #region int GLU_NURBS_VERTEX
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_VERTEX 100165
+        public const int GLU_NURBS_VERTEX = 100165;
+        #endregion int GLU_NURBS_VERTEX
+
+        #region int GLU_NURBS_VERTEX_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_VERTEX_EXT 100165
+        public const int GLU_NURBS_VERTEX_EXT = 100165;
+        #endregion int GLU_NURBS_VERTEX_EXT
+
+        #region int GLU_NURBS_NORMAL
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_NORMAL 100166
+        public const int GLU_NURBS_NORMAL = 100166;
+        #endregion int GLU_NURBS_NORMAL
+
+        #region int GLU_NURBS_NORMAL_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_NORMAL_EXT 100166
+        public const int GLU_NURBS_NORMAL_EXT = 100166;
+        #endregion int GLU_NURBS_NORMAL_EXT
+
+        #region int GLU_NURBS_COLOR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_COLOR 100167
+        public const int GLU_NURBS_COLOR = 100167;
+        #endregion int GLU_NURBS_COLOR
+
+        #region int GLU_NURBS_COLOR_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_COLOR_EXT 100167
+        public const int GLU_NURBS_COLOR_EXT = 100167;
+        #endregion int GLU_NURBS_COLOR_EXT
+
+        #region int GLU_NURBS_TEXTURE_COORD
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_TEXTURE_COORD 100168
+        public const int GLU_NURBS_TEXTURE_COORD = 100168;
+        #endregion int GLU_NURBS_TEXTURE_COORD
+
+        #region int GLU_NURBS_TEX_COORD_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_TEX_COORD_EXT 100168
+        public const int GLU_NURBS_TEX_COORD_EXT = 100168;
+        #endregion int GLU_NURBS_TEX_COORD_EXT
+
+        #region int GLU_NURBS_END
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_END 100169
+        public const int GLU_NURBS_END = 100169;
+        #endregion int GLU_NURBS_END
+
+        #region int GLU_NURBS_END_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_END_EXT 100169
+        public const int GLU_NURBS_END_EXT = 100169;
+        #endregion int GLU_NURBS_END_EXT
+
+        #region int GLU_NURBS_BEGIN_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_BEGIN_DATA 100170
+        public const int GLU_NURBS_BEGIN_DATA = 100170;
+        #endregion int GLU_NURBS_BEGIN_DATA
+
+        #region int GLU_NURBS_BEGIN_DATA_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_BEGIN_DATA_EXT 100170
+        public const int GLU_NURBS_BEGIN_DATA_EXT = 100170;
+        #endregion int GLU_NURBS_BEGIN_DATA_EXT
+
+        #region int GLU_NURBS_VERTEX_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_VERTEX_DATA 100171
+        public const int GLU_NURBS_VERTEX_DATA = 100171;
+        #endregion int GLU_NURBS_VERTEX_DATA
+
+        #region int GLU_NURBS_VERTEX_DATA_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_VERTEX_DATA_EXT 100171
+        public const int GLU_NURBS_VERTEX_DATA_EXT = 100171;
+        #endregion int GLU_NURBS_VERTEX_DATA_EXT
+
+        #region int GLU_NURBS_NORMAL_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_NORMAL_DATA 100172
+        public const int GLU_NURBS_NORMAL_DATA = 100172;
+        #endregion int GLU_NURBS_NORMAL_DATA
+
+        #region int GLU_NURBS_NORMAL_DATA_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_NORMAL_DATA_EXT 100172
+        public const int GLU_NURBS_NORMAL_DATA_EXT = 100172;
+        #endregion int GLU_NURBS_NORMAL_DATA_EXT
+
+        #region int GLU_NURBS_COLOR_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_COLOR_DATA 100173
+        public const int GLU_NURBS_COLOR_DATA = 100173;
+        #endregion int GLU_NURBS_COLOR_DATA
+
+        #region int GLU_NURBS_COLOR_DATA_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_COLOR_DATA_EXT 100173
+        public const int GLU_NURBS_COLOR_DATA_EXT = 100173;
+        #endregion int GLU_NURBS_COLOR_DATA_EXT
+
+        #region int GLU_NURBS_TEXTURE_COORD_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_TEXTURE_COORD_DATA 100174
+        public const int GLU_NURBS_TEXTURE_COORD_DATA = 100174;
+        #endregion int GLU_NURBS_TEXTURE_COORD_DATA
+
+        #region int GLU_NURBS_TEX_COORD_DATA_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_TEX_COORD_DATA_EXT 100174
+        public const int GLU_NURBS_TEX_COORD_DATA_EXT = 100174;
+        #endregion int GLU_NURBS_TEX_COORD_DATA_EXT
+
+        #region int GLU_NURBS_END_DATA
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_END_DATA 100175
+        public const int GLU_NURBS_END_DATA = 100175;
+        #endregion int GLU_NURBS_END_DATA
+
+        #region int GLU_NURBS_END_DATA_EXT
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_END_DATA_EXT 100175
+        public const int GLU_NURBS_END_DATA_EXT = 100175;
+        #endregion int GLU_NURBS_END_DATA_EXT
+        #endregion NurbsCallback
+
+        #region NurbsErrors
+        #region int GLU_NURBS_ERROR1
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR1 100251
+        public const int GLU_NURBS_ERROR1 = 100251;
+        #endregion int GLU_NURBS_ERROR1
+
+        #region int GLU_NURBS_ERROR2
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR2 100252
+        public const int GLU_NURBS_ERROR2 = 100252;
+        #endregion int GLU_NURBS_ERROR2
+
+        #region int GLU_NURBS_ERROR3
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR3 100253
+        public const int GLU_NURBS_ERROR3 = 100253;
+        #endregion int GLU_NURBS_ERROR3
+
+        #region int GLU_NURBS_ERROR4
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR4 100254
+        public const int GLU_NURBS_ERROR4 = 100254;
+        #endregion int GLU_NURBS_ERROR4
+
+        #region int GLU_NURBS_ERROR5
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR5 100255
+        public const int GLU_NURBS_ERROR5 = 100255;
+        #endregion int GLU_NURBS_ERROR5
+
+        #region int GLU_NURBS_ERROR6
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR6 100256
+        public const int GLU_NURBS_ERROR6 = 100256;
+        #endregion int GLU_NURBS_ERROR6
+
+        #region int GLU_NURBS_ERROR7
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR7 100257
+        public const int GLU_NURBS_ERROR7 = 100257;
+        #endregion int GLU_NURBS_ERROR7
+
+        #region int GLU_NURBS_ERROR8
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR8 100258
+        public const int GLU_NURBS_ERROR8 = 100258;
+        #endregion int GLU_NURBS_ERROR8
+
+        #region int GLU_NURBS_ERROR9
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR9 100259
+        public const int GLU_NURBS_ERROR9 = 100259;
+        #endregion int GLU_NURBS_ERROR9
+
+        #region int GLU_NURBS_ERROR10
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR10 100260
+        public const int GLU_NURBS_ERROR10 = 100260;
+        #endregion int GLU_NURBS_ERROR10
+
+        #region int GLU_NURBS_ERROR11
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR11 100261
+        public const int GLU_NURBS_ERROR11 = 100261;
+        #endregion int GLU_NURBS_ERROR11
+
+        #region int GLU_NURBS_ERROR12
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR12 100262
+        public const int GLU_NURBS_ERROR12 = 100262;
+        #endregion int GLU_NURBS_ERROR12
+
+        #region int GLU_NURBS_ERROR13
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR13 100263
+        public const int GLU_NURBS_ERROR13 = 100263;
+        #endregion int GLU_NURBS_ERROR13
+
+        #region int GLU_NURBS_ERROR14
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR14 100264
+        public const int GLU_NURBS_ERROR14 = 100264;
+        #endregion int GLU_NURBS_ERROR14
+
+        #region int GLU_NURBS_ERROR15
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR15 100265
+        public const int GLU_NURBS_ERROR15 = 100265;
+        #endregion int GLU_NURBS_ERROR15
+
+        #region int GLU_NURBS_ERROR16
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR16 100266
+        public const int GLU_NURBS_ERROR16 = 100266;
+        #endregion int GLU_NURBS_ERROR16
+
+        #region int GLU_NURBS_ERROR17
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR17 100267
+        public const int GLU_NURBS_ERROR17 = 100267;
+        #endregion int GLU_NURBS_ERROR17
+
+        #region int GLU_NURBS_ERROR18
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR18 100268
+        public const int GLU_NURBS_ERROR18 = 100268;
+        #endregion int GLU_NURBS_ERROR18
+
+        #region int GLU_NURBS_ERROR19
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR19 100269
+        public const int GLU_NURBS_ERROR19 = 100269;
+        #endregion int GLU_NURBS_ERROR19
+
+        #region int GLU_NURBS_ERROR20
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR20 100270
+        public const int GLU_NURBS_ERROR20 = 100270;
+        #endregion int GLU_NURBS_ERROR20
+
+        #region int GLU_NURBS_ERROR21
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR21 100271
+        public const int GLU_NURBS_ERROR21 = 100271;
+        #endregion int GLU_NURBS_ERROR21
+
+        #region int GLU_NURBS_ERROR22
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR22 100272
+        public const int GLU_NURBS_ERROR22 = 100272;
+        #endregion int GLU_NURBS_ERROR22
+
+        #region int GLU_NURBS_ERROR23
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR23 100273
+        public const int GLU_NURBS_ERROR23 = 100273;
+        #endregion int GLU_NURBS_ERROR23
+
+        #region int GLU_NURBS_ERROR24
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR24 100274
+        public const int GLU_NURBS_ERROR24 = 100274;
+        #endregion int GLU_NURBS_ERROR24
+
+        #region int GLU_NURBS_ERROR25
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR25 100275
+        public const int GLU_NURBS_ERROR25 = 100275;
+        #endregion int GLU_NURBS_ERROR25
+
+        #region int GLU_NURBS_ERROR26
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR26 100276
+        public const int GLU_NURBS_ERROR26 = 100276;
+        #endregion int GLU_NURBS_ERROR26
+
+        #region int GLU_NURBS_ERROR27
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR27 100277
+        public const int GLU_NURBS_ERROR27 = 100277;
+        #endregion int GLU_NURBS_ERROR27
+
+        #region int GLU_NURBS_ERROR28
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR28 100278
+        public const int GLU_NURBS_ERROR28 = 100278;
+        #endregion int GLU_NURBS_ERROR28
+
+        #region int GLU_NURBS_ERROR29
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR29 100279
+        public const int GLU_NURBS_ERROR29 = 100279;
+        #endregion int GLU_NURBS_ERROR29
+
+        #region int GLU_NURBS_ERROR30
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR30 100280
+        public const int GLU_NURBS_ERROR30 = 100280;
+        #endregion int GLU_NURBS_ERROR30
+
+        #region int GLU_NURBS_ERROR31
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR31 100281
+        public const int GLU_NURBS_ERROR31 = 100281;
+        #endregion int GLU_NURBS_ERROR31
+
+        #region int GLU_NURBS_ERROR32
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR32 100282
+        public const int GLU_NURBS_ERROR32 = 100282;
+        #endregion int GLU_NURBS_ERROR32
+
+        #region int GLU_NURBS_ERROR33
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR33 100283
+        public const int GLU_NURBS_ERROR33 = 100283;
+        #endregion int GLU_NURBS_ERROR33
+
+        #region int GLU_NURBS_ERROR34
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR34 100284
+        public const int GLU_NURBS_ERROR34 = 100284;
+        #endregion int GLU_NURBS_ERROR34
+
+        #region int GLU_NURBS_ERROR35
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR35 100285
+        public const int GLU_NURBS_ERROR35 = 100285;
+        #endregion int GLU_NURBS_ERROR35
+
+        #region int GLU_NURBS_ERROR36
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR36 100286
+        public const int GLU_NURBS_ERROR36 = 100286;
+        #endregion int GLU_NURBS_ERROR36
+
+        #region int GLU_NURBS_ERROR37
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_NURBS_ERROR37 100287
+        public const int GLU_NURBS_ERROR37 = 100287;
+        #endregion int GLU_NURBS_ERROR37
+        #endregion NurbsErrors
+
+        #region Contours types
+        #region int GLU_CW
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_CW 100120
+        public const int GLU_CW = 100120;
+        #endregion int GLU_CW
+
+        #region int GLU_CCW
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_CCW 100121
+        public const int GLU_CCW = 100121;
+        #endregion int GLU_CCW
+
+        #region int GLU_INTERIOR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_INTERIOR 100122
+        public const int GLU_INTERIOR = 100122;
+        #endregion int GLU_INTERIOR
+
+        #region int GLU_EXTERIOR
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_EXTERIOR 100123
+        public const int GLU_EXTERIOR = 100123;
+        #endregion int GLU_EXTERIOR
+
+        #region int GLU_UNKNOWN
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_UNKNOWN 100124
+        public const int GLU_UNKNOWN = 100124;
+        #endregion int GLU_UNKNOWN
+        #endregion Contours types
+
+        #region Extensions
+        #region int GLU_EXT_object_space_tess
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_EXT_object_space_tess 1
+        public const int GLU_EXT_object_space_tess = 1;
+        #endregion int GLU_EXT_object_space_tess
+
+        #region int GLU_EXT_nurbs_tessellator
+        /// <summary>
+        ///     Unknown.  Unable to locate definitive documentation on this constant.
+        /// </summary>
+        // #define GLU_EXT_nurbs_tessellator 1
+        public const int GLU_EXT_nurbs_tessellator = 1;
+        #endregion int GLU_EXT_nurbs_tessellator
+        #endregion Extensions
+        #endregion Public Constants
+
+        #region Public Structs
+        #region GLUnurbs
+        /// <summary>
+        ///     Defines a GLU NURBS object.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct GLUnurbs {
+            /// <summary>
+            ///     Keeps the struct from being garbage collected prematurely.
+            /// </summary>
+            private IntPtr Data;
+        }
+        #endregion GLUnurbs
+
+        #region GLUquadric
+        /// <summary>
+        ///     Defines a GLU quadric object.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct GLUquadric {
+            /// <summary>
+            ///     Keeps the struct from being garbage collected prematurely.
+            /// </summary>
+            private IntPtr Data;
+        }
+        #endregion GLUquadric
+
+        #region GLUtesselator
+        /// <summary>
+        ///     Defines a GLU tesselator object.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct GLUtesselator {
+            /// <summary>
+            ///     Keeps the struct from being garbage collected prematurely.
+            /// </summary>
+            private IntPtr Data;
+        }
+        #endregion GLUtesselator
+
+        #region GLUnurbsObj
+        /// <summary>
+        ///     Defines a GLU NURBS object.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct GLUnurbsObj {
+            /// <summary>
+            ///     Keeps the struct from being garbage collected prematurely.
+            /// </summary>
+            private IntPtr Data;
+        }
+        #endregion GLUnurbsObj
+
+        #region GLUquadricObj
+        /// <summary>
+        ///     Defines a GLU quadric object.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct GLUquadricObj {
+            /// <summary>
+            ///     Keeps the struct from being garbage collected prematurely.
+            /// </summary>
+            private IntPtr Data;
+        }
+        #endregion GLUquadricObj
+
+        #region GLUtesselatorObj
+        /// <summary>
+        ///     Defines a GLU tesselator object.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct GLUtesselatorObj {
+            /// <summary>
+            ///     Keeps the struct from being garbage collected prematurely.
+            /// </summary>
+            private IntPtr Data;
+        }
+        #endregion GLUtesselatorObj
+
+        #region GLUtriangulatorObj
+        /// <summary>
+        ///     Defines a GLU triangulator object.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct GLUtriangulatorObj {
+            /// <summary>
+            ///     Keeps the struct from being garbage collected prematurely.
+            /// </summary>
+            private IntPtr Data;
+        }
+        #endregion GLUtriangulatorObj
+        #endregion Public Structs
+
+        #region Private Fields
+        // These fields hold references to any callbacks used so as to prevent the garbage
+        // collector from sweeping the delegates even though the application may not be done
+        // with them.
+        private static NurbsBeginCallback nurbsBeginCallback;
+        private static NurbsBeginDataCallback nurbsBeginDataCallback;
+        private static NurbsColorCallback nurbsColorCallback;
+        private static NurbsColorDataCallback nurbsColorDataCallback;
+        private static NurbsEndCallback nurbsEndCallback;
+        private static NurbsEndDataCallback nurbsEndDataCallback;
+        private static NurbsErrorCallback nurbsErrorCallback;
+        private static NurbsNormalCallback nurbsNormalCallback;
+        private static NurbsNormalDataCallback nurbsNormalDataCallback;
+        private static NurbsTexCoordCallback nurbsTexCoordCallback;
+        private static NurbsTexCoordDataCallback nurbsTexCoordDataCallback;
+        private static NurbsVertexCallback nurbsVertexCallback;
+        private static NurbsVertexDataCallback nurbsVertexDataCallback;
+        private static QuadricErrorCallback quadricErrorCallback;
+        private static TessBeginCallback tessBeginCallback;
+        private static TessBeginDataCallback tessBeginDataCallback;
+        private static TessCombineCallback tessCombineCallback;
+        private static TessCombineCallback1 tessCombineCallback1;
+        private static TessCombineDataCallback tessCombineDataCallback;
+        private static TessEdgeFlagCallback tessEdgeFlagCallback;
+        private static TessEdgeFlagDataCallback tessEdgeFlagDataCallback;
+        private static TessEndCallback tessEndCallback;
+        private static TessEndDataCallback tessEndDataCallback;
+        private static TessErrorCallback tessErrorCallback;
+        private static TessErrorDataCallback tessErrorDataCallback;
+        private static TessVertexCallback tessVertexCallback;
+        private static TessVertexCallback1 tessVertexCallback1;
+        private static TessVertexDataCallback tessVertexDataCallback;
+        #endregion Private Fields
+
+        // --- Public Delegates ---
+        #region NurbsBeginCallback(int type)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void begin(GLenum type);
+        public delegate void NurbsBeginCallback(int type);
+        #endregion NurbsBeginCallback(int type)
+
+        #region NurbsBeginDataCallback(int type, [In] IntPtr[] userData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void beginData(GLenum type, void *userData);
+        public delegate void NurbsBeginDataCallback(int type, [In] IntPtr[] userData);
+        #endregion NurbsBeginDataCallback(int type, [In] IntPtr[] userData)
+
+        #region NurbsColorCallback([In] float[] colorData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void color(GLfloat *color);
+        public delegate void NurbsColorCallback([In] float[] colorData);
+        #endregion NurbsColorCallback([In] float[] colorData)
+
+        #region NurbsColorDataCallback([In] float[] colorData, [In] IntPtr[] userData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void colorData(GLfloat *color, void *userData);
+        public delegate void NurbsColorDataCallback([In] float[] colorData, [In] IntPtr[] userData);
+        #endregion NurbsColorDataCallback([In] float[] colorData, [In] IntPtr[] userData)
+
+        #region NurbsEndCallback()
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void end(void);
+        public delegate void NurbsEndCallback();
+        #endregion NurbsEndCallback()
+
+        #region NurbsEndDataCallback([In] IntPtr[] userData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void endData(void *userData);
+        public delegate void NurbsEndDataCallback([In] IntPtr[] userData);
+        #endregion NurbsEndDataCallback([In] IntPtr[] userData)
+
+        #region NurbsErrorCallback(int type)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // typedef void (CALLBACK* GLUnurbsErrorProc) (GLenum);
+        public delegate void NurbsErrorCallback(int type);
+        #endregion NurbsErrorCallback(int type)
+
+        #region NurbsNormalCallback([In] float[] normalData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void normal(GLfloat *normal);
+        public delegate void NurbsNormalCallback([In] float[] normalData);
+        #endregion NurbsNormalCallback([In] float[] normalData)
+
+        #region NurbsNormalDataCallback([In] float[] normalData, [In] IntPtr[] userData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void normalData(GLfloat *normal, void *userData);
+        public delegate void NurbsNormalDataCallback([In] float[] normalData, [In] IntPtr[] userData);
+        #endregion NurbsNormalDataCallback([In] float[] normalData, [In] IntPtr[] userData)
+
+        #region NurbsTexCoordCallback([In] float[] texCoord)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void texCoord(GLfloat *tex coord);
+        public delegate void NurbsTexCoordCallback([In] float[] texCoord);
+        #endregion NurbsTexCoordCallback([In] float[] texCoord)
+
+        #region NurbsTexCoordDataCallback([In] float[] texCoord, [In] IntPtr[] userData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void texCoordData(GLfloat *tex coord, void *userData);
+        public delegate void NurbsTexCoordDataCallback([In] float[] texCoord, [In] IntPtr[] userData);
+        #endregion NurbsTexCoordDataCallback([In] float[] texCoord, [In] IntPtr[] userData)
+
+        #region NurbsVertexCallback([In] float[] vertexData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void vertex(GLfloat *vertex);
+        public delegate void NurbsVertexCallback([In] float[] vertexData);
+        #endregion NurbsVertexCallback([In] float[] vertexData)
+
+        #region NurbsVertexDataCallback([In] float[] vertexData, [In] IntPtr[] userData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void vertexData(GLfloat *vertex, void *userData);
+        public delegate void NurbsVertexDataCallback([In] float[] vertexData, [In] IntPtr[] userData);
+        #endregion NurbsVertexDataCallback([In] float[] vertexData, [In] IntPtr[] userData)
+
+        #region QuadricErrorCallback(int errorCode)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluQuadricCallback" />.
+        /// </summary>
+        /// <seealso cref="gluQuadricCallback" />
+        // typedef void (CALLBACK* GLUquadricErrorProc) (GLenum);
+        public delegate void QuadricErrorCallback(int errorCode);
+        #endregion QuadricErrorCallback(int errorCode)
+
+        #region TessBeginCallback(int type)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessBeginProc) (GLenum);
+        public delegate void TessBeginCallback(int type);
+        #endregion TessBeginCallback(int type)
+
+        #region TessBeginDataCallback(int type, [In] IntPtr polygonData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessBeginDataProc) (GLenum, void *);
+        public delegate void TessBeginDataCallback(int type, [In] IntPtr polygonData);
+        #endregion TessBeginDataCallback(int type, [In] IntPtr polygonData)
+
+        #region TessCombineCallback([In] double[] coordinates, [In] IntPtr[] vertexData, [In] float[] weight, [Out] IntPtr[] outData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessCombineProc) (GLdouble[3], void*[4], GLfloat[4], void**);
+        public delegate void TessCombineCallback([In] double[] coordinates, [In] IntPtr[] vertexData, [In] float[] weight, [Out] IntPtr[] outData);
+        #endregion TessCombineCallback([In] double[] coordinates, [In] IntPtr[] vertexData, [In] float[] weight, [Out] IntPtr[] outData)
+
+        #region TessCombineCallback1([In] double[] coordinates, [In] double[][] vertexData, [In] float[] weight, [Out] double[] outData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessCombineProc) (GLdouble[3], void*[4], GLfloat[4], void**);
+        public delegate void TessCombineCallback1([MarshalAs(UnmanagedType.LPArray, SizeConst=3)] [In] double[] coordinates, [MarshalAs(UnmanagedType.LPArray, SizeConst=4)] [In] double[] vertexData, [MarshalAs(UnmanagedType.LPArray, SizeConst=4)] [In] float[] weight, [Out] double[] outData);
+        #endregion TessCombineCallback1([In] double[] coordinates, [In] double[][] vertexData, [In] float[] weight, [Out] double[] outData)
+
+        #region TessCombineDataCallback([In] double[] coordinates, [In] IntPtr[] vertexData, [In] float[] weight, [Out] IntPtr[] outData, [In] IntPtr polygonData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessCombineDataProc) (GLdouble[3], void*[4], GLfloat[4], void**, void*);
+        public delegate void TessCombineDataCallback([In] double[] coordinates, [In] IntPtr[] vertexData, [In] float[] weight, [Out] IntPtr[] outData, [In] IntPtr polygonData);
+        #endregion TessCombineDataCallback([In] double[] coordinates, [In] IntPtr[] vertexData, [In] float[] weight, [Out] IntPtr[] outData, [In] IntPtr polygonData)
+
+        #region TessEdgeFlagCallback(int flag)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessEdgeFlagProc) (GLboolean);
+        public delegate void TessEdgeFlagCallback(int flag);
+        #endregion TessEdgeFlagCallback(int flag)
+
+        #region TessEdgeFlagDataCallback(int flag, [In] IntPtr polygonData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessEdgeFlagDataProc) (GLboolean, void *);
+        public delegate void TessEdgeFlagDataCallback(int flag, [In] IntPtr polygonData);
+        #endregion TessEdgeFlagDataCallback(int flag, [In] IntPtr polygonData)
+
+        #region TessEndCallback()
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessEndProc) (void);
+        public delegate void TessEndCallback();
+        #endregion TessEndCallback()
+
+        #region TessEndDataCallback([In] IntPtr polygonData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessEndDataProc) (void *);
+        public delegate void TessEndDataCallback(IntPtr polygonData);
+        #endregion TessEndDataCallback(IntPtr polygonData)
+
+        #region TessErrorCallback(int errorCode)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessErrorProc) (GLenum);
+        public delegate void TessErrorCallback(int errorCode);
+        #endregion TessErrorCallback(int errorCode)
+
+        #region TessErrorDataCallback(int errorCode, [In] IntPtr polygonData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessErrorDataProc) (GLenum, void *);
+        public delegate void TessErrorDataCallback(int errorCode, [In] IntPtr polygonData);
+        #endregion TessErrorDataCallback(int errorCode, [In] IntPtr polygonData)
+
+        #region TessVertexCallback([In] IntPtr vertexData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessVertexProc) (void *);
+        public delegate void TessVertexCallback([In] IntPtr vertexData);
+        #endregion TessVertexCallback([In] IntPtr vertexData)
+
+        #region TessVertexCallback1([In] double[] vertexData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessVertexProc) (void *);
+        public delegate void TessVertexCallback1([In] double[] vertexData);
+        #endregion TessVertexCallback1([In] double[] vertexData)
+
+        #region TessVertexDataCallback([In] IntPtr vertexData, [In] IntPtr polygonData)
+        /// <summary>
+        ///     Callback (delegate) for use with <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // typedef void (CALLBACK* GLUtessVertexDataProc) (void *, void *);
+        public delegate void TessVertexDataCallback([In] IntPtr vertexData, [In] IntPtr polygonData);
+        #endregion TessVertexDataCallback([In] IntPtr vertexData, [In] IntPtr polygonData)
+
+        // --- Private Externs ---
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginDataCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginDataCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorDataCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorDataCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndDataCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndDataCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsErrorCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsErrorCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsErrorCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalDataCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalDataCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordDataCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordDataCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexCallback func)
+
+        #region __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluNurbsCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexDataCallback func);
+        #endregion __gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexDataCallback func)
+
+        #region __gluQuadricCallback([In] GLUquadric quad, int which, [In] QuadricErrorCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluQuadricCallback" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluQuadricCallback(GLUquadric *qobj, GLenum which, void (CALLBACK* fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluQuadricCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluQuadricCallback([In] GLUquadric quad, int which, [In] QuadricErrorCallback func);
+        #endregion __gluQuadricCallback([In] GLUquadric quad, int which, [In] QuadricErrorCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginDataCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginDataCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback1 func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback1 func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback1 func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineDataCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineDataCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagDataCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagDataCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndDataCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndDataCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorDataCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorDataCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback1 func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback1 func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback1 func)
+
+        #region __gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexDataCallback func)
+        /// <summary>
+        ///     Called from <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />.
+        /// </summary>
+        /// <remarks>
+        ///     <b>This method is not CLS-compliant due to naming conventions.</b>
+        /// </remarks>
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluTessCallback"), SuppressUnmanagedCodeSecurity]
+        private static extern void __gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexDataCallback func);
+        #endregion __gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexDataCallback func)
+
+        // --- Public Externs ---
+        #region gluBeginCurve([In] GLUnurbs nurb)
+        /// <summary>
+        ///     Delimits a Non-Uniform Rational B-Spline (NURBS) curve definition.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <b>gluBeginCurve</b> to mark the beginning of a NURBS curve definition.
+        ///         After calling <b>gluBeginCurve</b>, make one or more calls to
+        ///         <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" /> to define the attributes of the curve.  Exactly
+        ///         one of the calls to <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" /> must have a curve type of
+        ///         <see cref="Gl.GL_MAP1_VERTEX_3" /> or <see cref="Gl.GL_MAP1_VERTEX_4" />.  To
+        ///         mark the end of the NURBS curve definition, call <see cref="gluEndCurve" />.
+        ///     </para>
+        ///     <para>
+        ///         OpenGL evaluators are used to render the NURBS curve as a series of line
+        ///         segments.  Evaluator state is preserved during rendering with
+        ///         <c>Gl.glPushAttrib(Gl.GL_EVAL_BIT)</c> and <c>Gl.glPopAttrib</c>.  For
+        ///         information on exactly what state these calls preserve, see
+        ///         <see cref="Gl.glPushAttrib" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following commands render a textured NURBS curve with normals; texture
+        ///         coordinates and normals are also specified as NURBS curves:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginCurve(nobj);
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_TEXTURE_COORD_2);
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_NORMAL);
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_VERTEX_4);
+        ///             Glu.gluEndCurve(nobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glPopAttrib" />
+        /// <seealso cref="Gl.glPushAttrib" />
+        /// <seealso cref="gluBeginSurface" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        // void APIENTRY gluBeginCurve(GLUnurbs *nobj);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluBeginCurve([In] GLUnurbs nurb);
+        #endregion gluBeginCurve([In] GLUnurbs nurb)
+
+        #region gluBeginPolygon([In] GLUtesselator tess)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBeginPolygon</b> delimits the definition of a nonconvex polygon.  To
+        ///         define such a polygon, first call <b>gluBeginPolygon</b>.  Then define the
+        ///         contours of the polygon by calling <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" /> for each
+        ///         vertex and <see cref="gluNextContour" /> to start each new contour.  Finally,
+        ///         call <see cref="gluEndPolygon" /> to signal the end of the definition.  See
+        ///         the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" /> and <see cref="gluNextContour" /> reference
+        ///         pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluEndPolygon" /> is called, the polygon is tessellated, and
+        ///         the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         This command is obsolete and is provided for backward compatibility only.
+        ///         Calls to <b>gluBeginPolygon</b> are mapped to
+        ///         <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> followed by
+        ///         <see cref="gluTessBeginContour" />.  Calls to <see cref="gluEndPolygon" />
+        ///         are mapped to <see cref="gluTessEndContour" /> followed by
+        ///         <see cref="gluTessEndPolygon" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         A quadrilateral with a triangular hole in it can be described like this:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginPolygon(tobj);
+        ///                 Glu.gluTessVertex(tobj, v1, v1);
+        ///                 Glu.gluTessVertex(tobj, v2, v2);
+        ///                 Glu.gluTessVertex(tobj, v3, v3);
+        ///                 Glu.gluTessVertex(tobj, v4, v4);
+        ///             Glu.gluNextContour(tobj, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessVertex(tobj, v5, v5);
+        ///                 Glu.gluTessVertex(tobj, v6, v6);
+        ///                 Glu.gluTessVertex(tobj, v7, v7);
+        ///             Glu.gluEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluNextContour" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluBeginPolygon(GLUtesselator *tess);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluBeginPolygon([In] GLUtesselator tess);
+        #endregion gluBeginPolygon([In] GLUtesselator tess)
+
+        #region gluBeginSurface([In] GLUnurbs nurb)
+        /// <summary>
+        ///     Delimits a NURBS surface definition.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <b>gluBeginSurface</b> to mark the beginning of a NURBS surface
+        ///         definition.  After calling <b>gluBeginSurface</b>, make one or more calls to
+        ///         <see cref="gluNurbsSurface(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int, float[], int, int, int)" /> to define the attributes of the surface.
+        ///         Exactly one of these calls to <see cref="gluNurbsSurface(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int, float[], int, int, int)" /> must have a
+        ///         surface type of <see cref="Gl.GL_MAP2_VERTEX_3" /> or
+        ///         <see cref="Gl.GL_MAP2_VERTEX_4" />.  To mark the end of the NURBS surface
+        ///         definition, call <see cref="gluEndSurface" />.
+        ///     </para>
+        ///     <para>
+        ///         Trimming of NURBS surfaces is supported with <see cref="gluBeginTrim" />,
+        ///         <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />, <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />, and
+        ///         <see cref="gluEndTrim" />.  See the <see cref="gluBeginTrim" /> reference
+        ///         page for details. 
+        ///     </para>
+        ///     <para>
+        ///         OpenGL evaluators are used to render the NURBS surface as a set of polygons.
+        ///         Evaluator state is preserved during rendering with
+        ///         <c>Gl.glPushAttrib(Gl.GL_EVAL_BIT)</c> and <c>Gl.glPopAttrib()</c>.  See the
+        ///         <see cref="Gl.glPushAttrib" /> reference page for details on exactly what
+        ///         state these calls preserve.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following commands render a textured NURBS surface with normals; the
+        ///         texture coordinates and normals are also described as NURBS surfaces:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginSurface(nobj);
+        ///                 Glu.gluNurbsSurface(nobj, ..., Gl.GL_MAP2_TEXTURE_COORD_2);
+        ///                 Glu.gluNurbsSurface(nobj, ..., Gl.GL_MAP2_NORMAL);
+        ///                 Glu.gluNurbsSurface(nobj, ..., Gl.GL_MAP2_VERTEX_4);
+        ///             Glu.gluEndSurface(nobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginCurve" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        /// <see cref="gluNurbsSurface(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int, float[], int, int, int)" />
+        /// <seealso cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />
+        // void APIENTRY gluBeginSurface(GLUnurbs *nobj);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluBeginSurface([In] GLUnurbs nurb);
+        #endregion gluBeginSurface([In] GLUnurbs nurb)
+
+        #region gluBeginTrim([In] GLUnurbs nurb)
+        /// <summary>
+        ///     Delimits a NURBS trimming loop definition.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />). 
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <b>gluBeginTrim</b> to mark the beginning of a trimming loop, and
+        ///         <see cref="gluEndTrim" /> to mark the end of a trimming loop.  A trimming
+        ///         loop is a set of oriented curve segments (forming a closed curve) that define
+        ///         boundaries of a NURBS surface.  You include these trimming loops in the
+        ///         definition of a NURBS surface, between calls to
+        ///         <see cref="gluBeginSurface" /> and <see cref="gluEndSurface" />.
+        ///     </para>
+        ///     <para>
+        ///         The definition for a NURBS surface can contain many trimming loops.  For
+        ///         example, if you wrote a definition for a NURBS surface that resembled a
+        ///         rectangle with a hole punched out, the definition would contain two trimming
+        ///         loops.  One loop would define the outer edge of the rectangle; the other
+        ///         would define the hole punched out of the rectangle.  The definitions of each
+        ///         of these trimming loops would be bracketed by a <b>gluBeginTrim</b> and
+        ///         <see cref="gluEndTrim" /> pair.
+        ///     </para>
+        ///     <para>
+        ///         The definition of a single closed trimming loop can consist of multiple curve
+        ///         segments, each described as a piecewise linear curve (see
+        ///         <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />) or as a single NURBS curve (see
+        ///         <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />), or as a combination of both in any order.  The
+        ///         only library calls that can appear in a trimming loop definition (between the
+        ///         calls to <b>gluBeginTrim</b> and <see cref="gluEndTrim" />) are
+        ///         <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" /> and <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />.
+        ///     </para>
+        ///     <para>
+        ///         The area of the NURBS surface that is displayed is the region in the domain
+        ///         to the left of the trimming curve as the curve parameter increases.  Thus,
+        ///         the retained region of the NURBS surface is inside a counterclockwise
+        ///         trimming loop and outside a clockwise trimming loop.  For the rectangle
+        ///         mentioned earlier, the trimming loop for the outer edge of the rectangle runs
+        ///         counterclockwise, while the trimming loop for the punched-out hole runs
+        ///         clockwise.
+        ///     </para>
+        ///     <para>
+        ///         If you use more than one curve to define a single trimming loop, the curve
+        ///         segments must form a closed loop (that is, the endpoint of each curve must be
+        ///         the starting point of the next curve, and the endpoint of the final curve
+        ///         must be the starting point of the first curve).  If the endpoints of the
+        ///         curve are sufficiently close together but not exactly coincident, they will
+        ///         be coerced to match.  If the endpoints are not sufficiently close, an error
+        ///         results (see <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         If a trimming loop definition contains multiple curves, the direction of the
+        ///         curves must be consistent (that is, the inside must be to the left of all of
+        ///         the curves).  Nested trimming loops are legal as long as the curve
+        ///         orientations alternate correctly.  If trimming curves are self-intersecting,
+        ///         or intersect one another, an error results.
+        ///     </para>
+        ///     <para>
+        ///         If no trimming information is given for a NURBS surface, the entire surface
+        ///         is drawn.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         This code fragment defines a trimming loop that consists of one piecewise
+        ///         linear curve, and two NURBS curves:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginTrim(nobj);
+        ///                 Glu.gluPwlCurve(..., Glu.GLU_MAP1_TRIM_2);
+        ///                 Glu.gluNurbsCurve(..., Glu.GLU_MAP1_TRIM_2);
+        ///                 Glu.gluNurbsCurve(..., Glu.GLU_MAP1_TRIM_3);
+        ///             Glu.gluEndTrim(nobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginSurface" />
+        /// <seealso cref="gluEndSurface" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        /// <seealso cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />
+        // void APIENTRY gluBeginTrim(GLUnurbs *nobj);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluBeginTrim([In] GLUnurbs nurb);
+        #endregion gluBeginTrim([In] GLUnurbs nurb)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] byte[] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+		/// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+		/// <seealso cref="Gl.glGetTexLevelParameterfv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] byte[] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] byte[] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] byte[ , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+		/// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+		/// <seealso cref="Gl.glGetTexLevelParameterfv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] byte[ , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] byte[ , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] byte[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glGetTexLevelParameterfv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] byte[ , , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] byte[ , , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] double[] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] double[] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] double[] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] double[ , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+		/// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+		/// <seealso cref="Gl.glGetTexLevelParameterfv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] double[ , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] double[ , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] double[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+		/// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+		/// <seealso cref="Gl.glGetTexLevelParameterfv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] double[ , , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] double[ , , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] short[] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] short[] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] short[] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] short[ , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] short[ , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] short[ , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] short[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] short[ , , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] short[ , , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] int[] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] int[] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] int[] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] int[ , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] int[ , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] int[ , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] int[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] int[ , , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] int[ , , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] float[] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] float[] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] float[] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] float[ , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] float[ , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] float[ , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] float[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+		/// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+		/// <seealso cref="Gl.glGetTexLevelParameterfv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] float[ , , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] float[ , , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] ushort[] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] ushort[] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] ushort[] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] ushort[ , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] ushort[ , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] ushort[ , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] ushort[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] ushort[ , , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] ushort[ , , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] uint[] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] uint[] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] uint[] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] uint[ , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] uint[ , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] uint[ , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] uint[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] uint[ , , ] data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] uint[ , , ] data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] IntPtr data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] IntPtr data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] IntPtr data)
+
+        #region int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] void *data)
+        /// <summary>
+        ///     Builds a subset of one-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     or 4 or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" /> or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width in pixels of the texture image.  This should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for data.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> builds a subset of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating data in half until size 1�1 is reached.  At each level, each texel
+        ///         in the halved mipmap level is an average of the corresponding two texels in
+        ///         the larger mipmap level.  <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load
+        ///         these mipmap levels from <i>min</i> to <i>max</i>.  If <i>max</i> is larger
+        ///         than the highest mipmap level for the texture of the specified size, then a
+        ///         GLU error code is returned (see <see cref="gluErrorString" />) and nothing is
+        ///         loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, the following
+        ///         levels are possible: 16�1, 8�1, 4�1, 2�1, 1�1.  These correspond to levels 2
+        ///         through 6 respectively.  If <i>min</i> is 3 and <i>max</i> is 5, then only
+        ///         mipmap levels 8�1, 4�1 and 2�1 are loaded.  However, if <i>max</i> is 7 then
+        ///         an error is returned and nothing is loaded since <i>max</i> is larger than
+        ///         the highest mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2((width)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>level</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild1DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> are not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] void *data);
+        #endregion int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int min, int max, [In] void *data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] byte[] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] byte[] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] byte[] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] byte[ , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] byte[ , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] byte[ , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] byte[ , , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] byte[ , , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] byte[ , , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] double[] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] double[] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] double[] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] double[ , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] double[ , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] double[ , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] double[ , , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] double[ , , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] double[ , , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] short[] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] short[] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] short[] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] short[ , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] short[ , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] short[ , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] short[ , , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] short[ , , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] short[ , , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] int[] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] int[] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] int[] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] int[ , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] int[ , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] int[ , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] int[ , , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] int[ , , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] int[ , , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] float[] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] float[] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] float[] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] float[ , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] float[ , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] float[ , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] float[ , , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] float[ , , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] float[ , , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] ushort[] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] ushort[] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] ushort[] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] ushort[ , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] ushort[ , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] ushort[ , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] ushort[ , , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] ushort[ , , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] ushort[ , , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] uint[] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] uint[] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] uint[] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] uint[ , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] uint[ , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] uint[ , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] uint[ , , ] data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] uint[ , , ] data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] uint[ , , ] data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] IntPtr data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] IntPtr data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] IntPtr data)
+
+        #region int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] void *data)
+        /// <summary>
+        ///     Builds a one-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_1D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" />, or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild1DMipmaps</b> builds a series of prefiltered one-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> of <i>data</i> is checked to see if it is a power
+        ///         of 2.  If not, a copy of <i>data</i> is scaled up or down to the nearest
+        ///         power of 2.  (If <i>width</i> is exactly between powers of 2, then the copy
+        ///         of <i>data</i> will scale upwards.)  This copy will be used for subsequent
+        ///         mipmapping operations described below.  For example, if <i>width</i> is 57
+        ///         then a copy of <i>data</i> will scale up to 64 before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, width
+        ///         is continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half until size 1�1 is reached.  At each level, each texel in the halved
+        ///         mipmap level is an average of the corresponding two texels in the larger
+        ///         mipmap level.
+        ///     </para>
+        ///     <para>
+        ///         <b>glTexImage1D</b> is called to load each of these mipmap levels.  Level 0
+        ///         is a copy of <i>data</i>.  The highest level is <c>log2(width)</c>.  For
+        ///         example, if <i>width</i> is 64 and the implementation can store a texture of
+        ///         this size, the following mipmap levels are built: 64�1, 32�1, 16�1, 8�1, 4�1,
+        ///         2�1 and 1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>type</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for the <i>data</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Note that there is no direct way of querying the maximum level.  This can be
+        ///         derived indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First,
+        ///         query for the width actually used at level 0.  (The width may not be equal to
+        ///         <i>width</i> since proxy textures might have scaled it to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(width)</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater, and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i> or <i>type</i>
+        ///         are not legal. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] void *data);
+        #endregion int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, [In] void *data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] byte[] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] byte[] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] byte[] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] byte[ , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] byte[ , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] byte[ , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] byte[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] byte[ , , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] byte[ , , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] double[] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] double[] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] double[] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] double[ , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] double[ , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] double[ , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] double[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] double[ , , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] double[ , , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] short[] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] short[] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] short[] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] short[ , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] short[ , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] short[ , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] short[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] short[ , , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] short[ , , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] int[] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] int[] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] int[] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] int[ , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] int[ , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] int[ , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] int[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] int[ , , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] int[ , , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] float[] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] float[] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] float[] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] float[ , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] float[ , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] float[ , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] float[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] float[ , , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] float[ , , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] ushort[] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] ushort[] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] ushort[] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] ushort[ , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] ushort[ , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] ushort[ , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] ushort[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] ushort[ , , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] ushort[ , , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] uint[] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] uint[] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] uint[] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] uint[ , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] uint[ , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] uint[ , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] uint[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] uint[ , , ] data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] uint[ , , ] data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] IntPtr data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] IntPtr data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] IntPtr data)
+
+        #region int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] void *data)
+        /// <summary>
+        ///     Builds a subset of two-dimensional mipmap levels.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies the width, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height, in pixels, of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> builds a subset of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///         decimating <i>data</i> in half along both dimensions until size 1�1 is
+        ///         reached.  At each level, each texel in the halved mipmap level is an average
+        ///         of the corresponding four texels in the larger mipmap level.  (In the case of
+        ///         rectangular images, the decimation will ultimately reach an N�1 or 1�N
+        ///         configuration.  Here, two texels are averaged instead.)
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load these mipmap levels from
+        ///         <i>min</i> to <i>max</i>.  If <i>max</i> is larger than the highest mipmap
+        ///         level for the texture of the specified size, then a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16 and <i>height</i> is
+        ///         8, the following levels are possible: 16�8, 8�4, 4�2, 2�1, 1�1.  These
+        ///         correspond to levels 2 through 6 respectively.  If <i>min</i> is 3 and
+        ///         <i>max</i> is 5, then only mipmap levels 8�4, 4�2 and 2�1 are loaded.
+        ///         However, if <i>max</i> is 7 then an error is returned and nothing is loaded
+        ///         since <i>max</i> is larger than the highest mipmap level which is, in this
+        ///         case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild2DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />. 
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] void *data);
+        #endregion int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int min, int max, [In] void *data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] byte[] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] byte[] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] byte[] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] byte[ , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] byte[ , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] byte[ , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] byte[ , , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] byte[ , , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] byte[ , , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] double[] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] double[] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] double[] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] double[ , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] double[ , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] double[ , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] double[ , , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] double[ , , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] double[ , , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] short[] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] short[] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] short[] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] short[ , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] short[ , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] short[ , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] short[ , , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] short[ , , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] short[ , , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] int[] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] int[] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] int[] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] int[ , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] int[ , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] int[ , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] int[ , , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] int[ , , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] int[ , , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] float[] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] float[] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] float[] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] float[ , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] float[ , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] float[ , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] float[ , , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] float[ , , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] float[ , , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] ushort[] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] ushort[] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] ushort[] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] ushort[ , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] ushort[ , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] ushort[ , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] ushort[ , , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] ushort[ , , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] ushort[ , , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] uint[] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] uint[] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] uint[] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] uint[ , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] uint[ , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] uint[ , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] uint[ , , ] data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] uint[ , , ] data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] uint[ , , ] data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] IntPtr data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] IntPtr data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] IntPtr data)
+
+        #region int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] void *data)
+        /// <summary>
+        ///     Builds a two-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_2D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />,
+        ///     <see cref="Gl.GL_INTENSITY" />, <see cref="Gl.GL_INTENSITY4" />,
+        ///     <see cref="Gl.GL_INTENSITY8" />, <see cref="Gl.GL_INTENSITY12" />,
+        ///     <see cref="Gl.GL_INTENSITY16" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_R3_G3_B2" />, <see cref="Gl.GL_RGB4" />,
+        ///     <see cref="Gl.GL_RGB5" />, <see cref="Gl.GL_RGB8" />,
+        ///     <see cref="Gl.GL_RGB10" />, <see cref="Gl.GL_RGB12" />,
+        ///     <see cref="Gl.GL_RGB16" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_RGBA2" />, <see cref="Gl.GL_RGBA4" />,
+        ///     <see cref="Gl.GL_RGB5_A1" />, <see cref="Gl.GL_RGBA8" />,
+        ///     <see cref="Gl.GL_RGB10_A2" />, <see cref="Gl.GL_RGBA12" /> or
+        ///     <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild2DMipmaps</b> builds a series of prefiltered two-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for
+        ///         the antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i> and <i>height</i> of <i>data</i> are checked to
+        ///         see if they are a power of 2.  If not, a copy of <i>data</i> (not <i>data</i>
+        ///         itself), is scaled up or down to the nearest power of 2.  This copy will be
+        ///         used for subsequent mipmapping operations described below.  (If <i>width</i>
+        ///         or <i>height</i> is exactly between powers of 2, then the copy of <i>data</i>
+        ///         will scale upwards.)  For example, if <i>width</i> is 57 and <i>height</i> is
+        ///         23 then a copy of <i>data</i> will scale up to 64 in <i>width</i> and down to
+        ///         16 in depth, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, both
+        ///         dimensions are continually halved until it fits.  (If the OpenGL version is
+        ///         <= 1.0, both maximum texture dimensions are clamped to the value returned
+        ///         by <see cref="Gl.glGetIntegerv(int, IntPtr)" /> with the argument
+        ///         <see cref="Gl.GL_MAX_TEXTURE_SIZE" />.)
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along both dimensions until size 1�1 is reached.  At each level, each
+        ///         texel in the halved mipmap level is an average of the corresponding four
+        ///         texels in the larger mipmap level.  (In the case of rectangular images, the
+        ///         decimation will ultimately reach an N�1 or 1�N configuration.  Here, two
+        ///         texels are averaged instead.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height))</c>.  For example, if <i>width</i> is 64 and
+        ///         <i>height</i> is 16 and the implementation can store a texture of this size,
+        ///         the following mipmap levels are built: 64�16, 32�8, 16�4, 8�2, 4�1, 2�1 and
+        ///         1�1.  These correspond to levels 0 through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width and height actually used at level 0.  (The width and height may not
+        ///         be equal to <i>width</i> and <i>height</i> respectively since proxy textures
+        ///         might have scaled them to fit the implementation.)  Then the maximum level
+        ///         can be derived from the formula <c>log2(max(width,height))</c>.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater and if the GLU version is 1.3 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i> or <i>height</i>
+        ///         is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] void *data);
+        #endregion int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, [In] void *data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] byte[] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] byte[] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] byte[] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] byte[ , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] byte[ , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] byte[ , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] byte[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] byte[ , , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] byte[ , , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] double[] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] double[] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] double[] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] double[ , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] double[ , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] double[ , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] double[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] double[ , , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] double[ , , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] short[] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] short[] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] short[] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] short[ , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] short[ , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] short[ , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] short[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] short[ , , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] short[ , , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] int[] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] int[] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] int[] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] int[ , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] int[ , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] int[ , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] int[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] int[ , , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] int[ , , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] float[] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] float[] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] float[] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] float[ , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] float[ , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] float[ , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] float[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] float[ , , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] float[ , , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] ushort[] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] ushort[] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] ushort[] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] ushort[ , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] ushort[ , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] ushort[ , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] ushort[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] ushort[ , , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] ushort[ , , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] uint[] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] uint[] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] uint[] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] uint[ , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] uint[ , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] uint[ , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] uint[ , , ] data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] uint[ , , ] data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] uint[ , , ] data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] IntPtr data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] IntPtr data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] IntPtr data)
+
+        #region int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] void *data)
+        /// <summary>
+        ///     Builds a subset of three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth of the texture image.  Should be a power of 2.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="level">
+        ///     Specifies the mipmap level of the image data.
+        /// </param>
+        /// <param name="min">
+        ///     Specifies the minimum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="max">
+        ///     Specifies the maximum mipmap level to pass to <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> builds a subset of prefiltered
+        ///         three-dimensional texture maps of decreasing resolutions called a mipmap.
+        ///         This is used for the antialiasing of texture mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///          A series of mipmap levels from <i>min</i> to <i>max</i> is built by
+        ///          decimating <i>data</i> in half along both dimensions until size 1�1�1 is
+        ///          reached.  At each level, each texel in the halved mipmap level is an average
+        ///          of the corresponding eight texels in the larger mipmap level.  (If exactly
+        ///          one of the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///          dimensions are 1, two texels are averaged.)  <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        ///          is called to load these mipmap levels from <i>min</i> to <i>max</i>.  If
+        ///          <i>max</i> is larger than the highest mipmap level for the texture of the
+        ///          specified size, then a GLU error code is returned (see
+        ///          <see cref="gluErrorString" />) and nothing is loaded.
+        ///     </para>
+        ///     <para>
+        ///         For example, if <i>level</i> is 2 and <i>width</i> is 16, <i>height</i> is 8
+        ///         and <i>depth</i> is 4, the following levels are possible: 16�8�4, 8�4�2,
+        ///         4�2�1, 2�1�1, 1�1�1.  These correspond to levels 2 through 6 respectively.
+        ///         If <i>min</i> is 3 and <i>max</i> is 5, then only mipmap levels 8�4�2,
+        ///         4�2�1 and 2�1�1 are loaded.  However, if <i>max</i> is 7 then an error is
+        ///         returned and nothing is loaded since <i>max</i> is larger than the highest
+        ///         mipmap level which is, in this case, 6.
+        ///     </para>
+        ///     <para>
+        ///         The highest mipmap level can be derived from the formula
+        ///         <c>log2(max(width,height,depth)*(2^level))</c>.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmapLevels</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>level</i> > <i>min</i>,
+        ///         <i>min</i> < 0, <i>max</i> < <i>min</i> or <i>max</i> is > the
+        ///         highest mipmap level for <i>data</i>.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] void *data);
+        #endregion int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int min, int max, [In] void *data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] byte[] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] byte[] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] byte[] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] byte[ , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] byte[ , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] byte[ , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] byte[ , , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] byte[ , , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] byte[ , , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] double[] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] double[] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] double[] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] double[ , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] double[ , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] double[ , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] double[ , , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] double[ , , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] double[ , , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] short[] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] short[] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] short[] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] short[ , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] short[ , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] short[ , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] short[ , , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] short[ , , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] short[ , , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] int[] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] int[] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] int[] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] int[ , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] int[ , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] int[ , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] int[ , , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] int[ , , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] int[ , , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] float[] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] float[] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] float[] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] float[ , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] float[ , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] float[ , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] float[ , , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] float[ , , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] float[ , , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] ushort[] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] ushort[] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] ushort[] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] ushort[ , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] ushort[ , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] ushort[ , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] ushort[ , , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] ushort[ , , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] ushort[ , , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] uint[] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] uint[] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] uint[] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] uint[ , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] uint[ , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] uint[ , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] uint[ , , ] data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] uint[ , , ] data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] uint[ , , ] data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] IntPtr data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] IntPtr data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] IntPtr data)
+
+        #region int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] void *data)
+        /// <summary>
+        ///     Builds a three-dimensional mipmap.
+        /// </summary>
+        /// <param name="target">
+        ///     Specifies the target texture.  Must be <see cref="Gl.GL_TEXTURE_3D" />.
+        /// </param>
+        /// <param name="internalFormat">
+        ///     Requests the internal storage format of the texture image.  Must be 1, 2, 3,
+        ///     4, or one of the following symbolic constants: <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_ALPHA4" />, <see cref="Gl.GL_ALPHA8" />,
+        ///     <see cref="Gl.GL_ALPHA12" />, <see cref="Gl.GL_ALPHA16" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, <see cref="Gl.GL_LUMINANCE4" />,
+        ///     <see cref="Gl.GL_LUMINANCE8" />, <see cref="Gl.GL_LUMINANCE12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16" />, <see cref="Gl.GL_LUMINANCE_ALPHA" />,
+        ///     <see cref="Gl.GL_LUMINANCE4_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE6_ALPHA2" />,
+        ///     <see cref="Gl.GL_LUMINANCE8_ALPHA8" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA4" />,
+        ///     <see cref="Gl.GL_LUMINANCE12_ALPHA12" />,
+        ///     <see cref="Gl.GL_LUMINANCE16_ALPHA16" />, <see cref="Gl.GL_INTENSITY" />,
+        ///     <see cref="Gl.GL_INTENSITY4" />, <see cref="Gl.GL_INTENSITY8" />,
+        ///     <see cref="Gl.GL_INTENSITY12" />, <see cref="Gl.GL_INTENSITY16" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_R3_G3_B2" />,
+        ///     <see cref="Gl.GL_RGB4" />, <see cref="Gl.GL_RGB5" />,
+        ///     <see cref="Gl.GL_RGB8" />, <see cref="Gl.GL_RGB10" />,
+        ///     <see cref="Gl.GL_RGB12" />, <see cref="Gl.GL_RGB16" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_RGBA2" />,
+        ///     <see cref="Gl.GL_RGBA4" />, <see cref="Gl.GL_RGB5_A1" />,
+        ///     <see cref="Gl.GL_RGBA8" />, <see cref="Gl.GL_RGB10_A2" />,
+        ///     <see cref="Gl.GL_RGBA12" />, or <see cref="Gl.GL_RGBA16" />.
+        /// </param>
+        /// <param name="width">
+        ///     Specifies, in pixels, the width in pixels of the texture image.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies, in pixels, the height in pixels of the texture image.
+        /// </param>
+        /// <param name="depth">
+        ///     Specifies, in pixels, the depth in pixels of the texture image.
+        /// </param>
+        /// <param name="format">
+        ///     Specifies the format of the pixel data.  Must be one of
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_DEPTH_COMPONENT" />,
+        ///     <see cref="Gl.GL_RED" />, <see cref="Gl.GL_GREEN" />,
+        ///     <see cref="Gl.GL_BLUE" />, <see cref="Gl.GL_ALPHA" />,
+        ///     <see cref="Gl.GL_RGB" />, <see cref="Gl.GL_RGBA" />,
+        ///     <see cref="Gl.GL_BGR" />, <see cref="Gl.GL_BGRA" />,
+        ///     <see cref="Gl.GL_LUMINANCE" />, or <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="type">
+        ///     Specifies the data type for <i>data</i>.  Must be one of:
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="data">
+        ///     Specifies a pointer to the image data in memory.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> builds a series of prefiltered three-dimensional
+        ///         texture maps of decreasing resolutions called a mipmap.  This is used for the
+        ///         antialiasing of texture-mapped primitives.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         Initially, the <i>width</i>, <i>height</i> and <i>depth</i> of <i>data</i>
+        ///         are checked to see if they are a power of two.  If not, a copy of <i>data</i>
+        ///         (not <i>data</i> itself), is scaled up or down to the nearest power of two.
+        ///         This copy will be used for subsequent mipmapping operations described below.
+        ///         (If <i>width</i>, <i>height</i> or <i>depth</i> is exactly between powers of
+        ///         2, then the copy of <i>data</i> will scale upwards.)  For example, if
+        ///         <i>width</i> is 57, <i>height</i> is 23 and <i>depth</i> is 24 then a copy of
+        ///         <i>data</i> will scale up to 64 in <i>width</i>, down to 16 in <i>height</i>
+        ///         and up to 32 in <i>depth</i>, before mipmapping takes place.
+        ///     </para>
+        ///     <para>
+        ///         Then, proxy textures (see <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />) are used to
+        ///         determine if the implementation can fit the requested texture.  If not, all
+        ///         three dimensions are continually halved until it fits.
+        ///     </para>
+        ///     <para>
+        ///         Next, a series of mipmap levels is built by decimating a copy of <i>data</i>
+        ///         in half along all three dimensions until size 1�1�1 is reached.  At each
+        ///         level, each texel in the halved mipmap level is an average of the
+        ///         corresponding eight texels in the larger mipmap level.  (If exactly one of
+        ///         the dimensions is 1, four texels are averaged.  If exactly two of the
+        ///         dimensions are 1, two texels are averaged.)
+        ///     </para>
+        ///     <para>
+        ///         <see cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" /> is called to load each of these mipmap levels.
+        ///         Level 0 is a copy of <i>data</i>.  The highest level is
+        ///         <c>log2(max(width,height,depth))</c>.  For example, if <i>width</i> is 64,
+        ///         <i>height</i> is 16 and <i>depth</i> is 32, and the implementation can store
+        ///         a texture of this size, the following mipmap levels are built: 64�16�32,
+        ///         32�8�16, 16�4�8, 8�2�4, 4�1�2, 2�1�1 and 1�1�1.  These correspond to levels 0
+        ///         through 6, respectively.
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for <i>format</i> parameter.  See the
+        ///         <see cref="Gl.glDrawPixels(int, int, int, int, object)" /> reference page for a description of the
+        ///         acceptable values for <i>type</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         There is no direct way of querying the maximum level.  This can be derived
+        ///         indirectly via <see cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />.  First, query for
+        ///         the width, height and depth actually used at level 0.  (The width, height
+        ///         and depth may not be equal to <i>width</i>, <i>height</i> and <i>depth</i>
+        ///         respectively since proxy textures might have scaled them to fit the
+        ///         implementation.)  Then the maximum level can be derived from the formula
+        ///         <c>log2(max(width,height,depth))</c>.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluBuild3DMipmaps</b> is only available if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>width</i>, <i>height</i>,
+        ///         or <i>depth</i> is < 1.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>internalFormat</i>,
+        ///         <i>format</i>, or <i>type</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>type</i> is
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexImage(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glGetTexLevelParameteriv(int, int, int, IntPtr)" />
+        /// <seealso cref="Gl.glTexImage1D(int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage2D(int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="Gl.glTexImage3D(int, int, int, int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmapLevels(int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmapLevels(int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmapLevels(int, int, int, int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] void *data);
+        #endregion int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, [In] void *data)
+
+        #region int gluCheckExtension(string extensionName, string extensionString)
+        /// <summary>
+        ///     Determines if an extension name is supported.
+        /// </summary>
+        /// <param name="extensionName">
+        ///     Specifies an extension name.
+        /// </param>
+        /// <param name="extensionString">
+        ///     Specifies a space-separated list of extension names supported.
+        /// </param>
+        /// <returns>
+        ///     Returns <see cref="Gl.GL_TRUE" /> if <i>extensionName</i> is supported
+        ///     otherwise <see cref="Gl.GL_FALSE" /> is returned.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluCheckExtension</b> is used to check for the presence for OpenGL, GLU or
+        ///         GLX extension names by passing the extension strings returned by
+        ///         <see cref="Gl.glGetString" />, <see cref="gluGetString" />,
+        ///         /*see cref="glXGetClientString" />*/, /*see cref="glXQueryExtensionsString" />*/,
+        ///         or /*see cref="glXQueryServerString" />*/, respectively, as
+        ///         <i>extensionString</i>.
+        ///     </para>
+        ///     <para>
+        ///         Returns <see cref="Gl.GL_TRUE" /> if <i>extensionName</i> is supported
+        ///         otherwise <see cref="Gl.GL_FALSE" /> is returned.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Cases where one extension name is a substring of another are correctly
+        ///         handled.
+        ///     </para>
+        ///     <para>
+        ///         There may or may not be leading or trailing blanks in <i>extensionString</i>.
+        ///     </para>
+        ///     <para>
+        ///         Extension names should not contain embedded spaces.
+        ///     </para>
+        ///     <para>
+        ///         All strings are null-terminated.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glGetString" />
+        /// <seealso cref="gluGetString" />
+        /// /*seealso cref="glXGetClientString" />*/
+        /// /*seealso cref="glXQueryExtensionsString" />*/
+        /// /*seealso cref="glXQueryServerString" />*/
+        // GLAPI GLboolean GLAPIENTRY gluCheckExtension (const GLubyte *extName, const GLubyte *extString);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluCheckExtension(string extensionName, string extensionString);
+        #endregion int gluCheckExtension(string extensionName, string extensionString)
+
+        #region gluCylinder([In] GLUquadric quad, double baseRadius, double topRadius, double height, int slices, int stacks)
+        /// <summary>
+        ///     Draws a cylinder.
+        /// </summary>
+        /// <param name="quad">
+        ///     Specifies the quadrics object (created with <see cref="gluNewQuadric" />).
+        /// </param>
+        /// <param name="baseRadius">
+        ///     Specifies the radius of the cylinder at <c>z = 0</c>.
+        /// </param>
+        /// <param name="topRadius">
+        ///     Specifies the radius of the cylinder at <c>z = height</c>.  If <i>top</i> is
+        ///     set to 0, this subroutine generates a cone.
+        /// </param>
+        /// <param name="height">
+        ///     Specifies the height of the cylinder.
+        /// </param>
+        /// <param name="slices">
+        ///     Specifies the number of subdivisions around the z axis.
+        /// </param>
+        /// <param name="stacks">
+        ///     Specifies the number of subdivisions along the z axis.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluCylinder</b> draws a cylinder oriented along the z axis.  The base of
+        ///         the cylinder is placed at z = 0, and the top at z = height.  Like a sphere,
+        ///         a cylinder is subdivided around the z axis into slices, and along the z axis
+        ///         into stacks.
+        ///     </para>
+        ///     <para>
+        ///         Note that if <i>top</i> is set to 0.0, this routine generates a cone.
+        ///     </para>
+        ///     <para>
+        ///         If the orientation is set to <see cref="GLU_OUTSIDE" /> (with
+        ///         <see cref="gluQuadricOrientation" />), then any generated normals point away
+        ///         from the z axis.  Otherwise, they point toward the z axis.
+        ///     </para>
+        ///     <para>
+        ///         If texturing is turned on using the <see cref="gluQuadricTexture" />
+        ///         subroutine, texture coordinates are generated so that t ranges linearly from
+        ///         0.0 at z = 0 to 1.0 at z = height, and s ranges from 0.0 at the +y axis to
+        ///         0.25 at the +x axis, as well as up to 0.5 at the -y axis and 0.75 at the
+        ///         -x axis, then back to 1.0 at the +y axis.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluDisk" />
+        /// <seealso cref="gluNewQuadric" />
+        /// <seealso cref="gluPartialDisk" />
+        /// <seealso cref="gluQuadricOrientation" />
+        /// <seealso cref="gluQuadricTexture" />
+        /// <seealso cref="gluSphere" />
+        // void APIENTRY gluCylinder(GLUquadric *qobj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluCylinder([In] GLUquadric quad, double baseRadius, double topRadius, double height, int slices, int stacks);
+        #endregion gluCylinder([In] GLUquadric quad, double baseRadius, double topRadius, double height, int slices, int stacks)
+
+        #region gluDeleteNurbsRenderer([In] GLUnurbs nurb)
+        /// <summary>
+        ///     Destroys a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object to be destroyed (created with
+        ///     <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <remarks>
+        ///     <b>gluDeleteNurbsRenderer</b> destroys the NURBS object (which was created with
+        ///     <see cref="gluNewNurbsRenderer" />) and frees any memory it uses.  Once
+        ///     <b>gluDeleteNurbsRenderer</b> has been called, <i>nurb</i> cannot be used again.
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        // void APIENTRY gluDeleteNurbsRenderer(GLUnurbs *nobj);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluDeleteNurbsRenderer([In] GLUnurbs nurb);
+        #endregion gluDeleteNurbsRenderer([In] GLUnurbs nurb)
+
+        #region gluDeleteQuadric([In] GLUquadric quad)
+        /// <summary>
+        ///     Destroys a quadrics object.
+        /// </summary>
+        /// <param name="quad">
+        ///     The quadric object to be destroyed (created with
+        ///     <see cref="gluNewQuadric" />).
+        /// </param>
+        /// <remarks>
+        ///     <b>gluDeleteQuadric</b> destroys the quadrics object (created with
+        ///     <see cref="gluNewQuadric" />) and frees any memory it uses.  Once
+        ///     <b>gluDeleteQuadric</b> has been called, <i>quad</i> cannot be used again.
+        /// </remarks>
+        /// <seealso cref="gluNewQuadric" />
+        // void APIENTRY gluDeleteQuadric(GLUquadric *state);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluDeleteQuadric([In] GLUquadric quad);
+        #endregion gluDeleteQuadric([In] GLUquadric quad)
+
+        #region gluDeleteTess([In] GLUtesselator tess)
+        /// <summary>
+        ///     Destroys a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object to destroy (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <remarks>
+        ///     <b>gluDeleteTess</b> destroys the indicated tessellation object (which was
+        ///     created with <see cref="gluNewTess" />) and frees any memory that it used.
+        ///     Once <b>gluDeleteTess</b> has been called, <i>tess</i> cannot be used again.
+        /// </remarks>
+        /// <seealso cref="gluBeginPolygon" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // void APIENTRY gluDeleteTess(GLUtesselator *tess);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluDeleteTess([In] GLUtesselator tess);
+        #endregion gluDeleteTess([In] GLUtesselator tess)
+
+        #region gluDisk([In] GLUquadric quad, double innerRadius, double outerRadius, int slices, int loops)
+        /// <summary>
+        ///     Draws a disk.
+        /// </summary>
+        /// <param name="quad">
+        ///     The quadric object (created with <see cref="gluNewQuadric" />).
+        /// </param>
+        /// <param name="innerRadius">
+        ///     The inner radius of the disk (may be zero).
+        /// </param>
+        /// <param name="outerRadius">
+        ///     The outer radius of the disk.
+        /// </param>
+        /// <param name="slices">
+        ///     The number of subdivisions around the z-axis.
+        /// </param>
+        /// <param name="loops">
+        ///     The number of concentric rings about the origin into which the disk is subdivided.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluDisk</b> renders a disk on the z = 0 plane.  The disk has a radius of
+        ///         <i>outerRadius</i>, and contains a concentric circular hole with a radius of
+        ///         <i>innerRadius</i>.  If <i>innerRadius</i> is 0, then no hole is generated.
+        ///         The disk is subdivided around the z axis into slices (like pizza slices),
+        ///         and also about the z axis into rings (as specified by <i>slices</i> and
+        ///         <i>loops</i>, respectively).
+        ///     </para>
+        ///     <para>
+        ///         With respect to orientation, the +z side of the disk is considered to be
+        ///         "outside" (see <see cref="gluQuadricOrientation" />).  This means that if the
+        ///         orientation is set to <see cref="GLU_OUTSIDE" />, then any normals generated
+        ///         point along the +z axis.  Otherwise, they point along the -z axis.
+        ///     </para>
+        ///     <para>
+        ///         If texturing has been turned on (with <see cref="gluQuadricTexture" />),
+        ///         texture coordinates are generated linearly such that where r = outerRadius,
+        ///         the value at (r, 0, 0) is (1, 0.5), at (0, r, 0) it is (0.5, 1), at
+        ///         (-r, 0, 0) it is (0, 0.5), and at (0, -r, 0) it is (0.5, 0).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluCylinder" />
+        /// <seealso cref="gluNewQuadric" />
+        /// <seealso cref="gluPartialDisk" />
+        /// <seealso cref="gluQuadricOrientation" />
+        /// <seealso cref="gluQuadricTexture" />
+        /// <seealso cref="gluSphere" />
+        // void APIENTRY gluDisk(GLUquadric *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluDisk([In] GLUquadric quad, double innerRadius, double outerRadius, int slices, int loops);
+        #endregion gluDisk([In] GLUquadric quad, double innerRadius, double outerRadius, int slices, int loops)
+
+        #region gluEndCurve([In] GLUnurbs nurb)
+        /// <summary>
+        ///     Delimits a Non-Uniform Rational B-Spline (NURBS) curve definition.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <see cref="gluBeginCurve" /> to mark the beginning of a NURBS curve
+        ///         definition.  After calling <see cref="gluBeginCurve" />, make one or more
+        ///         calls to <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" /> to define the attributes of the curve.
+        ///         Exactly one of the calls to <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" /> must have a curve
+        ///         type of <see cref="Gl.GL_MAP1_VERTEX_3" /> or
+        ///         <see cref="Gl.GL_MAP1_VERTEX_4" />.  To mark the end of the NURBS curve
+        ///         definition, call <b>gluEndCurve</b>.
+        ///     </para>
+        ///     <para>
+        ///         OpenGL evaluators are used to render the NURBS curve as a series of line
+        ///         segments.  Evaluator state is preserved during rendering with
+        ///         <c>Gl.glPushAttrib(Gl.GL_EVAL_BIT)</c> and <c>Gl.glPopAttrib</c>.  For
+        ///         information on exactly what state these calls preserve, see
+        ///         <see cref="Gl.glPushAttrib" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following commands render a textured NURBS curve with normals; texture
+        ///         coordinates and normals are also specified as NURBS curves:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginCurve(nobj);
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_TEXTURE_COORD_2);
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_NORMAL);
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_VERTEX_4);
+        ///             Glu.gluEndCurve(nobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glPopAttrib" />
+        /// <seealso cref="Gl.glPushAttrib" />
+        /// <seealso cref="gluBeginSurface" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        // void APIENTRY gluEndCurve(GLUnurbs *nobj);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluEndCurve([In] GLUnurbs nurb);
+        #endregion gluEndCurve([In] GLUnurbs nurb)
+
+        #region gluEndPolygon([In] GLUtesselator tess)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <see cref="gluBeginPolygon" /> delimits the definition of a nonconvex
+        ///         polygon.  To define such a polygon, first call
+        ///         <see cref="gluBeginPolygon" />.  Then define the contours of the polygon by
+        ///         calling <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" /> for each vertex and
+        ///         <see cref="gluNextContour" /> to start each new contour.  Finally, call
+        ///         <b>gluEndPolygon</b> to signal the end of the definition.  See the
+        ///         <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" /> and <see cref="gluNextContour" /> reference
+        ///         pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         Once <b>gluEndPolygon</b> is called, the polygon is tessellated, and the
+        ///         resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         This command is obsolete and is provided for backward compatibility only.
+        ///         Calls to <see cref="gluBeginPolygon" /> are mapped to
+        ///         <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> followed by
+        ///         <see cref="gluTessBeginContour" />.  Calls to <b>gluEndPolygon</b> are mapped
+        ///         to <see cref="gluTessEndContour" /> followed by
+        ///         <see cref="gluTessEndPolygon" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         A quadrilateral with a triangular hole in it can be described like this:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginPolygon(tobj);
+        ///                 Glu.gluTessVertex(tobj, v1, v1);
+        ///                 Glu.gluTessVertex(tobj, v2, v2);
+        ///                 Glu.gluTessVertex(tobj, v3, v3);
+        ///                 Glu.gluTessVertex(tobj, v4, v4);
+        ///             Glu.gluNextContour(tobj, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessVertex(tobj, v5, v5);
+        ///                 Glu.gluTessVertex(tobj, v6, v6);
+        ///                 Glu.gluTessVertex(tobj, v7, v7);
+        ///             Glu.gluEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluNextContour" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluEndPolygon(GLUtesselator *tess);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluEndPolygon([In] GLUtesselator tess);
+        #endregion gluEndPolygon([In] GLUtesselator tess)
+
+        #region gluEndSurface([In] GLUnurbs nurb)
+        /// <summary>
+        ///     Delimits a NURBS surface definition.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <see cref="gluBeginSurface" /> to mark the beginning of a NURBS surface
+        ///         definition.  After calling <see cref="gluBeginSurface" />, make one or more
+        ///         calls to <see cref="gluNurbsSurface(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int, float[], int, int, int)" /> to define the attributes of the
+        ///         surface.  Exactly one of these calls to <see cref="gluNurbsSurface(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int, float[], int, int, int)" /> must
+        ///         have a surface type of <see cref="Gl.GL_MAP2_VERTEX_3" /> or
+        ///         <see cref="Gl.GL_MAP2_VERTEX_4" />.  To mark the end of the NURBS surface
+        ///         definition, call <b>gluEndSurface</b>.
+        ///     </para>
+        ///     <para>
+        ///         Trimming of NURBS surfaces is supported with <see cref="gluBeginTrim" />,
+        ///         <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />, <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />, and
+        ///         <see cref="gluEndTrim" />.  See the <see cref="gluBeginTrim" /> reference
+        ///         page for details. 
+        ///     </para>
+        ///     <para>
+        ///         OpenGL evaluators are used to render the NURBS surface as a set of polygons.
+        ///         Evaluator state is preserved during rendering with
+        ///         <c>Gl.glPushAttrib(Gl.GL_EVAL_BIT)</c> and <c>Gl.glPopAttrib()</c>.  See the
+        ///         <see cref="Gl.glPushAttrib" /> reference page for details on exactly what
+        ///         state these calls preserve.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following commands render a textured NURBS surface with normals; the
+        ///         texture coordinates and normals are also described as NURBS surfaces:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginSurface(nobj);
+        ///                 Glu.gluNurbsSurface(nobj, ..., Gl.GL_MAP2_TEXTURE_COORD_2);
+        ///                 Glu.gluNurbsSurface(nobj, ..., Gl.GL_MAP2_NORMAL);
+        ///                 Glu.gluNurbsSurface(nobj, ..., Gl.GL_MAP2_VERTEX_4);
+        ///             Glu.gluEndSurface(nobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginCurve" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        /// <see cref="gluNurbsSurface(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int, float[], int, int, int)" />
+        /// <seealso cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />
+        // void APIENTRY gluEndSurface(GLUnurbs *nobj);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluEndSurface([In] GLUnurbs nurb);
+        #endregion gluEndSurface([In] GLUnurbs nurb)
+
+        #region gluEndTrim([In] GLUnurbs nurb)
+        /// <summary>
+        ///     Delimits a NURBS trimming loop definition.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />). 
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <see cref="gluBeginTrim" /> to mark the beginning of a trimming loop, and
+        ///         <b>gluEndTrim</b> to mark the end of a trimming loop.  A trimming loop is a
+        ///         set of oriented curve segments (forming a closed curve) that define
+        ///         boundaries of a NURBS surface.  You include these trimming loops in the
+        ///         definition of a NURBS surface, between calls to
+        ///         <see cref="gluBeginSurface" /> and <see cref="gluEndSurface" />.
+        ///     </para>
+        ///     <para>
+        ///         The definition for a NURBS surface can contain many trimming loops.  For
+        ///         example, if you wrote a definition for a NURBS surface that resembled a
+        ///         rectangle with a hole punched out, the definition would contain two trimming
+        ///         loops.  One loop would define the outer edge of the rectangle; the other
+        ///         would define the hole punched out of the rectangle.  The definitions of each
+        ///         of these trimming loops would be bracketed by a <see cref="gluBeginTrim" />
+        ///         and <b>gluEndTrim</b> pair.
+        ///     </para>
+        ///     <para>
+        ///         The definition of a single closed trimming loop can consist of multiple curve
+        ///         segments, each described as a piecewise linear curve (see
+        ///         <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />) or as a single NURBS curve (see
+        ///         <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />), or as a combination of both in any order.  The
+        ///         only library calls that can appear in a trimming loop definition (between the
+        ///         calls to <see cref="gluBeginTrim" /> and <b>gluEndTrim</b> are
+        ///         <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" /> and <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />.
+        ///     </para>
+        ///     <para>
+        ///         The area of the NURBS surface that is displayed is the region in the domain
+        ///         to the left of the trimming curve as the curve parameter increases.  Thus,
+        ///         the retained region of the NURBS surface is inside a counterclockwise
+        ///         trimming loop and outside a clockwise trimming loop.  For the rectangle
+        ///         mentioned earlier, the trimming loop for the outer edge of the rectangle runs
+        ///         counterclockwise, while the trimming loop for the punched-out hole runs
+        ///         clockwise.
+        ///     </para>
+        ///     <para>
+        ///         If you use more than one curve to define a single trimming loop, the curve
+        ///         segments must form a closed loop (that is, the endpoint of each curve must be
+        ///         the starting point of the next curve, and the endpoint of the final curve
+        ///         must be the starting point of the first curve).  If the endpoints of the
+        ///         curve are sufficiently close together but not exactly coincident, they will
+        ///         be coerced to match.  If the endpoints are not sufficiently close, an error
+        ///         results (see <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         If a trimming loop definition contains multiple curves, the direction of the
+        ///         curves must be consistent (that is, the inside must be to the left of all of
+        ///         the curves).  Nested trimming loops are legal as long as the curve
+        ///         orientations alternate correctly.  If trimming curves are self-intersecting,
+        ///         or intersect one another, an error results.
+        ///     </para>
+        ///     <para>
+        ///         If no trimming information is given for a NURBS surface, the entire surface
+        ///         is drawn.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         This code fragment defines a trimming loop that consists of one piecewise
+        ///         linear curve, and two NURBS curves:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginTrim(nobj);
+        ///                 Glu.gluPwlCurve(..., Glu.GLU_MAP1_TRIM_2);
+        ///                 Glu.gluNurbsCurve(..., Glu.GLU_MAP1_TRIM_2);
+        ///                 Glu.gluNurbsCurve(..., Glu.GLU_MAP1_TRIM_3);
+        ///             Glu.gluEndTrim(nobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginSurface" />
+        /// <seealso cref="gluEndSurface" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        /// <seealso cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />
+        // void APIENTRY gluEndTrim(GLUnurbs *nobj);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluEndTrim([In] GLUnurbs nurb);
+        #endregion gluEndTrim([In] GLUnurbs nurb)
+
+        #region string gluErrorString(int errorCode)
+        /// <summary>
+        ///     Produces an error string from a GL or GLU error code.
+        /// </summary>
+        /// <param name="errorCode">
+        ///     An OpenGL or GLU error code.
+        /// </param>
+        /// <returns>
+        ///     A string representation of the error.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluErrorString</b> produces an error string from a GL or GLU error code.
+        ///         The string is in ISO Latin 1 format.  For example,
+        ///         <c>gluErrorString(Gl.GL_OUT_OF_MEMORY)</c> returns the string 'out of
+        ///         memory'.
+        ///     </para>
+        ///     <para>
+        ///         The standard GLU error codes are <see cref="GLU_INVALID_ENUM" />,
+        ///         <see cref="GLU_INVALID_VALUE" />, and <see cref="GLU_OUT_OF_MEMORY" />.
+        ///         Certain other GLU functions can return specialized error codes through
+        ///         callbacks.  See the <see cref="Gl.glGetError" /> reference page for the list
+        ///         of GL error codes.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <c>NULL</c> is returned if <i>errorCode</i> is not a valid GL or GLU error
+        ///         code.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glGetError" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        /// <seealso cref="gluQuadricCallback" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // const GLubyte* APIENTRY gluErrorString(GLenum errCode);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluErrorString"), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr gluErrorStringUnsafe(int errorCode);
+
+        public static string gluErrorString(int errorCode) {
+            return Marshal.PtrToStringAnsi(gluErrorStringUnsafe(errorCode));
+        }
+        #endregion string gluErrorString(int errorCode)
+
+        #region string gluErrorStringWIN(int errorCode)
+        /// <summary>
+        ///     Produces an error string from a GL or GLU error code.
+        /// </summary>
+        /// <param name="errorCode">
+        ///     An OpenGL or GLU error code.
+        /// </param>
+        /// <returns>
+        ///     A string representation of the error.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluErrorStringWIN</b> produces an error string from a GL or GLU error
+        ///         code.  The string is in UNICODE format.  For example,
+        ///         <c>gluErrorStringWIN(Gl.GL_OUT_OF_MEMORY)</c> returns the string 'out of
+        ///         memory'.
+        ///     </para>
+        ///     <para>
+        ///         The standard GLU error codes are <see cref="GLU_INVALID_ENUM" />,
+        ///         <see cref="GLU_INVALID_VALUE" />, and <see cref="GLU_OUT_OF_MEMORY" />.
+        ///         Certain other GLU functions can return specialized error codes through
+        ///         callbacks.  See the <see cref="Gl.glGetError" /> reference page for the list
+        ///         of GL error codes.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <c>NULL</c> is returned if <i>errorCode</i> is not a valid GL or GLU error
+        ///         code.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glGetError" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        /// <seealso cref="gluQuadricCallback" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // const GLubyte* APIENTRY gluErrorStringWIN(GLenum errCode);
+        public static string gluErrorStringWIN(int errorCode) {
+            return gluErrorUnicodeStringEXT(errorCode);
+        }
+        #endregion string gluErrorStringWIN(int errorCode)
+
+        #region string gluErrorUnicodeStringEXT(int errorCode)
+        /// <summary>
+        ///     Produces an error string from a GL or GLU error code.
+        /// </summary>
+        /// <param name="errorCode">
+        ///     An OpenGL or GLU error code.
+        /// </param>
+        /// <returns>
+        ///     A Unicode string representation of the error.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluErrorString</b> produces an error string from a GL or GLU error code.
+        ///         The string is in UNICODE format.  For example,
+        ///         <c>gluErrorString(Gl.GL_OUT_OF_MEMORY)</c> returns the string 'out of
+        ///         memory'.
+        ///     </para>
+        ///     <para>
+        ///         The standard GLU error codes are <see cref="GLU_INVALID_ENUM" />,
+        ///         <see cref="GLU_INVALID_VALUE" />, and <see cref="GLU_OUT_OF_MEMORY" />.
+        ///         Certain other GLU functions can return specialized error codes through
+        ///         callbacks.  See the <see cref="Gl.glGetError" /> reference page for the list
+        ///         of GL error codes.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <c>NULL</c> is returned if <i>errorCode</i> is not a valid GL or GLU error
+        ///         code.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glGetError" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        /// <seealso cref="gluQuadricCallback" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // const wchar_t* APIENTRY gluErrorUnicodeStringEXT(GLenum errCode);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluErrorUnicodeStringEXT"), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr gluErrorUnicodeStringEXTUnsafe(int errorCode);
+
+        public static string gluErrorUnicodeStringEXT(int errorCode) {
+            return Marshal.PtrToStringAnsi(gluErrorUnicodeStringEXTUnsafe(errorCode));
+        }
+        #endregion string gluErrorUnicodeStringEXT(int errorCode)
+
+        #region gluGetNurbsProperty([In] GLUnurbs nurb, int property, [Out] float[] data)
+        /// <summary>
+        ///     Gets a NURBS property.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="property">
+        ///     The property whose value is to be retrieved.  The following values are valid:
+        ///     <see cref="GLU_SAMPLING_TOLERANCE" />, <see cref="GLU_DISPLAY_MODE" />,
+        ///     <see cref="GLU_CULLING" />, <see cref="GLU_AUTO_LOAD_MATRIX" />,
+        ///     <see cref="GLU_PARAMETRIC_TOLERANCE" />,
+        ///     <see cref="GLU_SAMPLING_METHOD" />, <see cref="GLU_U_STEP" />, and
+        ///     <see cref="GLU_V_STEP" />.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to the location into which the value of the named property is
+        ///     written.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluGetNurbsProperty</b> retrieves properties stored in a NURBS object.
+        ///     These properties affect the way that NURBS curves and surfaces are rendered.
+        ///     See the <see cref="gluNurbsProperty" /> reference page for information about
+        ///     what the properties are and what they do.
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluGetNurbsProperty(GLUnurbs *nobj, GLenum property, GLfloat *value);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluGetNurbsProperty([In] GLUnurbs nurb, int property, [Out] float[] data);
+        #endregion gluGetNurbsProperty([In] GLUnurbs nurb, int property, [Out] float[] data)
+
+        #region gluGetNurbsProperty([In] GLUnurbs nurb, int property, out float data)
+        /// <summary>
+        ///     Gets a NURBS property.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="property">
+        ///     The property whose value is to be retrieved.  The following values are valid:
+        ///     <see cref="GLU_SAMPLING_TOLERANCE" />, <see cref="GLU_DISPLAY_MODE" />,
+        ///     <see cref="GLU_CULLING" />, <see cref="GLU_AUTO_LOAD_MATRIX" />,
+        ///     <see cref="GLU_PARAMETRIC_TOLERANCE" />,
+        ///     <see cref="GLU_SAMPLING_METHOD" />, <see cref="GLU_U_STEP" />, and
+        ///     <see cref="GLU_V_STEP" />.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to the location into which the value of the named property is
+        ///     written.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluGetNurbsProperty</b> retrieves properties stored in a NURBS object.
+        ///     These properties affect the way that NURBS curves and surfaces are rendered.
+        ///     See the <see cref="gluNurbsProperty" /> reference page for information about
+        ///     what the properties are and what they do.
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluGetNurbsProperty(GLUnurbs *nobj, GLenum property, GLfloat *value);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluGetNurbsProperty([In] GLUnurbs nurb, int property, out float data);
+        #endregion gluGetNurbsProperty([In] GLUnurbs nurb, int property, out float data)
+
+        #region gluGetNurbsProperty([In] GLUnurbs nurb, int property, [Out] IntPtr data)
+        /// <summary>
+        ///     Gets a NURBS property.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="property">
+        ///     The property whose value is to be retrieved.  The following values are valid:
+        ///     <see cref="GLU_SAMPLING_TOLERANCE" />, <see cref="GLU_DISPLAY_MODE" />,
+        ///     <see cref="GLU_CULLING" />, <see cref="GLU_AUTO_LOAD_MATRIX" />,
+        ///     <see cref="GLU_PARAMETRIC_TOLERANCE" />,
+        ///     <see cref="GLU_SAMPLING_METHOD" />, <see cref="GLU_U_STEP" />, and
+        ///     <see cref="GLU_V_STEP" />.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to the location into which the value of the named property is
+        ///     written.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluGetNurbsProperty</b> retrieves properties stored in a NURBS object.
+        ///     These properties affect the way that NURBS curves and surfaces are rendered.
+        ///     See the <see cref="gluNurbsProperty" /> reference page for information about
+        ///     what the properties are and what they do.
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluGetNurbsProperty(GLUnurbs *nobj, GLenum property, GLfloat *value);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluGetNurbsProperty([In] GLUnurbs nurb, int property, [Out] IntPtr data);
+        #endregion gluGetNurbsProperty([In] GLUnurbs nurb, int property, [Out] IntPtr data)
+
+        #region string gluGetString(int name)
+        /// <summary>
+        ///     Gets a string that describes the GLU version number or supported GLU extension
+        ///     calls.
+        /// </summary>
+        /// <param name="name">
+        ///     Either the version number of GLU (<see cref="GLU_VERSION" />) or available
+        ///     vendor-specific extension calls (<see cref="GLU_EXTENSIONS" />).
+        /// </param>
+        /// <returns>
+        ///     Returns a string describing the GLU version or the GLU extensions that are
+        ///     supported.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluGetString</b> returns a string describing the GLU version or the GLU
+        ///         extensions that are supported.  When <i>name</i> is
+        ///         <see cref="GLU_VERSION" />, the returned string is a value that represents
+        ///         the version number of GLU.  The format of the version number is as follows:
+        ///     </para>
+        ///     <para>
+        ///         <version number><space><vendor-specific information> 
+        ///         (for example, "1.2.11 Microsoft Windows NT")
+        ///     </para>
+        ///     <para>
+        ///         The version number has the form "major_number.minor_number" or
+        ///         "major_number.minor_number.release_number".  The vendor-specific information
+        ///         is optional, and the format and contents depend on the implementation.
+        ///     </para>
+        ///     <para>
+        ///         When <i>name</i> is <see cref="GLU_EXTENSIONS" />, the returned string
+        ///         contains a list of names of supported GLU extensions that are separated by
+        ///         spaces.  The format of the returned list of names is as follows:
+        ///     </para>
+        ///     <para>
+        ///         <extension_name><space><extension_name><space> . . .
+        ///         (for example, "GLU_NURBS GL_TESSELATION")
+        ///     </para>
+        ///     <para>
+        ///         The extension names cannot contain any spaces.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         The <b>gluGetString</b> function is valid for GLU version 1.1 or later.
+        ///     </para>
+        ///     <para>
+        ///         All strings are NULL-terminated.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluGetString</b> only returns information about GLU extensions.  Call
+        ///         <see cref="Gl.glGetString" /> to get a list of GL extensions.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluGetString</b> is an initialization routine.  Calling it after a
+        ///         <see cref="Gl.glNewList" /> results in undefined behavior.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <c>NULL</c> is returned if name is not <see cref="GLU_VERSION" /> or
+        ///         <see cref="GLU_EXTENSIONS" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glGetString" />
+        // const GLubyte* APIENTRY gluGetString(GLenum name);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION, EntryPoint="gluGetString"), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr gluGetStringUnsafe(int name);
+
+        public static string gluGetString(int name) {
+            return Marshal.PtrToStringAnsi(gluGetStringUnsafe(name));
+        }
+        #endregion string gluGetString(int name)
+
+        #region gluGetTessProperty([In] GLUtesselator tess, int which, [Out] double[] data)
+        /// <summary>
+        ///     Gets a tessellation object property.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     The property whose value is to be retrieved.  The following values are valid:
+        ///     <see cref="GLU_TESS_WINDING_RULE" />, <see cref="GLU_TESS_BOUNDARY_ONLY" />,
+        ///     and <see cref="GLU_TESS_TOLERANCE" />.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to the location where the value of the named property is written.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluGetTessProperty</b> retrieves properties stored in a tessellation
+        ///     object.  These properties affect the way that tessellation objects are
+        ///     interpreted and rendered.  See the <see cref="gluTessProperty" /> reference
+        ///     page for information about the properties and what they do.
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluGetTessProperty(GLUtesselator *tess, GLenum which, GLdouble *value);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluGetTessProperty([In] GLUtesselator tess, int which, [Out] double[] data);
+        #endregion gluGetTessProperty([In] GLUtesselator tess, int which, [Out] double[] data)
+
+        #region gluGetTessProperty([In] GLUtesselator tess, int which, out double data)
+        /// <summary>
+        ///     Gets a tessellation object property.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     The property whose value is to be retrieved.  The following values are valid:
+        ///     <see cref="GLU_TESS_WINDING_RULE" />, <see cref="GLU_TESS_BOUNDARY_ONLY" />,
+        ///     and <see cref="GLU_TESS_TOLERANCE" />.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to the location where the value of the named property is written.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluGetTessProperty</b> retrieves properties stored in a tessellation
+        ///     object.  These properties affect the way that tessellation objects are
+        ///     interpreted and rendered.  See the <see cref="gluTessProperty" /> reference
+        ///     page for information about the properties and what they do.
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluGetTessProperty(GLUtesselator *tess, GLenum which, GLdouble *value);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluGetTessProperty([In] GLUtesselator tess, int which, out double data);
+        #endregion gluGetTessProperty([In] GLUtesselator tess, int which, out double data)
+
+        #region gluGetTessProperty([In] GLUtesselator tess, int which, [Out] IntPtr data)
+        /// <summary>
+        ///     Gets a tessellation object property.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     The property whose value is to be retrieved.  The following values are valid:
+        ///     <see cref="GLU_TESS_WINDING_RULE" />, <see cref="GLU_TESS_BOUNDARY_ONLY" />,
+        ///     and <see cref="GLU_TESS_TOLERANCE" />.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to the location where the value of the named property is written.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluGetTessProperty</b> retrieves properties stored in a tessellation
+        ///     object.  These properties affect the way that tessellation objects are
+        ///     interpreted and rendered.  See the <see cref="gluTessProperty" /> reference
+        ///     page for information about the properties and what they do.
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluGetTessProperty(GLUtesselator *tess, GLenum which, GLdouble *value);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluGetTessProperty([In] GLUtesselator tess, int which, [Out] IntPtr data);
+        #endregion gluGetTessProperty([In] GLUtesselator tess, int which, [Out] IntPtr data)
+
+        #region gluLoadSamplingMatrices([In] GLUnurbs nurb, [In] float[] modelMatrix, [In] float[] projectionMatrix, [In] int[] viewport)
+        /// <summary>
+        ///     Loads NURBS sampling and culling matrices.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="modelMatrix">
+        ///     A modelview matrix (as from a <see cref="Gl.glGetFloatv(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="projectionMatrix">
+        ///     A projection matrix (as from a <see cref="Gl.glGetFloatv(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="viewport">
+        ///     A viewport (as from a <see cref="Gl.glGetIntegerv(int, IntPtr)" /> call).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluLoadSamplingMatrices</b> uses <i>modelMatrix</i>,
+        ///         <i>projectionMatrix</i>, and <i>viewport</i> to recompute the sampling and
+        ///         culling matrices stored in <i>nurb</i>.  The sampling matrix determines how
+        ///         finely a NURBS curve or surface must be tessellated to satisfy the sampling
+        ///         tolerance (as determined by the <see cref="GLU_SAMPLING_TOLERANCE" />
+        ///         property).  The culling matrix is used in deciding if a NURBS curve or
+        ///         surface should be culled before rendering (when the
+        ///         <see cref="GLU_CULLING" /> property is turned on).
+        ///     </para>
+        ///     <para>
+        ///         <b>gluLoadSamplingMatrices</b> is necessary only if the
+        ///         <see cref="GLU_AUTO_LOAD_MATRIX" /> property is turned off (see
+        ///         <see cref="gluNurbsProperty" />).  Although it can be convenient to leave the
+        ///         <see cref="GLU_AUTO_LOAD_MATRIX" /> property turned on, there can be a
+        ///         performance penalty for doing so.  (A round trip to the GL server is needed
+        ///         to fetch the current values of the modelview matrix, projection matrix, and
+        ///         viewport.)
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glGetFloatv(int, IntPtr)" />
+        /// <seealso cref="Gl.glGetIntegerv(int, IntPtr)" />
+        /// <seealso cref="gluGetNurbsProperty(Tao.OpenGl.Glu.GLUnurbs, int, float[])" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluLoadSamplingMatrices(GLUnurbs *nobj, const GLfloat modelMatrix[16], const GLfloat projMatrix[16], const GLint viewport[4]);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluLoadSamplingMatrices([In] GLUnurbs nurb, [In] float[] modelMatrix, [In] float[] projectionMatrix, [In] int[] viewport);
+        #endregion gluLoadSamplingMatrices([In] GLUnurbs nurb, [In] float[] modelMatrix, [In] float[] projectionMatrix, [In] int[] viewport)
+
+        #region gluLookAt(double eyeX, double eyeY, double eyeZ, double centerX, double centerY, double centerZ, double upX, double upY, double upZ)
+        /// <summary>
+        ///     Defines a viewing transformation.
+        /// </summary>
+        /// <param name="eyeX">
+        ///     The x axis position of the eye point.
+        /// </param>
+        /// <param name="eyeY">
+        ///     The y axis position of the eye point.
+        /// </param>
+        /// <param name="eyeZ">
+        ///     The z axis position of the eye point.
+        /// </param>
+        /// <param name="centerX">
+        ///     The x axis position of the reference point.
+        /// </param>
+        /// <param name="centerY">
+        ///     The y axis position of the reference point.
+        /// </param>
+        /// <param name="centerZ">
+        ///     The z axis position of the reference point.
+        /// </param>
+        /// <param name="upX">
+        ///     The x axis direction of the up vector.
+        /// </param>
+        /// <param name="upY">
+        ///     The y axis direction of the up vector.
+        /// </param>
+        /// <param name="upZ">
+        ///     The z axis direction of the up vector.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluLookAt</b> creates a viewing matrix derived from an eye point, a
+        ///         reference point indicating the center of the scene, and an UP vector.
+        ///     </para>
+        ///     <para>
+        ///         The matrix maps the reference point to the negative z axis and the eye point
+        ///         to the origin.  When a typical projection matrix is used, the center of the
+        ///         scene therefore maps to the center of the viewport.  Similarly, the direction
+        ///         described by the UP vector projected onto the viewing plane is mapped to the
+        ///         positive y axis so that it points upward in the viewport.  The UP vector must
+        ///         not be parallel to the line of sight from the eye point to the reference
+        ///         point.
+        ///     </para>
+        ///     <para>
+        ///         The matrix generated by <b>gluLookAt</b> postmultiplies the current matrix.
+        ///     </para>
+        ///     <para>
+        ///         The matrix M generated by the OpenGL could be computed as follows:
+        ///     </para>
+        ///     <para>
+        ///         Let E be the 3d column vector (eyeX, eyeY, eyeZ).
+        ///         Let C be the 3d column vector (centerX, centerY, centerZ).
+        ///         Let U be the 3d column vector (upX, upY, upZ).
+        ///         Compute L = C - E.
+        ///         Normalize L.
+        ///         Compute S = L x U.
+        ///         Normalize S.
+        ///         Compute U' = S x L.
+        ///     </para>
+        ///     <para>
+        ///         M is the matrix whose columns are, in order:
+        ///     </para>
+        ///     <para>
+        ///         (S, 0), (U', 0), (-L, 0), (-E, 1)  (all column vectors)
+        ///     </para>
+        ///     <para>
+        ///         Note: This matrix is defined for use in systems where the the modelling
+        ///         coordinate vector is a column vector and is multiplied on the left by the
+        ///         matrices.  If you prefer a row vector which gets multiplied by matrices to
+        ///         its right, then use the transpose of this matrix M.
+        ///     </para>
+        ///     <para>
+        ///         Note: It is necessary that the UP vector NOT be parallel to the line
+        ///         connecting the center point with the eye point.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glFrustum" />
+        /// <seealso cref="gluPerspective" />
+        // void APIENTRY gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluLookAt(double eyeX, double eyeY, double eyeZ, double centerX, double centerY, double centerZ, double upX, double upY, double upZ);
+        #endregion gluLookAt(double eyeX, double eyeY, double eyeZ, double centerX, double centerY, double centerZ, double upX, double upY, double upZ)
+
+        #region GLUnurbs gluNewNurbsRenderer()
+        /// <summary>
+        ///     Creates a NURBS object.
+        /// </summary>
+        /// <returns>
+        ///     Returns a pointer to a new NURBS object.
+        /// </returns>
+        /// <remarks>
+        ///     <b>gluNewNurbsRenderer</b> creates and returns a pointer to a new NURBS
+        ///     object.  This object must be referred to when calling NURBS rendering and
+        ///     control functions.  A return value of 0 means that there is not enough memory
+        ///     to allocate the object.
+        /// </remarks>
+        /// <seealso cref="gluBeginCurve" />
+        /// <seealso cref="gluBeginSurface" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluDeleteNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        /// <seealso cref="gluNurbsProperty" />
+        // GLUnurbs* APIENTRY gluNewNurbsRenderer(void);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern GLUnurbs gluNewNurbsRenderer();
+        #endregion GLUnurbs gluNewNurbsRenderer()
+
+        #region GLUquadric gluNewQuadric()
+        /// <summary>
+        ///     Creates a quadrics object.
+        /// </summary>
+        /// <returns>
+        ///     Returns a pointer to a new quadrics object.
+        /// </returns>
+        /// <remarks>
+        ///     <b>gluNewQuadric</b> creates and returns a pointer to a new quadrics object.
+        ///     This object must be referred to when calling quadrics rendering and control
+        ///     functions.  A return value of 0 means that there is not enough memory to
+        ///     allocate the object.
+        /// </remarks>
+        /// <seealso cref="gluCylinder" />
+        /// <seealso cref="gluDeleteQuadric" />
+        /// <seealso cref="gluDisk" />
+        /// <seealso cref="gluPartialDisk" />
+        /// <seealso cref="gluQuadricCallback" />
+        /// <seealso cref="gluQuadricDrawStyle" />
+        /// <seealso cref="gluQuadricNormals" />
+        /// <seealso cref="gluQuadricOrientation" />
+        /// <seealso cref="gluQuadricTexture" />
+        /// <seealso cref="gluSphere" />
+        // GLUquadric* APIENTRY gluNewQuadric(void);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern GLUquadric gluNewQuadric();
+        #endregion GLUquadric gluNewQuadric()
+
+        #region GLUtesselator gluNewTess()
+        /// <summary>
+        ///     Creates a tessellation object.
+        /// </summary>
+        /// <returns>
+        ///     Returns a pointer to a new tessellation object.
+        /// </returns>
+        /// <remarks>
+        ///     <b>gluNewTess</b> creates and returns a pointer to a new tessellation object.
+        ///     This object must be referred to when calling tessellation functions.  A
+        ///     return value of 0 means that there is not enough memory to allocate the
+        ///     object.
+        /// </remarks>
+        /// <seealso cref="gluDeleteTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        // GLUtesselator* APIENTRY gluNewTess(void);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern GLUtesselator gluNewTess();
+        #endregion GLUtesselator gluNewTess()
+
+        #region gluNextContour([In] GLUtesselator tess, int type)
+        /// <summary>
+        ///     Marks the beginning of another contour.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="type">
+        ///     <para>
+        ///         The type of the contour being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_EXTERIOR" /></term>
+        ///                 <description>
+        ///                     An exterior contour defines an exterior boundary of the polygon.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_INTERIOR" /></term>
+        ///                 <description>
+        ///                     An interior contour defines an interior boundary of the polygon
+        ///                     (such as a hole).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_UNKNOWN" /></term>
+        ///                 <description>
+        ///                     An unknown contour is analyzed by the library to determine
+        ///                     whether it is interior or exterior.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_CCW" />, <see cref="GLU_CW" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The first <see cref="GLU_CCW" /> or <see cref="GLU_CW" />
+        ///                         contour defined is considered to be exterior.  All other
+        ///                         contours are considered to be exterior if they are oriented
+        ///                         in the same direction (clockwise or counterclockwise) as the
+        ///                         first contour, and interior if they are not.
+        ///                     </para>
+        ///                     <para>
+        ///                         If one contour is of type <see cref="GLU_CCW" /> or
+        ///                         <see cref="GLU_CW" />, then all contours must be of the same
+        ///                         type (if they are not, then all <see cref="GLU_CCW" /> and
+        ///                         <see cref="GLU_CW" /> contours will be changed to
+        ///                         <see cref="GLU_UNKNOWN" />).  Note that there is no real
+        ///                         difference between the <see cref="GLU_CCW" /> and
+        ///                         <see cref="GLU_CW" /> contour types.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNextContour</b> is used in describing polygons with multiple contours.
+        ///         After the first contour has been described through a series of
+        ///         <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" /> calls, a <b>gluNextContour</b> call indicates
+        ///         that the previous contour is complete and that the next contour is about to
+        ///         begin.  Another series of <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" /> calls is then used to
+        ///         describe the new contour.  This process can be repeated until all contours
+        ///         have been described.
+        ///     </para>
+        ///     <para>
+        ///         Before the first contour is described, <b>gluNextContour</b> can be called to
+        ///         define the type of the first contour.  If <b>gluNextContour</b> is not called
+        ///         before the first contour, then the first contour is marked
+        ///         <see cref="GLU_EXTERIOR" />.
+        ///     </para>
+        ///     <para>
+        ///         This command is obsolete and is provided for backward compatibility only.
+        ///         Calls to <b>gluNextContour</b> are mapped to <see cref="gluTessEndContour" />
+        ///         followed by <see cref="gluTessBeginContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can describe a quadrilateral with a triangular hole in it as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginPolygon(tess); 
+        ///                 Glu.gluTessVertex(tess, v1, v1); 
+        ///                 Glu.gluTessVertex(tess, v2, v2); 
+        ///                 Glu.gluTessVertex(tess, v3, v3); 
+        ///                 Glu.gluTessVertex(tess, v4, v4);  
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR); 
+        ///                 Glu.gluTessVertex(tess, v5, v5); 
+        ///                 Glu.gluTessVertex(tess, v6, v6); 
+        ///                 Glu.gluTessVertex(tess, v7, v7);  
+        ///             Glu.gluEndPolygon(tess); 
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndContour" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluNextContour(GLUtesselator *tess, GLenum type);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNextContour([In] GLUtesselator tess, int type);
+        #endregion gluNextContour([In] GLUtesselator tess, int type)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginCallback func) {
+            nurbsBeginCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsBeginCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginDataCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginDataCallback func) {
+            nurbsBeginDataCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsBeginDataCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsBeginDataCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorCallback func) {
+            nurbsColorCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsColorCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorDataCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorDataCallback func) {
+            nurbsColorDataCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsColorDataCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsColorDataCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndCallback func) {
+            nurbsEndCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsEndCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndDataCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndDataCallback func) {
+            nurbsEndDataCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsEndDataCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsEndDataCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsErrorCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsErrorCallback func) {
+            nurbsErrorCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsErrorCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsErrorCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalCallback func) {
+            nurbsNormalCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsNormalCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalDataCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalDataCallback func) {
+            nurbsNormalDataCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsNormalDataCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsNormalDataCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordCallback func) {
+            nurbsTexCoordCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsTexCoordCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordDataCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordDataCallback func) {
+            nurbsTexCoordDataCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsTexCoordDataCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsTexCoordDataCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexCallback func) {
+            nurbsVertexCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsVertexCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexCallback func)
+
+        #region gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexDataCallback func)
+        /// <summary>
+        ///     The <b>gluNurbsCallback</b> mehtod defines a callback for a NURBS object.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The legal callbacks are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback indicates the start of a primitive.  The
+        ///                     function takes a single argument of type <see cref="int" />,
+        ///                     which can be one of <see cref="Gl.GL_LINES" />,
+        ///                     <see cref="Gl.GL_LINE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />,
+        ///                     <see cref="Gl.GL_TRIANGLES" />, or
+        ///                     <see cref="Gl.GL_QUAD_STRIP" />.  The default begin callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR" /></term>
+        ///                 <description>
+        ///                     The color callback is invoked as the color of a vertex is
+        ///                     generated.  The components of the color are stored in the
+        ///                     parameter <i>colorData</i>.  This callback is effective only when
+        ///                     the user provides a color map (<see cref="Gl.GL_MAP1_COLOR_4" />
+        ///                     or <see cref="Gl.GL_MAP2_COLOR_4" />).  <i>colorData</i>
+        ///                     contains four components: R,G,B,A.  The default color callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_COLOR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_COLOR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsColorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END" /></term>
+        ///                 <description>
+        ///                     The end callback is invoked at the end of a primitive.  The
+        ///                     default end callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is <see cref="NurbsEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_END_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_END" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_ERROR" /></term>
+        ///                 <description>
+        ///                     The error function is called when an error is encountered.  Its
+        ///                     single argument is of type <see cref="int" />, and it indicates
+        ///                     the specific error that occurred.  There are 37 errors unique to
+        ///                     NURBS named <see cref="GLU_NURBS_ERROR1" /> through
+        ///                     <see cref="GLU_NURBS_ERROR37" />.  Character strings describing
+        ///                     these errors can be retrieved with <see cref="gluErrorString" />.
+        ///                     The delegate prototype for this callback is
+        ///                     <see cref="NurbsErrorCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL" /></term>
+        ///                 <description>
+        ///                     The normal callback is invoked as the vertex normal is generated.
+        ///                     The components of the normal are stored in the parameter
+        ///                     <i>normalData</i>.  In the case of a NURBS curve, the callback
+        ///                     function is effective only when the user provides a normal map
+        ///                     (<see cref="Gl.GL_MAP1_NORMAL" />).  In the case of a NURBS
+        ///                     surface, if a normal map (<see cref="Gl.GL_MAP2_NORMAL" />) is
+        ///                     provided, then the generated normal is computed from the normal
+        ///                     map.  If a normal map is not provided then a surface normal is
+        ///                     computed in a manner similar to that described for evaluators
+        ///                     when <see cref="Gl.GL_AUTO_NORMAL" /> is enabled.  The default
+        ///                     normal callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsNormalCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_NORMAL_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_NURBS_NORMAL" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is a
+        ///                     copy of the pointer that was specified at the last call to
+        ///                     <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default callback
+        ///                     function is <c>null</c>.  The delegate prototype for this
+        ///                     callback is <see cref="NurbsNormalDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD" /></term>
+        ///                 <description>
+        ///                     The texture callback is invoked as the texture coordinates of a
+        ///                     vertex are generated.  These coordinates are stored in the
+        ///                     parameter <i>texCoord</i>.  The number of texture coordinates can
+        ///                     be 1, 2, 3, or 4 depending on which type of texture map is
+        ///                     specified (<see cref="Gl.GL_MAP1_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP1_TEXTURE_COORD_4" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_1" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_2" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_3" />,
+        ///                     <see cref="Gl.GL_MAP2_TEXTURE_COORD_4" />).  If no texture map is
+        ///                     specified, this callback function will not be called.  The
+        ///                     default texture callback function is <c>null</c>.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="NurbsTexCoordCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_TEXTURE_COORD_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_TEXTURE_COORD" />
+        ///                     callback, except that it takes an additional pointer argument.
+        ///                     This pointer is a copy of the pointer that was specified at the
+        ///                     last call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsTexCoordDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback indicates a vertex of the primitive.  The
+        ///                     coordinates of the vertex are stored in the parameter
+        ///                     <i>vertexData</i>.  All the generated vertices have dimension 3,
+        ///                     that is, homogeneous coordinates have been transformed into
+        ///                     affine coordinates.  The default vertex callback function is
+        ///                     <c>null</c>. The delegate prototype for this callback is
+        ///                     <see cref="NurbsVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     This is the same as the <see cref="GLU_NURBS_VERTEX" /> callback,
+        ///                     except that it takes an additional pointer argument.  This
+        ///                     pointer is a copy of the pointer that was specified at the last
+        ///                     call to <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.  The default
+        ///                     callback function is <c>null</c>.  The delegate prototype for
+        ///                     this callback is <see cref="NurbsVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function that the callback invokes.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is used to define a callback to be used by a NURBS
+        ///         object.  If the specified callback is already defined, then it is replaced.
+        ///         If <i>func</i> is <c>null</c>, then this callback will not get invoked and
+        ///         the related data, if any, will be lost.
+        ///     </para>
+        ///     <para>
+        ///         Except the error callback, these callbacks are used by NURBS tessellator
+        ///         (when <see cref="GLU_NURBS_MODE" /> is set to be
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />) to return back the OpenGL polygon
+        ///         primitives resulting from the tessellation.  Note that there are two
+        ///         versions of each callback: one with a user data pointer and one without.  If
+        ///         both versions for a particular callback are specified then the callback with
+        ///         the user data pointer will be used.  Note that <i>userData</i> is a copy of
+        ///         the pointer that was specified at the last call to
+        ///         <see cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />.
+        ///     </para>
+        ///     <para>
+        ///         The error callback function is effective no matter which value that
+        ///         <see cref="GLU_NURBS_MODE" /> is set to.  All other callback functions are
+        ///         effective only when <see cref="GLU_NURBS_MODE" /> is set to
+        ///         <see cref="GLU_NURBS_TESSELLATOR" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallback</b> is available only if the GLU version is 1.2 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         GLU version 1.2 supports only the <see cref="GLU_ERROR" /> parameter for
+        ///         <i>which</i>.  The <see cref="GLU_ERROR" /> value is deprecated in GLU
+        ///         version 1.3 in favor of <see cref="GLU_NURBS_ERROR" />.  All other
+        ///         accepted values for <i>func</i> are available only if the GLU version is 1.3
+        ///         or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="NurbsBeginCallback" />
+        /// <seealso cref="NurbsBeginDataCallback" />
+        /// <seealso cref="NurbsColorCallback" />
+        /// <seealso cref="NurbsColorDataCallback" />
+        /// <seealso cref="NurbsEndCallback" />
+        /// <seealso cref="NurbsEndDataCallback" />
+        /// <seealso cref="NurbsErrorCallback" />
+        /// <seealso cref="NurbsNormalCallback" />
+        /// <seealso cref="NurbsNormalDataCallback" />
+        /// <seealso cref="NurbsTexCoordCallback" />
+        /// <seealso cref="NurbsTexCoordDataCallback" />
+        /// <seealso cref="NurbsVertexCallback" />
+        /// <seealso cref="NurbsVertexDataCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallbackData(Tao.OpenGl.Glu.GLUnurbs, byte[])" />
+        /// <seealso cref="gluNurbsProperty" />
+        // void APIENTRY gluNurbsCallback(GLUnurbs *nobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexDataCallback func) {
+            nurbsVertexDataCallback = func;
+            __gluNurbsCallback(nurb, which, nurbsVertexDataCallback);
+        }
+        #endregion gluNurbsCallback([In] GLUnurbs nurb, int which, [In] NurbsVertexDataCallback func)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] byte[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] byte[] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] byte[] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] byte[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] byte[ , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] byte[ , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] byte[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] byte[ , , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] byte[ , , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] double[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] double[] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] double[] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] double[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] double[ , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] double[ , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] double[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] double[ , , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] double[ , , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] short[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] short[] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] short[] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] short[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] short[ , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] short[ , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] short[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] short[ , , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] short[ , , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] int[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] int[] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] int[] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] int[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] int[ , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] int[ , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] int[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] int[ , , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] int[ , , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] float[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] float[] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] float[] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] float[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] float[ , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] float[ , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] float[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] float[ , , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] float[ , , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] ushort[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] ushort[] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] ushort[] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] ushort[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] ushort[ , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] ushort[ , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] ushort[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] ushort[ , , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] ushort[ , , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] uint[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] uint[] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] uint[] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] uint[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] uint[ , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] uint[ , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] uint[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] uint[ , , ] userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] uint[ , , ] userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] IntPtr userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] IntPtr userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] IntPtr userData)
+
+        #region gluNurbsCallbackData([In] GLUnurbs nurb, [In] void *userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is used to pass a pointer to the application's
+        ///         data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///         tessellator in the NURBS callback functions (set by
+        ///         <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         <b>gluNurbsCallbackData</b> is available only if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackData(GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void gluNurbsCallbackData([In] GLUnurbs nurb, [In] void *userData);
+        #endregion gluNurbsCallbackData([In] GLUnurbs nurb, [In] void *userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] byte[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] byte[] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] byte[] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] byte[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] byte[ , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] byte[ , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] byte[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] byte[ , , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] byte[ , , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] double[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] double[] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] double[] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] double[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] double[ , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] double[ , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] double[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] double[ , , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] double[ , , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] short[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] short[] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] short[] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] short[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] short[ , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] short[ , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] short[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] short[ , , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] short[ , , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] int[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] int[] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] int[] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] int[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] int[ , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] int[ , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] int[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] int[ , , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] int[ , , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] float[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] float[] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] float[] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] float[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] float[ , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] float[ , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] float[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] float[ , , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] float[ , , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] ushort[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] ushort[] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] ushort[] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] ushort[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] ushort[ , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] ushort[ , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] ushort[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] ushort[ , , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] ushort[ , , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] uint[] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] uint[] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] uint[] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] uint[ , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] uint[ , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] uint[ , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] uint[ , , ] userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] uint[ , , ] userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] uint[ , , ] userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] IntPtr userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] IntPtr userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] IntPtr userData)
+
+        #region gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] void *userData)
+        /// <summary>
+        ///     Sets a user data pointer.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="userData">
+        ///     A pointer to the user's data.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluNurbsCallbackDataEXT</b> is used to pass a pointer to the application's
+        ///     data to NURBS tessellator.  A copy of this pointer will be passed by the
+        ///     tessellator in the NURBS callback functions (set by
+        ///     <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).
+        /// </remarks>
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] void *userData);
+        #endregion gluNurbsCallbackDataEXT([In] GLUnurbs nurb, [In] void *userData)
+
+        #region gluNurbsCurve([In] GLUnurbs nurb, int knotCount, [In] float[] knots, int stride, [In] float[] control, int order, int type)
+        /// <summary>
+        ///     Defines the shape of a NURBS curve.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="knotCount">
+        ///     The number of knots in <i>knot</i>.  The <i>knotCount</i> parameter equals
+        ///     the number of control points plus the order.
+        /// </param>
+        /// <param name="knots">
+        ///     An array of <i>knotCount</i> nondecreasing knot values.
+        /// </param>
+        /// <param name="stride">
+        ///     The offset (as a number of single precision�floating-point values) between
+        ///     successive curve control points.
+        /// </param>
+        /// <param name="control">
+        ///     A pointer to an array of control points.  The coordinates must agree with
+        ///     <i>type</i>.
+        /// </param>
+        /// <param name="order">
+        ///     The order of the NURBS curve.  The <i>order</i> parameter equals degree + 1;
+        ///     hence a cubic curve has an order of 4.
+        /// </param>
+        /// <param name="type">
+        ///     The type of the curve.  If this curve is defined within a
+        ///     <see cref="gluBeginCurve" />/<see cref="gluEndCurve" /> pair, then the type
+        ///     can be any of the valid one-dimensional evaluator types (such as
+        ///     <see cref="Gl.GL_MAP1_VERTEX_3" /> or <see cref="Gl.GL_MAP1_COLOR_4" />).
+        ///     Between a <see cref="gluBeginTrim" />/<see cref="gluEndTrim" /> pair, the
+        ///     only valid types are <see cref="GLU_MAP1_TRIM_2" /> and
+        ///     <see cref="GLU_MAP1_TRIM_3" />. 
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <b>gluNurbsCurve</b> to describe a NURBS curve.
+        ///     </para>
+        ///     <para>
+        ///         When <b>gluNurbsCurve</b> appears between a
+        ///         <see cref="gluBeginCurve" />/<see cref="gluEndCurve" /> pair, it is used to
+        ///         describe a curve to be rendered.  Positional, texture, and color coordinates
+        ///         are associated by presenting each as a separate <b>gluNurbsCurve</b> between
+        ///         a <see cref="gluBeginCurve" />/<see cref="gluEndCurve" /> pair.  No more than
+        ///         one call to <b>gluNurbsCurve</b> for each of color, position, and texture
+        ///         data can be made within a single
+        ///         <see cref="gluBeginCurve" />/<see cref="gluEndCurve" /> pair.  Exactly one
+        ///         call must be made to describe the position of the curve (a type of
+        ///         <see cref="Gl.GL_MAP1_VERTEX_3" /> or <see cref="Gl.GL_MAP1_VERTEX_4" />). 
+        ///     </para>
+        ///     <para>
+        ///         When <b>gluNurbsCurve</b> appears between a
+        ///         <see cref="gluBeginTrim" />/<see cref="gluEndTrim" /> pair, it is used to
+        ///         describe a trimming curve on a NURBS surface.  If <i>type</i> is
+        ///         <see cref="GLU_MAP1_TRIM_2" />, then it describes a curve in two-dimensional
+        ///         (u and v) parameter space.  If it is <see cref="GLU_MAP1_TRIM_3" />, then it
+        ///         describes a curve in two-dimensional homogeneous (u, v, and w) parameter
+        ///         space.  See the <see cref="gluBeginTrim" /> reference page for more
+        ///         discussion about trimming curves. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         To define trim curves which stitch well, use <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following commands render a textured NURBS curve with normals:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginCurve(nobj); 
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_TEXTURE_COORD_2); 
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_NORMAL); 
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_VERTEX_4);  
+        ///             Glu.gluEndCurve(nobj); 
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginCurve" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluEndCurve" />
+        /// <seealso cref="gluEndTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />
+        // void APIENTRY gluNurbsCurve(GLUnurbs *nobj, GLint nknots, GLfloat *knot, GLint stride, GLfloat *ctlarray, GLint order, GLenum type);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCurve([In] GLUnurbs nurb, int knotCount, [In] float[] knots, int stride, [In] float[] control, int order, int type);
+        #endregion gluNurbsCurve([In] GLUnurbs nurb, int knotCount, [In] float[] knots, int stride, [In] float[] control, int order, int type)
+
+        #region gluNurbsCurve([In] GLUnurbs nurb, int knotCount, [In] float[] knots, int stride, [In] float[ , ] control, int order, int type)
+        /// <summary>
+        ///     Defines the shape of a NURBS curve.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="knotCount">
+        ///     The number of knots in <i>knot</i>.  The <i>knotCount</i> parameter equals
+        ///     the number of control points plus the order.
+        /// </param>
+        /// <param name="knots">
+        ///     An array of <i>knotCount</i> nondecreasing knot values.
+        /// </param>
+        /// <param name="stride">
+        ///     The offset (as a number of single precision�floating-point values) between
+        ///     successive curve control points.
+        /// </param>
+        /// <param name="control">
+        ///     A pointer to an array of control points.  The coordinates must agree with
+        ///     <i>type</i>.
+        /// </param>
+        /// <param name="order">
+        ///     The order of the NURBS curve.  The <i>order</i> parameter equals degree + 1;
+        ///     hence a cubic curve has an order of 4.
+        /// </param>
+        /// <param name="type">
+        ///     The type of the curve.  If this curve is defined within a
+        ///     <see cref="gluBeginCurve" />/<see cref="gluEndCurve" /> pair, then the type
+        ///     can be any of the valid one-dimensional evaluator types (such as
+        ///     <see cref="Gl.GL_MAP1_VERTEX_3" /> or <see cref="Gl.GL_MAP1_COLOR_4" />).
+        ///     Between a <see cref="gluBeginTrim" />/<see cref="gluEndTrim" /> pair, the
+        ///     only valid types are <see cref="GLU_MAP1_TRIM_2" /> and
+        ///     <see cref="GLU_MAP1_TRIM_3" />. 
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <b>gluNurbsCurve</b> to describe a NURBS curve.
+        ///     </para>
+        ///     <para>
+        ///         When <b>gluNurbsCurve</b> appears between a
+        ///         <see cref="gluBeginCurve" />/<see cref="gluEndCurve" /> pair, it is used to
+        ///         describe a curve to be rendered.  Positional, texture, and color coordinates
+        ///         are associated by presenting each as a separate <b>gluNurbsCurve</b> between
+        ///         a <see cref="gluBeginCurve" />/<see cref="gluEndCurve" /> pair.  No more than
+        ///         one call to <b>gluNurbsCurve</b> for each of color, position, and texture
+        ///         data can be made within a single
+        ///         <see cref="gluBeginCurve" />/<see cref="gluEndCurve" /> pair.  Exactly one
+        ///         call must be made to describe the position of the curve (a type of
+        ///         <see cref="Gl.GL_MAP1_VERTEX_3" /> or <see cref="Gl.GL_MAP1_VERTEX_4" />). 
+        ///     </para>
+        ///     <para>
+        ///         When <b>gluNurbsCurve</b> appears between a
+        ///         <see cref="gluBeginTrim" />/<see cref="gluEndTrim" /> pair, it is used to
+        ///         describe a trimming curve on a NURBS surface.  If <i>type</i> is
+        ///         <see cref="GLU_MAP1_TRIM_2" />, then it describes a curve in two-dimensional
+        ///         (u and v) parameter space.  If it is <see cref="GLU_MAP1_TRIM_3" />, then it
+        ///         describes a curve in two-dimensional homogeneous (u, v, and w) parameter
+        ///         space.  See the <see cref="gluBeginTrim" /> reference page for more
+        ///         discussion about trimming curves. 
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         To define trim curves which stitch well, use <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following commands render a textured NURBS curve with normals:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginCurve(nobj); 
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_TEXTURE_COORD_2); 
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_NORMAL); 
+        ///                 Glu.gluNurbsCurve(nobj, ..., Gl.GL_MAP1_VERTEX_4);  
+        ///             Glu.gluEndCurve(nobj); 
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginCurve" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluEndCurve" />
+        /// <seealso cref="gluEndTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />
+        // void APIENTRY gluNurbsCurve(GLUnurbs *nobj, GLint nknots, GLfloat *knot, GLint stride, GLfloat *ctlarray, GLint order, GLenum type);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsCurve([In] GLUnurbs nurb, int knotCount, [In] float[] knots, int stride, [In] float[ , ] control, int order, int type);
+        #endregion gluNurbsCurve([In] GLUnurbs nurb, int knotCount, [In] float[] knots, int stride, [In] float[ , ] control, int order, int type)
+
+        #region gluNurbsProperty([In] GLUnurbs nurb, int property, float val)
+        /// <summary>
+        ///     Sets a NURBS property.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="property">
+        ///     The property to be set.  Valid values are
+        ///     <see cref="GLU_SAMPLING_TOLERANCE" />, <see cref="GLU_DISPLAY_MODE" />,
+        ///     <see cref="GLU_CULLING" />, <see cref="GLU_AUTO_LOAD_MATRIX" />,
+        ///     <see cref="GLU_PARAMETRIC_TOLERANCE" />, <see cref="GLU_SAMPLING_METHOD" />,
+        ///     <see cref="GLU_U_STEP" />, <see cref="GLU_V_STEP" />, or
+        ///     <see cref="GLU_NURBS_MODE" />.
+        /// </param>
+        /// <param name="val">
+        ///     The value of the indicated property.  It may be a numeric value, or one of
+        ///     <see cref="GLU_OUTLINE_POLYGON" />, <see cref="GLU_FILL" />,
+        ///     <see cref="GLU_OUTLINE_PATCH" />, <see cref="Gl.GL_TRUE" />,
+        ///     <see cref="Gl.GL_FALSE" />, <see cref="GLU_PATH_LENGTH" />,
+        ///     <see cref="GLU_PARAMETRIC_ERROR" />, <see cref="GLU_DOMAIN_DISTANCE" />,
+        ///     <see cref="GLU_NURBS_RENDERER" />, or <see cref="GLU_NURBS_TESSELLATOR" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluNurbsProperty</b> is used to control properties stored in a NURBS
+        ///         object.  These properties affect the way that a NURBS curve is rendered.  The
+        ///         accepted values for property are as follows:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NURBS_MODE" /></term>
+        ///                 <description>
+        ///                     <i>val</i> should be set to be either
+        ///                     <see cref="GLU_NURBS_RENDERER" /> or
+        ///                     <see cref="GLU_NURBS_TESSELLATOR" />.  When set to
+        ///                     <see cref="GLU_NURBS_RENDERER" />, NURBS objects are tessellated
+        ///                     into OpenGL primitives and sent to the pipeline for rendering.
+        ///                     When set to <see cref="GLU_NURBS_TESSELLATOR" />, NURBS objects
+        ///                     are tessellated into OpenGL primitives but the vertices, normals,
+        ///                     colors, and/or textures are retrieved back through a callback
+        ///                     interface (see <see cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />).  This allows the
+        ///                     user to cache the tessellated results for further processing.
+        ///                     The initial value is <see cref="GLU_NURBS_RENDERER" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_SAMPLING_METHOD" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Specifies how a NURBS surface should be tessellated.
+        ///                         <i>val</i> may be one of <see cref="GLU_PATH_LENGTH" />,
+        ///                         <see cref="GLU_PARAMETRIC_ERROR" />,
+        ///                         <see cref="GLU_DOMAIN_DISTANCE" />,
+        ///                         <see cref="GLU_OBJECT_PATH_LENGTH" />, or
+        ///                         <see cref="GLU_OBJECT_PARAMETRIC_ERROR" />.  When set to
+        ///                         <see cref="GLU_PATH_LENGTH" />, the surface is rendered so
+        ///                         that the maximum length, in pixels, of the edges of the
+        ///                         tessellation polygons is no greater than what is specified by
+        ///                         <see cref="GLU_SAMPLING_TOLERANCE" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         <see cref="GLU_PARAMETRIC_ERROR" /> specifies that the
+        ///                         surface is rendered in such a way that the value specified by
+        ///                         <see cref="GLU_PARAMETRIC_TOLERANCE" /> describes the maximum
+        ///                         distance, in pixels, between the tessellation polygons and
+        ///                         the surfaces they approximate.
+        ///                     </para>
+        ///                     <para>
+        ///                         <see cref="GLU_DOMAIN_DISTANCE" /> allows users to specify,
+        ///                         in parametric coordinates, how many sample points per unit
+        ///                         length are taken in u, v direction.
+        ///                     </para>
+        ///                     <para>
+        ///                         <see cref="GLU_OBJECT_PATH_LENGTH" /> is similar to
+        ///                         <see cref="GLU_PATH_LENGTH" /> except that it is view
+        ///                         independent, that is, the surface is rendered so that the
+        ///                         maximum length, in object space, of edges of the tessellation
+        ///                         polygons is no greater than what is specified by
+        ///                         <see cref="GLU_SAMPLING_TOLERANCE" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         <see cref="GLU_OBJECT_PARAMETRIC_ERROR" /> is similar to
+        ///                         <see cref="GLU_PARAMETRIC_ERROR" /> except that it is view
+        ///                         independent, that is, the surface is rendered in such a way
+        ///                         that the value specified by
+        ///                         <see cref="GLU_PARAMETRIC_TOLERANCE" /> describes the maximum
+        ///                         distance, in object space, between the tessellation polygons
+        ///                         and the surfaces they approximate.
+        ///                     </para>
+        ///                     <para>
+        ///                         The initial value of <see cref="GLU_SAMPLING_METHOD" /> is
+        ///                         <see cref="GLU_PATH_LENGTH" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_SAMPLING_TOLERANCE" /></term>
+        ///                 <description>
+        ///                     Specifies the maximum length, in pixels or in object space length
+        ///                     unit, to use when the sampling method is set to
+        ///                     <see cref="GLU_PATH_LENGTH" /> or
+        ///                     <see cref="GLU_OBJECT_PATH_LENGTH" />.  The NURBS code is
+        ///                     conservative when rendering a curve or surface, so the actual
+        ///                     length can be somewhat shorter.  The initial value is 50.0
+        ///                     pixels.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_PARAMETRIC_TOLERANCE" /></term>
+        ///                 <description>
+        ///                     Specifies the maximum distance, in pixels or in object space
+        ///                     length unit, to use when the sampling method is
+        ///                     <see cref="GLU_PARAMETRIC_ERROR" /> or
+        ///                     <see cref="GLU_OBJECT_PARAMETRIC_ERROR" />.  The initial value is
+        ///                     0.5.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_U_STEP" /></term>
+        ///                 <description>
+        ///                     Specifies the number of sample points per unit length taken along
+        ///                     the u axis in parametric coordinates.  It is needed when
+        ///                     <see cref="GLU_SAMPLING_METHOD" /> is set to
+        ///                     <see cref="GLU_DOMAIN_DISTANCE" />.  The initial value is 100.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_V_STEP" /></term>
+        ///                 <description>
+        ///                     Specifies the number of sample points per unit length taken along
+        ///                     the v axis in parametric coordinate.  It is needed when
+        ///                     <see cref="GLU_SAMPLING_METHOD" /> is set to
+        ///                     <see cref="GLU_DOMAIN_DISTANCE" />.  The initial value is 100.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_DISPLAY_MODE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         <i>val</i> can be set to <see cref="GLU_OUTLINE_POLYGON" />,
+        ///                         <see cref="GLU_FILL" />, or <see cref="GLU_OUTLINE_PATCH" />.
+        ///                         When <see cref="GLU_NURBS_MODE" /> is set to be
+        ///                         <see cref="GLU_NURBS_RENDERER" />, <i>val</i> defines how a
+        ///                         NURBS surface should be rendered.  When <i>val</i> is set to
+        ///                         <see cref="GLU_FILL" />, the surface is rendered as a set of
+        ///                         polygons.  When <i>val</i> is set to
+        ///                         <see cref="GLU_OUTLINE_POLYGON" />, the NURBS library draws
+        ///                         only the outlines of the polygons created by tessellation.
+        ///                         When <i>val</i> is set to
+        ///                         <see cref="GLU_OUTLINE_PATCH" /> just the outlines of patches
+        ///                         and trim curves defined by the user are drawn.
+        ///                     </para>
+        ///                     <para>
+        ///                         When <see cref="GLU_NURBS_MODE" /> is set to be
+        ///                         <see cref="GLU_NURBS_TESSELLATOR" />, <i>val</i> defines how
+        ///                         a NURBS surface should be tessellated.  When
+        ///                         <see cref="GLU_DISPLAY_MODE" /> is set to
+        ///                         <see cref="GLU_FILL" /> or
+        ///                         <see cref="GLU_OUTLINE_POLYGON" />, the NURBS surface is
+        ///                         tessellated into OpenGL triangle primitives which can be
+        ///                         retrieved back through callback functions.  If
+        ///                         <see cref="GLU_DISPLAY_MODE" /> is set to
+        ///                         <see cref="GLU_OUTLINE_PATCH" />, only the outlines of the
+        ///                         patches and trim curves are generated as a sequence of
+        ///                         line strips which can be retrieved back through callback
+        ///                         functions.
+        ///                     </para>
+        ///                     <para>
+        ///                         The initial value is <see cref="GLU_FILL" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_CULLING" /></term>
+        ///                 <description>
+        ///                     <i>val</i> is a boolean value that, when set to
+        ///                     <see cref="Gl.GL_TRUE" />, indicates that a NURBS curve should be
+        ///                     discarded prior to tessellation if its control points lie outside
+        ///                     the current viewport.  The initial value is
+        ///                     <see cref="Gl.GL_FALSE" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_AUTO_LOAD_MATRIX" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         <i>val</i> is a boolean value.  When set to
+        ///                         <see cref="Gl.GL_TRUE" />, the NURBS code downloads the
+        ///                         projection matrix, the modelview matrix, and the viewport
+        ///                         from the GL server to compute sampling and culling matrices
+        ///                         for each NURBS curve that is rendered.  Sampling and culling
+        ///                         matrices are required to determine the tessellation of a
+        ///                         NURBS surface into line segments or polygons and to cull a
+        ///                         NURBS surface if it lies outside the viewport.
+        ///                     </para>
+        ///                     <para>
+        ///                         If this mode is set to <see cref="Gl.GL_FALSE" />, then the
+        ///                         program needs to provide a projection matrix, a modelview
+        ///                         matrix, and a viewport for the NURBS renderer to use to
+        ///                         construct sampling and culling matrices.  This can be done
+        ///                         with the <see cref="gluLoadSamplingMatrices" /> function.
+        ///                         This mode is initially set to <see cref="Gl.GL_TRUE" />.
+        ///                         Changing it from <see cref="Gl.GL_TRUE" /> to
+        ///                         <see cref="Gl.GL_FALSE" /> does not affect the sampling and
+        ///                         culling matrices until <see cref="gluLoadSamplingMatrices" />
+        ///                         is called.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         If <see cref="GLU_AUTO_LOAD_MATRIX" /> is true, sampling and culling may be
+        ///         executed incorrectly if NURBS routines are compiled into a display list.
+        ///     </para>
+        ///     <para>
+        ///         A <i>property</i> of <see cref="GLU_PARAMETRIC_TOLERANCE" />,
+        ///         <see cref="GLU_SAMPLING_METHOD" />, <see cref="GLU_U_STEP" />, or
+        ///         <see cref="GLU_V_STEP" />, or a <i>val</i> of <see cref="GLU_PATH_LENGTH" />,
+        ///         <see cref="GLU_PARAMETRIC_ERROR" />, <see cref="GLU_DOMAIN_DISTANCE" /> are
+        ///         only available if the GLU version is 1.1 or greater.  They are not valid
+        ///         parameters in GLU 1.0.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="gluGetString" /> can be used to determine the GLU version.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_NURBS_MODE" /> is only availble if the GLU version is 1.3 or
+        ///         greater.
+        ///     </para>
+        ///     <para>
+        ///         The <see cref="GLU_OBJECT_PATH_LENGTH" /> and
+        ///         <see cref="GLU_OBJECT_PARAMETRIC_ERROR" /> values for the
+        ///         <see cref="GLU_SAMPLING_METHOD" /> property are only available if the GLU
+        ///         version is 1.3 or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluGetNurbsProperty(Tao.OpenGl.Glu.GLUnurbs, int, float[])" />
+        /// <seealso cref="gluGetString" />
+        /// <seealso cref="gluLoadSamplingMatrices" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCallback(Tao.OpenGl.Glu.GLUnurbs, int, Tao.OpenGl.Glu.NurbsBeginCallback)" />
+        // void APIENTRY gluNurbsProperty(GLUnurbs *nobj, GLenum property, GLfloat value);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsProperty([In] GLUnurbs nurb, int property, float val);
+        #endregion gluNurbsProperty([In] GLUnurbs nurb, int property, float val)
+
+        #region gluNurbsSurface([In] GLUnurbs nurb, int sKnotCount, [In] float[] sKnots, int tKnotCount, [In] float[] tKnots, int sStride, int tStride, [In] float[] control, int sOrder, int tOrder, int type)
+        /// <summary>
+        ///     Defines the shape of a NURBS surface.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="sKnotCount">
+        ///     The number of knots in the parametric u direction.
+        /// </param>
+        /// <param name="sKnots">
+        ///     An array of <i>sKnotCount</i> nondecreasing knot values in the parametric
+        ///     u direction
+        /// </param>
+        /// <param name="tKnotCount">
+        ///     The number of knots in the parametric v direction.
+        /// </param>
+        /// <param name="tKnots">
+        ///     An array of <i>tKnotCount</i> nondecreasing knot values in the parametric
+        ///     v direction.
+        /// </param>
+        /// <param name="sStride">
+        ///     The offset (as a number of single precision�floating-point values) between
+        ///     successive control points in the parametric u direction in <i>control</i>.
+        /// </param>
+        /// <param name="tStride">
+        ///     The offset (in single precision�floating-point values) between successive
+        ///     control points in the parametric v direction in <i>control</i>.
+        /// </param>
+        /// <param name="control">
+        ///     An array containing control points for the NURBS surface.  The offsets
+        ///     between successive control points in the parametric u and v directions are
+        ///     given by <i>sStride</i> and <i>tStride</i>.
+        /// </param>
+        /// <param name="sOrder">
+        ///     The order of the NURBS surface in the parametric u direction.  The order is
+        ///     one more than the degree, hence a surface that is cubic in u has a u order of
+        ///     4.
+        /// </param>
+        /// <param name="tOrder">
+        ///     The order of the NURBS surface in the parametric v direction.  The order is
+        ///     one more than the degree, hence a surface that is cubic in v has a v order of
+        ///     4.
+        /// </param>
+        /// <param name="type">
+        ///     The type of the surface.  The <i>type</i> parameter can be any of the valid
+        ///     two-dimensional evaluator types (such as <see cref="Gl.GL_MAP2_VERTEX_3" />
+        ///     or <see cref="Gl.GL_MAP2_COLOR_4" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <b>gluNurbsSurface</b> within a NURBS (Non-Uniform Rational B-Spline)
+        ///         surface definition to describe the shape of a NURBS surface (before any
+        ///         trimming).  To mark the beginning of a NURBS surface definition, use the
+        ///         <see cref="gluBeginSurface" /> command.  To mark the end of a NURBS surface
+        ///         definition, use the <see cref="gluEndSurface" /> command.  Call
+        ///         <b>gluNurbsSurface</b> within a NURBS surface definition only.
+        ///     </para>
+        ///     <para>
+        ///         Positional, texture, and color coordinates are associated with a surface by
+        ///         presenting each as a separate <b>gluNurbsSurface</b> between a
+        ///         <see cref="gluBeginSurface" />/<see cref="gluEndSurface" /> pair.  No more
+        ///         than one call to <b>gluNurbsSurface</b> for each of color, position, and
+        ///         texture data can be made within a single
+        ///         <see cref="gluBeginSurface" />/<see cref="gluEndSurface" /> pair.  Exactly
+        ///         one call must be made to describe the position of the surface (a type of
+        ///         <see cref="Gl.GL_MAP2_VERTEX_3" /> or <see cref="Gl.GL_MAP2_VERTEX_4" />).
+        ///     </para>
+        ///     <para>
+        ///         A NURBS surface can be trimmed by using the commands
+        ///         <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" /> and <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" /> between calls to
+        ///         <see cref="gluBeginTrim" /> and <see cref="gluEndTrim" />.
+        ///     </para>
+        ///     <para>
+        ///         Note that a <b>gluNurbsSurface</b> with <i>sKnotCount</i> knots in the u
+        ///         direction and <i>tKnotCount</i> knots in the v direction with orders
+        ///         <i>sOrder</i> and <i>tOrder</i> must have (<i>sKnotCount</i> - <i>sOrder</i>)
+        ///         multiplied by (<i>tKnotCount</i> - <i>tOrder</i>) control points.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginSurface(nobj);
+        ///                 Glu.gluNurbsSurface(nobj, . . ., Gl.GL_MAP2_TEXTURE_COORD_2);
+        ///                 Glu.gluNurbsSurface(nobj, . . ., Gl.GL_MAP2_NORMAL);
+        ///                 Glu.gluNurbsSurface(nobj, . . ., Gl.GL_MAP2_VERTEX_4);
+        ///             Glu.gluEndSurface(nobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginSurface" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluEndSurface" />
+        /// <seealso cref="gluEndTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        /// <seealso cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />
+        // void APIENTRY gluNurbsSurface(GLUnurbs *nobj, GLint sknot_count, float *sknot, GLint tknot_count, GLfloat *tknot, GLint s_stride, GLint t_stride, GLfloat *ctlarray, GLint sorder, GLint torder, GLenum type);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsSurface([In] GLUnurbs nurb, int sKnotCount, [In] float[] sKnots, int tKnotCount, [In] float[] tKnots, int sStride, int tStride, float[] control, int sOrder, int tOrder, int type);
+        #endregion gluNurbsSurface([In] GLUnurbs nurb, int sKnotCount, [In] float[] sKnots, int tKnotCount, [In] float[] tKnots, int sStride, int tStride, float[] control, int sOrder, int tOrder, int type)
+
+        #region gluNurbsSurface([In] GLUnurbs nurb, int sKnotCount, [In] float[] sKnots, int tKnotCount, [In] float[] tKnots, int sStride, int tStride, [In] float[ , ] control, int sOrder, int tOrder, int type)
+        /// <summary>
+        ///     Defines the shape of a NURBS surface.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="sKnotCount">
+        ///     The number of knots in the parametric u direction.
+        /// </param>
+        /// <param name="sKnots">
+        ///     An array of <i>sKnotCount</i> nondecreasing knot values in the parametric
+        ///     u direction
+        /// </param>
+        /// <param name="tKnotCount">
+        ///     The number of knots in the parametric v direction.
+        /// </param>
+        /// <param name="tKnots">
+        ///     An array of <i>tKnotCount</i> nondecreasing knot values in the parametric
+        ///     v direction.
+        /// </param>
+        /// <param name="sStride">
+        ///     The offset (as a number of single precision�floating-point values) between
+        ///     successive control points in the parametric u direction in <i>control</i>.
+        /// </param>
+        /// <param name="tStride">
+        ///     The offset (in single precision�floating-point values) between successive
+        ///     control points in the parametric v direction in <i>control</i>.
+        /// </param>
+        /// <param name="control">
+        ///     An array containing control points for the NURBS surface.  The offsets
+        ///     between successive control points in the parametric u and v directions are
+        ///     given by <i>sStride</i> and <i>tStride</i>.
+        /// </param>
+        /// <param name="sOrder">
+        ///     The order of the NURBS surface in the parametric u direction.  The order is
+        ///     one more than the degree, hence a surface that is cubic in u has a u order of
+        ///     4.
+        /// </param>
+        /// <param name="tOrder">
+        ///     The order of the NURBS surface in the parametric v direction.  The order is
+        ///     one more than the degree, hence a surface that is cubic in v has a v order of
+        ///     4.
+        /// </param>
+        /// <param name="type">
+        ///     The type of the surface.  The <i>type</i> parameter can be any of the valid
+        ///     two-dimensional evaluator types (such as <see cref="Gl.GL_MAP2_VERTEX_3" />
+        ///     or <see cref="Gl.GL_MAP2_COLOR_4" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <b>gluNurbsSurface</b> within a NURBS (Non-Uniform Rational B-Spline)
+        ///         surface definition to describe the shape of a NURBS surface (before any
+        ///         trimming).  To mark the beginning of a NURBS surface definition, use the
+        ///         <see cref="gluBeginSurface" /> command.  To mark the end of a NURBS surface
+        ///         definition, use the <see cref="gluEndSurface" /> command.  Call
+        ///         <b>gluNurbsSurface</b> within a NURBS surface definition only.
+        ///     </para>
+        ///     <para>
+        ///         Positional, texture, and color coordinates are associated with a surface by
+        ///         presenting each as a separate <b>gluNurbsSurface</b> between a
+        ///         <see cref="gluBeginSurface" />/<see cref="gluEndSurface" /> pair.  No more
+        ///         than one call to <b>gluNurbsSurface</b> for each of color, position, and
+        ///         texture data can be made within a single
+        ///         <see cref="gluBeginSurface" />/<see cref="gluEndSurface" /> pair.  Exactly
+        ///         one call must be made to describe the position of the surface (a type of
+        ///         <see cref="Gl.GL_MAP2_VERTEX_3" /> or <see cref="Gl.GL_MAP2_VERTEX_4" />).
+        ///     </para>
+        ///     <para>
+        ///         A NURBS surface can be trimmed by using the commands
+        ///         <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" /> and <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" /> between calls to
+        ///         <see cref="gluBeginTrim" /> and <see cref="gluEndTrim" />.
+        ///     </para>
+        ///     <para>
+        ///         Note that a <b>gluNurbsSurface</b> with <i>sKnotCount</i> knots in the u
+        ///         direction and <i>tKnotCount</i> knots in the v direction with orders
+        ///         <i>sOrder</i> and <i>tOrder</i> must have (<i>sKnotCount</i> - <i>sOrder</i>)
+        ///         multiplied by (<i>tKnotCount</i> - <i>tOrder</i>) control points.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginSurface(nobj);
+        ///                 Glu.gluNurbsSurface(nobj, . . ., Gl.GL_MAP2_TEXTURE_COORD_2);
+        ///                 Glu.gluNurbsSurface(nobj, . . ., Gl.GL_MAP2_NORMAL);
+        ///                 Glu.gluNurbsSurface(nobj, . . ., Gl.GL_MAP2_VERTEX_4);
+        ///             Glu.gluEndSurface(nobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginSurface" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluEndSurface" />
+        /// <seealso cref="gluEndTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        /// <seealso cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />
+        // void APIENTRY gluNurbsSurface(GLUnurbs *nobj, GLint sknot_count, float *sknot, GLint tknot_count, GLfloat *tknot, GLint s_stride, GLint t_stride, GLfloat *ctlarray, GLint sorder, GLint torder, GLenum type);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsSurface([In] GLUnurbs nurb, int sKnotCount, [In] float[] sKnots, int tKnotCount, [In] float[] tKnots, int sStride, int tStride, float[ , ] control, int sOrder, int tOrder, int type);
+        #endregion gluNurbsSurface([In] GLUnurbs nurb, int sKnotCount, [In] float[] sKnots, int tKnotCount, [In] float[] tKnots, int sStride, int tStride, float[ , ] control, int sOrder, int tOrder, int type)
+
+        #region gluNurbsSurface([In] GLUnurbs nurb, int sKnotCount, [In] float[] sKnots, int tKnotCount, [In] float[] tKnots, int sStride, int tStride, [In] float[ , , ] control, int sOrder, int tOrder, int type)
+        /// <summary>
+        ///     Defines the shape of a NURBS surface.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="sKnotCount">
+        ///     The number of knots in the parametric u direction.
+        /// </param>
+        /// <param name="sKnots">
+        ///     An array of <i>sKnotCount</i> nondecreasing knot values in the parametric
+        ///     u direction
+        /// </param>
+        /// <param name="tKnotCount">
+        ///     The number of knots in the parametric v direction.
+        /// </param>
+        /// <param name="tKnots">
+        ///     An array of <i>tKnotCount</i> nondecreasing knot values in the parametric
+        ///     v direction.
+        /// </param>
+        /// <param name="sStride">
+        ///     The offset (as a number of single precision�floating-point values) between
+        ///     successive control points in the parametric u direction in <i>control</i>.
+        /// </param>
+        /// <param name="tStride">
+        ///     The offset (in single precision�floating-point values) between successive
+        ///     control points in the parametric v direction in <i>control</i>.
+        /// </param>
+        /// <param name="control">
+        ///     An array containing control points for the NURBS surface.  The offsets
+        ///     between successive control points in the parametric u and v directions are
+        ///     given by <i>sStride</i> and <i>tStride</i>.
+        /// </param>
+        /// <param name="sOrder">
+        ///     The order of the NURBS surface in the parametric u direction.  The order is
+        ///     one more than the degree, hence a surface that is cubic in u has a u order of
+        ///     4.
+        /// </param>
+        /// <param name="tOrder">
+        ///     The order of the NURBS surface in the parametric v direction.  The order is
+        ///     one more than the degree, hence a surface that is cubic in v has a v order of
+        ///     4.
+        /// </param>
+        /// <param name="type">
+        ///     The type of the surface.  The <i>type</i> parameter can be any of the valid
+        ///     two-dimensional evaluator types (such as <see cref="Gl.GL_MAP2_VERTEX_3" />
+        ///     or <see cref="Gl.GL_MAP2_COLOR_4" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         Use <b>gluNurbsSurface</b> within a NURBS (Non-Uniform Rational B-Spline)
+        ///         surface definition to describe the shape of a NURBS surface (before any
+        ///         trimming).  To mark the beginning of a NURBS surface definition, use the
+        ///         <see cref="gluBeginSurface" /> command.  To mark the end of a NURBS surface
+        ///         definition, use the <see cref="gluEndSurface" /> command.  Call
+        ///         <b>gluNurbsSurface</b> within a NURBS surface definition only.
+        ///     </para>
+        ///     <para>
+        ///         Positional, texture, and color coordinates are associated with a surface by
+        ///         presenting each as a separate <b>gluNurbsSurface</b> between a
+        ///         <see cref="gluBeginSurface" />/<see cref="gluEndSurface" /> pair.  No more
+        ///         than one call to <b>gluNurbsSurface</b> for each of color, position, and
+        ///         texture data can be made within a single
+        ///         <see cref="gluBeginSurface" />/<see cref="gluEndSurface" /> pair.  Exactly
+        ///         one call must be made to describe the position of the surface (a type of
+        ///         <see cref="Gl.GL_MAP2_VERTEX_3" /> or <see cref="Gl.GL_MAP2_VERTEX_4" />).
+        ///     </para>
+        ///     <para>
+        ///         A NURBS surface can be trimmed by using the commands
+        ///         <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" /> and <see cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" /> between calls to
+        ///         <see cref="gluBeginTrim" /> and <see cref="gluEndTrim" />.
+        ///     </para>
+        ///     <para>
+        ///         Note that a <b>gluNurbsSurface</b> with <i>sKnotCount</i> knots in the u
+        ///         direction and <i>tKnotCount</i> knots in the v direction with orders
+        ///         <i>sOrder</i> and <i>tOrder</i> must have (<i>sKnotCount</i> - <i>sOrder</i>)
+        ///         multiplied by (<i>tKnotCount</i> - <i>tOrder</i>) control points.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluBeginSurface(nobj);
+        ///                 Glu.gluNurbsSurface(nobj, . . ., Gl.GL_MAP2_TEXTURE_COORD_2);
+        ///                 Glu.gluNurbsSurface(nobj, . . ., Gl.GL_MAP2_NORMAL);
+        ///                 Glu.gluNurbsSurface(nobj, . . ., Gl.GL_MAP2_VERTEX_4);
+        ///             Glu.gluEndSurface(nobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginSurface" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluEndSurface" />
+        /// <seealso cref="gluEndTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        /// <seealso cref="gluPwlCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, int)" />
+        // void APIENTRY gluNurbsSurface(GLUnurbs *nobj, GLint sknot_count, float *sknot, GLint tknot_count, GLfloat *tknot, GLint s_stride, GLint t_stride, GLfloat *ctlarray, GLint sorder, GLint torder, GLenum type);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluNurbsSurface([In] GLUnurbs nurb, int sKnotCount, [In] float[] sKnots, int tKnotCount, [In] float[] tKnots, int sStride, int tStride, float[ , , ] control, int sOrder, int tOrder, int type);
+        #endregion gluNurbsSurface([In] GLUnurbs nurb, int sKnotCount, [In] float[] sKnots, int tKnotCount, [In] float[] tKnots, int sStride, int tStride, float[ , , ] control, int sOrder, int tOrder, int type)
+
+        #region gluOrtho2D(double left, double right, double bottom, double top)
+        /// <summary>
+        ///     Defines a 2D orthographic projection matrix.
+        /// </summary>
+        /// <param name="left">
+        ///     The coordinates for the leftvertical clipping planes.
+        /// </param>
+        /// <param name="right">
+        ///     The coordinates for the right vertical clipping planes.
+        /// </param>
+        /// <param name="bottom">
+        ///     The coordinates for the bottom horizontal clipping planes.
+        /// </param>
+        /// <param name="top">
+        ///     The coordinates for the top horizontal clipping planes.
+        /// </param>
+        /// <remarks>
+        ///     The <b>gluOrtho2D</b> function sets up a two-dimensional orthographic viewing
+        ///     region.  This is equivalent to calling <see cref="Gl.glOrtho" /> with
+        ///     <i>near</i> = �1 and <i>far</i> = 1.
+        /// </remarks>
+        /// <seealso cref="Gl.glOrtho" />
+        /// <seealso cref="gluPerspective" />
+        // void APIENTRY gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluOrtho2D(double left, double right, double bottom, double top);
+        #endregion gluOrtho2D(double left, double right, double bottom, double top)
+
+        #region gluPartialDisk([In] GLUquadric quad, double innerRadius, double outerRadius, int slices, int loops, double startAngle, double sweepAngle)
+        /// <summary>
+        ///     Draws an arc of a disk.
+        /// </summary>
+        /// <param name="quad">
+        ///     A quadric object (created with <see cref="gluNewQuadric" />).
+        /// </param>
+        /// <param name="innerRadius">
+        ///     The inner radius of the partial disk (can be zero).
+        /// </param>
+        /// <param name="outerRadius">
+        ///     The outer radius of the partial disk.
+        /// </param>
+        /// <param name="slices">
+        ///     The number of subdivisions around the z-axis.
+        /// </param>
+        /// <param name="loops">
+        ///     The number of concentric rings about the origin into which the partial disk
+        ///     is subdivided.
+        /// </param>
+        /// <param name="startAngle">
+        ///     The starting angle, in degrees, of the disk portion.
+        /// </param>
+        /// <param name="sweepAngle">
+        ///     The sweep angle, in degrees, of the disk portion.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluPartialDisk</b> renders a partial disk on the z = 0 plane.  A partial
+        ///         disk is similar to a full disk, except that only the subset of the disk from
+        ///         <i>startAngle</i> through <i>startAngle</i> + <i>sweepAngle</i> is included
+        ///         (where 0 degrees is along the +y axis, 90 degrees along the +x axis, 180
+        ///         degrees along the -y axis, and 270 degrees along the -x axis).
+        ///     </para>
+        ///     <para>
+        ///         The partial disk has a radius of <i>outerRadius</i>, and contains a
+        ///         concentric circular hole with a radius of <i>innerRadius</i>.  If
+        ///         <i>innerRadius</i> is 0, then no hole is generated.  The partial disk is
+        ///         subdivided around the z axis into slices (like pizza slices), and also about
+        ///         the z axis into rings (as specified by <i>slices</i> and <i>loops</i>,
+        ///         respectively).
+        ///     </para>
+        ///     <para>
+        ///         With respect to orientation, the +z side of the partial disk is considered
+        ///         to be outside (see <see cref="gluQuadricOrientation" />).  This means that if
+        ///         the orientation is set to <see cref="GLU_OUTSIDE" />, then any normals
+        ///         generated point along the +z axis.  Otherwise, they point along the -z axis.
+        ///     </para>
+        ///     <para>
+        ///         If texturing is turned on (with <see cref="gluQuadricTexture" />), texture
+        ///         coordinates are generated linearly such that where r = <i>outerRadius</i>,
+        ///         the value at (r, 0, 0) is (1.0, 0.5), at (0, r, 0) it is (0.5, 1.0), at
+        ///         (-r, 0, 0) it is (0.0, 0.5), and at (0, -r, 0) it is (0.5, 0.0).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluCylinder" />
+        /// <seealso cref="gluDisk" />
+        /// <seealso cref="gluNewQuadric" />
+        /// <seealso cref="gluQuadricOrientation" />
+        /// <seealso cref="gluQuadricTexture" />
+        /// <seealso cref="gluSphere" />
+        // void APIENTRY gluPartialDisk(GLUquadric *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops, GLdouble startAngle, GLdouble sweepAngle);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluPartialDisk([In] GLUquadric quad, double innerRadius, double outerRadius, int slices, int loops, double startAngle, double sweepAngle);
+        #endregion gluPartialDisk([In] GLUquadric quad, double innerRadius, double outerRadius, int slices, int loops, double startAngle, double sweepAngle)
+
+        #region gluPerspective(double fovY, double aspectRatio, double zNear, double zFar)
+        /// <summary>
+        ///     Sets up a perspective projection matrix.
+        /// </summary>
+        /// <param name="fovY">
+        ///     The field of view angle, in degrees, in the y-direction.
+        /// </param>
+        /// <param name="aspectRatio">
+        ///     The aspect ratio that determines the field of view in the x-direction.  The
+        ///     aspect ratio is the ratio of x (width) to y (height).
+        /// </param>
+        /// <param name="zNear">
+        ///     The distance from the viewer to the near clipping plane (always positive).
+        /// </param>
+        /// <param name="zFar">
+        ///     The distance from the viewer to the far clipping plane (always positive).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         The <b>gluPerspective</b> subroutine specifies a viewing frustum into the
+        ///         world coordinate system.  Generally, the aspect ratio used with this
+        ///         subroutine should match that of its associated viewport.  For example, an
+        ///         aspect ratio value of aspect = 2.0 means the viewer's angle of view is twice
+        ///         as wide in x as it is in y.  If the viewport is twice as wide as it is tall,
+        ///         it displays the image without distortion.
+        ///     </para>
+        ///     <para>
+        ///         The matrix generated by <b>gluPerspective</b> is multipled by the current
+        ///         matrix, just as if Gl.glMultMatrix* were called with the generated matrix.
+        ///         To load the perspective matrix onto the current matrix stack instead,
+        ///         precede the call to <b>gluPerspective</b> with a call to
+        ///         <see cref="Gl.glLoadIdentity" />.
+        ///     </para>
+        ///     <para>
+        ///         Given f defined as follows:
+        ///     </para>
+        ///     <para>
+        ///         <c>f = cotangent(fovY / 2)</c>
+        ///     </para>
+        ///     <para>
+        ///         The generated matrix is:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             (     f                                       )
+        ///             |  ------        0       0            0       |
+        ///             |  aspectRatio                                |
+        ///             |                                             |
+        ///             |                                             |
+        ///             |     0          f       0            0       |
+        ///             |                                             |
+        ///             |                                             |
+        ///             |                    zFar+zNear  2*zFar*zNear |
+        ///             |     0          0   ----------  ------------ |
+        ///             |                    zNear-zFar   zNear-zFar  |
+        ///             |                                             |
+        ///             |                                             |
+        ///             |     0          0      -1            0       |
+        ///             (                                             )
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Depth buffer precision is affected by the values specified for <i>zNear</i>
+        ///         and <i>zFar</i>.  The greater the ratio of <i>zFar</i> to <i>zNear</i> is,
+        ///         the less effective the depth buffer will be at distinguishing between
+        ///         surfaces that are near each other.  If <c>r = zFar / zNear</c> roughly
+        ///         <c>log2(r)</c> bits of depth buffer precision are lost.  Because r approaches
+        ///         infinity as <i>zNear</i> approaches 0, <i>zNear</i> must never be set to 0.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glFrustum" />
+        /// <seealso cref="Gl.glLoadIdentity" />
+        /// <seealso cref="gluOrtho2D" />
+        // void APIENTRY gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluPerspective(double fovY, double aspectRatio, double zNear, double zFar);
+        #endregion gluPerspective(double fovY, double aspectRatio, double zNear, double zFar)
+
+        #region gluPickMatrix(double x, double y, double width, double height, [In] int[] viewport)
+        /// <summary>
+        ///     Defines a picking region.
+        /// </summary>
+        /// <param name="x">
+        ///     The center of a picking region in x axis window coordinates.
+        /// </param>
+        /// <param name="y">
+        ///     The center of a picking region in y axis window coordinates.
+        /// </param>
+        /// <param name="width">
+        ///     The width of the picking region in window coordinates.
+        /// </param>
+        /// <param name="height">
+        ///     The height of the picking region in window coordinates.
+        /// </param>
+        /// <param name="viewport">
+        ///     The current viewport (as from a <see cref="Gl.glGetIntegerv(int, IntPtr)" /> call).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluPickMatrix</b> creates a projection matrix that can be used to restrict
+        ///         drawing to a small region of the viewport.  This is typically useful to
+        ///         determine what objects are being drawn near the cursor.  Use
+        ///         <b>gluPickMatrix</b> to restrict drawing to a small region around the cursor.
+        ///         Then, enter selection mode (with <see cref="Gl.glRenderMode" />) and rerender
+        ///         the scene.  All primitives that would have been drawn near the cursor are
+        ///         identified and stored in the selection buffer.
+        ///     </para>
+        ///     <para>
+        ///         The matrix created by <b>gluPickMatrix</b> is multiplied by the current
+        ///         matrix just as if Gl.glMultMatrix* is called with the generated matrix.
+        ///         To effectively use the generated pick matrix for picking, first call
+        ///         <see cref="Gl.glLoadIdentity" /> to load an identity matrix onto the
+        ///         perspective matrix stack.  Then call <b>gluPickMatrix</b>, and finally, call
+        ///         a command (such as <see cref="gluPerspective" />) to multiply the perspective
+        ///         matrix by the pick matrix.
+        ///     </para>
+        ///     <para>
+        ///         When using <b>gluPickMatrix</b> to pick NURBS, be careful to turn off the
+        ///         NURBS property <see cref="GLU_AUTO_LOAD_MATRIX" />.  If
+        ///         <see cref="GLU_AUTO_LOAD_MATRIX" /> is not turned off, then any NURBS
+        ///         surface rendered is subdivided differently with the pick matrix than the way
+        ///         it was subdivided without the pick matrix.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         When rendering a scene as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Gl.glMatrixMode(Gl.GL_PROJECTION);
+        ///             Gl.glLoadIdentity();
+        ///             Glu.gluPerspective(. . .);
+        ///             Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        ///             // Draw the scene
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         The following code selects a portion of the viewport:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Gl.glMatrixMode(Gl.GL_PROJECTION);
+        ///             Gl.glLoadIdentity();
+        ///             Glu.gluPickMatrix(x, y, width, height, viewport);
+        ///             Glu.gluPerspective(. . .);
+        ///             Gl.glMatrixMode(Gl.GL_MODELVIEW);
+        ///             // Draw the scene
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glLoadIdentity" />
+        /// <seealso cref="Gl.glRenderMode" />
+        /// <seealso cref="gluPerspective" />
+        // void APIENTRY gluPickMatrix(GLdouble x, GLdouble y, GLdouble width, GLdouble height, GLint viewport[4]);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluPickMatrix(double x, double y, double width, double height, [In] int[] viewport);
+        #endregion gluPickMatrix(double x, double y, double width, double height, [In] int[] viewport)
+
+        #region int gluProject(double objX, double objY, double objZ, [In] double[] modelMatrix, [In] double[] projectionMatrix, [In] int[] viewport, out double winX, out double winY, out double winZ)
+        /// <summary>
+        ///     Maps object coordinates to window coordinates.
+        /// </summary>
+        /// <param name="objX">
+        ///     The object's x axis coordinate.
+        /// </param>
+        /// <param name="objY">
+        ///     The object's y axis coordinate.
+        /// </param>
+        /// <param name="objZ">
+        ///     The object's z axis coordinate.
+        /// </param>
+        /// <param name="modelMatrix">
+        ///     The current modelview matrix (as from a <see cref="Gl.glGetDoublev(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="projectionMatrix">
+        ///     The current projection matrix (as from a <see cref="Gl.glGetDoublev(int, IntPtr)" />
+        ///     call).
+        /// </param>
+        /// <param name="viewport">
+        ///     The current viewport (as from a <see cref="Gl.glGetIntegerv(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="winX">
+        ///     The computed window's x axis coordinate.
+        /// </param>
+        /// <param name="winY">
+        ///     The computed window's y axis coordinate.
+        /// </param>
+        /// <param name="winZ">
+        ///     The computed window's z axis coordinate.
+        /// </param>
+        /// <returns>
+        ///     Returns <see cref="Gl.GL_TRUE" /> indicates success, a return value of
+        ///     <see cref="Gl.GL_FALSE" /> indicates failure.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluProject</b> transforms the specified object coordinates into window
+        ///         coordinates using <i>modelMatrix</i>, <i>projectionMatrix</i>, and
+        ///         <i>viewport</i>.  The result is stored in <i>winX</i>, <i>winY</i>, and
+        ///         <i>winZ</i>.  A return value of <see cref="Gl.GL_TRUE" /> indicates success,
+        ///         a return value of <see cref="Gl.GL_FALSE" /> indicates failure.
+        ///     </para>
+        ///     <para>
+        ///         To compute the coordinates, let <c>v = (objX, objY, objZ, 1.0)</c>
+        ///         represented as a matrix with 4 rows and 1 column.  Then <b>gluProject</b>
+        ///         computes v' as follows:
+        ///     </para>
+        ///     <para>
+        ///         <c>v' = P x M x v</c>
+        ///     </para>
+        ///     <para>
+        ///         Where P is the current projection matrix <i>projectionMatrix</i>, M is the
+        ///         current modelview matrix <i>modelMatrix</i> (both represented as 4x4 matrices
+        ///         in column-major order) and 'x' represents matrix multiplication.
+        ///     </para>
+        ///     <para>
+        ///         The window coordinates are then computed as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             winX = view(0) + view(2) * (v'(0) + 1) / 2
+        ///             winY = view(1) + view(3) * (v'(1) + 1) / 2
+        ///             winZ = (v'(2) + 1) / 2
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glGetDoublev(int, IntPtr)" />
+        /// <seealso cref="Gl.glGetIntegerv(int, IntPtr)" />
+        /// <seealso cref="gluUnProject" />
+        // int APIENTRY gluProject(GLdouble objx, GLdouble objy, GLdouble objz, const GLdouble modelMatrix[16], const GLdouble projMatrix[16], const GLint viewport[4], GLdouble *winx, GLdouble *winy, GLdouble *winz);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluProject(double objX, double objY, double objZ, [In] double[] modelMatrix, [In] double[] projectionMatrix, [In] int[] viewport, out double winX, out double winY, out double winZ);
+        #endregion int gluProject(double objX, double objY, double objZ, [In] double[] modelMatrix, [In] double[] projectionMatrix, [In] int[] viewport, out double winX, out double winY, out double winZ)
+
+        #region gluPwlCurve([In] GLUnurbs nurb, int count, [In] float[] data, int stride, int type)
+        /// <summary>
+        ///     Describes a piecewise linear NURBS trimming curve.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="count">
+        ///     The number of points on the curve.
+        /// </param>
+        /// <param name="data">
+        ///     An array containing the curve points.
+        /// </param>
+        /// <param name="stride">
+        ///     The offset (a number of single precision�floating-point values) between
+        ///     points on the curve.
+        /// </param>
+        /// <param name="type">
+        ///     The type of curve.  Must be either <see cref="GLU_MAP1_TRIM_2" /> or
+        ///     <see cref="GLU_MAP1_TRIM_3" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluPwlCurve</b> describes a piecewise linear trimming curve for a NURBS
+        ///         surface.  A piecewise linear curve consists of a list of coordinates of
+        ///         points in the parameter space for the NURBS surface to be trimmed.  These
+        ///         points are connected with line segments to form a curve.  If the curve is an
+        ///         approximation to a curve that is not piecewise linear, the points should be
+        ///         close enough in parameter space that the resulting path appears curved at the
+        ///         resolution used in the application.
+        ///     </para>
+        ///     <para>
+        ///         If type is <see cref="GLU_MAP1_TRIM_2" />, then it describes a curve in
+        ///         two-dimensional (u and v) parameter space.  If it is
+        ///         <see cref="GLU_MAP1_TRIM_3" />, then it describes a curve in two-dimensional
+        ///         homogeneous (u, v, and w) parameter space.  See the
+        ///         <see cref="gluBeginTrim" /> reference page for more information about
+        ///         trimming curves.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         To describe a trim curve that closely follows the contours of a NURBS
+        ///         surface, call <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginCurve" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        // void APIENTRY gluPwlCurve(GLUnurbs *nobj, GLint count, GLfloat *array, GLint stride, GLenum type);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluPwlCurve([In] GLUnurbs nurb, int count, [In] float[] data, int stride, int type);
+        #endregion gluPwlCurve([In] GLUnurbs nurb, int count, [In] float[] data, int stride, int type)
+
+        #region gluPwlCurve([In] GLUnurbs nurb, int count, [In] float[ , ] data, int stride, int type)
+        /// <summary>
+        ///     Describes a piecewise linear NURBS trimming curve.
+        /// </summary>
+        /// <param name="nurb">
+        ///     The NURBS object (created with <see cref="gluNewNurbsRenderer" />).
+        /// </param>
+        /// <param name="count">
+        ///     The number of points on the curve.
+        /// </param>
+        /// <param name="data">
+        ///     An array containing the curve points.
+        /// </param>
+        /// <param name="stride">
+        ///     The offset (a number of single precision�floating-point values) between
+        ///     points on the curve.
+        /// </param>
+        /// <param name="type">
+        ///     The type of curve.  Must be either <see cref="GLU_MAP1_TRIM_2" /> or
+        ///     <see cref="GLU_MAP1_TRIM_3" />.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluPwlCurve</b> describes a piecewise linear trimming curve for a NURBS
+        ///         surface.  A piecewise linear curve consists of a list of coordinates of
+        ///         points in the parameter space for the NURBS surface to be trimmed.  These
+        ///         points are connected with line segments to form a curve.  If the curve is an
+        ///         approximation to a curve that is not piecewise linear, the points should be
+        ///         close enough in parameter space that the resulting path appears curved at the
+        ///         resolution used in the application.
+        ///     </para>
+        ///     <para>
+        ///         If type is <see cref="GLU_MAP1_TRIM_2" />, then it describes a curve in
+        ///         two-dimensional (u and v) parameter space.  If it is
+        ///         <see cref="GLU_MAP1_TRIM_3" />, then it describes a curve in two-dimensional
+        ///         homogeneous (u, v, and w) parameter space.  See the
+        ///         <see cref="gluBeginTrim" /> reference page for more information about
+        ///         trimming curves.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         To describe a trim curve that closely follows the contours of a NURBS
+        ///         surface, call <see cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluBeginCurve" />
+        /// <seealso cref="gluBeginTrim" />
+        /// <seealso cref="gluNewNurbsRenderer" />
+        /// <seealso cref="gluNurbsCurve(Tao.OpenGl.Glu.GLUnurbs, int, float[], int, float[], int, int)" />
+        // void APIENTRY gluPwlCurve(GLUnurbs *nobj, GLint count, GLfloat *array, GLint stride, GLenum type);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluPwlCurve([In] GLUnurbs nurb, int count, [In] float[ , ] data, int stride, int type);
+        #endregion gluPwlCurve([In] GLUnurbs nurb, int count, [In] float[ , ] data, int stride, int type)
+
+        #region gluQuadricCallback([In] GLUquadric quad, int which, [In] QuadricErrorCallback func)
+        /// <summary>
+        ///     Defines a callback for a quadric object.
+        /// </summary>
+        /// <param name="quad">
+        ///     The quadric object (created with <see cref="gluNewQuadric" />).
+        /// </param>
+        /// <param name="which">
+        ///     The callback being defined.  The only valid value is
+        ///     <see cref="GLU_ERROR" />.
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluQuadricCallback</b> is used to define a new callback to be used by a
+        ///         quadrics object.  If the specified callback is already defined, then it is
+        ///         replaced.  If <i>func</i> is <c>null</c>, then any existing callback is
+        ///         erased.
+        ///     </para>
+        ///     <para>
+        ///         The one legal callback is <see cref="GLU_ERROR" />:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_ERROR" /></term>
+        ///                 <description>
+        ///                     The function is called when an error is encountered.  Its single
+        ///                     argument is of type <see cref="int" />, and it indicates the
+        ///                     specific error that occurred.  Character strings describing these
+        ///                     errors can be retrieved with the <see cref="gluErrorString" />
+        ///                     call.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="QuadricErrorCallback" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewQuadric" />
+        // void APIENTRY gluQuadricCallback(GLUquadric *qobj, GLenum which, void (CALLBACK* fn)());
+        public static void gluQuadricCallback([In] GLUquadric quad, int which, [In] QuadricErrorCallback func) {
+            quadricErrorCallback = func;
+            __gluQuadricCallback(quad, which, quadricErrorCallback);
+
+        }
+        #endregion gluQuadricCallback([In] GLUquadric quad, int which, [In] QuadricErrorCallback func)
+
+        #region gluQuadricDrawStyle([In] GLUquadric quad, int drawStyle)
+        /// <summary>
+        ///     Specifies the draw style desired for quadrics.
+        /// </summary>
+        /// <param name="quad">
+        ///     The quadric object (created with <see cref="gluNewQuadric" />).
+        /// </param>
+        /// <param name="drawStyle">
+        ///     <para>
+        ///         The desired draw style.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_FILL" /></term>
+        ///                 <description>
+        ///                     Quadrics are rendered with polygon primitives.  The polygons are
+        ///                     drawn in a counterclockwise fashion with respect to their normals
+        ///                     (as defined with <see cref="gluQuadricOrientation" />).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_LINE" /></term>
+        ///                 <description>
+        ///                     Quadrics are rendered as a set of lines.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_SILHOUETTE" /></term>
+        ///                 <description>
+        ///                     Quadrics are rendered as a set of lines, except that edges
+        ///                     separating coplanar faces will not be drawn.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_POINT" /></term>
+        ///                 <description>
+        ///                     Quadrics are rendered as a set of points.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <b>gluQuadricDrawStyle</b> specifies the draw style for quadrics rendered
+        ///     with <i>quad</i>.
+        /// </remarks>
+        /// <seealso cref="gluNewQuadric" />
+        /// <seealso cref="gluQuadricNormals" />
+        /// <seealso cref="gluQuadricOrientation" />
+        /// <seealso cref="gluQuadricTexture" />
+        // void APIENTRY gluQuadricDrawStyle(GLUquadric *quadObject, GLenum drawStyle);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluQuadricDrawStyle([In] GLUquadric quad, int drawStyle);
+        #endregion gluQuadricDrawStyle([In] GLUquadric quad, int drawStyle)
+
+        #region gluQuadricNormals([In] GLUquadric quad, int normal)
+        /// <summary>
+        ///     Specifies what kind of normals are to be used for quadrics.
+        /// </summary>
+        /// <param name="quad">
+        ///     The quadric object (created with <see cref="gluNewQuadric" />).
+        /// </param>
+        /// <param name="normal">
+        ///     <para>
+        ///         The desired type of normals.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_NONE" /></term>
+        ///                 <description>
+        ///                     No normals are generated.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_FLAT" /></term>
+        ///                 <description>
+        ///                     One normal is generated for every facet of a quadric.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_SMOOTH" /></term>
+        ///                 <description>
+        ///                     One normal is generated for every vertex of a quadric.  This is
+        ///                     the default value.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <b>gluQuadricNormals</b> specifies what kind of normals are desired for
+        ///     quadrics rendered with <i>quad</i>.
+        /// </remarks>
+        /// <seealso cref="gluNewQuadric" />
+        /// <seealso cref="gluQuadricDrawStyle" />
+        /// <seealso cref="gluQuadricOrientation" />
+        /// <seealso cref="gluQuadricTexture" />
+        // void APIENTRY gluQuadricNormals(GLUquadric *quadObject, GLenum normals);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluQuadricNormals([In] GLUquadric quad, int normal);
+        #endregion gluQuadricNormals([In] GLUquadric quad, int normal)
+
+        #region gluQuadricOrientation([In] GLUquadric quad, int orientation)
+        /// <summary>
+        ///     Specifies inside or outside orientation for quadrics.
+        /// </summary>
+        /// <param name="quad">
+        ///     The quadric object (created with <see cref="gluNewQuadric" />).
+        /// </param>
+        /// <param name="orientation">
+        ///     <para>
+        ///         The desired orientation.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_OUTSIDE" /></term>
+        ///                 <description>
+        ///                     Draw quadrics with normals pointing outward.  This is the default
+        ///                     value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_INSIDE" /></term>
+        ///                 <description>
+        ///                     Draw quadrics with normals pointing inward.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluQuadricOrientation</b> specifies what kind of orientation is desired
+        ///         for quadrics rendered with <i>quad</i>.
+        ///     </para>
+        ///     <para>
+        ///         The interpretation of outward and inward depends on the quadric being drawn.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewQuadric" />
+        /// <seealso cref="gluQuadricDrawStyle" />
+        /// <seealso cref="gluQuadricNormals" />
+        /// <seealso cref="gluQuadricTexture" />
+        // void APIENTRY gluQuadricOrientation(GLUquadric *quadObject, GLenum orientation);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluQuadricOrientation([In] GLUquadric quad, int orientation);
+        #endregion gluQuadricOrientation([In] GLUquadric quad, int orientation)
+
+        #region gluQuadricTexture([In] GLUquadric quad, int texture)
+        /// <summary>
+        ///     Specifies whether quadrics are to be textured.
+        /// </summary>
+        /// <param name="quad">
+        ///     The quadric object (created with <see cref="gluNewQuadric" />).
+        /// </param>
+        /// <param name="texture">
+        ///     <para>
+        ///         A flag indicating whether texture coordinates are to be generated.  The
+        ///         following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="Gl.GL_TRUE" /></term>
+        ///                 <description>
+        ///                     Generate texture coordinates.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gl.GL_FALSE" /></term>
+        ///                 <description>
+        ///                     Do not generate texture coordinates.  This is the default value.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluQuadricTexture</b> specifies if texture coordinates should be generated
+        ///         for quadrics rendered with <i>quad</i>.
+        ///     </para>
+        ///     <para>
+        ///         The manner in which texture coordinates are generated depends upon the
+        ///         specific quadric rendered.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewQuadric" />
+        /// <seealso cref="gluQuadricDrawStyle" />
+        /// <seealso cref="gluQuadricNormals" />
+        /// <seealso cref="gluQuadricOrientation" />
+        // void APIENTRY gluQuadricTexture(GLUquadric *quadObject, GLboolean textureCoords);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluQuadricTexture([In] GLUquadric quad, int texture);
+        #endregion gluQuadricTexture([In] GLUquadric quad, int texture)
+
+        #region int gluScaleImage(int format, int widthIn, int heightIn, int typeIn, [In] IntPtr dataIn, int widthOut, int heightOut, int typeOut, [Out] IntPtr dataOut)
+        /// <summary>
+        ///     Scales an image to an arbitrary size.
+        /// </summary>
+        /// <param name="format">
+        ///     The format of the pixel data.  The following symbolic values are valid:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_STENCIL_INDEX" />,
+        ///     <see cref="Gl.GL_DEPTH_COMPONENT" />, <see cref="Gl.GL_RED" />,
+        ///     <see cref="Gl.GL_GREEN" />, <see cref="Gl.GL_BLUE" />,
+        ///     <see cref="Gl.GL_ALPHA" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_BGR_EXT" />,
+        ///     <see cref="Gl.GL_BGRA_EXT" />, <see cref="Gl.GL_LUMINANCE" />, and
+        ///     <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="widthIn">
+        ///     The width of the source image that is scaled.
+        /// </param>
+        /// <param name="heightIn">
+        ///     The height of the source image that is scaled.
+        /// </param>
+        /// <param name="typeIn">
+        ///     The data type for <i>dataIn</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="dataIn">
+        ///     A pointer to the source image.
+        /// </param>
+        /// <param name="widthOut">
+        ///     The width of the destination image.
+        /// </param>
+        /// <param name="heightOut">
+        ///     The height of the destination image.
+        /// </param>
+        /// <param name="typeOut">
+        ///     The data type for <i>dataOut</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="dataOut">
+        ///     A pointer to the destination image.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluScaleImage</b> scales a pixel image using the appropriate pixel store
+        ///         modes to unpack data from the source image and pack data into the
+        ///         destination image.
+        ///     </para>
+        ///     <para>
+        ///         When shrinking an image, <b>gluScaleImage</b> uses a box filter to sample the
+        ///         source image and create pixels for the destination image.  When magnifying an
+        ///         image, the pixels from the source image are linearly interpolated to create
+        ///         the destination image.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glReadPixels(int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>format</i>, <i>typeIn</i>, and
+        ///         <i>typeOut</i> parameters.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>widthIn</i>,
+        ///         <i>heightIn</i>, <i>widthOut</i>, or <i>heightOut</i> is negative.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i>, <i>typeIn</i>,
+        ///         or <i>typeOut</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glReadPixels(int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // int APIENTRY gluScaleImage(GLenum format, GLint widthin, GLint heightin, GLenum typein, const void *datain, GLint widthout, GLint heightout, GLenum typeout, void *dataout);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluScaleImage(int format, int widthIn, int heightIn, int typeIn, [In] IntPtr dataIn, int widthOut, int heightOut, int typeOut, [Out] IntPtr dataOut);
+        #endregion int gluScaleImage(int format, int widthIn, int heightIn, int typeIn, [In] IntPtr dataIn, int widthOut, int heightOut, int typeOut, [Out] IntPtr dataOut)
+
+        #region int gluScaleImage(int format, int widthIn, int heightIn, int typeIn, [In] byte[] dataIn, int widthOut, int heightOut, int typeOut, [Out] byte[] dataOut)
+        /// <summary>
+        ///     Scales an image to an arbitrary size.
+        /// </summary>
+        /// <param name="format">
+        ///     The format of the pixel data.  The following symbolic values are valid:
+        ///     <see cref="Gl.GL_COLOR_INDEX" />, <see cref="Gl.GL_STENCIL_INDEX" />,
+        ///     <see cref="Gl.GL_DEPTH_COMPONENT" />, <see cref="Gl.GL_RED" />,
+        ///     <see cref="Gl.GL_GREEN" />, <see cref="Gl.GL_BLUE" />,
+        ///     <see cref="Gl.GL_ALPHA" />, <see cref="Gl.GL_RGB" />,
+        ///     <see cref="Gl.GL_RGBA" />, <see cref="Gl.GL_BGR_EXT" />,
+        ///     <see cref="Gl.GL_BGRA_EXT" />, <see cref="Gl.GL_LUMINANCE" />, and
+        ///     <see cref="Gl.GL_LUMINANCE_ALPHA" />.
+        /// </param>
+        /// <param name="widthIn">
+        ///     The width of the source image that is scaled.
+        /// </param>
+        /// <param name="heightIn">
+        ///     The height of the source image that is scaled.
+        /// </param>
+        /// <param name="typeIn">
+        ///     The data type for <i>dataIn</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="dataIn">
+        ///     A pointer to the source image.
+        /// </param>
+        /// <param name="widthOut">
+        ///     The width of the destination image.
+        /// </param>
+        /// <param name="heightOut">
+        ///     The height of the destination image.
+        /// </param>
+        /// <param name="typeOut">
+        ///     The data type for <i>dataOut</i>.  Must be one of
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE" />, <see cref="Gl.GL_BYTE" />,
+        ///     <see cref="Gl.GL_BITMAP" />, <see cref="Gl.GL_UNSIGNED_SHORT" />,
+        ///     <see cref="Gl.GL_SHORT" />, <see cref="Gl.GL_UNSIGNED_INT" />,
+        ///     <see cref="Gl.GL_INT" />, <see cref="Gl.GL_FLOAT" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///     <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///     <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///     <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, or
+        ///     <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" />.
+        /// </param>
+        /// <param name="dataOut">
+        ///     A pointer to the destination image.
+        /// </param>
+        /// <returns>
+        ///     A return value of zero indicates success, otherwise a GLU error code is
+        ///     returned (see <see cref="gluErrorString" />).
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluScaleImage</b> scales a pixel image using the appropriate pixel store
+        ///         modes to unpack data from the source image and pack data into the
+        ///         destination image.
+        ///     </para>
+        ///     <para>
+        ///         When shrinking an image, <b>gluScaleImage</b> uses a box filter to sample the
+        ///         source image and create pixels for the destination image.  When magnifying an
+        ///         image, the pixels from the source image are linearly interpolated to create
+        ///         the destination image.
+        ///     </para>
+        ///     <para>
+        ///         A return value of zero indicates success, otherwise a GLU error code is
+        ///         returned (see <see cref="gluErrorString" />).
+        ///     </para>
+        ///     <para>
+        ///         See the <see cref="Gl.glReadPixels(int, int, int, int, int, int, object)" /> reference page for a description of
+        ///         the acceptable values for the <i>format</i>, <i>typeIn</i>, and
+        ///         <i>typeOut</i> parameters.
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         Formats <see cref="Gl.GL_BGR" />, and <see cref="Gl.GL_BGRA" />, and types
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" />,
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" />,
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" />,
+        ///         <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" />, and
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> are only available if the GL
+        ///         version is 1.2 or greater.
+        ///     </para>
+        ///     <para>
+        ///         <b>ERRORS</b>
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_VALUE" /> is returned if <i>widthIn</i>,
+        ///         <i>heightIn</i>, <i>widthOut</i>, or <i>heightOut</i> is negative.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_ENUM" /> is returned if <i>format</i>, <i>typeIn</i>,
+        ///         or <i>typeOut</i> is not legal.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_BYTE_3_3_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_BYTE_2_3_3_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_5_6_5_REV" /> and <i>format</i> is not
+        ///         <see cref="Gl.GL_RGB" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_4_4_4_4_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_SHORT_5_5_5_1" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_SHORT_1_5_5_5_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_8_8_8_8_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="GLU_INVALID_OPERATION" /> is returned if <i>typeIn</i> or
+        ///         <i>typeOut</i> is <see cref="Gl.GL_UNSIGNED_INT_10_10_10_2" /> or
+        ///         <see cref="Gl.GL_UNSIGNED_INT_2_10_10_10_REV" /> and <i>format</i> is neither
+        ///         <see cref="Gl.GL_RGBA" /> nor <see cref="Gl.GL_BGRA" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glDrawPixels(int, int, int, int, object)" />
+        /// <seealso cref="Gl.glReadPixels(int, int, int, int, int, int, object)" />
+        /// <seealso cref="gluBuild1DMipmaps(int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild2DMipmaps(int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluBuild3DMipmaps(int, int, int, int, int, int, int, byte[])" />
+        /// <seealso cref="gluErrorString" />
+        // int APIENTRY gluScaleImage(GLenum format, GLint widthin, GLint heightin, GLenum typein, const void *datain, GLint widthout, GLint heightout, GLenum typeout, void *dataout);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluScaleImage(int format, int widthIn, int heightIn, int typeIn, [In] byte[] dataIn, int widthOut, int heightOut, int typeOut, [Out] byte[] dataOut);
+        #endregion int gluScaleImage(int format, int widthIn, int heightIn, int typeIn, [In] byte[] dataIn, int widthOut, int heightOut, int typeOut, [Out] byte[] dataOut)
+
+        #region gluSphere([In] GLUquadric quad, double radius, int slices, int stacks)
+        /// <summary>
+        ///     Draws a sphere.
+        /// </summary>
+        /// <param name="quad">
+        ///     The quadric object (created with <see cref="gluNewQuadric" />).
+        /// </param>
+        /// <param name="radius">
+        ///     The radius of the sphere.
+        /// </param>
+        /// <param name="slices">
+        ///     The number of subdivisions around the z-axis (similar to lines of longitude.
+        /// </param>
+        /// <param name="stacks">
+        ///     The number of subdivisions along the z-axis (similar to lines of latitude).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluSphere</b> draws a sphere of the given radius centered around the
+        ///         origin.  The sphere is subdivided around the z axis into slices and along the
+        ///         z axis into stacks (similar to lines of longitude and latitude).
+        ///     </para>
+        ///     <para>
+        ///         If the orientation is set to <see cref="GLU_OUTSIDE" /> (with
+        ///         <see cref="gluQuadricOrientation" />), then any normals generated point away
+        ///         from the center of the sphere.  Otherwise, they point toward the center of
+        ///         the sphere.
+        ///     </para>
+        ///     <para>
+        ///         If texturing is turned on (with <see cref="gluQuadricTexture" />), then
+        ///         texture coordinates are generated so that t ranges from 0.0 at z = -radius
+        ///         to 1.0 at z = radius (t increases linearly along longitudinal lines), and
+        ///         s ranges from 0.0 at the +y axis, to 0.25 at the +x axis, to 0.5 at the -y
+        ///         axis, to 0.75 at the -x axis, and back to 1.0 at the +y axis.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluCylinder" />
+        /// <seealso cref="gluDisk" />
+        /// <seealso cref="gluNewQuadric" />
+        /// <seealso cref="gluPartialDisk" />
+        /// <seealso cref="gluQuadricOrientation" />
+        /// <seealso cref="gluQuadricTexture" />
+        // void APIENTRY gluSphere(GLUquadric *qobj, GLdouble radius, GLint slices, GLint stacks);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluSphere([In] GLUquadric quad, double radius, int slices, int stacks);
+        #endregion gluSphere([In] GLUquadric quad, double radius, int slices, int stacks)
+
+        #region gluTessBeginContour([In] GLUtesselator tess)
+        /// <summary>
+        ///     Delimits a contour description.
+        /// </summary>
+        /// <param name="tess">
+        ///         The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <remarks>
+        ///     <b>gluTessBeginContour</b> and <see cref="gluTessEndContour" /> delimit the
+        ///     definition of a polygon contour.  Within each
+        ///     <b>gluTessBeginContour</b>/<see cref="gluTessEndContour" /> pair, there can
+        ///     be zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.  The vertices specify
+        ///     a closed contour (the last vertex of each contour is automatically linked to
+        ///     the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" /> reference page for more
+        ///     details.  <b>gluTessBeginContour</b> can only be called between
+        ///     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> and <see cref="gluTessEndPolygon" />.
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndContour" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginContour(GLUtesselator *tess);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginContour([In] GLUtesselator tess);
+        #endregion gluTessBeginContour([In] GLUtesselator tess)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] byte[] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] byte[] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] byte[] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] byte[ , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] byte[ , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] byte[ , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] byte[ , , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] byte[ , , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] byte[ , , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] double[] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] double[] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] double[] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] double[ , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] double[ , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] double[ , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] double[ , , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] double[ , , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] double[ , , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] short[] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] short[] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] short[] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] short[ , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] short[ , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] short[ , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] short[ , , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] short[ , , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] short[ , , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] int[] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] int[] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] int[] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] int[ , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] int[ , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] int[ , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] int[ , , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] int[ , , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] int[ , , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] float[] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] float[] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] float[] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] float[ , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] float[ , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] float[ , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] float[ , , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] float[ , , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] float[ , , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] ushort[] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] ushort[] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] ushort[] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] ushort[ , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] ushort[ , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] ushort[ , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] ushort[ , , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] ushort[ , , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] ushort[ , , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] uint[] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] uint[] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] uint[] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] uint[ , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] uint[ , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] uint[ , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] uint[ , , ] data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] uint[ , , ] data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] uint[ , , ] data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] IntPtr data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] IntPtr data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] IntPtr data)
+
+        #region gluTessBeginPolygon([In] GLUtesselator tess, [In] void *data)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="data">
+        ///     A pointer to a programmer defined�polygon data structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessBeginPolygon</b> and <see cref="gluTessEndPolygon" /> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <b>gluTessBeginPolygon</b>/<see cref="gluTessEndPolygon" /> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> is a pointer to a user-defined data structure.  If the
+        ///         appropriate callback(s) are specified (see <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />),
+        ///         then this pointer is returned to the callback function(s).  Thus, it is a
+        ///         convenient way to store per-polygon information.
+        ///     </para>
+        ///     <para>
+        ///         Once <see cref="gluTessEndPolygon" /> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessBeginPolygon(GLUtesselator *tess, void *polygon_data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void gluTessBeginPolygon([In] GLUtesselator tess, [In] void *data);
+        #endregion gluTessBeginPolygon([In] GLUtesselator tess, [In] void *data)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginCallback func) {
+            tessBeginCallback = func;
+            __gluTessCallback(tess, which, tessBeginCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginDataCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginDataCallback func) {
+            tessBeginDataCallback = func;
+            __gluTessCallback(tess, which, tessBeginDataCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessBeginDataCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback func) {
+            tessCombineCallback = func;
+            __gluTessCallback(tess, which, tessCombineCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback1 func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback1 func) {
+            tessCombineCallback1 = func;
+            __gluTessCallback(tess, which, tessCombineCallback1);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineCallback1 func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineDataCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineDataCallback func) {
+            tessCombineDataCallback = func;
+            __gluTessCallback(tess, which, tessCombineDataCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessCombineDataCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagCallback func) {
+            tessEdgeFlagCallback = func;
+            __gluTessCallback(tess, which, tessEdgeFlagCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagDataCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagDataCallback func) {
+            tessEdgeFlagDataCallback = func;
+            __gluTessCallback(tess, which, tessEdgeFlagDataCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessEdgeFlagDataCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndCallback func) {
+            tessEndCallback = func;
+            __gluTessCallback(tess, which, tessEndCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndDataCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndDataCallback func) {
+            tessEndDataCallback = func;
+            __gluTessCallback(tess, which, tessEndDataCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessEndDataCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorCallback func) {
+            tessErrorCallback = func;
+            __gluTessCallback(tess, which, tessErrorCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorDataCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorDataCallback func) {
+            tessErrorDataCallback = func;
+            __gluTessCallback(tess, which, tessErrorDataCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessErrorDataCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback func) {
+            tessVertexCallback = func;
+            __gluTessCallback(tess, which, tessVertexCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback1 func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback1 func) {
+            tessVertexCallback1 = func;
+            __gluTessCallback(tess, which, tessVertexCallback1);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexCallback1 func)
+
+        #region gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexDataCallback func)
+        /// <summary>
+        ///     Defines a callback for a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The callback being defined.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN" /></term>
+        ///                 <description>
+        ///                     The begin callback is invoked like <see cref="Gl.glBegin" /> to
+        ///                     indicate the start of a (triangle) primitive.  The function takes
+        ///                     a single argument of type <see cref="int" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_FALSE" />, then the argument is set to either
+        ///                     <see cref="Gl.GL_TRIANGLE_FAN" />,
+        ///                     <see cref="Gl.GL_TRIANGLE_STRIP" />, or
+        ///                     <see cref="Gl.GL_TRIANGLES" />.  If the
+        ///                     <see cref="GLU_TESS_BOUNDARY_ONLY" /> property is set to
+        ///                     <see cref="Gl.GL_TRUE" />, then the argument will be set to
+        ///                     <see cref="Gl.GL_LINE_LOOP" />.  The delegate prototype for this
+        ///                     callback is <see cref="TessBeginCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BEGIN_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_BEGIN" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessBeginDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The combine callback is called to create a new vertex when
+        ///                         the tessellation detects an intersection, or wishes to merge
+        ///                         features.  The function takes four arguments: an array of
+        ///                         three elements each of type <see cref="double" />, an
+        ///                         array of four pointers, an array of four elements each of
+        ///                         type <see cref="float" />, and a pointer to a pointer.  The
+        ///                         delegate prototype for this callback is
+        ///                         <see cref="TessCombineCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The vertex is defined as a linear combination of up to four
+        ///                         existing vertices, stored in <i>vertexData</i>.  The
+        ///                         coefficients of the linear combination are given by
+        ///                         <i>weight</i>; these weights always add up to 1.  All
+        ///                         vertex pointers are valid even when some of the weights are
+        ///                         0.  <i>coordinates</i> gives the location of the new vertex.
+        ///                     </para>
+        ///                     <para>
+        ///                         The user must allocate another vertex, interpolate parameters
+        ///                         using <i>vertexData</i> and <i>weight</i>, and return the new
+        ///                         vertex pointer in <i>outData</i>.  This handle is supplied
+        ///                         during rendering callbacks.  The user is responsible for
+        ///                         freeing the memory some time after
+        ///                         <see cref="gluTessEndPolygon" /> is called.
+        ///                     </para>
+        ///                     <para>
+        ///                         For example, if the polygon lies in an arbitrary plane in
+        ///                         3-space, and a color is associated with each vertex, the
+        ///                         <b>GLU_TESS_COMBINE</b> callback might look like this:
+        ///                     </para>
+        ///                     <para>
+        ///                         <code>
+        ///                             void myCombine(GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut) { 
+        ///                                 VERTEX *newVertex = new_vertex(); 
+        ///                                 newVertex->x = coords[0]; 
+        ///                                 newVertex->y = coords[1]; 
+        ///                                 newVertex->z = coords[2]; 
+        ///                                 newVertex->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + 
+        ///                                 w[3]*d[3]->r; 
+        ///                                 newVertex->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + 
+        ///                                 w[3]*d[3]->g; 
+        ///                                 newVertex->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + 
+        ///                                 w[3]*d[3]->b; 
+        ///                                 newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + 
+        ///                                 w[3]*d[3]->a; 
+        ///                                 *dataOut = newVertex; 
+        ///                             } 
+        ///                         </code>
+        ///                     </para>
+        ///                     <para>
+        ///                         If the tessellation detects an intersection, then the
+        ///                         <b>GLU_TESS_COMBINE</b> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback (see below)
+        ///                         must be defined, and it must write a non-NULL pointer into
+        ///                         <i>outData</i>.  Otherwise the
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error occurs,
+        ///                         and no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_COMBINE_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_COMBINE" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessCombineDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The edge flag callback is similar to
+        ///                         <see cref="Gl.glEdgeFlag" />.  The function takes a single
+        ///                         boolean flag that indicates which edges lie on the polygon
+        ///                         boundary.  If the flag is <see cref="Gl.GL_TRUE" />, then
+        ///                         each vertex that follows begins an edge that lies on the
+        ///                         polygon boundary, that is, an edge that separates an interior
+        ///                         region from an exterior one.  If the flag is
+        ///                         <see cref="Gl.GL_FALSE" />, then each vertex that follows
+        ///                         begins an edge that lies in the polygon interior.  The edge
+        ///                         flag callback (if defined) is invoked before the first
+        ///                         vertex callback.
+        ///                     </para>
+        ///                     <para>
+        ///                         Since triangle fans and triangle strips do not support edge
+        ///                         flags, the begin callback is not called with
+        ///                         <see cref="Gl.GL_TRIANGLE_FAN" /> or
+        ///                         <see cref="Gl.GL_TRIANGLE_STRIP" /> if a non-NULL edge flag
+        ///                         callback is provided.  (If the callback is initialized to
+        ///                         <c>null</c>, there is no impact on performance).  Instead,
+        ///                         the fans and strips are converted to independent triangles.
+        ///                         The delegate prototype for this callback is
+        ///                         <see cref="TessEdgeFlagCallback" />.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_EDGE_FLAG_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_EDGE_FLAG" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEdgeFlagDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END" /></term>
+        ///                 <description>
+        ///                     The end callback serves the same purpose as
+        ///                     <see cref="Gl.glEnd" />.  It indicates the end of a primitive and
+        ///                     it takes no arguments.  The delegate prototype for this callback
+        ///                     is <see cref="TessEndCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_END_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_END" /> callback except that
+        ///                     it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessEndDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The error callback is called when an error is encountered.
+        ///                         The one argument is of type <see cref="int" />; it
+        ///                         indicates the specific error that occurred and will be set to
+        ///                         one of <see cref="GLU_TESS_MISSING_BEGIN_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_POLYGON" />,
+        ///                         <see cref="GLU_TESS_MISSING_BEGIN_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_MISSING_END_CONTOUR" />,
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" />,
+        ///                         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> or
+        ///                         <see cref="GLU_OUT_OF_MEMORY" />.  Character strings
+        ///                         describing these errors can be retrieved with the
+        ///                         <see cref="gluErrorString" /> call.  The delegate prototype
+        ///                         for this callback is <see cref="TessErrorCallback" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         The GLU library will recover from the first four errors by
+        ///                         inserting the missing call(s).
+        ///                         <see cref="GLU_TESS_COORD_TOO_LARGE" /> indicates that some
+        ///                         vertex coordinate exceeded the predefined constant
+        ///                         <see cref="GLU_TESS_MAX_COORD" /> in absolute value, and that
+        ///                         the value has been clamped.  (Coordinate values must be small
+        ///                         enough so that two can be multiplied together without
+        ///                         overflow.)  <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" />
+        ///                         indicates that the tessellation detected an intersection
+        ///                         between two edges in the input data, and the
+        ///                         <see cref="GLU_TESS_COMBINE" /> or
+        ///                         <see cref="GLU_TESS_COMBINE_DATA" /> callback was not
+        ///                         provided.  No output is generated.
+        ///                         <see cref="GLU_OUT_OF_MEMORY" /> indicates that there is not
+        ///                         enough memory so no output is generated.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_ERROR_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_ERROR" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessErrorDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX" /></term>
+        ///                 <description>
+        ///                     The vertex callback is invoked between the begin and end
+        ///                     callbacks.  It is similar to Gl.glVertex*, and it defines the
+        ///                     vertices of the triangles created by the tessellation process.
+        ///                     The function takes a pointer as its only argument.  This pointer
+        ///                     is identical to the opaque pointer provided by the user when the
+        ///                     vertex was described (see <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />).  The
+        ///                     delegate prototype for this callback is
+        ///                     <see cref="TessVertexCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_VERTEX_DATA" /></term>
+        ///                 <description>
+        ///                     The same as the <see cref="GLU_TESS_VERTEX" /> callback except
+        ///                     that it takes an additional pointer argument.  This pointer is
+        ///                     identical to the opaque pointer provided when
+        ///                     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was called.  The delegate
+        ///                     prototype for this callback is
+        ///                     <see cref="TessVertexDataCallback" />.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="func">
+        ///     The function to be called.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessCallback</b> is used to indicate a callback to be used by a
+        ///         tessellation object.  If the specified callback is already defined, then it
+        ///         is replaced.  If <i>func</i> is <c>null</c>, then the existing callback
+        ///         becomes undefined.
+        ///     </para>
+        ///     <para>
+        ///         These callbacks are used by the tessellation object to describe how a polygon
+        ///         specified by the user is broken into triangles.  Note that there are two
+        ///         versions of each callback: one with user-specified polygon data and one
+        ///         without.  If both versions of a particular callback are specified, then the
+        ///         callback with user-specified polygon data will be used.  Note that the
+        ///         <i>polygonData</i> parameter used by some of the functions is a copy of the
+        ///         pointer that was specified when <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> was
+        ///         called.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         You can directly render tessallated polygons as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(Gl.glBegin));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(Gl.glVertex3dv));
+        ///             Glu.gluTessCallback(tess, Glu.GLU_TESS_END, new Glu.TessEndCallback(Gl.glEnd));
+        ///
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v, v);
+        ///                     . . .
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="TessBeginCallback" />
+        /// <seealso cref="TessBeginDataCallback" />
+        /// <seealso cref="TessCombineCallback" />
+        /// <seealso cref="TessCombineDataCallback" />
+        /// <seealso cref="TessEdgeFlagCallback" />
+        /// <seealso cref="TessEdgeFlagDataCallback" />
+        /// <seealso cref="TessEndCallback" />
+        /// <seealso cref="TessEndDataCallback" />
+        /// <seealso cref="TessErrorCallback" />
+        /// <seealso cref="TessErrorDataCallback" />
+        /// <seealso cref="TessVertexCallback" />
+        /// <seealso cref="TessVertexDataCallback" />
+        /// <seealso cref="Gl.glBegin" />
+        /// <seealso cref="Gl.glEdgeFlag" />
+        /// <seealso cref="gluErrorString" />
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessCallback(GLUtesselator *tess, GLenum which, void (CALLBACK *fn)());
+        public static void gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexDataCallback func) {
+            tessVertexDataCallback = func;
+            __gluTessCallback(tess, which, tessVertexDataCallback);
+        }
+        #endregion gluTessCallback([In] GLUtesselator tess, int which, [In] TessVertexDataCallback func)
+
+        #region gluTessEndContour([In] GLUtesselator tess)
+        /// <summary>
+        ///     Delimits a contour description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <remarks>
+        ///     <see cref="gluTessBeginContour" /> and <b>gluTessEndContour</b> delimit the
+        ///     definition of a polygon contour.  Within each
+        ///     <see cref="gluTessBeginContour" />/<b>gluTessEndContour</b> pair, there can
+        ///     be zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.  The vertices specify
+        ///     a closed contour (the last vertex of each contour is automatically linked to
+        ///     the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" /> reference page for more
+        ///     details.  <see cref="gluTessBeginContour" /> can only be called between
+        ///     <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> and <see cref="gluTessEndPolygon" />.
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessEndContour(GLUtesselator *tess);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessEndContour([In] GLUtesselator tess);
+        #endregion gluTessEndContour([In] GLUtesselator tess)
+
+        #region gluTessEndPolygon([In] GLUtesselator tess)
+        /// <summary>
+        ///     Delimits a polygon description.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" /> and <b>gluTessEndPolygon</b> delimit the
+        ///         definition of a convex, concave or self-intersecting polygon.  Within each
+        ///         <see cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />/<b>gluTessEndPolygon</b> pair, there must
+        ///         be one or more calls to
+        ///         <see cref="gluTessBeginContour" />/<see cref="gluTessEndContour" />.  Within
+        ///         each contour, there are zero or more calls to <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />.
+        ///         The vertices specify a closed contour (the last vertex of each contour is
+        ///         automatically linked to the first).  See the <see cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />,
+        ///         <see cref="gluTessBeginContour" />, and <see cref="gluTessEndContour" />
+        ///         reference pages for more details.
+        ///     </para>
+        ///     <para>
+        ///         Once <b>gluTessEndPolygon</b> is called, the polygon is tessellated,
+        ///         and the resulting triangles are described through callbacks.  See
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> for descriptions of the callback functions.
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tobj, null);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v1, v1);
+        ///                     Glu.gluTessVertex(tobj, v2, v2);
+        ///                     Glu.gluTessVertex(tobj, v3, v3);
+        ///                     Glu.gluTessVertex(tobj, v4, v4);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///                 Glu.gluTessBeginContour(tobj);
+        ///                     Glu.gluTessVertex(tobj, v5, v5);
+        ///                     Glu.gluTessVertex(tobj, v6, v6);
+        ///                     Glu.gluTessVertex(tobj, v7, v7);
+        ///                 Glu.gluTessEndContour(tobj);
+        ///             Glu.gluTessEndPolygon(tobj);
+        ///         </code>
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        /// <seealso cref="gluTessVertex(Tao.OpenGl.Glu.GLUtesselator, double[], byte[])" />
+        // void APIENTRY gluTessEndPolygon(GLUtesselator *tess);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessEndPolygon([In] GLUtesselator tess);
+        #endregion gluTessEndPolygon([In] GLUtesselator tess)
+
+        #region gluTessNormal([In] GLUtesselator tess, double x, double y, double z)
+        /// <summary>
+        ///     Specifies a normal for a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="x">
+        ///     The x-coordinate component of a normal.
+        /// </param>
+        /// <param name="y">
+        ///     The y-coordinate component of a normal.
+        /// </param>
+        /// <param name="z">
+        ///     The z-coordinate component of a normal.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessNormal</b> describes a normal for a polygon that the program is
+        ///         defining.  All input data will be projected onto a plane perpendicular to one
+        ///         of the three coordinate axes before tessellation and all output triangles
+        ///         will be oriented CCW with respect to the normal (CW orientation can be
+        ///         obtained by reversing the sign of the supplied normal).  For example, if you
+        ///         know that all polygons lie in the x-y plane, call
+        ///         <c>Glu.gluTessNormal(tess, 0.0, 0.0, 1.0)</c> before rendering any polygons.
+        ///     </para>
+        ///     <para>
+        ///         If the supplied normal is (0.0, 0.0, 0.0) (the initial value), the normal is
+        ///         determined as follows.  The direction of the normal, up to its sign, is found
+        ///         by fitting a plane to the vertices, without regard to how the vertices are
+        ///         connected.  It is expected that the input data lies approximately in the
+        ///         plane; otherwise, projection perpendicular to one of the three coordinate
+        ///         axes may substantially change the geometry.  The sign of the normal is chosen
+        ///         so that the sum of the signed areas of all input contours is nonnegative
+        ///         (where a CCW contour has positive area).
+        ///     </para>
+        ///     <para>
+        ///         The supplied normal persists until it is changed by another call to
+        ///         <b>gluTessNormal</b>.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessEndPolygon" />
+        // void APIENTRY gluTessNormal(GLUtesselator *tess, GLdouble x, GLdouble y, GLdouble z);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessNormal([In] GLUtesselator tess, double x, double y, double z);
+        #endregion gluTessNormal([In] GLUtesselator tess, double x, double y, double z)
+
+        #region gluTessProperty([In] GLUtesselator tess, int which, double data)
+        /// <summary>
+        ///     Sets the property of a tessellation object.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="which">
+        ///     <para>
+        ///         The property value to set.  The following values are valid:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_WINDING_RULE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Determines which parts of the polygon are on the "interior".
+        ///                         <i>data</i> may be set to one of
+        ///                         <see cref="GLU_TESS_WINDING_ODD" />,
+        ///                         <see cref="GLU_TESS_WINDING_NONZERO" />,
+        ///                         <see cref="GLU_TESS_WINDING_POSITIVE" />, or
+        ///                         <see cref="GLU_TESS_WINDING_NEGATIVE" />, or
+        ///                         <see cref="GLU_TESS_WINDING_ABS_GEQ_TWO" />.
+        ///                     </para>
+        ///                     <para>
+        ///                         To understand how the winding rule works, consider that the
+        ///                         input contours partition the plane into regions.  The winding
+        ///                         rule determines which of these regions are inside the
+        ///                         polygon.
+        ///                     </para>
+        ///                     <para>
+        ///                         For a single contour C, the winding number of a point x is
+        ///                         simply the signed number of revolutions we make around x as
+        ///                         we travel once around C (where CCW is positive).  When there
+        ///                         are several contours, the individual winding numbers are
+        ///                         summed.  This procedure associates a signed integer value
+        ///                         with each point x in the plane.  Note that the winding number
+        ///                         is the same for all points in a single region.
+        ///                     </para>
+        ///                     <para>
+        ///                         The winding rule classifies a region as "inside" if its
+        ///                         winding number belongs to the chosen category (odd, nonzero,
+        ///                         positive, negative, or absolute value of at least two).  The
+        ///                         previous GLU tessellator (prior to GLU 1.2) used the "odd"
+        ///                         rule.  The "nonzero" rule is another common way to define the
+        ///                         interior.  The other three rules are useful for polygon CSG
+        ///                         operations.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_BOUNDARY_ONLY" /></term>
+        ///                 <description>
+        ///                     Is a boolean value ("value" should be set to
+        ///                     <see cref="Gl.GL_TRUE" /> or <see cref="Gl.GL_FALSE" />).  When
+        ///                     set to <see cref="Gl.GL_TRUE" />, a set of closed contours
+        ///                     separating the polygon interior and exterior are returned instead
+        ///                     of a tessellation.  Exterior contours are oriented CCW with
+        ///                     respect to the normal; interior contours are oriented CW.  The
+        ///                     <see cref="GLU_TESS_BEGIN" /> and
+        ///                     <see cref="GLU_TESS_BEGIN_DATA" /> callbacks use the type
+        ///                     <see cref="Gl.GL_LINE_LOOP" /> for each contour.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="GLU_TESS_TOLERANCE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Specifies a tolerance for merging features to reduce the size
+        ///                         of the output.  For example, two vertices that are very close
+        ///                         to each other might be replaced by a single vertex.  The
+        ///                         tolerance is multiplied by the largest coordinate magnitude
+        ///                         of any input vertex; this specifies the maximum distance that
+        ///                         any feature can move as the result of a single merge
+        ///                         operation.  If a single feature takes part in several merge
+        ///                         operations, the total distance moved could be larger.
+        ///                     </para>
+        ///                     <para>
+        ///                         Feature merging is completely optional; the tolerance is only
+        ///                         a hint.  The implementation is free to merge in some cases
+        ///                         and not in others, or to never merge features at all.  The
+        ///                         initial tolerance is 0.
+        ///                     </para>
+        ///                     <para>
+        ///                         The current implementation merges vertices only if they are
+        ///                         exactly coincident, regardless of the current tolerance.  A
+        ///                         vertex is spliced into an edge only if the implementation is
+        ///                         unable to distinguish which side of the edge the vertex lies
+        ///                         on.  Two edges are merged only when both endpoints are
+        ///                         identical.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="data">
+        ///     The value of the indicated property.
+        /// </param>
+        /// <remarks>
+        ///     <b>gluTessProperty</b> is used to control properties stored in a tessellation
+        ///     object.  These properties affect the way that the polygons are interpreted
+        ///     and rendered.
+        /// </remarks>
+        /// <seealso cref="gluGetTessProperty(Tao.OpenGl.Glu.GLUtesselator, int, double[])" />
+        /// <seealso cref="gluNewTess" />
+        // void APIENTRY gluTessProperty(GLUtesselator *tess, GLenum which, GLdouble value);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessProperty([In] GLUtesselator tess, int which, double data);
+        #endregion gluTessProperty([In] GLUtesselator tess, int which, double data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] byte[] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] byte[] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] byte[] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] byte[ , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] byte[ , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] byte[ , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] byte[ , , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] byte[ , , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] byte[ , , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] double[] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] double[] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] double[] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] double[ , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] double[ , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] double[ , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] double[ , , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] double[ , , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] double[ , , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] short[] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] short[] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] short[] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] short[ , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] short[ , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] short[ , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] short[ , , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] short[ , , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] short[ , , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] int[] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] int[] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] int[] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] int[ , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] int[ , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] int[ , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] int[ , , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] int[ , , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] int[ , , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] float[] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] float[] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] float[] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] float[ , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] float[ , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] float[ , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] float[ , , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] float[ , , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] float[ , , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] ushort[] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] ushort[] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] ushort[] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] ushort[ , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] ushort[ , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] ushort[ , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] ushort[ , , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] ushort[ , , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] ushort[ , , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] uint[] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] uint[] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] uint[] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] uint[ , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] uint[ , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] uint[ , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] uint[ , , ] data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] uint[ , , ] data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] uint[ , , ] data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] IntPtr data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] IntPtr data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] IntPtr data)
+
+        #region gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] void *data)
+        /// <summary>
+        ///     Specifies a vertex on a polygon.
+        /// </summary>
+        /// <param name="tess">
+        ///     The tessellation object (created with <see cref="gluNewTess" />).
+        /// </param>
+        /// <param name="location">
+        ///     The location of the vertex.
+        /// </param>
+        /// <param name="data">
+        ///     A pointer passed back to the program with the vertex callback (as specified
+        ///     by <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />).
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluTessVertex</b> describes a vertex on a polygon that the program
+        ///         defines.  Successive <b>gluTessVertex</b> calls describe a closed contour.
+        ///         For example, to describe a quadrilateral <b>gluTessVertex</b> should be
+        ///         called four times.  <b>gluTessVertex</b> can only be called between
+        ///         <see cref="gluTessBeginContour" /> and <see cref="gluTessEndContour" />.
+        ///     </para>
+        ///     <para>
+        ///         <i>data</i> normally points to a structure containing the vertex location,
+        ///         as well as other per-vertex attributes such as color and normal.  This
+        ///         pointer is passed back to the user through the <see cref="GLU_TESS_VERTEX" />
+        ///         or <see cref="GLU_TESS_VERTEX_DATA" /> callback after tessellation (see the
+        ///         <see cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" /> reference page).
+        ///     </para>
+        ///     <para>
+        ///         <b>EXAMPLE</b>
+        ///     </para>
+        ///     <para>
+        ///         The following describes a quadrilateral with a triangular hole:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             Glu.gluTessBeginPolygon(tess, null);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v1, v1);
+        ///                     Glu.gluTessVertex(tess, v2, v2);
+        ///                     Glu.gluTessVertex(tess, v3, v3);
+        ///                     Glu.gluTessVertex(tess, v4, v4);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluNextContour(tess, Glu.GLU_INTERIOR);
+        ///                 Glu.gluTessBeginContour(tess);
+        ///                     Glu.gluTessVertex(tess, v5, v5);
+        ///                     Glu.gluTessVertex(tess, v6, v6);
+        ///                     Glu.gluTessVertex(tess, v7, v7);
+        ///                 Glu.gluTessEndContour(tess);
+        ///             Glu.gluTessEndPolygon(tess);
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         <b>NOTES</b>
+        ///     </para>
+        ///     <para>
+        ///         It is a common error to use a local variable for <i>location</i> or
+        ///         <i>data</i> and store values into it as part of a loop.  For example:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///             for(int i = 0; i < NVERTICES; ++i) { 
+        ///                 double data[3];
+        ///                 data[0] = vertex[i, 0];
+        ///                 data[1] = vertex[i, 1];
+        ///                 data[2] = vertex[i, 2];
+        ///                 Glu.gluTessVertex(tobj, data, data);
+        ///             } 
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         This doesn't work.  Because the pointers specified by <i>location</i> and
+        ///         <i>data</i> might not be dereferenced until <see cref="gluTessEndPolygon" />
+        ///         is executed, all the vertex coordinates but the very last set could be
+        ///         overwritten before tessellation begins.
+        ///     </para>
+        ///     <para>
+        ///         Two common symptoms of this problem are consists of a single point (when a
+        ///         local variable is used for <i>data</i>) and a
+        ///         <see cref="GLU_TESS_NEED_COMBINE_CALLBACK" /> error (when a local variable
+        ///         is used for <i>location</i>).
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="gluNewTess" />
+        /// <seealso cref="gluTessBeginPolygon(Tao.OpenGl.Glu.GLUtesselator, byte[])" />
+        /// <seealso cref="gluTessBeginContour" />
+        /// <seealso cref="gluTessCallback(Tao.OpenGl.Glu.GLUtesselator, int, Tao.OpenGl.Glu.TessBeginCallback)" />
+        /// <seealso cref="gluTessEndPolygon" />
+        /// <seealso cref="gluTessNormal" />
+        /// <seealso cref="gluTessProperty" />
+        // void APIENTRY gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public unsafe static extern void gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] void *data);
+        #endregion gluTessVertex([In] GLUtesselator tess, [In] double[] location, [In] void *data)
+
+        #region int gluUnProject(double winX, double winY, double winZ, [In] double[] modelMatrix, [In] double[] projectionMatrix, [In] int[] viewport, out double objX, out double objY, out double objZ)
+        /// <summary>
+        ///     Maps window coordinates to object coordinates.
+        /// </summary>
+        /// <param name="winX">
+        ///     The window's x axis coordinate to be mapped.
+        /// </param>
+        /// <param name="winY">
+        ///     The window's y axis coordinate to be mapped.
+        /// </param>
+        /// <param name="winZ">
+        ///     The window's z axis coordinate to be mapped.
+        /// </param>
+        /// <param name="modelMatrix">
+        ///     The modelview matrix (as from a <see cref="Gl.glGetDoublev(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="projectionMatrix">
+        ///     The projection matrix (as from a <see cref="Gl.glGetDoublev(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="viewport">
+        ///     The viewport (as from a <see cref="Gl.glGetIntegerv(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="objX">
+        ///     The computed object's x axis coordinate.
+        /// </param>
+        /// <param name="objY">
+        ///     The computed object's y axis coordinate.
+        /// </param>
+        /// <param name="objZ">
+        ///     The computed object's z axis coordinate.
+        /// </param>
+        /// <returns>
+        ///     A return value of <see cref="Gl.GL_TRUE" /> indicates success; a return value
+        ///     of <see cref="Gl.GL_FALSE" /> indicates failure.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluUnProject</b> maps the specified window coordinates into object
+        ///         coordinates using <i>modelMatrix</i>, <i>projectionMatrix</i>, and
+        ///         <i>viewport</i>.  The result is stored in <i>objX</i>, <i>objY</i>, and
+        ///         <i>objZ</i>.  A return value of <see cref="Gl.GL_TRUE" /> indicates success;
+        ///         a return value of <see cref="Gl.GL_FALSE" /> indicates failure.
+        ///     </para>
+        ///     <para>
+        ///         To compute the coordinates (<i>objX</i>, <i>objY</i>, and <i>objZ</i>),
+        ///         <b>gluUnProject</b> multiplies the normalized device coordinates by the
+        ///         inverse of <i>modelMatrix</i> multiplied by <i>projectionMatrix</i> as
+        ///         follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///                               (  2(winX - viewport[0])  )
+        ///                               |  ----------------- - 1  |
+        ///                               |       viewport[2]       |
+        ///             (      )          |                         |
+        ///             | objX |          |  2(winY - viewport[1])  |
+        ///             | objY | = INV(PM)|  ----------------- - 1  |
+        ///             | objZ |          |       viewport[3]       |
+        ///             (  W   )          |                         |
+        ///                               |       2(winZ) - 1       |
+        ///                               |                         |
+        ///                               (            1            )
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         INV() denotes matrix inversion.  W is an unused variable, included for
+        ///         consistent matrix notation. 
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glGetDoublev(int, IntPtr)" />
+        /// <seealso cref="Gl.glGetIntegerv(int, IntPtr)" />
+        /// <seealso cref="gluProject" />
+        // int APIENTRY gluUnProject(GLdouble winx, GLdouble winy, GLdouble winz, const GLdouble modelMatrix[16], const GLdouble projMatrix[16], const GLint viewport[4], GLdouble *objx, GLdouble *objy, GLdouble *objz);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluUnProject(double winX, double winY, double winZ, [In] double[] modelMatrix, [In] double[] projectionMatrix, [In] int[] viewport, out double objX, out double objY, out double objZ);
+        #endregion int gluUnProject(double winX, double winY, double winZ, [In] double[] modelMatrix, [In] double[] projectionMatrix, [In] int[] viewport, out double objX, out double objY, out double objZ)
+
+        #region int gluUnProject4(double winX, double winY, double winZ, double clipW, [In] double[] modelMatrix, [In] double[] projectionMatrix, [In] int[] viewport, double nearVal, double farVal, out double objX, out double objY, out double objZ, out double objW)
+        /// <summary>
+        ///     Maps window and clip coordinates to object coordinates.
+        /// </summary>
+        /// <param name="winX">
+        ///     The window's x axis coordinate to be mapped.
+        /// </param>
+        /// <param name="winY">
+        ///     The window's y axis coordinate to be mapped.
+        /// </param>
+        /// <param name="winZ">
+        ///     The window's z axis coordinate to be mapped.
+        /// </param>
+        /// <param name="clipW">
+        ///     The clip w coordinate to be mapped.
+        /// </param>
+        /// <param name="modelMatrix">
+        ///     The modelview matrix (as from a <see cref="Gl.glGetDoublev(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="projectionMatrix">
+        ///     The projection matrix (as from a <see cref="Gl.glGetDoublev(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="viewport">
+        ///     The viewport (as from a <see cref="Gl.glGetIntegerv(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="nearVal">
+        ///     The near plane (as from a <see cref="Gl.glGetDoublev(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="farVal">
+        ///     The far plane (as from a <see cref="Gl.glGetDoublev(int, IntPtr)" /> call).
+        /// </param>
+        /// <param name="objX">
+        ///     The computed object's x axis coordinate.
+        /// </param>
+        /// <param name="objY">
+        ///     The computed object's y axis coordinate.
+        /// </param>
+        /// <param name="objZ">
+        ///     The computed object's z axis coordinate.
+        /// </param>
+        /// <param name="objW">
+        ///     The computed object's clip w coordinate.
+        /// </param>
+        /// <returns>
+        ///     A return value of <see cref="Gl.GL_TRUE" /> indicates success; a return
+        ///     value of <see cref="Gl.GL_FALSE" /> indicates failure.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>gluUnProject4</b> maps the specified window coordinates <i>winX</i>,
+        ///         <i>winY</i> and <i>winZ</i> and its clip w coordinate <i>clipW</i> into
+        ///         object coordinates (<i>objX</i>, <i>objY</i>, <i>objZ</i>, <i>objW</i>)
+        ///         using <i>modelMatrix</i>, <i>projectionMatrix</i> and <i>viewport</i>.
+        ///         <i>clipW</i> can be other than 1 as for vertices in
+        ///         <see cref="Gl.glFeedbackBuffer(int, int, IntPtr)" /> when data type
+        ///         <see cref="Gl.GL_4D_COLOR_TEXTURE" /> is returned.  This also handles the
+        ///         case where the <i>nearVal</i> and <i>farVal</i> planes are different from the
+        ///         default, 0 and 1, respectively.  A return value of <see cref="Gl.GL_TRUE" />
+        ///         indicates success; a return value of <see cref="Gl.GL_FALSE" /> indicates
+        ///         failure.
+        ///     </para>
+        ///     <para>
+        ///         To compute the coordinates (<i>objX</i>, <i>objY</i>, <i>objZ</i> and
+        ///         <i>objW</i>), <b>gluUnProject4</b> multiplies the normalized device
+        ///         coordinates by the inverse of <i>modelMatrix</i> multiplied by
+        ///         <i>projectionMatrix</i> as follows:
+        ///     </para>
+        ///     <para>
+        ///         <code>
+        ///                               ( 2(winX - viewport[0]  )
+        ///                               | ---------------- - 1  |
+        ///                               |     viewport[2]       |
+        ///                               |                       |
+        ///                               | 2(winY - viewport[1]  |
+        ///         ( objX  )             | ---------------- - 1  |
+        ///         | objY  | = INV(PM) * |     viewport[3]       |
+        ///         | objZ  |             |                       |
+        ///         ( objW  )             |  2(winZ - nearVal)    |
+        ///                               |  -------------- - 1   |
+        ///                               |    farVal - nearVal   |
+        ///                               |                       |
+        ///                               (        clipW          )
+        ///         </code>
+        ///     </para>
+        ///     <para>
+        ///         INV() denotes matrix inversion.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluUnProject4</b> is equivalent to <see cref="gluUnProject" /> when
+        ///         <i>clipW</i> is 1, <i>nearVal</i> is 0 and <i>farVal</i> is 1.
+        ///     </para>
+        ///     <para>
+        ///         <b>gluUnProject4</b> is available only if the GLU version is 1.3 or greater.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Gl.glFeedbackBuffer(int, int, IntPtr)" />
+        /// <seealso cref="Gl.glGetDoublev(int, IntPtr)" />
+        /// <seealso cref="Gl.glGetIntegerv(int, IntPtr)" />
+        /// <seealso cref="gluProject" />
+        /// <seealso cref="gluUnProject" />
+        // GLAPI GLint GLAPIENTRY gluUnProject4 (GLdouble winX, GLdouble winY, GLdouble winZ, GLdouble clipW, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble nearVal, GLdouble farVal, GLdouble* objX, GLdouble* objY, GLdouble* objZ, GLdouble* objW);
+        [DllImport("glu32.dll", CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int gluUnProject4(double winX, double winY, double winZ, double clipW, [In] double[] modelMatrix, [In] double[] projectionMatrix, [In] int[] viewport, double nearVal, double farVal, out double objX, out double objY, out double objZ, out double objW);
+        #endregion int gluUnProject4(double winX, double winY, double winZ, double clipW, [In] double[] modelMatrix, [In] double[] projectionMatrix, [In] int[] viewport, double nearVal, double farVal, out double objX, out double objY, out double objZ, out double objW)
+   }
+}
diff --git a/src/Tao.OpenGl/INSTALL b/src/Tao.OpenGl/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.OpenGl/Makefile.am b/src/Tao.OpenGl/Makefile.am
new file mode 100644
index 0000000..c35534d
--- /dev/null
+++ b/src/Tao.OpenGl/Makefile.am
@@ -0,0 +1,24 @@
+
+ASSEMBLY = Tao.OpenGl
+SHORTNAME = tao-opengl
+VERSION = @TAOOPENGL_VERSION@
+MAJOR = @TAOOPENGL_MAJOR@
+
+PACKAGES =
+BINARY_LIBS =
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        GLCore.cs \
+        GLDelegates.cs \
+        GLEnums.cs \
+        Gl.cs \
+        GlExtensionLoader.cs \
+        GlHelper.cs \
+        Glu.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.OpenGl/Makefile.in b/src/Tao.OpenGl/Makefile.in
new file mode 100644
index 0000000..af4988a
--- /dev/null
+++ b/src/Tao.OpenGl/Makefile.in
@@ -0,0 +1,420 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-opengl.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.OpenGl
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-opengl.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOOPENGL_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.OpenGl
+SHORTNAME = tao-opengl
+MAJOR = @TAOOPENGL_MAJOR@
+PACKAGES = 
+BINARY_LIBS = 
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        GLCore.cs \
+        GLDelegates.cs \
+        GLEnums.cs \
+        Gl.cs \
+        GlExtensionLoader.cs \
+        GlHelper.cs \
+        Glu.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.OpenGl/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.OpenGl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-opengl.pc: $(top_builddir)/config.status $(srcdir)/tao-opengl.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.OpenGl/NEWS b/src/Tao.OpenGl/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.OpenGl/Properties/AssemblyInfo.cs b/src/Tao.OpenGl/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..82aac58
--- /dev/null
+++ b/src/Tao.OpenGl/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2007 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.OpenGl")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework OpenGL Binding For .NET")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
+[assembly: AssemblyInformationalVersion("3.0.0.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.OpenGl.dll")]
+[assembly: AssemblyTitle("Tao Framework OpenGL Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.OpenGl/README b/src/Tao.OpenGl/README
new file mode 100644
index 0000000..858fd86
--- /dev/null
+++ b/src/Tao.OpenGl/README
@@ -0,0 +1,66 @@
+Tao.OpenGl 2.1.0.2
+Copyright ©2003-2007 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.OpenGl is an OpenGL binding for .NET, implementing GL 2.1 and GLU 1.3.
+
+=== OpenGl DLL and compilation portability ===
+
+Due to some issues with the binding generation that I've yet to work
+out, the extension entry points in a Tao.OpenGl.dll built for WIN32 is
+not portable to Linux/Mono.  To make matters worse, a clean
+Tao.OpenGl.dll build can't happen on Linux/Mono, because of the lack
+of ILMerge.exe on Linux.  It's acceptable to build a Tao.OpenGl.dll on
+windows that's built for Mono and then copy that and use it on Mono.
+
+Hopefully this issue will be resolved soon.
+
+=== Extensions and Tao ===
+
+[To be written.  Comments/problems to vladimir at pobox.com .]
+
+In a nutshell, you'll use the Tao.OpenGl.GlExtensionLoader class.
+
+To check for support without loading:
+
+   bool vboSupported = GlExtensionLoader.IsExtensionSupported("GL_ARB_vertex_buffer_object");
+
+or to check and load:
+
+   bool vboSupported = GlExtensionLoader.LoadExtension ("GL_ARB_vertex_buffer_object");
+
+then, just use
+
+   Tao.OpenGl.Gl.glGenBuffersARB(1, out buf);
+   Tao.OpenGl.Gl.glBindBufferARB(target, buf);
+   etc.
+
+Multiple context is supported; you have to create a new ContextGl class:
+
+   Tao.OpenGl.ContextGl cgl = new Tao.OpenGl.ContextGl();
+
+then pass this as the first argument to IsExtensionSupported/LoadExtension:
+
+   GlExtensionLoader.LoadExtension (cgl, "GL_ARB_vertex_buffer_object");
+
+And then call
+
+   cgl.glGenBuffersARB(1, out buf);
+   etc.
+
+It's the application's responsibility to make the appropriate context
+current before calling GlCore or Gl methods on a ContextGl instance.
+
+To load all extensions:
+   GlExtensionLoader.LoadAllExtensions();
+
+Change Log:
+
+1.5.0.3 - August 23, 2004:
+    Rewrote OpenGl layer to generate code directly from ARB
+    spec files; also implemented new extension loading/access mechanism.
+
+1.5.0.0 - April 20, 2004:
+    Initial release.  Special thanks to Manfred Doetter for his work
+    implementing almost all of the extensions.
diff --git a/src/Tao.OpenGl/Tao.OpenGl.csproj b/src/Tao.OpenGl/Tao.OpenGl.csproj
new file mode 100644
index 0000000..d3ee3eb
--- /dev/null
+++ b/src/Tao.OpenGl/Tao.OpenGl.csproj
@@ -0,0 +1,117 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6292109B-6BB4-4120-AD56-F409C0285AB6}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.OpenGl</AssemblyName>
+    <AssemblyOriginatorKeyFile>../Tao.OpenGl/Tao.OpenGl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.OpenGl</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.OpenGl.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Gl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GLCore.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GLDelegates.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GLEnums.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GlExtensionLoader.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GlHelper.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Glu.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.OpenGl.dll.config" />
+    <None Include="Tao.OpenGl.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.OpenGl/Tao.OpenGl.dll.config b/src/Tao.OpenGl/Tao.OpenGl.dll.config
new file mode 100644
index 0000000..cf50562
--- /dev/null
+++ b/src/Tao.OpenGl/Tao.OpenGl.dll.config
@@ -0,0 +1,9 @@
+<configuration>
+    <dllmap dll="opengl32.dll" os="windows" target="opengl32.dll" />
+    <dllmap dll="opengl32.dll" os="osx" target="/System/Library/Frameworks/OpenGL.framework/OpenGL" />
+    <dllmap dll="opengl32.dll" os="!windows,osx" target="libGL.so.1" />
+
+    <dllmap dll="glu32.dll" os="windows" target="opengl32.dll" />
+    <dllmap dll="glu32.dll" os="osx" target="/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib" />
+    <dllmap dll="glu32.dll" os="!windows,osx" target="libGLU.so.1" />
+</configuration>
diff --git a/src/Tao.OpenGl/Tao.OpenGl.snk b/src/Tao.OpenGl/Tao.OpenGl.snk
new file mode 100644
index 0000000..1f79d73
Binary files /dev/null and b/src/Tao.OpenGl/Tao.OpenGl.snk differ
diff --git a/src/Tao.OpenGl/tao-opengl.pc.in b/src/Tao.OpenGl/tao-opengl.pc.in
new file mode 100644
index 0000000..2dd59a9
--- /dev/null
+++ b/src/Tao.OpenGl/tao-opengl.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.OpenGl
+Description: OpenGL section of the Tao framework
+Version: @TAOOPENGL_VERSION@
+Requires: tao-platform-x11- at TAOX11_MAJOR@
+Libs: -r:${libdir}/mono/tao-opengl- at TAOOPENGL_MAJOR@/Tao.OpenGl.dll
+
diff --git a/src/Tao.PhysFs/AUTHORS b/src/Tao.PhysFs/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.PhysFs/COPYING b/src/Tao.PhysFs/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.PhysFs/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.PhysFs/ChangeLog b/src/Tao.PhysFs/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.PhysFs/Fs.cs b/src/Tao.PhysFs/Fs.cs
new file mode 100644
index 0000000..7b3df56
--- /dev/null
+++ b/src/Tao.PhysFs/Fs.cs
@@ -0,0 +1,1602 @@
+#region License
+/*
+ MIT License
+ Copyright 2003-2006 Tao Framework Team
+ http://www.taoframework.com
+ All rights reserved.
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+ 
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Text;
+using System.Collections;
+
+namespace Tao.PhysFs
+{
+	#region Aliases
+	using PHYSFS_uint8 = System.Byte;
+	using PHYSFS_sint8 = System.SByte;
+	using PHYSFS_uint16 = System.UInt16;
+	using PHYSFS_sint16 = System.Int16;
+	using PHYSFS_uint32 = System.UInt32;
+	using PHYSFS_sint32 = System.Int32;
+	using PHYSFS_uint64 = System.UInt64;
+	using PHYSFS_sint64 = System.Int64;
+	#endregion Aliases
+
+	#region Class Documentation
+	/// <summary>
+	///     PhysFS bindings for .NET, implementing PhysFS 1.0.1 (http://icculus.org/physfs/).
+	/// </summary>
+	/// <remarks>
+	///		PhysicsFS is a library to provide abstract access to
+	///		various archives. It is intended for use in video games,
+	///		and the design was somewhat inspired by Quake 3's file
+	///		subsystem.
+	///	<p>More information can be found at the official website (http://icculus.org/physfs/).</p>
+	///	</remarks>
+	#endregion Class Documentation
+	[SuppressUnmanagedCodeSecurityAttribute()]
+	public static class Fs
+	{
+		#region Private Constants
+		#region string PHYSFS_NATIVE_LIBRARY
+		/// <summary>
+		/// Specifies the PhysicsFS native library used in the bindings
+		/// </summary>
+		/// <remarks>
+		/// The Windows dll is specified here universally - note that
+		/// under Mono the non-windows native library can be mapped using
+		/// the ".config" file mechanism.  Kudos to the Mono team for this
+		/// simple yet elegant solution.
+		/// </remarks>
+		private const string PHYSFS_NATIVE_LIBRARY = "physfs.dll";
+		#endregion string PHYSFS_NATIVE_LIBRARY
+		
+		#region CallingConvention CALLING_CONVENTION
+		/// <summary>
+		///     Specifies the calling convention used for the binding.
+		/// </summary>
+		/// <remarks>
+		///     Specifies <see cref="CallingConvention.Winapi" />.
+		/// </remarks>
+		private const CallingConvention CALLING_CONVENTION = CallingConvention.Cdecl;
+		#endregion CallingConvention CALLING_CONVENTION
+		#endregion Private Constants
+
+		#region physfs.h
+		#region Public Structs
+
+		#region PHYSFS_Version
+		/// <summary>
+		/// Information the version of PhysicsFS in use.
+		/// </summary>
+		/// <remarks>Represents the library's version as three levels: major revision (increments with massive changes, additions, and enhancements), minor revision (increments with backwards-compatible changes to the major revision), and patchlevel (increments with fixes to the minor revision).</remarks>
+		/// <seealso cref="PHYSFS_VERSION"/>
+		/// <seealso cref="PHYSFS_getLinkedVersion"/>
+		[StructLayout(LayoutKind.Sequential, Pack=4)]
+		public struct PHYSFS_Version
+		{
+			/// <summary>
+			/// major revision
+			/// </summary>
+			public PHYSFS_uint8 major;
+			/// <summary>
+			/// minor revision
+			/// </summary>
+			public PHYSFS_uint8 minor;
+			/// <summary>
+			/// patchlevel
+			/// </summary>
+			public PHYSFS_uint8 patch;
+			/// <summary>
+			/// Returns a string representation of the version number (x.x.x).
+			/// </summary>
+			/// <returns>A string representing the version.</returns>
+			public override string ToString()
+			{
+				return major.ToString() + "." + minor.ToString() + "." + patch.ToString();
+			}
+		}
+		#endregion PHYSFS_Version
+
+		#region PHYSFS_ArchiveInfo
+		/// <summary>
+		/// Information on various PhysicsFS-supported archives.
+		/// </summary>
+		/// <remarks>
+		/// This structure gives you details on what sort of archives are supported by this implementation of PhysicsFS. Archives tend to be things like ZIP files and such.
+		/// <p>
+		/// Not all binaries are created equal! PhysicsFS can be built with or without support for various archives. You can check with PHYSFS_supportedArchiveTypes() to see if your archive type is supported.
+		/// </p>
+		/// </remarks>
+		/// <seealso cref="PHYSFS_supportedArchiveTypes"/>
+		// This is the public class declaration to use strings instead of IntPtrs.
+		public class PHYSFS_ArchiveInfo
+		{
+			/// <summary>
+			/// Creates a PHYSFS_ArchiveInfo structure.
+			/// </summary>
+			/// <param name="extension">The archive's file extension.</param>
+			/// <param name="description">The description of the archive.</param>
+			/// <param name="author">Who created this implementation.</param>
+			/// <param name="url">The URL of the archive.</param>
+			// This is a strongly typed implementation of PHYSFS_ArchiveInfo that uses strings instead of IntPtrs.
+			public PHYSFS_ArchiveInfo(string extension, string description, string author, string url)
+			{
+				this.extension = extension;
+				this.description = description;
+				this.author = author;
+				this.url = url;
+			}
+			/// <summary>
+			/// Archive file extension: "ZIP", for example.
+			/// </summary>
+			public string extension;
+			/// <summary>
+			/// Human-readable archive description.
+			/// </summary>
+			public string description;
+			/// <summary>
+			/// Person who did support for this archive.
+			/// </summary>
+			public string author;
+			/// <summary>
+			/// URL related to this archive.
+			/// </summary>
+			public string url;
+			/// <summary>
+			/// A human-readable representation of the archive info
+			/// </summary>
+			/// <returns></returns>
+			public override string ToString()
+			{
+				return string.Format("{0} - {1} ({2} - {3})", extension, description, author, url);
+			}
+		}
+		#endregion PHYSFS_ArchiveInfo
+
+		#region PHYSFS_ArchiveInfoInternal
+		/// <summary>
+		/// Information on various PhysicsFS-supported archives.
+		/// </summary>
+		/// <remarks>
+		/// This structure gives you details on what sort of archives are supported by this implementation of PhysicsFS. Archives tend to be things like ZIP files and such.
+		/// <p>
+		/// Not all binaries are created equal! PhysicsFS can be built with or without support for various archives. You can check with PHYSFS_supportedArchiveTypes() to see if your archive type is supported.
+		/// </p>
+		/// </remarks>
+		/// <seealso cref="PHYSFS_supportedArchiveTypes"/>\
+		// This is the internal PHYSFS_ArchiveInfo using IntPtrs for marshalling.
+		[StructLayout(LayoutKind.Sequential, Pack=4)]
+		private struct PHYSFS_ArchiveInfoInternal
+		{
+			/// <summary>
+			/// Archive file extension: "ZIP", for example.
+			/// </summary>
+			public IntPtr extension;
+			/// <summary>
+			/// Human-readable archive description.
+			/// </summary>
+			public IntPtr description;
+			/// <summary>
+			/// Person who did support for this archive.
+			/// </summary>
+			public IntPtr author;
+			/// <summary>
+			/// URL related to this archive.
+			/// </summary>
+			public IntPtr url;
+		}
+		#endregion PHYSFS_ArchiveInfoInternal
+
+		#region PHYSFS_File
+		/// <summary>
+		/// A PhysicsFS file handle.
+		/// </summary>
+		/// <remarks>You get a pointer to one of these when you open a file for reading, writing, or appending via PhysicsFS.
+		/// <p>As you can see from the lack of meaningful fields, you should treat this as opaque data. Don't try to manipulate the file handle, just pass the pointer you got, unmolested, to various PhysicsFS APIs.</p>
+		/// </remarks>
+		/// <seealso cref="PHYSFS_openRead"/>
+		/// <seealso cref="PHYSFS_openWrite"/>
+		/// <seealso cref="PHYSFS_openAppend"/>
+		/// <seealso cref="PHYSFS_close"/>
+        /// <seealso cref="PHYSFS_read(System.IntPtr, System.IntPtr, uint, uint)"/>
+		/// <seealso cref="PHYSFS_write"/>
+		/// <seealso cref="PHYSFS_seek"/>
+		/// <seealso cref="PHYSFS_tell"/>
+		/// <seealso cref="PHYSFS_eof"/>
+		/// <seealso cref="PHYSFS_setBuffer"/>
+		/// <seealso cref="PHYSFS_flush"/>
+		[StructLayout(LayoutKind.Sequential, Pack=4)]
+		public struct PHYSFS_File
+		{
+			/// <summary>
+			/// That's all you get. Don't touch. 
+			/// </summary>
+			public IntPtr opaque;
+		}
+		#endregion PHYSFS_File
+
+		#endregion Public Structs
+
+		#region Public Defines
+
+		/// <summary>
+		/// Tao.PhysFs's major version.
+		/// </summary>
+		public const int PHYSFS_VER_MAJOR = 1;
+		/// <summary>
+		/// Tao.PhysFs's minor version.
+		/// </summary>
+		public const int PHYSFS_VER_MINOR = 0;
+		/// <summary>
+		/// Tao.PhysFs's patch version.
+		/// </summary>
+		public const int PHYSFS_VER_PATCH = 1;
+
+		#endregion Public Defines
+
+		#region Public Functions
+		
+		#region PHYSFS_VERSION
+		/// <summary>
+		/// Information the version of PhysicsFS in use.
+		/// </summary>
+		/// <remarks>Represents the library's version as three levels: major revision (increments with massive changes, additions, and enhancements), minor revision (increments with backwards-compatible changes to the major revision), and patchlevel (increments with fixes to the minor revision).</remarks>
+		/// <param name="ver">The <see cref="PHYSFS_Version"/> to change.</param>
+		/// <seealso cref="PHYSFS_Version"/>
+		/// <seealso cref="PHYSFS_getLinkedVersion"/>
+		// Since this is dependant on the header file, we wrap our own.
+		[CLSCompliant(false)] // Not CLS Compliant because it's named the same as PHYSFS_Version
+		public static void PHYSFS_VERSION(out PHYSFS_Version ver)
+		{
+			ver.major = PHYSFS_VER_MAJOR;
+			ver.minor = PHYSFS_VER_MINOR;
+			ver.patch = PHYSFS_VER_PATCH;
+		}
+		#endregion PHYSFS_VERSION
+
+		#region PHYSFS_addToSearchPath
+		/// <summary>
+		/// Add an archive or directory to the search path.
+		/// </summary>
+		/// <remarks>If this is a duplicate, the entry is not added again, even though the function succeeds.</remarks>
+		/// <param name="newDir">directory or archive to add to the path, in platform-dependent notation.</param>
+		/// <param name="appendToPath">nonzero to append to search path, zero to prepend.</param>
+		/// <returns>nonzero if added to path, zero on failure (bogus archive, dir missing, etc). Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>.</returns>
+		/// <seealso cref="PHYSFS_removeFromSearchPath"/>
+		/// <seealso cref="PHYSFS_getSearchPath"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_addToSearchPath(string newDir, int appendToPath);
+		#endregion PHYSFS_addToSearchPath
+		
+		#region PHYSFS_close
+		/// <summary>
+		/// Close a PhysicsFS filehandle.
+		/// </summary>
+		/// <remarks>This call is capable of failing if the operating system was buffering writes to the physical media, and, now forced to write those changes to physical media, can not store the data for some reason. In such a case, the filehandle stays open. A well-written program should ALWAYS check the return value from the close call in addition to every writing call!</remarks>
+		/// <param name="handle">handle returned from PHYSFS_open*().</param>
+		/// <returns>nonzero on success, zero on error. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>.</returns>
+		/// <seealso cref="PHYSFS_openRead"/>
+		/// <seealso cref="PHYSFS_openWrite"/>
+		/// <seealso cref="PHYSFS_openAppend"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_close(IntPtr handle);
+		#endregion PHYSFS_close
+
+		#region PHYSFS_deinit
+		/// <summary>
+		/// Deinitialize the PhysicsFS library.
+		/// </summary>
+		/// <remarks>This closes any files opened via PhysicsFS, blanks the search/write paths, frees memory, and invalidates all of your file handles.
+		/// <p>Note that this call can FAIL if there's a file open for writing that refuses to close (for example, the underlying operating system was buffering writes to network filesystem, and the fileserver has crashed, or a hard drive has failed, etc). It is usually best to close all write handles yourself before calling this function, so that you can gracefully handle a specific failure.</p>
+		/// <p>Once successfully deinitialized, <see cref="PHYSFS_init"/> can be called again to restart the subsystem. All defaults API states are restored at this point.</p></remarks>
+		/// <returns>nonzero on success, zero on error. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>. If failure, state of PhysFS is undefined, and probably badly screwed up.</returns>
+		/// <seealso cref="PHYSFS_init"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_deinit();
+		#endregion PHYSFS_deinit
+
+		#region PHYSFS_delete
+		/// <summary>
+		/// Delete a file or directory.
+		/// </summary>
+		/// <remarks>(filename) is specified in platform-independent notation in relation to the write dir.
+		/// <p>A directory must be empty before this call can delete it.</p>
+		/// <p>Deleting a symlink will remove the link, not what it points to, regardless of whether you "permitSymLinks" or not.</p>
+		/// <p>So if you've got the write dir set to "C:\mygame\writedir" and call PHYSFS_delete("downloads/maps/level1.map") then the file "C:\mygame\writedir\downloads\maps\level1.map" is removed from the physical filesystem, if it exists and the operating system permits the deletion.</p>
+		/// <p>Note that on Unix systems, deleting a file may be successful, but the actual file won't be removed until all processes that have an open filehandle to it (including your program) close their handles.</p>
+		/// <p>Chances are, the bits that make up the file still exist, they are just made available to be written over at a later point. Don't consider this a security method or anything.</p></remarks>
+		/// <param name="filename">Filename to delete.</param>
+		/// <returns>nonzero on success, zero on error. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_delete(string filename);
+		#endregion PHYSFS_delete
+
+		#region PHYSFS_enumerateFilesInternal
+		/// <summary>
+		/// Get a file listing of a search path's directory.
+		/// </summary>
+		/// <param name="dir">directory in platform-independent notation to enumerate.</param>
+		/// <returns>Null-terminated array of null-terminated strings.</returns>
+		/// <remarks>Matching directories are interpolated. That is, if "C:\mydir" is in the search path and contains a directory "savegames" that contains "x.sav", "y.sav", and "z.sav", and there is also a "C:\userdir" in the search path that has a "savegames" subdirectory with "w.sav", then the following code:
+		/// <code>
+		/// char **rc = PHYSFS_enumerateFiles("savegames");
+		/// char **i;
+		/// for (i = rc; *i != NULL; i++)
+		///		printf(" * We've got [%s].\n", *i);
+		///		PHYSFS_freeList(rc);
+		/// </code>
+		/// ...will print:
+		/// <code>
+		///  * We've got [x.sav].
+		///  * We've got [y.sav].
+		///  * We've got [z.sav].
+		///  * We've got [w.sav].
+		/// </code>
+		/// <p>Feel free to sort the list however you like. We only promise there will be no duplicates, but not what order the final list will come back in.</p>
+		/// <p>Don't forget to call <see cref="PHYSFS_freeList"/> with the return value from this function when you are done with it.</p>
+		/// </remarks>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="PHYSFS_enumerateFiles"), SuppressUnmanagedCodeSecurity]
+		private extern static IntPtr PHYSFS_enumerateFilesInternal(string dir);
+		#endregion PHYSFS_enumerateFilesInternal
+
+		#region PHYSFS_enumerateFiles
+		/// <summary>
+		/// Get a file listing of a search path's directory.
+		/// </summary>
+		/// <param name="dir">directory in platform-independent notation to enumerate.</param>
+		/// <returns>Null-terminated array of null-terminated strings.</returns>
+		/// <remarks>Matching directories are interpolated. That is, if "C:\mydir" is in the search path and contains a directory "savegames" that contains "x.sav", "y.sav", and "z.sav", and there is also a "C:\userdir" in the search path that has a "savegames" subdirectory with "w.sav", then the following code:
+		/// <code>
+		/// char **rc = PHYSFS_enumerateFiles("savegames");
+		/// char **i;
+		/// for (i = rc; *i != NULL; i++)
+		///		printf(" * We've got [%s].\n", *i);
+		///		PHYSFS_freeList(rc);
+		/// </code>
+		/// ...will print:
+		/// <code>
+		///  * We've got [x.sav].
+		///  * We've got [y.sav].
+		///  * We've got [z.sav].
+		///  * We've got [w.sav].
+		/// </code>
+		/// <p>Feel free to sort the list however you like. We only promise there will be no duplicates, but not what order the final list will come back in.</p>
+		/// <p>Don't forget to call <see cref="PHYSFS_freeList"/> with the return value from this function when you are done with it.</p>
+		/// <p>Note that Tao.PhysFs calls <see cref="PHYSFS_freeList"/> for you.</p>
+		/// </remarks>
+		public static string[] PHYSFS_enumerateFiles(string dir)
+		{
+			ArrayList strings = new ArrayList(); // Use System.Collections.Generic.List if you're on .NET 2.0
+			IntPtr p = PHYSFS_enumerateFilesInternal(dir);
+			IntPtr original = p;
+			unsafe
+			{
+				int* ptr = (int*)p.ToPointer();
+				while( *ptr != 0 ) 
+				{
+					string s = Marshal.PtrToStringAnsi(new IntPtr(*ptr));
+					strings.Add(s);
+					p = new IntPtr(ptr + 1);
+					ptr++;
+				}
+			}
+			PHYSFS_freeList(original);
+			return (string[])strings.ToArray(typeof(string));
+		}
+		#endregion PHYSFS_enumerateFiles
+
+		#region PHYSFS_eof
+		/// <summary>
+		/// Check for end-of-file state on a PhysicsFS filehandle.
+		/// </summary>
+		/// <remarks>Determine if the end of file has been reached in a PhysicsFS filehandle.</remarks>
+		/// <param name="handle">handle returned from <see cref="PHYSFS_openRead"/>.</param>
+		/// <returns>nonzero if EOF, zero if not.</returns>
+        /// <seealso cref="PHYSFS_read(System.IntPtr, System.IntPtr, uint, uint)"/>
+		/// <seealso cref="PHYSFS_tell"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_eof(IntPtr handle);
+		#endregion PHYSFS_eof
+
+		#region PHYSFS_exists
+		/// <summary>
+		/// Determine if a file exists in the search path.
+		/// </summary>
+		/// <remarks>Reports true if there is an entry anywhere in the search path by the name of (fname).
+		/// <p>Note that entries that are symlinks are ignored if PHYSFS_permitSymbolicLinks(1) hasn't been called, so you might end up further down in the search path than expected.</p></remarks>
+		/// <param name="fname">filename in platform-independent notation.</param>
+		/// <returns>non-zero if filename exists. zero otherwise.</returns>
+		/// <seealso cref="PHYSFS_isDirectory"/>
+		/// <seealso cref="PHYSFS_isSymbolicLink"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_exists(string fname);
+		#endregion PHYSFS_exists
+
+		#region PHYSFS_fileLength
+		/// <summary>
+		/// Get total length of a file in bytes.
+		/// </summary>
+		/// <remarks>Note that if the file size can't be determined (since the archive is "streamed" or whatnot) than this will report (-1). Also note that if another process/thread is writing to this file at the same time, then the information this function supplies could be incorrect before you get it. Use with caution, or better yet, don't use at all.</remarks>
+		/// <param name="handle">handle returned from PHYSFS_open*().</param>
+		/// <returns>size in bytes of the file. -1 if can't be determined.</returns>
+		/// <seealso cref="PHYSFS_tell"/>
+		/// <seealso cref="PHYSFS_seek"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint64 PHYSFS_fileLength(IntPtr handle);
+		#endregion PHYSFS_fileLength
+
+		#region PHYSFS_flush
+		/// <summary>
+		/// Flush a buffered PhysicsFS file handle.
+		/// </summary>
+		/// <remarks>For buffered files opened for writing, this will put the current contents of the buffer to disk and flag the buffer as empty if possible.
+		/// <p>For buffered files opened for reading or unbuffered files, this is a safe no-op, and will report success.</p></remarks>
+		/// <param name="handle">handle returned from PHYSFS_open*().</param>
+		/// <returns>nonzero if successful, zero on error.</returns>
+		/// <seealso cref="PHYSFS_setBuffer"/>
+		/// <seealso cref="PHYSFS_close"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_flush(IntPtr handle);
+		#endregion PHYSFS_flush
+
+		#region PHYSFS_freeList
+		/// <summary>
+		/// Deallocate resources of lists returned by PhysicsFS.
+		/// </summary>
+		/// <remarks>Certain PhysicsFS functions return lists of information that are dynamically allocated. Use this function to free those resources.</remarks>
+		/// <param name="listVar">List of information specified as freeable by this function.</param>
+		/// <seealso cref="PHYSFS_getCdRomDirs"/>
+		/// <seealso cref="PHYSFS_enumerateFiles"/>
+		/// <seealso cref="PHYSFS_getSearchPath"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static void PHYSFS_freeList(IntPtr listVar);
+		#endregion PHYSFS_freeList
+
+		#region PHYSFS_getBaseDir
+		/// <summary>
+		/// Get the path where the application resides.
+		/// </summary>
+		/// <remarks>Helper function.
+		/// <p>Get the "base dir". This is the directory where the application was run from, which is probably the installation directory, and may or may not be the process's current working directory.</p>
+		/// <p>You should probably use the base dir in your search path.</p></remarks>
+		/// <returns>string of base dir in platform-dependent notation.</returns>
+		/// <seealso cref="PHYSFS_getUserDir"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static string PHYSFS_getBaseDir();
+		#endregion PHYSFS_getBaseDir
+
+		#region PHYSFS_getCdRomDirsInternal
+		/// <summary>
+		/// Get an array of paths to available CD-ROM drives.
+		/// </summary>
+		/// <remarks>The dirs returned are platform-dependent ("D:\" on Win32, "/cdrom" or whatnot on Unix). Dirs are only returned if there is a disc ready and accessible in the drive. So if you've got two drives (D: and E:), and only E: has a disc in it, then that's all you get. If the user inserts a disc in D: and you call this function again, you get both drives. If, on a Unix box, the user unmounts a disc and remounts it elsewhere, the next call to this function will reflect that change. Fun.
+		/// <p>The returned value is an array of strings, with a NULL entry to signify the end of the list:</p>
+		/// <p><code>
+		/// char **cds = PHYSFS_getCdRomDirs();
+		/// char **i;
+		/// for (i = cds; *i != NULL; i++)
+		///		printf("cdrom dir [%s] is available.\n", *i);
+		///	PHYSFS_freeList(cds);</code></p>
+		///	<p>This call may block while drives spin up. Be forewarned.</p>
+		///	<p>When you are done with the returned information, you may dispose of the resources by calling <see cref="PHYSFS_freeList"/> with the returned pointer.</p></remarks>
+		/// <returns>Null-terminated array of null-terminated strings.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="PHYSFS_getCdRomDirs"), SuppressUnmanagedCodeSecurity]
+		private extern static IntPtr PHYSFS_getCdRomDirsInternal();
+		#endregion PHYSFS_getCdRomDirsInternal
+
+		#region PHYSFS_getCdRomDirs
+		/// <summary>
+		/// Get an array of paths to available CD-ROM drives.
+		/// </summary>
+		/// <remarks>The dirs returned are platform-dependent ("D:\" on Win32, "/cdrom" or whatnot on Unix). Dirs are only returned if there is a disc ready and accessible in the drive. So if you've got two drives (D: and E:), and only E: has a disc in it, then that's all you get. If the user inserts a disc in D: and you call this function again, you get both drives. If, on a Unix box, the user unmounts a disc and remounts it elsewhere, the next call to this function will reflect that change. Fun.
+		/// <p>The returned value is an array of strings, with a NULL entry to signify the end of the list:</p>
+		/// <p><code>
+		/// char **cds = PHYSFS_getCdRomDirs();
+		/// char **i;
+		/// for (i = cds; *i != NULL; i++)
+		///		printf("cdrom dir [%s] is available.\n", *i);
+		///	PHYSFS_freeList(cds);</code></p>
+		///	<p>This call may block while drives spin up. Be forewarned.</p>
+		///	<p>When you are done with the returned information, you may dispose of the resources by calling <see cref="PHYSFS_freeList"/> with the returned pointer.</p>
+		///	<p>Note that Tao.PhysFs calls <see cref="PHYSFS_freeList"/> for you.</p>
+		///	</remarks>
+		/// <returns>Null-terminated array of null-terminated strings.</returns>
+		public static string[] PHYSFS_getCdRomDirs()
+		{
+			ArrayList strings = new ArrayList(); // Use System.Collections.Generic.List if you're on .NET 2.0
+			IntPtr p = PHYSFS_getCdRomDirsInternal();
+			IntPtr original = p;
+			unsafe
+			{
+				int* ptr = (int*)p.ToPointer();
+				while( *ptr != 0 ) 
+				{
+					string s = Marshal.PtrToStringAnsi(new IntPtr(*ptr));
+					strings.Add(s);
+					p = new IntPtr(ptr + 1);
+					ptr++;
+				}
+			}
+			PHYSFS_freeList(original);
+			return (string[])strings.ToArray(typeof(string));
+		}
+		#endregion PHYSFS_getCdRomDirs
+
+		#region PHYSFS_getDirSeparator
+		/// <summary>
+		/// Get platform-dependent dir separator string.
+		/// </summary>
+		/// <remarks>This returns "\\\\" on win32, "/" on Unix, and ":" on MacOS. It may be more than one character, depending on the platform, and your code should take that into account. Note that this is only useful for setting up the search/write paths, since access into those dirs always use '/' (platform-independent notation) to separate directories. This is also handy for getting platform-independent access when using stdio calls.</remarks>
+		/// <returns>null-terminated string of platform's dir separator.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static string PHYSFS_getDirSeparator();
+		#endregion PHYSFS_getDirSeparator
+
+		#region PHYSFS_getLastError
+		/// <summary>
+		/// Get human-readable error information.
+		/// </summary>
+		/// <remarks>Get the last PhysicsFS error message as a null-terminated string. This will be NULL if there's been no error since the last call to this function. The pointer returned by this call points to an internal buffer. Each thread has a unique error state associated with it, but each time a new error message is set, it will overwrite the previous one associated with that thread. It is safe to call this function at anytime, even before <see cref="PHYSFS_init"/>.</remarks>
+		/// <returns>string of last error message.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static string PHYSFS_getLastError();
+		#endregion PHYSFS_getLastError
+
+		#region PHYSFS_getLastModTime
+		/// <summary>
+		/// Get the last modification time of a file.
+		/// </summary>
+		/// <remarks>The modtime is returned as a number of seconds since the epoch (Jan 1, 1970). The exact derivation and accuracy of this time depends on the particular archiver. If there is no reasonable way to obtain this information for a particular archiver, or there was some sort of error, this function returns (-1).</remarks>
+		/// <param name="filename">filename to check, in platform-independent notation.</param>
+		/// <returns>last modified time of the file. -1 if it can't be determined.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint64 PHYSFS_getLastModTime(string filename);
+		#endregion PHYSFS_getLastModTime
+
+		#region PHYSFS_getLinkedVersion
+		/// <summary>
+		/// Get the version of PhysicsFS that is linked against your program.
+		/// </summary>
+		/// <remarks>This function may be called safely at any time, even before <see cref="PHYSFS_init"/>.</remarks>
+		/// <param name="ver">The output PHYSFS_Version structure.</param>
+		/// <seealso cref="PHYSFS_VERSION"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static void PHYSFS_getLinkedVersion (out PHYSFS_Version ver);
+		#endregion PHYSFS_getLinkedVersion
+
+		#region PHYSFS_getRealDir
+		/// <summary>
+		/// Figure out where in the search path a file resides.
+		/// </summary>
+		/// <remarks>The file is specified in platform-independent notation. The returned filename will be the element of the search path where the file was found, which may be a directory, or an archive. Even if there are multiple matches in different parts of the search path, only the first one found is used, just like when opening a file.
+		/// <p>So, if you look for "maps/level1.map", and C:\mygame is in your search path and C:\mygame\maps\level1.map exists, then "C:\mygame" is returned.</p>
+		/// <p>If a any part of a match is a symbolic link, and you've not explicitly permitted symlinks, then it will be ignored, and the search for a match will continue.</p></remarks>
+		/// <param name="filename">file to look for.</param>
+		/// <returns>string of element of search path containing the the file in question. NULL if not found.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static string PHYSFS_getRealDir(string filename);
+		#endregion PHYSFS_getRealDir
+
+		#region PHYSFS_getSearchPath
+		/// <summary>
+		/// Get the current search path.
+		/// </summary>
+		/// <remarks>The default search path is an empty list.
+		/// <p>The returned value is an array of strings, with a NULL entry to signify the end of the list:</p>
+		/// <p>
+		/// <code>
+		/// char **i;
+		/// for (i = PHYSFS_getSearchPath(); *i != NULL; i++)
+		///		printf("[%s] is in the search path.\n", *i);
+		///	</code></p>
+		///	<p>When you are done with the returned information, you may dispose of the resources by calling <see cref="PHYSFS_freeList"/> with the returned pointer.</p>
+		///	<p>Please note that Tao.PhysFs calls <see cref="PHYSFS_freeList"/> for you.</p>
+		///	</remarks>
+		/// <returns>Null-terminated array of null-terminated strings. NULL if there was a problem (read: OUT OF MEMORY).</returns>
+		/// <seealso cref="PHYSFS_addToSearchPath"/>
+		/// <seealso cref="PHYSFS_removeFromSearchPath"/>
+		public static string[] PHYSFS_getSearchPath()
+		{
+			ArrayList strings = new ArrayList(); // Use System.Collections.Generic.List if you're on .NET 2.0
+			IntPtr p = PHYSFS_getSearchPathInternal();
+			IntPtr original = p;
+			unsafe
+			{
+				int* ptr = (int*)p.ToPointer();
+				while( *ptr != 0 ) 
+				{
+					string s = Marshal.PtrToStringAnsi(new IntPtr(*ptr));
+					strings.Add(s);
+					p = new IntPtr(ptr + 1);
+					ptr++;
+				}
+			}
+			PHYSFS_freeList(original);
+			return (string[])strings.ToArray(typeof(string));
+		}
+		#endregion PHYSFS_getSearchPath
+
+		#region PHYSFS_getSearchPathInternal
+		/// <summary>
+		/// Get the current search path.
+		/// </summary>
+		/// <remarks>The default search path is an empty list.
+		/// <p>The returned value is an array of strings, with a NULL entry to signify the end of the list:</p>
+		/// <p>
+		/// <code>
+		/// char **i;
+		/// for (i = PHYSFS_getSearchPath(); *i != NULL; i++)
+		///		printf("[%s] is in the search path.\n", *i);
+		///	</code></p>
+		///	<p>When you are done with the returned information, you may dispose of the resources by calling PHYSFS_freeList() with the returned pointer.</p></remarks>
+		/// <returns>Null-terminated array of null-terminated strings. NULL if there was a problem (read: OUT OF MEMORY).</returns>
+		/// <seealso cref="PHYSFS_addToSearchPath"/>
+		/// <seealso cref="PHYSFS_removeFromSearchPath"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="PHYSFS_getSearchPath"), SuppressUnmanagedCodeSecurity]
+		private extern static IntPtr PHYSFS_getSearchPathInternal();
+		#endregion PHYSFS_getSearchPathInternal
+
+		#region PHYSFS_getUserDir
+		/// <summary>
+		/// Get the path where user's home directory resides.
+		/// </summary>
+		/// <remarks>Helper function.
+		/// <p>Get the "user dir". This is meant to be a suggestion of where a specific user of the system can store files. On Unix, this is her home directory. On systems with no concept of multiple home directories (MacOS, win95), this will default to something like "C:\mybasedir\users\username" where "username" will either be the login name, or "default" if the platform doesn't support multiple users, either.</p>
+		/// <p>You should probably use the user dir as the basis for your write dir, and also put it near the beginning of your search path.</p></remarks>
+		/// <returns>string of user dir in platform-dependent notation.</returns>
+		/// <seealso cref="PHYSFS_getBaseDir"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static string PHYSFS_getUserDir();
+		#endregion PHYSFS_getUserDir
+
+		#region PHYSFS_getWriteDir
+		/// <summary>
+		/// Get path where PhysicsFS will allow file writing.
+		/// </summary>
+		/// <remarks>Get the current write dir. The default write dir is NULL.</remarks>
+		/// <returns>string of write dir in platform-dependent notation, OR NULL IF NO WRITE PATH IS CURRENTLY SET.</returns>
+		/// <seealso cref="PHYSFS_setWriteDir"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static string PHYSFS_getWriteDir();
+		#endregion PHYSFS_getWriteDir
+
+		#region PHYSFS_init
+		/// <summary>
+		/// Initialize the PhysicsFS library.
+		/// </summary>
+		/// <remarks>This must be called before any other PhysicsFS function.
+		/// <p>This should be called prior to any attempts to change your process's current working directory.</p></remarks>
+		/// <param name="argv0">the argv[0] string passed to your program's mainline. This may be NULL on most platforms (such as ones without a standard main() function), but you should always try to pass something in here. Unix-like systems such as Linux _need_ to pass argv[0] from main() in here.</param>
+		/// <returns>nonzero on success, zero on error. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>.</returns>
+		/// <seealso cref="PHYSFS_deinit"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_init(string argv0);
+		#endregion PHYSFS_init
+
+		#region PHYSFS_isDirectory
+		/// <summary>
+		/// Determine if a file in the search path is really a directory.
+		/// </summary>
+		/// <remarks>Determine if the first occurence of (fname) in the search path is really a directory entry.
+		/// <p>Note that entries that are symlinks are ignored if PHYSFS_permitSymbolicLinks(1) hasn't been called, so you might end up further down in the search path than expected.</p></remarks>
+		/// <param name="filename">filename in platform-independent notation.</param>
+		/// <returns>non-zero if filename exists and is a directory. zero otherwise.</returns>
+		/// <seealso cref="PHYSFS_exists"/>
+		/// <seealso cref="PHYSFS_isSymbolicLink"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_isDirectory(string filename);
+		#endregion PHYSFS_isDirectory
+
+		#region PHYSFS_isSymbolicLink
+		/// <summary>
+		/// Determine if a file in the search path is really a symbolic link.
+		/// </summary>
+		/// <remarks>Determine if the first occurence of (fname) in the search path is really a symbolic link.
+		/// <p>Note that entries that are symlinks are ignored if PHYSFS_permitSymbolicLinks(1) hasn't been called, and as such, this function will always return 0 in that case.</p></remarks>
+		/// <param name="filename">filename in platform-independent notation.</param>
+		/// <returns>non-zero if filename exists and is a symlink. zero otherwise.</returns>
+		/// <seealso cref="PHYSFS_exists"/>
+		/// <seealso cref="PHYSFS_isDirectory"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_isSymbolicLink(string filename);
+		#endregion PHYSFS_isSymbolicLink
+
+		#region PHYSFS_mkdir
+		/// <summary>
+		/// Create a directory.
+		/// </summary>
+		/// <remarks>This is specified in platform-independent notation in relation to the write dir. All missing parent directories are also created if they don't exist.
+		/// <p>So if you've got the write dir set to "C:\mygame\writedir" and call PHYSFS_mkdir("downloads/maps") then the directories "C:\mygame\writedir\downloads" and "C:\mygame\writedir\downloads\maps" will be created if possible. If the creation of "maps" fails after we have successfully created "downloads", then the function leaves the created directory behind and reports failure.</p></remarks>
+		/// <param name="dirName">New dir to create.</param>
+		/// <returns>nonzero on success, zero on error. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_mkdir(string dirName);
+		#endregion PHYSFS_mkdir
+
+		#region PHYSFS_openAppend
+		/// <summary>
+		/// Open a file for appending.
+		/// </summary>
+		/// <remarks>Open a file for writing, in platform-independent notation and in relation to the write dir as the root of the writable filesystem. The specified file is created if it doesn't exist. If it does exist, the writing offset is set to the end of the file, so the first write will be the byte after the end.
+		/// <p>Note that entries that are symlinks are ignored if PHYSFS_permitSymbolicLinks(1) hasn't been called, and opening a symlink with this function will fail in such a case.</p></remarks>
+		/// <param name="filename">File to open.</param>
+		/// <returns>A valid PhysicsFS filehandle on success, NULL on error. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>.</returns>
+		/// <seealso cref="PHYSFS_openRead"/>
+		/// <seealso cref="PHYSFS_openWrite"/>
+		/// <seealso cref="PHYSFS_write"/>
+		/// <seealso cref="PHYSFS_close"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static IntPtr PHYSFS_openAppend(string filename);
+		#endregion PHYSFS_openAppend
+
+		#region PHYSFS_openRead
+		/// <summary>
+		/// Open a file for reading.
+		/// </summary>
+		/// <remarks>Open a file for reading, in platform-independent notation. The search path is checked one at a time until a matching file is found, in which case an abstract filehandle is associated with it, and reading may be done. The reading offset is set to the first byte of the file.
+		/// <p>Note that entries that are symlinks are ignored if PHYSFS_permitSymbolicLinks(1) hasn't been called, and opening a symlink with this function will fail in such a case.</p></remarks>
+		/// <param name="filename">File to open.</param>
+		/// <returns>A valid PhysicsFS filehandle on success, NULL on error. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>.</returns>
+		/// <seealso cref="PHYSFS_openWrite"/>
+		/// <seealso cref="PHYSFS_openAppend"/>
+        /// <seealso cref="PHYSFS_read(System.IntPtr, System.IntPtr, uint, uint)"/>
+		/// <seealso cref="PHYSFS_close"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static IntPtr PHYSFS_openRead(string filename);
+		#endregion PHYSFS_openRead
+
+		#region PHYSFS_openWrite
+		/// <summary>
+		/// Open a file for writing.
+		/// </summary>
+		/// <remarks>Open a file for writing, in platform-independent notation and in relation to the write dir as the root of the writable filesystem. The specified file is created if it doesn't exist. If it does exist, it is truncated to zero bytes, and the writing offset is set to the start.
+		/// <p>Note that entries that are symlinks are ignored if PHYSFS_permitSymbolicLinks(1) hasn't been called, and opening a symlink with this function will fail in such a case.</p></remarks>
+		/// <param name="filename">File to open.</param>
+		/// <returns>A valid PhysicsFS filehandle on success, NULL on error. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>.</returns>
+		/// <seealso cref="PHYSFS_openRead"/>
+		/// <seealso cref="PHYSFS_openAppend"/>
+		/// <seealso cref="PHYSFS_write"/>
+		/// <seealso cref="PHYSFS_close"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static IntPtr PHYSFS_openWrite(string filename);
+		#endregion PHYSFS_openWrite
+
+		#region PHYSFS_permitSymbolicLinks
+		/// <summary>
+		/// Enable or disable following of symbolic links.
+		/// </summary>
+		/// <remarks>Some physical filesystems and archives contain files that are just pointers to other files. On the physical filesystem, opening such a link will (transparently) open the file that is pointed to.
+		/// <p>By default, PhysicsFS will check if a file is really a symlink during open calls and fail if it is. Otherwise, the link could take you outside the write and search paths, and compromise security.</p>
+		/// <p>If you want to take that risk, call this function with a non-zero parameter. Note that this is more for sandboxing a program's scripting language, in case untrusted scripts try to compromise the system. Generally speaking, a user could very well have a legitimate reason to set up a symlink, so unless you feel there's a specific danger in allowing them, you should permit them.</p>
+		/// <p>Symlinks are only explicitly checked when dealing with filenames in platform-independent notation. That is, when setting up your search and write paths, etc, symlinks are never checked for.</p>
+		/// <p>Symbolic link permission can be enabled or disabled at any time after you've called PHYSFS_init(), and is disabled by default.</p></remarks>
+		/// <param name="allow">nonzero to permit symlinks, zero to deny linking.</param>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static void PHYSFS_permitSymbolicLinks(int allow);
+		#endregion PHYSFS_permitSymbolicLinks
+
+		#region PHYSFS_read
+		/// <summary>
+		/// Read data from a PhysicsFS filehandle to a buffer location which already has memory allocated to it.
+		/// </summary>
+		/// <remarks>The file must be opened for reading. Memory must be allocated.</remarks>
+		/// <param name="handle">handle returned from <see cref="PHYSFS_openRead"/>.</param>
+		/// <param name="buffer">buffer to store read data into.</param>
+		/// <param name="objSize">size in bytes of objects being read from (handle).</param>
+		/// <param name="objCount">number of (objSize) objects to read from (handle).</param>
+		/// <returns>number of objects read. <see cref="PHYSFS_getLastError"/> can shed light on the reason this might be less than (objCount), as can <see cref="PHYSFS_eof"/>. -1 if complete failure.</returns>
+		/// <seealso cref="PHYSFS_eof"/>
+		// PHYSFS_sint64 PHYSFS_read(PHYSFS_file * handle, void * buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="PHYSFS_read"), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint64 PHYSFS_read(IntPtr handle, IntPtr buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
+
+        /// <summary>
+		/// Read data from a PhysicsFS filehandle. Buffer memory is allocated for you.
+		/// </summary>
+        /// <remarks>The file must be opened for reading. Note that this allocates memory and points to it through the buffer. You must then free the memory by using Marshal.FreeHGlobal(buffer)</remarks>
+		/// <param name="handle">handle returned from <see cref="PHYSFS_openRead"/>.</param>
+		/// <param name="buffer">buffer where memory is stored. Memory is allocated for you.</param>
+		/// <param name="objSize">size in bytes of objects being read from (handle).</param>
+		/// <param name="objCount">number of (objSize) objects to read from (handle).</param>
+		/// <returns>number of objects read. <see cref="PHYSFS_getLastError"/> can shed light on the reason this might be less than (objCount), as can <see cref="PHYSFS_eof"/>. -1 if complete failure.</returns>
+		/// <seealso cref="PHYSFS_eof"/>
+		[CLSCompliant(false)]
+		public static PHYSFS_sint64 PHYSFS_read(IntPtr handle, out IntPtr buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
+		{
+            buffer = Marshal.AllocHGlobal((int)objSize * (int)objCount);
+            return PHYSFS_read(handle, buffer, objSize, objCount);
+		}
+
+        /// <summary>
+		/// Read a byte array from a PhysicsFS filehandle.
+		/// </summary>
+		/// <remarks>The file must be opened for reading.</remarks>
+		/// <param name="handle">handle returned from <see cref="PHYSFS_openRead"/>.</param>
+		/// <param name="buffer">byte array to read in</param>
+		/// <param name="objSize">size in bytes of objects being read from (handle).</param>
+		/// <param name="objCount">number of (objSize) objects to read from (handle).</param>
+		/// <returns>number of objects read. <see cref="PHYSFS_getLastError"/> can shed light on the reason this might be less than (objCount), as can <see cref="PHYSFS_eof"/>. -1 if complete failure.</returns>
+		/// <seealso cref="PHYSFS_eof"/>
+		[CLSCompliant(false)]
+        public static PHYSFS_sint64 PHYSFS_read(IntPtr handle, out byte[] buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
+        {
+            IntPtr ptrBuffer;
+            PHYSFS_sint64 ret = PHYSFS_read(handle, out ptrBuffer, objSize, objCount);
+            buffer = new byte[objCount];
+            Marshal.Copy(ptrBuffer, buffer, 0, (int)objCount);
+            Marshal.FreeHGlobal(ptrBuffer);
+            return ret;
+        }
+
+        /// <summary>
+        /// Read a char array from a PhysicsFS filehandle.
+        /// </summary>
+        /// <remarks>The file must be opened for reading.</remarks>
+        /// <param name="handle">handle returned from <see cref="PHYSFS_openRead"/>.</param>
+        /// <param name="buffer">char array to read in</param>
+        /// <param name="objSize">size in bytes of objects being read from (handle).</param>
+        /// <param name="objCount">number of (objSize) objects to read from (handle).</param>
+        /// <returns>number of objects read. <see cref="PHYSFS_getLastError"/> can shed light on the reason this might be less than (objCount), as can <see cref="PHYSFS_eof"/>. -1 if complete failure.</returns>
+        /// <seealso cref="PHYSFS_eof"/>
+		[CLSCompliant(false)]
+        public static PHYSFS_sint64 PHYSFS_read(IntPtr handle, out char[] buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
+        {
+            IntPtr ptrBuffer;
+            PHYSFS_sint64 ret = PHYSFS_read(handle, out ptrBuffer, objSize, objCount);
+            buffer = new char[objCount];
+            Marshal.Copy(ptrBuffer, buffer, 0, (int)objCount);
+            Marshal.FreeHGlobal(ptrBuffer);
+            return ret;
+        }
+
+        /// <summary>
+        /// Read a double array from a PhysicsFS filehandle.
+        /// </summary>
+        /// <remarks>The file must be opened for reading.</remarks>
+        /// <param name="handle">handle returned from <see cref="PHYSFS_openRead"/>.</param>
+        /// <param name="buffer">double array to read in</param>
+        /// <param name="objSize">size in bytes of objects being read from (handle).</param>
+        /// <param name="objCount">number of (objSize) objects to read from (handle).</param>
+        /// <returns>number of objects read. <see cref="PHYSFS_getLastError"/> can shed light on the reason this might be less than (objCount), as can <see cref="PHYSFS_eof"/>. -1 if complete failure.</returns>
+        /// <seealso cref="PHYSFS_eof"/>
+		[CLSCompliant(false)]
+        public static PHYSFS_sint64 PHYSFS_read(IntPtr handle, out double[] buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
+        {
+            IntPtr ptrBuffer;
+            PHYSFS_sint64 ret = PHYSFS_read(handle, out ptrBuffer, objSize, objCount);
+            buffer = new double[objCount];
+            Marshal.Copy(ptrBuffer, buffer, 0, (int)objCount);
+            Marshal.FreeHGlobal(ptrBuffer);
+            return ret;
+        }
+
+        /// <summary>
+        /// Read a float array from a PhysicsFS filehandle.
+        /// </summary>
+        /// <remarks>The file must be opened for reading.</remarks>
+        /// <param name="handle">handle returned from <see cref="PHYSFS_openRead"/>.</param>
+        /// <param name="buffer">float array to read in</param>
+        /// <param name="objSize">size in bytes of objects being read from (handle).</param>
+        /// <param name="objCount">number of (objSize) objects to read from (handle).</param>
+        /// <returns>number of objects read. <see cref="PHYSFS_getLastError"/> can shed light on the reason this might be less than (objCount), as can <see cref="PHYSFS_eof"/>. -1 if complete failure.</returns>
+        /// <seealso cref="PHYSFS_eof"/>
+		[CLSCompliant(false)]
+        public static PHYSFS_sint64 PHYSFS_read(IntPtr handle, out float[] buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
+        {
+            IntPtr ptrBuffer;
+            PHYSFS_sint64 ret = PHYSFS_read(handle, out ptrBuffer, objSize, objCount);
+            buffer = new float[objCount];
+            Marshal.Copy(ptrBuffer, buffer, 0, (int)objCount);
+            Marshal.FreeHGlobal(ptrBuffer);
+            return ret;
+        }
+
+        /// <summary>
+        /// Read a integer array from a PhysicsFS filehandle.
+        /// </summary>
+        /// <remarks>The file must be opened for reading.</remarks>
+        /// <param name="handle">handle returned from <see cref="PHYSFS_openRead"/>.</param>
+        /// <param name="buffer">integer array to read in</param>
+        /// <param name="objSize">size in bytes of objects being read from (handle).</param>
+        /// <param name="objCount">number of (objSize) objects to read from (handle).</param>
+        /// <returns>number of objects read. <see cref="PHYSFS_getLastError"/> can shed light on the reason this might be less than (objCount), as can <see cref="PHYSFS_eof"/>. -1 if complete failure.</returns>
+        /// <seealso cref="PHYSFS_eof"/>
+		[CLSCompliant(false)]
+        public static PHYSFS_sint64 PHYSFS_read(IntPtr handle, out int[] buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
+        {
+            IntPtr ptrBuffer;
+            PHYSFS_sint64 ret = PHYSFS_read(handle, out ptrBuffer, objSize, objCount);
+            buffer = new int[objCount];
+            Marshal.Copy(ptrBuffer, buffer, 0, (int)objCount);
+            Marshal.FreeHGlobal(ptrBuffer);
+            return ret;
+        }
+
+        /// <summary>
+        /// Read a array of long values from a PhysicsFS filehandle.
+        /// </summary>
+        /// <remarks>The file must be opened for reading.</remarks>
+        /// <param name="handle">handle returned from <see cref="PHYSFS_openRead"/>.</param>
+        /// <param name="buffer">byte array to read in</param>
+        /// <param name="objSize">size in bytes of objects being read from (handle).</param>
+        /// <param name="objCount">number of (objSize) objects to read from (handle).</param>
+        /// <returns>number of objects read. <see cref="PHYSFS_getLastError"/> can shed light on the reason this might be less than (objCount), as can <see cref="PHYSFS_eof"/>. -1 if complete failure.</returns>
+        /// <seealso cref="PHYSFS_eof"/>
+		[CLSCompliant(false)]
+        public static PHYSFS_sint64 PHYSFS_read(IntPtr handle, out long[] buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
+        {
+            IntPtr ptrBuffer;
+            PHYSFS_sint64 ret = PHYSFS_read(handle, out ptrBuffer, objSize, objCount);
+            buffer = new long[objCount];
+            Marshal.Copy(ptrBuffer, buffer, 0, (int)objCount);
+            Marshal.FreeHGlobal(ptrBuffer);
+            return ret;
+        }
+
+        /// <summary>
+        /// Read a array of short values from a PhysicsFS filehandle.
+        /// </summary>
+        /// <remarks>The file must be opened for reading.</remarks>
+        /// <param name="handle">handle returned from <see cref="PHYSFS_openRead"/>.</param>
+        /// <param name="buffer">short array to read in</param>
+        /// <param name="objSize">size in bytes of objects being read from (handle).</param>
+        /// <param name="objCount">number of (objSize) objects to read from (handle).</param>
+        /// <returns>number of objects read. <see cref="PHYSFS_getLastError"/> can shed light on the reason this might be less than (objCount), as can <see cref="PHYSFS_eof"/>. -1 if complete failure.</returns>
+        /// <seealso cref="PHYSFS_eof"/>
+        [CLSCompliant(false)]
+        public static PHYSFS_sint64 PHYSFS_read(IntPtr handle, out short[] buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
+        {
+            IntPtr ptrBuffer;
+            PHYSFS_sint64 ret = PHYSFS_read(handle, out ptrBuffer, objSize, objCount);
+            buffer = new short[objCount];
+            Marshal.Copy(ptrBuffer, buffer, 0, (int)objCount);
+            Marshal.FreeHGlobal(ptrBuffer);
+            return ret;
+        }
+		#endregion PHYSFS_read
+
+		#region PHYSFS_readSBE16
+		/// <summary>
+		/// Read and convert a signed 16-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read a signed 16-bit bigendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readSBE16(IntPtr handle, ref PHYSFS_sint16 val);
+		#endregion PHYSFS_readSBE16
+
+		#region PHYSFS_readSBE32
+		/// <summary>
+		/// Read and convert a signed 32-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read a signed 32-bit bigendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readSBE32(IntPtr handle, ref PHYSFS_sint32 val);
+		#endregion PHYSFS_readSBE32
+
+		#region PHYSFS_readSBE64
+		/// <summary>
+		/// Read and convert a signed 64-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read a signed 64-bit bigendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readSBE64(IntPtr handle, ref PHYSFS_sint64 val);
+		#endregion PHYSFS_readSBE64
+
+		#region PHYSFS_readSLE16
+		/// <summary>
+		/// Read and convert a signed 16-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read a signed 16-bit littleendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readSLE16(IntPtr handle, ref PHYSFS_sint16 val);
+		#endregion PHYSFS_readSLE16
+
+		#region PHYSFS_readSLE32
+		/// <summary>
+		/// Read and convert a signed 32-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read a signed 32-bit littleendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readSLE32(IntPtr handle, ref PHYSFS_sint32 val);
+		#endregion PHYSFS_readSLE32
+
+		#region PHYSFS_readSLE64
+		/// <summary>
+		/// Read and convert a signed 64-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read a signed 64-bit littleendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readSLE64(IntPtr handle, ref PHYSFS_sint64 val);
+		#endregion PHYSFS_readSLE64
+
+		#region PHYSFS_readUBE16
+		/// <summary>
+		/// Read and convert an unsigned 16-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read an unsigned 16-bit bigendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readUBE16(IntPtr handle, ref PHYSFS_uint16 val);
+		#endregion PHYSFS_readUBE16
+
+		#region PHYSFS_readUBE32
+		/// <summary>
+		/// Read and convert an unsigned 32-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read an unsigned 32-bit bigendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readUBE32(IntPtr handle, ref PHYSFS_uint32 val);
+		#endregion PHYSFS_readUBE32
+
+		#region PHYSFS_readUBE64
+		/// <summary>
+		/// Read and convert an unsigned 64-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read an unsigned 64-bit bigendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readUBE64(IntPtr handle, ref PHYSFS_uint64 val);
+		#endregion PHYSFS_readUBE64
+
+		#region PHYSFS_readULE16
+		/// <summary>
+		/// Read and convert an unsigned 16-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read an unsigned 16-bit littleendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readULE16(IntPtr handle, ref PHYSFS_uint16 val);
+		#endregion PHYSFS_readULE16
+
+		#region PHYSFS_readULE32
+		/// <summary>
+		/// Read and convert an unsigned 32-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read an unsigned 32-bit littleendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readULE32(IntPtr handle, ref PHYSFS_uint32 val);
+		#endregion PHYSFS_readULE32
+
+		#region PHYSFS_readULE64
+		/// <summary>
+		/// Read and convert an unsigned 64-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Read an unsigned 64-bit littleendian value from a file and convert it to the platform's native byte order.</remarks>
+		/// <param name="handle">PhysicsFS file handle from which to read.</param>
+		/// <param name="val">Where value should be stored.</param>
+		/// <returns>zero on failure, non-zero on success. If successful, val will store the result. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_readULE64(IntPtr handle, ref PHYSFS_uint32 val);
+		#endregion PHYSFS_readULE64
+
+		#region PHYSFS_removeFromSearchPath
+		/// <summary>
+		/// Remove a directory or archive from the search path.
+		/// </summary>
+		/// <remarks>This must be a (case-sensitive) match to a dir or archive already in the search path, specified in platform-dependent notation.
+		/// <p>This call will fail (and fail to remove from the path) if the element still has files open in it.</p></remarks>
+		/// <param name="oldDir">dir/archive to remove.</param>
+		/// <returns>nonzero on success, zero on failure. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>().</returns>
+		/// <seealso cref="PHYSFS_addToSearchPath"/>
+		/// <seealso cref="PHYSFS_getSearchPath"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_removeFromSearchPath(string oldDir);
+		#endregion PHYSFS_removeFromSearchPath
+
+		#region PHYSFS_seek
+		/// <summary>
+		/// Seek to a new position within a PhysicsFS filehandle.
+		/// </summary>
+		/// <remarks>The next read or write will occur at that place. Seeking past the beginning or end of the file is not allowed, and causes an error.</remarks>
+		/// <param name="handle">handle returned from PHYSFS_open*().</param>
+		/// <param name="pos">number of bytes from start of file to seek to.</param>
+		/// <returns>nonzero on success, zero on error. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>().</returns>
+		/// <seealso cref="PHYSFS_tell"/>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_seek(IntPtr handle, PHYSFS_uint64 pos);
+		#endregion PHYSFS_seek
+
+		#region PHYSFS_setBuffer
+		/// <summary>
+		/// Set up buffering for a PhysicsFS file handle.
+		/// </summary>
+		/// <remarks>Define an i/o buffer for a file handle. A memory block of (bufsize) bytes will be allocated and associated with (handle).
+        /// <p>For files opened for reading, up to (bufsize) bytes are read from (handle) and stored in the internal buffer. Calls to <see cref="PHYSFS_read(System.IntPtr, System.IntPtr, uint, uint)"/>() will pull from this buffer until it is empty, and then refill it for more reading. Note that compressed files, like ZIP archives, will decompress while buffering, so this can be handy for offsetting CPU-intensive operations. The buffer isn't filled until you do your next read.</p>
+		/// <p>For files opened for writing, data will be buffered to memory until the buffer is full or the buffer is flushed. Closing a handle implicitly causes a flush...check your return values!</p>
+		/// <p>Seeking, etc transparently accounts for buffering.</p>
+		/// <p>You can resize an existing buffer by calling this function more than once on the same file. Setting the buffer size to zero will free an existing buffer.</p>
+		/// <p>PhysicsFS file handles are unbuffered by default.</p>
+		/// <p>Please check the return value of this function! Failures can include not being able to seek backwards in a read-only file when removing the buffer, not being able to allocate the buffer, and not being able to flush the buffer to disk, among other unexpected problems.</p></remarks>
+		/// <param name="handle">handle returned from PHYSFS_open*().</param>
+		/// <param name="bufsize">size, in bytes, of buffer to allocate.</param>
+		/// <returns>nonzero if successful, zero on error.</returns>
+		/// <seealso cref="PHYSFS_flush"/>
+        /// <seealso cref="PHYSFS_read(System.IntPtr, System.IntPtr, uint, uint)"/>
+		/// <seealso cref="PHYSFS_write"/>
+		/// <seealso cref="PHYSFS_close"/>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_setBuffer(IntPtr handle, PHYSFS_uint64 bufsize);
+		#endregion PHYSFS_setBuffer
+
+		#region PHYSFS_setSaneConfig
+		/// <summary>
+		/// Set up sane, default paths.
+		/// </summary>
+		/// <remarks>Helper function.
+		/// <p>The write dir will be set to "userdir/.organization/appName", which is created if it doesn't exist.</p>
+		/// <p>The above is sufficient to make sure your program's configuration directory is separated from other clutter, and platform-independent. The period before "mygame" even hides the directory on Unix systems.</p>
+		/// <p>The search path will be:
+		/// * The Write Dir (created if it doesn't exist)
+		/// * The Base Dir (PHYSFS_getBaseDir())
+		/// * All found CD-ROM dirs (optionally)</p>
+		/// <p>These directories are then searched for files ending with the extension (archiveExt), which, if they are valid and supported archives, will also be added to the search path. If you specified "PKG" for (archiveExt), and there's a file named data.PKG in the base dir, it'll be checked. Archives can either be appended or prepended to the search path in alphabetical order, regardless of which directories they were found in.</p>
+		/// <p>All of this can be accomplished from the application, but this just does it all for you. Feel free to add more to the search path manually, too.</p></remarks>
+		/// <param name="organization">Name of your company/group/etc to be used as a dirname, so keep it small, and no-frills.</param>
+		/// <param name="appName">Program-specific name of your program, to separate it from other programs using PhysicsFS.</param>
+		/// <param name="archiveExt">File extension used by your program to specify an archive. For example, Quake 3 uses "pk3", even though they are just zipfiles. Specify NULL to not dig out archives automatically. Do not specify the '.' char; If you want to look for ZIP files, specify "ZIP" and not ".ZIP" ... the archive search is case-insensitive.</param>
+		/// <param name="includeCdRoms">Non-zero to include CD-ROMs in the search path, and (if (archiveExt) != NULL) search them for archives. This may cause a significant amount of blocking while discs are accessed, and if there are no discs in the drive (or even not mounted on Unix systems), then they may not be made available anyhow. You may want to specify zero and handle the disc setup yourself.</param>
+		/// <param name="archivesFirst">Non-zero to prepend the archives to the search path. Zero to append them. Ignored if !(archiveExt).</param>
+		/// <returns>nonzero on success, zero on error. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>().</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_setSaneConfig(string organization, string appName, string archiveExt, int includeCdRoms, int archivesFirst);
+		#endregion PHYSFS_setSaneConfig
+
+		#region PHYSFS_setWriteDir
+		/// <summary>
+		/// Tell PhysicsFS where it may write files.
+		/// </summary>
+		/// <remarks>Set a new write dir. This will override the previous setting. If the directory or a parent directory doesn't exist in the physical filesystem, PhysicsFS will attempt to create them as needed.
+		/// <p>This call will fail (and fail to change the write dir) if the current write dir still has files open in it.</p></remarks>
+		/// <param name="newDir">The new directory to be the root of the write dir, specified in platform-dependent notation. Setting to NULL disables the write dir, so no files can be opened for writing via PhysicsFS.</param>
+		/// <returns>non-zero on success, zero on failure. All attempts to open a file for writing via PhysicsFS will fail until this call succeeds. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>().</returns>
+		/// <seealso cref="PHYSFS_getWriteDir"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_setWriteDir(string newDir);
+		#endregion PHYSFS_setWriteDir
+
+		#region PHYSFS_supportedArchiveTypes
+		/// <summary>
+		/// Get a list of supported archive types.
+		/// </summary>
+		/// <remarks>Get a list of archive types supported by this implementation of PhysicFS. These are the file formats usable for search path entries. This is for informational purposes only. Note that the extension listed is merely convention: if we list "ZIP", you can open a PkZip-compatible archive with an extension of "XYZ", if you like.
+		/// <p>The returned value is an array of pointers to PHYSFS_ArchiveInfo structures, with a NULL entry to signify the end of the list:</p>
+		/// <p>
+		/// <code>
+		/// PHYSFS_ArchiveInfo **i;
+		/// for (i = PHYSFS_supportedArchiveTypes(); *i != NULL; i++)
+		/// {
+		///		printf("Supported archive: [%s], which is [%s].\n",
+		///			i->extension, i->description);
+		///	}
+		/// </code>
+		/// </p>
+		/// <p>The return values are pointers to static internal memory, and should be considered READ ONLY, and never freed.</p></remarks>
+		/// <returns>Null-terminated array of READ ONLY structures.</returns>
+		public static PHYSFS_ArchiveInfo[] PHYSFS_supportedArchiveTypes()
+		{
+			ArrayList archives = new ArrayList(); // Use System.Collections.Generic.List if you're on .NET 2.0
+			IntPtr p = PHYSFS_supportedArchiveTypesInternal();
+			unsafe
+			{
+				int* ptr = (int*)p.ToPointer();
+				while( *ptr != 0 ) 
+				{
+					PHYSFS_ArchiveInfoInternal info = (PHYSFS_ArchiveInfoInternal)Marshal.PtrToStructure(new IntPtr(*ptr),typeof(PHYSFS_ArchiveInfoInternal));
+					PHYSFS_ArchiveInfo archiveInfo = new PHYSFS_ArchiveInfo(
+						Marshal.PtrToStringAnsi(info.extension),
+						Marshal.PtrToStringAnsi(info.description),
+						Marshal.PtrToStringAnsi(info.author),
+						Marshal.PtrToStringAnsi(info.url));
+					archives.Add(archiveInfo);
+					p = new IntPtr(ptr + 1);
+					ptr++;
+				}
+			}
+			return (PHYSFS_ArchiveInfo[])archives.ToArray(typeof(PHYSFS_ArchiveInfo));
+		}
+		#endregion PHYSFS_supportedArchiveTypes
+
+		#region PHYSFS_supportedArchiveTypesInternal
+		/// <summary>
+		/// Private bindings to get a list of supported archive types.
+		/// </summary>
+		/// <remarks>Get a list of archive types supported by this implementation of PhysicFS. These are the file formats usable for search path entries. This is for informational purposes only. Note that the extension listed is merely convention: if we list "ZIP", you can open a PkZip-compatible archive with an extension of "XYZ", if you like.
+		/// <p>The returned value is an array of pointers to PHYSFS_ArchiveInfo structures, with a NULL entry to signify the end of the list:</p>
+		/// <p>
+		/// <code>
+		/// PHYSFS_ArchiveInfo **i;
+		/// for (i = PHYSFS_supportedArchiveTypes(); *i != NULL; i++)
+		/// {
+		///		printf("Supported archive: [%s], which is [%s].\n",
+		///			i->extension, i->description);
+		///	}
+		/// </code>
+		/// </p>
+		/// <p>The return values are pointers to static internal memory, and should be considered READ ONLY, and never freed.</p></remarks>
+		/// <returns>READ ONLY Null-terminated array of READ ONLY structures.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="PHYSFS_supportedArchiveTypes"), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr PHYSFS_supportedArchiveTypesInternal();
+		#endregion PHYSFS_supportedArchiveTypesInternal
+
+		#region PHYSFS_swapSBE16
+		/// <summary>
+		/// Swap bigendian signed 16 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 16-bit signed value in bigendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint16 PHYSFS_swapSBE16(PHYSFS_sint16 val);
+		#endregion PHYSFS_swapSBE16
+
+		#region PHYSFS_swapSBE32
+		/// <summary>
+		/// Swap bigendian signed 32 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 32-bit signed value in bigendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint32 PHYSFS_swapSBE32(PHYSFS_sint32 val);
+		#endregion PHYSFS_swapSBE32
+
+		#region PHYSFS_swapSBE64
+		/// <summary>
+		/// Swap bigendian signed 64 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 64-bit signed value in bigendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint64 PHYSFS_swapSBE64(PHYSFS_sint64 val);
+		#endregion PHYSFS_swapSBE64
+
+		#region PHYSFS_swapSLE16
+		/// <summary>
+		/// Swap littleendian signed 16 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 16-bit signed value in littleendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint16 PHYSFS_swapSLE16(PHYSFS_sint16 val);
+		#endregion PHYSFS_swapSLE16
+
+		#region PHYSFS_swapSLE32
+		/// <summary>
+		/// Swap littleendian signed 32 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 32-bit signed value in littleendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint32 PHYSFS_swapSLE32(PHYSFS_sint32 val);
+		#endregion PHYSFS_swapSLE32
+
+		#region PHYSFS_swapSLE64
+		/// <summary>
+		/// Swap littleendian signed 64 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 64-bit signed value in littleendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint64 PHYSFS_swapSLE64(PHYSFS_sint64 val);
+		#endregion PHYSFS_swapSLE64
+
+		#region PHYSFS_swapUBE16
+		/// <summary>
+		/// Swap bigendian unsigned 16 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 16-bit unsigned value in bigendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_uint16 PHYSFS_swapUBE16(PHYSFS_uint16 val);
+		#endregion PHYSFS_swapUBE16
+
+		#region PHYSFS_swapUBE32
+		/// <summary>
+		/// Swap bigendian unsigned 32 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 32-bit unsigned value in bigendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_uint32 PHYSFS_swapUBE32(PHYSFS_uint32 val);
+		#endregion PHYSFS_swapUBE32
+
+		#region PHYSFS_swapUBE64
+		/// <summary>
+		/// Swap bigendian unsigned 64 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 64-bit unsigned value in bigendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_uint64 PHYSFS_swapUBE64(PHYSFS_uint64 val);
+		#endregion PHYSFS_swapUBE64
+
+		#region PHYSFS_swapULE16
+		/// <summary>
+		/// Swap littleendian unsigned 16 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 16-bit unsigned value in littleendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_uint16 PHYSFS_swapULE16(PHYSFS_uint16 val);
+		#endregion PHYSFS_swapULE16
+
+		#region PHYSFS_swapULE32
+		/// <summary>
+		/// Swap littleendian unsigned 32 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 32-bit unsigned value in littleendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_uint32 PHYSFS_swapULE32(PHYSFS_uint32 val);
+		#endregion PHYSFS_swapULE32
+
+		#region PHYSFS_swapULE64
+		/// <summary>
+		/// Swap littleendian unsigned 64 to platform's native byte order.
+		/// </summary>
+		/// <remarks>Take a 64-bit unsigned value in littleendian format and convert it to the platform's native byte order.</remarks>
+		/// <param name="val">value to convert</param>
+		/// <returns>converted value.</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_uint64 PHYSFS_swapULE64(PHYSFS_uint64 val);
+		#endregion PHYSFS_swapULE64
+
+		#region PHYSFS_tell
+		/// <summary>
+		/// Determine current position within a PhysicsFS filehandle.
+		/// </summary>
+		/// <param name="handle">handle returned from PHYSFS_open*().</param>
+		/// <returns>offset in bytes from start of file. -1 if error occurred. Specifics of the error can be gleaned from <see cref="PHYSFS_getLastError"/>.</returns>
+		/// <seealso cref="PHYSFS_seek"/>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint64 PHYSFS_tell(IntPtr handle);
+		#endregion PHYSFS_tell
+
+		#region PHYSFS_write
+		/// <summary>
+		/// Write data to a PhysicsFS filehandle.
+		/// </summary>
+		/// <remarks>The file must be opened for writing.</remarks>
+		/// <param name="handle">retval from <see cref="PHYSFS_openWrite"/> or <see cref="PHYSFS_openAppend"/>.</param>
+		/// <param name="buffer">buffer to store read data into.</param>
+		/// <param name="objSize">size in bytes of objects being read from (handle).</param>
+		/// <param name="objCount">number of (objSize) objects to read from (handle).</param>
+		/// <returns>number of objects written. <see cref="PHYSFS_getLastError"/>() can shed light on the reason this might be less than (objCount). -1 if complete failure.</returns>
+        // PHYSFS_write(PHYSFS_file * handle, const void * buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static PHYSFS_sint64 PHYSFS_write(IntPtr handle, IntPtr buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
+		#endregion PHYSFS_write
+
+		#region PHYSFS_writeSBE16
+		/// <summary>
+		/// Convert and write a signed 16-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert a signed 16-bit value from the platform's native byte order to bigendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeSBE16(IntPtr file, PHYSFS_sint16 val);
+		#endregion PHYSFS_writeSBE16
+
+		#region PHYSFS_writeSBE32
+		/// <summary>
+		/// Convert and write a signed 32-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert a signed 32-bit value from the platform's native byte order to bigendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeSBE32(IntPtr file, PHYSFS_sint32 val);
+		#endregion PHYSFS_writeSBE32
+
+		#region PHYSFS_writeSBE64
+		/// <summary>
+		/// Convert and write a signed 64-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert a signed 64-bit value from the platform's native byte order to bigendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeSBE64 (IntPtr file, PHYSFS_sint64 val);
+		#endregion PHYSFS_writeSBE64
+
+		#region PHYSFS_writeSLE16
+		/// <summary>
+		/// Convert and write a signed 16-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert a signed 16-bit value from the platform's native byte order to littleendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeSLE16(IntPtr file, PHYSFS_sint16 val);
+		#endregion PHYSFS_writeSLE16
+
+		#region PHYSFS_writeSLE32
+		/// <summary>
+		/// Convert and write a signed 32-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert a signed 32-bit value from the platform's native byte order to littleendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeSLE32(IntPtr file, PHYSFS_sint32 val);
+		#endregion PHYSFS_writeSLE32
+
+		#region PHYSFS_writeSLE64
+		/// <summary>
+		/// Convert and write a signed 64-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert a signed 64-bit value from the platform's native byte order to littleendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeSLE64(IntPtr file, PHYSFS_sint64 val);
+		#endregion PHYSFS_writeSLE64
+
+		#region PHYSFS_writeUBE16
+		/// <summary>
+		/// Convert and write an unsigned 16-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert an unsigned 16-bit value from the platform's native byte order to bigendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeUBE16(IntPtr file, PHYSFS_uint16 val);
+		#endregion PHYSFS_writeUBE16
+
+		#region PHYSFS_writeUBE32
+		/// <summary>
+		/// Convert and write an unsigned 32-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert an unsigned 32-bit value from the platform's native byte order to bigendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeUBE32(IntPtr file, PHYSFS_uint32 val);
+		#endregion PHYSFS_writeUBE32
+
+		#region PHYSFS_writeUBE64
+		/// <summary>
+		/// Convert and write an unsigned 64-bit bigendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert an unsigned 64-bit value from the platform's native byte order to bigendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeUBE64(IntPtr file, PHYSFS_uint64 val);
+		#endregion PHYSFS_writeUBE64
+
+		#region PHYSFS_writeULE16
+		/// <summary>
+		/// Convert and write an unsigned 16-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert an unsigned 16-bit value from the platform's native byte order to littleendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeULE16(IntPtr file, PHYSFS_uint16 val);
+		#endregion PHYSFS_writeULE16
+
+		#region PHYSFS_writeULE32
+		/// <summary>
+		/// Convert and write an unsigned 32-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert an unsigned 32-bit value from the platform's native byte order to littleendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeULE32(IntPtr file, PHYSFS_uint32 val);
+		#endregion PHYSFS_writeULE32
+
+		#region PHYSFS_writeULE64
+		/// <summary>
+		/// Convert and write an unsigned 64-bit littleendian value.
+		/// </summary>
+		/// <remarks>Convenience function. Convert an unsigned 64-bit value from the platform's native byte order to littleendian and write it to a file.</remarks>
+		/// <param name="file">PhysicsFS file handle to which to write.</param>
+		/// <param name="val">Value to convert and write.</param>
+		/// <returns>zero on failure, non-zero on success. On failure, you can find out what went wrong from <see cref="PHYSFS_getLastError"/>().</returns>
+		[CLSCompliant(false)]
+		[DllImport(PHYSFS_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public extern static int PHYSFS_writeULE64(IntPtr file, PHYSFS_uint64 val);
+		#endregion PHYSFS_writeULE64
+
+		#endregion Public Functions
+
+		#endregion physfs.h
+	}
+}
diff --git a/src/Tao.PhysFs/INSTALL b/src/Tao.PhysFs/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.PhysFs/Makefile.am b/src/Tao.PhysFs/Makefile.am
new file mode 100644
index 0000000..b43e0c9
--- /dev/null
+++ b/src/Tao.PhysFs/Makefile.am
@@ -0,0 +1,18 @@
+
+ASSEMBLY = Tao.PhysFs
+SHORTNAME = tao-physfs
+VERSION = @TAOPHYSFS_VERSION@
+MAJOR = @TAOPHYSFS_MAJOR@
+
+PACKAGES =
+BINARY_LIBS =
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        Fs.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.PhysFs/Makefile.in b/src/Tao.PhysFs/Makefile.in
new file mode 100644
index 0000000..5aed1c9
--- /dev/null
+++ b/src/Tao.PhysFs/Makefile.in
@@ -0,0 +1,414 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-physfs.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.PhysFs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-physfs.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOPHYSFS_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.PhysFs
+SHORTNAME = tao-physfs
+MAJOR = @TAOPHYSFS_MAJOR@
+PACKAGES = 
+BINARY_LIBS = 
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        Fs.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.PhysFs/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.PhysFs/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-physfs.pc: $(top_builddir)/config.status $(srcdir)/tao-physfs.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.PhysFs/NEWS b/src/Tao.PhysFs/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.PhysFs/Properties/AssemblyInfo.cs b/src/Tao.PhysFs/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..b52a23d
--- /dev/null
+++ b/src/Tao.PhysFs/Properties/AssemblyInfo.cs
@@ -0,0 +1,52 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright ©2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.PhysFs")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework PhysFS Binding For .NET")]
+[assembly: AssemblyFileVersion("1.0.1.2")]
+[assembly: AssemblyInformationalVersion("1.0.1.2")]
+[assembly: AssemblyProduct("Tao.PhysFs.dll")]
+[assembly: AssemblyTitle("Tao Framework PhysFS Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.1.2")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.PhysFs/README b/src/Tao.PhysFs/README
new file mode 100644
index 0000000..c66078a
--- /dev/null
+++ b/src/Tao.PhysFs/README
@@ -0,0 +1,21 @@
+Tao.PhysFs 1.0.0.0
+Copyright ©2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.PhysFs is a PhysFS API binding for .NET, implementing PhysicsFS 1.0.0 (http://icculus.org/physfs/).
+
+
+Todo:
+
+PHYSFS_write
+    Overloaded functions for writing byte[], int[], etc.
+
+
+Change Log:
+1.0.1.0 - June 16, 2006:
+    Updated to physfs.dll 1.0.1
+
+1.0.0.0 - January 12, 2006:
+    Initial release.  Special thanks to Oli Wilkinson for his
+    special DLL build of PhysFS.
diff --git a/src/Tao.PhysFs/Tao.PhysFs.csproj b/src/Tao.PhysFs/Tao.PhysFs.csproj
new file mode 100644
index 0000000..2d61a3f
--- /dev/null
+++ b/src/Tao.PhysFs/Tao.PhysFs.csproj
@@ -0,0 +1,98 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6B39535D-B2C1-414C-94A4-BBB70EF8EB0D}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.PhysFs</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.PhysFs.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.PhysFs</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.PhysFs.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.PhysFs.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Fs.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.PhysFs.dll.config" />
+    <None Include="Tao.PhysFs.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.PhysFs/Tao.PhysFs.dll.config b/src/Tao.PhysFs/Tao.PhysFs.dll.config
new file mode 100644
index 0000000..b1e75b6
--- /dev/null
+++ b/src/Tao.PhysFs/Tao.PhysFs.dll.config
@@ -0,0 +1,5 @@
+<configuration>
+    <dllmap dll="physfs.dll" os="windows" target="physfs.dll" />
+    <dllmap dll="physfs.dll" os="osx" target="libphysfs-1.0.so.0" />
+    <dllmap dll="physfs.dll" os="!windows,osx" target="libphysfs.so.1" />
+</configuration>
diff --git a/src/Tao.PhysFs/Tao.PhysFs.snk b/src/Tao.PhysFs/Tao.PhysFs.snk
new file mode 100644
index 0000000..6446c6a
Binary files /dev/null and b/src/Tao.PhysFs/Tao.PhysFs.snk differ
diff --git a/src/Tao.PhysFs/tao-physfs.pc.in b/src/Tao.PhysFs/tao-physfs.pc.in
new file mode 100644
index 0000000..a3f04e4
--- /dev/null
+++ b/src/Tao.PhysFs/tao-physfs.pc.in
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.PhysFs
+Description: PhysFs section of the Tao framework
+Version: @TAOPHYSFS_VERSION@
+Requires:
+Libs: -r:${libdir}/mono/tao-physfs- at TAOPHYSFS_MAJOR@/Tao.PhysFs.dll
diff --git a/src/Tao.Platform.Windows/AUTHORS b/src/Tao.Platform.Windows/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Platform.Windows/COPYING b/src/Tao.Platform.Windows/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.Platform.Windows/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.Platform.Windows/ChangeLog b/src/Tao.Platform.Windows/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Platform.Windows/Gdi.cs b/src/Tao.Platform.Windows/Gdi.cs
new file mode 100644
index 0000000..dfcd5a0
--- /dev/null
+++ b/src/Tao.Platform.Windows/Gdi.cs
@@ -0,0 +1,1786 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.Platform.Windows {
+    #region Class Documentation
+    /// <summary>
+    ///     GDI binding for .NET, implementing Windows-specific GDI functionality.
+    /// </summary>
+    /// <remarks>
+    ///     Binds functions and definitions in gdi32.dll.
+    /// </remarks>
+    #endregion Class Documentation
+    public static class Gdi
+    {
+        // --- Fields ---
+        #region Private Constants
+        #region string GDI_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies GDI's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies gdi32.dll for Windows.
+        /// </remarks>
+        private const string GDI_NATIVE_LIBRARY = "gdi32.dll";
+        #endregion string GDI_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.StdCall" />.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.StdCall;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+
+        #region Public Constants
+        #region LAYERPLANEDESCRIPTOR Pixel Types
+        #region int LPD_TYPE_RGBA
+        /// <summary>
+        ///     RGBA pixels.  Each pixel has four components: red, green, blue, and alpha.
+        /// </summary>
+        // #define LPD_TYPE_RGBA        0
+        public const int LPD_TYPE_RGBA = 0;
+        #endregion int LPD_TYPE_RGBA
+
+        #region int LPD_TYPE_COLORINDEX
+        /// <summary>
+        ///     Color-index pixels.  Each pixel uses a color-index value.
+        /// </summary>
+        // #define LPD_TYPE_COLORINDEX  1
+        public const int LPD_TYPE_COLORINDEX = 1;
+        #endregion int LPD_TYPE_COLORINDEX
+        #endregion LAYERPLANEDESCRIPTOR Pixel Types
+
+        #region LAYERPLANEDESCRIPTOR Flags
+        #region int LPD_DOUBLEBUFFER
+        /// <summary>
+        ///     The layer plane is double-buffered.  A layer plane can be double-buffered
+        ///     even when the main plane is single-buffered and vice versa.
+        /// </summary>
+        // #define LPD_DOUBLEBUFFER        0x00000001
+        public const int LPD_DOUBLEBUFFER = 0x00000001;
+        #endregion int LPD_DOUBLEBUFFER
+
+        #region int LPD_STEREO
+        /// <summary>
+        ///     The layer plane is stereoscopic.  A layer plane can be stereoscopic even
+        ///     when the main plane is monoscopic and vice versa.
+        /// </summary>
+        // #define LPD_STEREO              0x00000002
+        public const int LPD_STEREO = 0x00000002;
+        #endregion int LPD_STEREO
+
+        #region int LPD_SUPPORT_GDI
+        /// <summary>
+        ///     The layer plane supports GDI drawing.  The current implementation of OpenGL
+        ///     doesn't support this flag.
+        /// </summary>
+        // #define LPD_SUPPORT_GDI         0x00000010
+        public const int LPD_SUPPORT_GDI = 0x00000010;
+        #endregion int LPD_SUPPORT_GDI
+
+        #region int LPD_SUPPORT_OPENGL
+        /// <summary>
+        ///     The layer plane supports OpenGL drawing.
+        /// </summary>
+        // #define LPD_SUPPORT_OPENGL      0x00000020
+        public const int LPD_SUPPORT_OPENGL = 0x00000020;
+        #endregion int LPD_SUPPORT_OPENGL
+
+        #region int LPD_SHARE_DEPTH
+        /// <summary>
+        ///     The layer plane shares the depth buffer with the main plane.
+        /// </summary>
+        // #define LPD_SHARE_DEPTH         0x00000040
+        public const int LPD_SHARE_DEPTH = 0x00000040;
+        #endregion int LPD_SHARE_DEPTH
+
+        #region int LPD_SHARE_STENCIL
+        /// <summary>
+        ///     The layer plane shares the stencil buffer with the main plane.
+        /// </summary>
+        // #define LPD_SHARE_STENCIL       0x00000080
+        public const int LPD_SHARE_STENCIL = 0x00000080;
+        #endregion int LPD_SHARE_STENCIL
+
+        #region int LPD_SHARE_ACCUM
+        /// <summary>
+        ///     The layer plane shares the accumulation buffer with the main plane.
+        /// </summary>
+        // #define LPD_SHARE_ACCUM         0x00000100
+        public const int LPD_SHARE_ACCUM = 0x00000100;
+        #endregion int LPD_SHARE_ACCUM
+
+        #region int LPD_SWAP_EXCHANGE
+        /// <summary>
+        ///     In a double-buffered layer plane, swapping the color buffer exchanges the
+        ///     front buffer and back buffer contents.  The back buffer then contains the
+        ///     contents of the front buffer before the swap. This flag is a hint only and
+        ///     might not be provided by a driver.
+        /// </summary>
+        // #define LPD_SWAP_EXCHANGE       0x00000200
+        public const int LPD_SWAP_EXCHANGE = 0x00000200;
+        #endregion int LPD_SWAP_EXCHANGE
+
+        #region int LPD_SWAP_COPY
+        /// <summary>
+        ///     In a double-buffered layer plane, swapping the color buffer copies the back
+        ///     buffer contents to the front buffer.  The swap does not affect the back
+        ///     buffer contents. This flag is a hint only and might not be provided by a driver.
+        /// </summary>
+        // #define LPD_SWAP_COPY           0x00000400
+        public const int LPD_SWAP_COPY = 0x00000400;
+        #endregion int LPD_SWAP_COPY
+
+        #region int LPD_TRANSPARENT
+        /// <summary>
+        ///     Contains a transparent color or index value that enables underlying layers
+        ///     to show through this layer.  All layer planes, except the lowest-numbered
+        ///     underlay layer, have a transparent color or index.
+        /// </summary>
+        // #define LPD_TRANSPARENT         0x00001000
+        public const int LPD_TRANSPARENT = 0x00001000;
+        #endregion int LPD_TRANSPARENT
+        #endregion LAYERPLANEDESCRIPTOR Flags
+
+        #region PIXELFORMATDESCRIPTOR Pixel Types
+        #region int PFD_TYPE_RGBA
+        /// <summary>
+        ///     RGBA pixels.  Each pixel has four components in this order: red, green, blue,
+        ///     and alpha.
+        /// </summary>
+        // #define PFD_TYPE_RGBA        0
+        public const int PFD_TYPE_RGBA = 0;
+        #endregion int PFD_TYPE_RGBA
+
+        #region int PFD_TYPE_COLORINDEX
+        /// <summary>
+        ///     Color-index pixels.  Each pixel uses a color-index value.
+        /// </summary>
+        // #define PFD_TYPE_COLORINDEX  1
+        public const int PFD_TYPE_COLORINDEX = 1;
+        #endregion int PFD_TYPE_COLORINDEX
+        #endregion PIXELFORMATDESCRIPTOR Pixel Types
+
+        #region PIXELFORMATDESCRIPTOR Layer Types
+        #region int PFD_MAIN_PLANE
+        /// <summary>
+        ///     The layer is the main plane.
+        /// </summary>
+        // #define PFD_MAIN_PLANE       0
+        public const int PFD_MAIN_PLANE = 0;
+        #endregion int PFD_MAIN_PLANE
+
+        #region int PFD_OVERLAY_PLANE
+        /// <summary>
+        ///     The layer is the overlay plane.
+        /// </summary>
+        // #define PFD_OVERLAY_PLANE    1
+        public const int PFD_OVERLAY_PLANE = 1;
+        #endregion int PFD_OVERLAY_PLANE
+
+        #region int PFD_UNDERLAY_PLANE
+        /// <summary>
+        ///     The layer is the underlay plane.
+        /// </summary>
+        // #define PFD_UNDERLAY_PLANE   (-1)
+        public const int PFD_UNDERLAY_PLANE = -1;
+        #endregion int PFD_UNDERLAY_PLANE
+        #endregion PIXELFORMATDESCRIPTOR Layer Types
+
+        #region PIXELFORMATDESCRIPTOR Flags
+        #region int PFD_DOUBLEBUFFER
+        /// <summary>
+        ///     <para>
+        ///         The buffer is double-buffered.  This flag and <see cref="PFD_SUPPORT_GDI" />
+        ///         are mutually exclusive in the current generic implementation.
+        ///     </para>
+        /// </summary>
+        // #define PFD_DOUBLEBUFFER            0x00000001
+        public const int PFD_DOUBLEBUFFER = 0x00000001;
+        #endregion int PFD_DOUBLEBUFFER
+
+        #region int PFD_STEREO
+        /// <summary>
+        ///     <para>
+        ///         The buffer is stereoscopic.  This flag is not supported in the current
+        ///         generic implementation.
+        ///     </para>
+        /// </summary>
+        // #define PFD_STEREO                  0x00000002
+        public const int PFD_STEREO = 0x00000002;
+        #endregion int PFD_STEREO
+
+        #region int PFD_DRAW_TO_WINDOW
+        /// <summary>
+        ///     <para>
+        ///         The buffer can draw to a window or device surface.
+        ///     </para>
+        /// </summary>
+        // #define PFD_DRAW_TO_WINDOW          0x00000004
+        public const int PFD_DRAW_TO_WINDOW = 0x00000004;
+        #endregion int PFD_DRAW_TO_WINDOW
+
+        #region int PFD_DRAW_TO_BITMAP
+        /// <summary>
+        ///     <para>
+        ///         The buffer can draw to a memory bitmap.
+        ///     </para>
+        /// </summary>
+        // #define PFD_DRAW_TO_BITMAP          0x00000008
+        public const int PFD_DRAW_TO_BITMAP = 0x00000008;
+        #endregion int PFD_DRAW_TO_BITMAP
+
+        #region int PFD_SUPPORT_GDI
+        /// <summary>
+        ///     <para>
+        ///         The buffer supports GDI drawing.  This flag and
+        ///         <see cref="PFD_DOUBLEBUFFER" /> are mutually exclusive in the current generic
+        ///         implementation.
+        ///     </para>
+        /// </summary>
+        // #define PFD_SUPPORT_GDI             0x00000010
+        public const int PFD_SUPPORT_GDI = 0x00000010;
+        #endregion int PFD_SUPPORT_GDI
+
+        #region int PFD_SUPPORT_OPENGL
+        /// <summary>
+        ///     <para>
+        ///         The buffer supports OpenGL drawing.
+        ///     </para>
+        /// </summary>
+        // #define PFD_SUPPORT_OPENGL          0x00000020
+        public const int PFD_SUPPORT_OPENGL = 0x00000020;
+        #endregion int PFD_SUPPORT_OPENGL
+
+        #region int PFD_GENERIC_FORMAT
+        /// <summary>
+        ///     <para>
+        ///         The pixel format is supported by the GDI software implementation, which is
+        ///         also known as the generic implementation.  If this bit is clear, the pixel
+        ///         format is supported by a device driver or hardware.
+        ///     </para>
+        /// </summary>
+        // #define PFD_GENERIC_FORMAT          0x00000040
+        public const int PFD_GENERIC_FORMAT = 0x00000040;
+        #endregion int PFD_GENERIC_FORMAT
+
+        #region int PFD_NEED_PALETTE
+        /// <summary>
+        ///     <para>
+        ///         The buffer uses RGBA pixels on a palette-managed device.  A logical palette
+        ///         is required to achieve the best results for this pixel type.  Colors in the
+        ///         palette should be specified according to the values of the <b>cRedBits</b>,
+        ///         <b>cRedShift</b>, <b>cGreenBits</b>, <b>cGreenShift</b>, <b>cBluebits</b>,
+        ///         and <b>cBlueShift</b> members.  The palette should be created and realized in
+        ///         the device context before calling <see cref="Wgl.wglMakeCurrent" />.
+        ///     </para>
+        /// </summary>
+        // #define PFD_NEED_PALETTE            0x00000080
+        public const int PFD_NEED_PALETTE = 0x00000080;
+        #endregion int PFD_NEED_PALETTE
+
+        #region int PFD_NEED_SYSTEM_PALETTE
+        /// <summary>
+        ///     <para>
+        ///         Defined in the pixel format descriptors of hardware that supports one
+        ///         hardware palette in 256-color mode only.  For such systems to use
+        ///         hardware acceleration, the hardware palette must be in a fixed order
+        ///         (for example, 3-3-2) when in RGBA mode or must match the logical palette
+        ///         when in color-index mode.
+        ///     </para>
+        ///     <para>
+        ///         When this flag is set, you must call see cref="SetSystemPaletteUse" /> in
+        ///         your program to force a one-to-one mapping of the logical palette and the
+        ///         system palette.  If your OpenGL hardware supports multiple hardware palettes
+        ///         and the device driver can allocate spare hardware palettes for OpenGL, this
+        ///         flag is typically clear.
+        ///     </para>
+        ///     <para>
+        ///         This flag is not set in the generic pixel formats.
+        ///     </para>
+        /// </summary>
+        // #define PFD_NEED_SYSTEM_PALETTE     0x00000100
+        public const int PFD_NEED_SYSTEM_PALETTE = 0x00000100;
+        #endregion int PFD_NEED_SYSTEM_PALETTE
+
+        #region int PFD_SWAP_EXCHANGE
+        /// <summary>
+        ///     <para>
+        ///         Specifies the content of the back buffer in the double-buffered main color
+        ///         plane following a buffer swap.  Swapping the color buffers causes the
+        ///         exchange of the back buffer's content with the front buffer's content.
+        ///         Following the swap, the back buffer's content contains the front buffer's
+        ///         content before the swap. <b>PFD_SWAP_EXCHANGE</b> is a hint only and might
+        ///         not be provided by a driver.
+        ///     </para>
+        /// </summary>
+        // #define PFD_SWAP_EXCHANGE           0x00000200
+        public const int PFD_SWAP_EXCHANGE = 0x00000200;
+        #endregion int PFD_SWAP_EXCHANGE
+
+        #region int PFD_SWAP_COPY
+        /// <summary>
+        ///     <para>
+        ///         Specifies the content of the back buffer in the double-buffered main color
+        ///         plane following a buffer swap.  Swapping the color buffers causes the content
+        ///         of the back buffer to be copied to the front buffer.  The content of the back
+        ///         buffer is not affected by the swap.  <b>PFD_SWAP_COPY</b> is a hint only and
+        ///         might not be provided by a driver.
+        ///     </para>
+        /// </summary>
+        // #define PFD_SWAP_COPY               0x00000400
+        public const int PFD_SWAP_COPY = 0x00000400;
+        #endregion int PFD_SWAP_COPY
+
+        #region int PFD_SWAP_LAYER_BUFFERS
+        /// <summary>
+        ///     <para>
+        ///         Indicates whether a device can swap individual layer planes with pixel
+        ///         formats that include double-buffered overlay or underlay planes.
+        ///         Otherwise all layer planes are swapped together as a group.  When this
+        ///         flag is set, <see cref="Wgl.wglSwapLayerBuffers(IntPtr, int)" /> is supported.
+        ///     </para>
+        /// </summary>
+        // #define PFD_SWAP_LAYER_BUFFERS      0x00000800
+        public const int PFD_SWAP_LAYER_BUFFERS = 0x00000800;
+        #endregion int PFD_SWAP_LAYER_BUFFERS
+
+        #region int PFD_GENERIC_ACCELERATED
+        /// <summary>
+        ///     <para>
+        ///         The pixel format is supported by a device driver that accelerates the generic
+        ///         implementation.  If this flag is clear and the
+        ///         <see cref="PFD_GENERIC_FORMAT" /> flag is set, the pixel format is supported
+        ///         by the generic implementation only.
+        ///     </para>
+        /// </summary>
+        // #define PFD_GENERIC_ACCELERATED     0x00001000
+        public const int PFD_GENERIC_ACCELERATED = 0x00001000;
+        #endregion int PFD_GENERIC_ACCELERATED
+
+        #region int PFD_SUPPORT_DIRECTDRAW
+        /// <summary>
+        ///     <para>
+        ///         The buffer supports DirectDraw drawing.
+        ///     </para>
+        /// </summary>
+        // #define PFD_SUPPORT_DIRECTDRAW      0x00002000
+        public const int PFD_SUPPORT_DIRECTDRAW = 0x00002000;
+        #endregion int PFD_SUPPORT_DIRECTDRAW
+        #endregion PIXELFORMATDESCRIPTOR Flags
+
+        #region PIXELFORMATDESCRIPTOR Flags For Use In ChoosePixelFormat Only
+        #region int PFD_DEPTH_DONTCARE
+        /// <summary>
+        ///     <para>
+        ///         The requested pixel format can either have or not have a depth buffer.  To
+        ///         select a pixel format without a depth buffer, you must specify this flag.
+        ///         The requested pixel format can be with or without a depth buffer.  Otherwise,
+        ///         only pixel formats with a depth buffer are considered.
+        ///     </para>
+        /// </summary>
+        // #define PFD_DEPTH_DONTCARE          0x20000000
+        public const int PFD_DEPTH_DONTCARE = 0x20000000;
+        #endregion int PFD_DEPTH_DONTCARE
+
+        #region int PFD_DOUBLEBUFFER_DONTCARE
+        /// <summary>
+        ///     <para>
+        ///         The requested pixel format can be either single- or double-buffered.
+        ///     </para>
+        /// </summary>
+        // #define PFD_DOUBLEBUFFER_DONTCARE   0x40000000
+        public const int PFD_DOUBLEBUFFER_DONTCARE = 0x40000000;
+        #endregion int PFD_DOUBLEBUFFER_DONTCARE
+
+        #region int PFD_STEREO_DONTCARE
+        /// <summary>
+        ///     <para>
+        ///         The requested pixel format can be either monoscopic or stereoscopic.
+        ///     </para>
+        /// </summary>
+        // #define PFD_STEREO_DONTCARE         0x80000000
+        public const int PFD_STEREO_DONTCARE = unchecked((int) 0x80000000);
+        #endregion int PFD_STEREO_DONTCARE
+        #endregion PIXELFORMATDESCRIPTOR Flags For Use In ChoosePixelFormat Only
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int DM_BITSPERPEL = 0x00040000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int DM_PELSWIDTH = 0x00080000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int DM_PELSHEIGHT = 0x00100000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int DM_DISPLAYFLAGS = 0x00200000;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int DM_DISPLAYFREQUENCY = 0x00400000;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define OUT_TT_PRECIS 4
+        public const int OUT_TT_PRECIS = 4;
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define CLIP_DEFAULT_PRECIS 0
+        public const int CLIP_DEFAULT_PRECIS = 0;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define DEFAULT_QUALITY 0
+        public const int DEFAULT_QUALITY = 0;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define DRAFT_QUALITY 1
+        public const int DRAFT_QUALITY = 1;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define PROOF_QUALITY 2
+        public const int PROOF_QUALITY = 2;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define NONANTIALIASED_QUALITY 3
+        public const int NONANTIALIASED_QUALITY = 3;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define ANTIALIASED_QUALITY 4
+        public const int ANTIALIASED_QUALITY = 4;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define CLEARTYPE_QUALITY 5
+        public const int CLEARTYPE_QUALITY = 5;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define CLEARTYPE_NATURAL_QUALITY 6
+        public const int CLEARTYPE_NATURAL_QUALITY = 6;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define DEFAULT_PITCH 0
+        public const int DEFAULT_PITCH = 0;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define FIXED_PITCH 1
+        public const int FIXED_PITCH = 1;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define VARIABLE_PITCH 2
+        public const int VARIABLE_PITCH = 2;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define MONO_FONT 8
+        public const int MONO_FONT = 8;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define ANSI_CHARSET 0
+        public const int ANSI_CHARSET = 0;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define DEFAULT_CHARSET 1
+        public const int DEFAULT_CHARSET = 1;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define SYMBOL_CHARSET 2
+        public const int SYMBOL_CHARSET = 2;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define SHIFTJIS_CHARSET 128
+        public const int SHIFTJIS_CHARSET = 128;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define FF_DONTCARE (0<<4)
+        public const int FF_DONTCARE = (0 << 4);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        // #define FW_BOLD 700
+        public const int FW_BOLD = 700;
+        #endregion Public Constants
+
+        // --- Public Structs ---
+        #region DEVMODE Struct
+        /// <summary>
+        ///     <para>
+        ///         The <b>DEVMODE</b> data structure contains information about the
+        ///         initialization and environment of a printer or a display device.
+        ///     </para>
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         A device driver's private data follows the public portion of the
+        ///         <b>DEVMODE</b> structure.  The size of the public data can vary for different
+        ///         versions of the structure.  The <i>dmSize</i> member specifies the number of
+        ///         bytes of public data, and the <i>dmDriverExtra</i> member specifies the
+        ///         number of bytes of private data.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="User.ChangeDisplaySettings(ref Tao.Platform.Windows.Gdi.DEVMODE, int)" />
+        /// <seealso cref="User.EnumDisplaySettings" />
+        // <seealso cref="AdvancedDocumentProperties" />
+        // <seealso cref="CreateDC" />
+        // <seealso cref="CreateIC" />
+        // <seealso cref="DeviceCapabilities" />
+        // <seealso cref="DocumentProperties" />
+        // <seealso cref="OpenPrinter" />
+        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
+        public struct DEVMODE {
+			/// <summary>
+			/// </summary>
+            [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
+            public string dmDeviceName;
+			/// <summary>
+			/// </summary>
+            public short dmSpecVersion;
+			/// <summary>
+			/// </summary>
+            public short dmDriverVersion;
+			/// <summary>
+			/// </summary>
+            public short dmSize;
+			/// <summary>
+			/// </summary>
+            public short dmDriverExtra;
+			/// <summary>
+			/// </summary>
+            public int dmFields;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmOrientation;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmPaperSize;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmPaperLength;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmPaperWidth;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmScale;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmCopies;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmDefaultSource;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmPrintQuality;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmColor;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmDuplex;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmYResolution;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmTTOption;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmCollate;
+			/// <summary>
+			/// 
+			/// </summary>
+            [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
+            public string dmFormName;
+			/// <summary>
+			/// 
+			/// </summary>
+            public short dmLogPixels;
+			/// <summary>
+			/// </summary>
+            public int dmBitsPerPel;
+			/// <summary>
+			/// </summary>
+            public int dmPelsWidth;
+			/// <summary>
+			/// </summary>
+            public int dmPelsHeight;
+			/// <summary>
+			/// </summary>
+            public int dmDisplayFlags;
+			/// <summary>
+			/// 
+			/// </summary>
+            public int dmDisplayFrequency;
+			/// <summary>
+			/// </summary>
+            public int dmICMMethod;
+			/// <summary>
+			/// </summary>
+            public int dmICMIntent;
+			/// <summary>
+			/// 
+			/// </summary>
+            public int dmMediaType;
+			/// <summary>
+			/// </summary>
+            public int dmDitherType;
+			/// <summary>
+			/// </summary>
+            public int dmReserved1;
+			/// <summary>
+			/// 
+			/// </summary>
+            public int dmReserved2;
+			/// <summary>
+			/// </summary>
+            public int dmPanningWidth;
+			/// <summary>
+			/// </summary>
+            public int dmPanningHeight;
+        }
+        #endregion DEVMODE Struct
+
+        #region GLYPHMETRICSFLOAT Struct
+        /// <summary>
+        /// The <b>GLYPHMETRICSFLOAT</b> structure contains information about the placement and orientation of a glyph in a
+        /// character cell.
+        /// </summary>
+        /// <remarks>The values of <b>GLYPHMETRICSFLOAT</b> are specified as notional units.</remarks>
+        /// <seealso cref="POINTFLOAT" />
+        /// <seealso cref="Wgl.wglUseFontOutlinesA(IntPtr, int, int, int, float, float, int, Gdi.GLYPHMETRICSFLOAT[])" />
+        [StructLayout(LayoutKind.Sequential)]
+        public struct GLYPHMETRICSFLOAT {
+            /// <summary>
+            /// Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+            /// </summary>
+            public float gmfBlackBoxX;
+
+            /// <summary>
+            /// Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+            /// </summary>
+            public float gmfBlackBoxY;
+
+            /// <summary>
+            /// Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+            /// </summary>
+            public POINTFLOAT gmfptGlyphOrigin;
+
+            /// <summary>
+            /// Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+            /// </summary>
+            public float gmfCellIncX;
+
+            /// <summary>
+            /// Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+            /// </summary>
+            public float gmfCellIncY;
+        };
+        #endregion GLYPHMETRICSFLOAT Struct
+
+        #region PIXELFORMATDESCRIPTOR Struct
+        /// <summary>
+        ///     The <b>PIXELFORMATDESCRIPTOR</b> structure describes the pixel format of a drawing surface.
+        /// </summary>
+        /// <remarks>
+        ///     Please notice carefully, as documented in the members, that certain pixel format properties are not supported
+        ///     in the current generic implementation. The generic implementation is the Microsoft GDI software
+        ///     implementation of OpenGL. Hardware manufacturers may enhance parts of OpenGL, and may support some
+        ///     pixel format properties not supported by the generic implementation.
+        /// </remarks>
+        /// <seealso cref="ChoosePixelFormat" />
+        /// seealso cref="DescribePixelFormat" />
+        /// seealso cref="GetPixelFormat" />
+        /// <seealso cref="SetPixelFormat" />
+        [StructLayout(LayoutKind.Sequential)]
+        public struct PIXELFORMATDESCRIPTOR {
+            /// <summary>
+            /// Specifies the size of this data structure. This value should be set to <c>sizeof(PIXELFORMATDESCRIPTOR)</c>.
+            /// </summary>
+            public Int16 nSize;
+
+            /// <summary>
+            /// Specifies the version of this data structure. This value should be set to 1.
+            /// </summary>
+            public Int16 nVersion;
+
+            /// <summary>
+            /// A set of bit flags that specify properties of the pixel buffer. The properties are generally not mutually exclusive;
+            /// you can set any combination of bit flags, with the exceptions noted.
+            /// </summary>
+            /// <remarks>
+            ///     <para>The following bit flag constants are defined:</para>
+            ///     <list type="table">
+            ///			<listheader>
+            ///				<term>Value</term>
+            ///				<description>Meaning</description>
+            ///			</listheader>
+            ///			<item>
+            ///				<term>PFD_DRAW_TO_WINDOW</term>
+            ///				<description>The buffer can draw to a window or device surface.</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_DRAW_TO_BITMAP</term>
+            ///				<description>The buffer can draw to a memory bitmap.</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_SUPPORT_GDI</term>
+            ///				<description>
+            ///					The buffer supports GDI drawing. This flag and PFD_DOUBLEBUFFER are mutually exclusive
+            ///					in the current generic implementation.
+            ///				</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_SUPPORT_OPENGL</term>
+            ///				<description>The buffer supports OpenGL drawing.</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_GENERIC_ACCELERATED</term>
+            ///				<description>
+            ///					The pixel format is supported by a device driver that accelerates the generic implementation.
+            ///					If this flag is clear and the PFD_GENERIC_FORMAT flag is set, the pixel format is supported by
+            ///					the generic implementation only.
+            ///				</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_GENERIC_FORMAT</term>
+            ///				<description>
+            ///					The pixel format is supported by the GDI software implementation, which is also known as the
+            ///					generic implementation. If this bit is clear, the pixel format is supported by a device
+            ///					driver or hardware.
+            ///				</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_NEED_PALETTE</term>
+            ///				<description>
+            ///					The buffer uses RGBA pixels on a palette-managed device. A logical palette is required to achieve
+            ///					the best results for this pixel type. Colors in the palette should be specified according to the
+            ///					values of the <b>cRedBits</b>, <b>cRedShift</b>, <b>cGreenBits</b>, <b>cGreenShift</b>,
+            ///					<b>cBluebits</b>, and <b>cBlueShift</b> members. The palette should be created and realized in
+            ///					the device context before calling <see cref="Wgl.wglMakeCurrent" />.
+            ///				</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_NEED_SYSTEM_PALETTE</term>
+            ///				<description>
+            ///					Defined in the pixel format descriptors of hardware that supports one hardware palette in
+            ///					256-color mode only. For such systems to use hardware acceleration, the hardware palette must be in
+            ///					a fixed order (for example, 3-3-2) when in RGBA mode or must match the logical palette when in
+            ///					color-index mode.
+            ///					
+            ///					When this flag is set, you must call SetSystemPaletteUse in your program to force a one-to-one
+            ///					mapping of the logical palette and the system palette. If your OpenGL hardware supports multiple
+            ///					hardware palettes and the device driver can allocate spare hardware palettes for OpenGL, this
+            ///					flag is typically clear.
+            ///					
+            ///					This flag is not set in the generic pixel formats.
+            ///				</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_DOUBLEBUFFER</term>
+            ///				<description>
+            ///					The buffer is double-buffered. This flag and PFD_SUPPORT_GDI are mutually exclusive in the
+            ///					current generic implementation.
+            ///				</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_STEREO</term>
+            ///				<description>
+            ///					The buffer is stereoscopic. This flag is not supported in the current generic implementation.
+            ///				</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_SWAP_LAYER_BUFFERS</term>
+            ///				<description>
+            ///					Indicates whether a device can swap individual layer planes with pixel formats that include
+            ///					double-buffered overlay or underlay planes. Otherwise all layer planes are swapped together
+            ///					as a group. When this flag is set, <b>wglSwapLayerBuffers</b> is supported.
+            ///				</description>
+            ///			</item>
+            ///		</list>
+            ///		<para>You can specify the following bit flags when calling <see cref="ChoosePixelFormat" />.</para>
+            ///		<list type="table">
+            ///			<listheader>
+            ///				<term>Value</term>
+            ///				<description>Meaning</description>
+            ///			</listheader>
+            ///			<item>
+            ///				<term>PFD_DEPTH_DONTCARE</term>
+            ///				<description>
+            ///					The requested pixel format can either have or not have a depth buffer. To select
+            ///					a pixel format without a depth buffer, you must specify this flag. The requested pixel format
+            ///					can be with or without a depth buffer. Otherwise, only pixel formats with a depth buffer
+            ///					are considered.
+            ///				</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_DOUBLEBUFFER_DONTCARE</term>
+            ///				<description>The requested pixel format can be either single- or double-buffered.</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_STEREO_DONTCARE</term>
+            ///				<description>The requested pixel format can be either monoscopic or stereoscopic.</description>
+            ///			</item>
+            ///		</list>
+            ///		<para>
+            ///			With the <b>glAddSwapHintRectWIN</b> extension function, two new flags are included for the
+            ///			<b>PIXELFORMATDESCRIPTOR</b> pixel format structure.
+            ///		</para>
+            ///		<list type="table">
+            ///			<listheader>
+            ///				<term>Value</term>
+            ///				<description>Meaning</description>
+            ///			</listheader>
+            ///			<item>
+            ///				<term>PFD_SWAP_COPY</term>
+            ///				<description>
+            ///					Specifies the content of the back buffer in the double-buffered main color plane following
+            ///					a buffer swap. Swapping the color buffers causes the content of the back buffer to be copied
+            ///					to the front buffer. The content of the back buffer is not affected by the swap. PFD_SWAP_COPY
+            ///					is a hint only and might not be provided by a driver.
+            ///				</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_SWAP_EXCHANGE</term>
+            ///				<description>
+            ///					Specifies the content of the back buffer in the double-buffered main color plane following a
+            ///					buffer swap. Swapping the color buffers causes the exchange of the back buffer's content
+            ///					with the front buffer's content. Following the swap, the back buffer's content contains the
+            ///					front buffer's content before the swap. PFD_SWAP_EXCHANGE is a hint only and might not be
+            ///					provided by a driver.
+            ///				</description>
+            ///			</item>
+            ///		</list>
+            /// </remarks>
+            public Int32 dwFlags;
+
+            /// <summary>
+            /// Specifies the type of pixel data. The following types are defined.
+            /// </summary>
+            /// <remarks>
+            ///		<list type="table">
+            ///			<listheader>
+            ///				<term>Value</term>
+            ///				<description>Meaning</description>
+            ///			</listheader>
+            ///			<item>
+            ///				<term>PFD_TYPE_RGBA</term>
+            ///				<description>
+            ///					RGBA pixels. Each pixel has four components in this order: red, green, blue, and alpha.
+            ///				</description>
+            ///			</item>
+            ///			<item>
+            ///				<term>PFD_TYPE_COLORINDEX</term>
+            ///				<description>Color-index pixels. Each pixel uses a color-index value.</description>
+            ///			</item>
+            ///		</list>
+            /// </remarks>
+            public Byte iPixelType;
+
+            /// <summary>
+            /// Specifies the number of color bitplanes in each color buffer. For RGBA pixel types, it is the size
+            /// of the color buffer, excluding the alpha bitplanes. For color-index pixels, it is the size of the
+            /// color-index buffer.
+            /// </summary>
+            public Byte cColorBits;
+
+            /// <summary>
+            /// Specifies the number of red bitplanes in each RGBA color buffer.
+            /// </summary>
+            public Byte cRedBits;
+
+            /// <summary>
+            /// Specifies the shift count for red bitplanes in each RGBA color buffer.
+            /// </summary>
+            public Byte cRedShift;
+
+            /// <summary>
+            /// Specifies the number of green bitplanes in each RGBA color buffer.
+            /// </summary>
+            public Byte cGreenBits;
+
+            /// <summary>
+            /// Specifies the shift count for green bitplanes in each RGBA color buffer.
+            /// </summary>
+            public Byte cGreenShift;
+
+            /// <summary>
+            /// Specifies the number of blue bitplanes in each RGBA color buffer.
+            /// </summary>
+            public Byte cBlueBits;
+
+            /// <summary>
+            /// Specifies the shift count for blue bitplanes in each RGBA color buffer.
+            /// </summary>
+            public Byte cBlueShift;
+
+            /// <summary>
+            /// Specifies the number of alpha bitplanes in each RGBA color buffer. Alpha bitplanes are not supported.
+            /// </summary>
+            public Byte cAlphaBits;
+
+            /// <summary>
+            /// Specifies the shift count for alpha bitplanes in each RGBA color buffer. Alpha bitplanes are not supported.
+            /// </summary>
+            public Byte cAlphaShift;
+
+            /// <summary>
+            /// Specifies the total number of bitplanes in the accumulation buffer.
+            /// </summary>
+            public Byte cAccumBits;
+
+            /// <summary>
+            /// Specifies the number of red bitplanes in the accumulation buffer.
+            /// </summary>
+            public Byte cAccumRedBits;
+
+            /// <summary>
+            /// Specifies the number of green bitplanes in the accumulation buffer.
+            /// </summary>
+            public Byte cAccumGreenBits;
+
+            /// <summary>
+            /// Specifies the number of blue bitplanes in the accumulation buffer.
+            /// </summary>
+            public Byte cAccumBlueBits;
+
+            /// <summary>
+            /// Specifies the number of alpha bitplanes in the accumulation buffer.
+            /// </summary>
+            public Byte cAccumAlphaBits;
+
+            /// <summary>
+            /// Specifies the depth of the depth (z-axis) buffer.
+            /// </summary>
+            public Byte cDepthBits;
+
+            /// <summary>
+            /// Specifies the depth of the stencil buffer.
+            /// </summary>
+            public Byte cStencilBits;
+
+            /// <summary>
+            /// Specifies the number of auxiliary buffers. Auxiliary buffers are not supported.
+            /// </summary>
+            public Byte cAuxBuffers;
+
+            /// <summary>
+            /// Ignored. Earlier implementations of OpenGL used this member, but it is no longer used.
+            /// </summary>
+            /// <remarks>Specifies the type of layer.</remarks>
+            public Byte iLayerType;
+
+            /// <summary>
+            /// Specifies the number of overlay and underlay planes. Bits 0 through 3 specify up to 15 overlay planes and
+            /// bits 4 through 7 specify up to 15 underlay planes.
+            /// </summary>
+            public Byte bReserved;
+
+            /// <summary>
+            /// Ignored. Earlier implementations of OpenGL used this member, but it is no longer used.
+            /// </summary>
+            /// <remarks>
+            ///		Specifies the layer mask. The layer mask is used in conjunction with the visible mask to determine
+            ///		if one layer overlays another.
+            /// </remarks>
+            public Int32 dwLayerMask;
+
+            /// <summary>
+            /// Specifies the transparent color or index of an underlay plane. When the pixel type is RGBA, <b>dwVisibleMask</b>
+            /// is a transparent RGB color value. When the pixel type is color index, it is a transparent index value.
+            /// </summary>
+            public Int32 dwVisibleMask;
+
+            /// <summary>
+            /// Ignored. Earlier implementations of OpenGL used this member, but it is no longer used.
+            /// </summary>
+            /// <remarks>
+            ///		Specifies whether more than one pixel format shares the same frame buffer. If the result of the bitwise
+            ///		AND of the damage masks between two pixel formats is nonzero, then they share the same buffers.
+            /// </remarks>
+            public Int32 dwDamageMask;
+        };
+        #endregion PIXELFORMATDESCRIPTOR Struct
+
+        #region POINTFLOAT Struct
+        /// <summary>
+        /// The <b>POINTFLOAT</b> structure contains the x and y coordinates of a point.
+        /// </summary>
+        /// <seealso cref="GLYPHMETRICSFLOAT" />
+        [StructLayout(LayoutKind.Sequential)]
+        public struct POINTFLOAT {
+            /// <summary>
+            /// Specifies the horizontal (x) coordinate of a point.
+            /// </summary>
+            public float X;
+
+            /// <summary>
+            /// Specifies the vertical (y) coordinate of a point.
+            /// </summary>
+            public float Y;
+        };
+        #endregion POINTFLOAT Struct
+
+        #region LAYERPLANEDESCRIPTOR Struct
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct LAYERPLANEDESCRIPTOR
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public short nSize;
+            /// <summary>
+            /// 
+            /// </summary>
+            public short nVersion;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int dwFlags;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte iPixelType;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cColorBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cRedBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cRedShift;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cGreenBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cGreenShift;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cBlueBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cBlueShift;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cAlphaBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cAlphaShift;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cAccumBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cAccumRedBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cAccumGreenBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cAccumBlueBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cAccumAlphaBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cDepthBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cStencilBits;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte cAuxBuffers;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte iLayerPlane;
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte bReserved;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int crTransparent;
+        };
+        #endregion
+
+        #region DevCaps Enum
+        /// <summary>
+        /// Flags for <see cref="Gdi.GetDeviceCaps"/>
+        /// </summary>
+        [Flags]
+        public enum DevCaps : int
+        {
+            /// <summary>
+            /// Device driver version
+            /// </summary>
+            DRIVERVERSION = 0,
+            /// <summary>
+            /// Device classification
+            /// </summary>
+            TECHNOLOGY = 2,
+            /// <summary>
+            /// Horizontal size in millimeters
+            /// </summary>
+            HORZSIZE = 4,
+            /// <summary>
+            /// Vertical size in millimeters
+            /// </summary>
+            VERTSIZE = 6,
+            /// <summary>
+            /// Horizontal width in pixels
+            /// </summary>
+            HORZRES = 8,
+            /// <summary>
+            /// Vertical height in pixels
+            /// </summary>
+            VERTRES = 10,
+            /// <summary>
+            /// Number of bits per pixel
+            /// </summary>
+            BITSPIXEL = 12,
+            /// <summary>
+            /// Number of planes
+            /// </summary>
+            PLANES = 14,
+            /// <summary>
+            /// Number of brushes the device has
+            /// </summary>
+            NUMBRUSHES = 16,
+            /// <summary>
+            /// Number of pens the device has
+            /// </summary>
+            NUMPENS = 18,
+            /// <summary>
+            /// Number of markers the device has
+            /// </summary>
+            NUMMARKERS = 20,
+            /// <summary>
+            /// Number of fonts the device has
+            /// </summary>
+            NUMFONTS = 22,
+            /// <summary>
+            /// Number of colors the device supports
+            /// </summary>
+            NUMCOLORS = 24,
+            /// <summary>
+            /// Size required for device descriptor
+            /// </summary>
+            PDEVICESIZE = 26,
+            /// <summary>
+            /// Curve capabilities
+            /// </summary>
+            CURVECAPS = 28,
+            /// <summary>
+            /// Line capabilities
+            /// </summary>
+            LINECAPS = 30,
+            /// <summary>
+            /// Polygonal capabilities
+            /// </summary>
+            POLYGONALCAPS = 32,
+            /// <summary>
+            /// Text capabilities
+            /// </summary>
+            TEXTCAPS = 34,
+            /// <summary>
+            /// Clipping capabilities
+            /// </summary>
+            CLIPCAPS = 36,
+            /// <summary>
+            /// Bitblt capabilities
+            /// </summary>
+            RASTERCAPS = 38,
+            /// <summary>
+            /// Length of the X leg
+            /// </summary>
+            ASPECTX = 40,
+            /// <summary>
+            /// Length of the Y leg
+            /// </summary>
+            ASPECTY = 42,
+            /// <summary>
+            /// Length of the hypotenuse
+            /// </summary>
+            ASPECTXY = 44,
+            /// <summary>
+            /// Shading and Blending caps
+            /// </summary>
+            SHADEBLENDCAPS = 45,
+
+            /// <summary>
+            /// Logical pixels inch in X
+            /// </summary>
+            LOGPIXELSX = 88,
+            /// <summary>
+            /// Logical pixels inch in Y
+            /// </summary>
+            LOGPIXELSY = 90,
+
+            /// <summary>
+            /// Number of entries in physical palette
+            /// </summary>
+            SIZEPALETTE = 104,
+            /// <summary>
+            /// Number of reserved entries in palette
+            /// </summary>
+            NUMRESERVED = 106,
+            /// <summary>
+            /// Actual color resolution
+            /// </summary>
+            COLORRES = 108,
+
+            // Printing related DeviceCaps. These replace the appropriate Escapes
+            /// <summary>
+            /// Physical Width in device units
+            /// </summary>
+            PHYSICALWIDTH = 110,
+            /// <summary>
+            /// Physical Height in device units
+            /// </summary>
+            PHYSICALHEIGHT = 111,
+            /// <summary>
+            /// Physical Printable Area x margin
+            /// </summary>
+            PHYSICALOFFSETX = 112,
+            /// <summary>
+            /// Physical Printable Area y margin
+            /// </summary>
+            PHYSICALOFFSETY = 113,
+            /// <summary>
+            /// Scaling factor x
+            /// </summary>
+            SCALINGFACTORX = 114,
+            /// <summary>
+            /// Scaling factor y
+            /// </summary>
+            SCALINGFACTORY = 115,
+
+            /// <summary>
+            /// Current vertical refresh rate of the display device (for displays only) in Hz
+            /// </summary>
+            VREFRESH = 116,
+            /// <summary>
+            /// Horizontal width of entire desktop in pixels
+            /// </summary>
+            DESKTOPVERTRES = 117,
+            /// <summary>
+            /// Vertical height of entire desktop in pixels
+            /// </summary>
+            DESKTOPHORZRES = 118,
+            /// <summary>
+            /// Preferred blt alignment
+            /// </summary>
+            BLTALIGNMENT = 119            
+        }
+        #endregion
+
+        // --- Private Externs ---
+        #region bool _SetPixelFormat(IntPtr deviceContext, int pixelFormat, ref PIXELFORMATDESCRIPTOR pixelFormatDescriptor)
+        /// <summary>
+        /// 
+        /// </summary>
+        [DllImport(GDI_NATIVE_LIBRARY, EntryPoint="SetPixelFormat", SetLastError=true), CLSCompliant(false), SuppressUnmanagedCodeSecurity]
+        public static extern bool _SetPixelFormat(IntPtr deviceContext, int pixelFormat, ref PIXELFORMATDESCRIPTOR pixelFormatDescriptor);
+        #endregion bool _SetPixelFormat(IntPtr deviceContext, int pixelFormat, ref PIXELFORMATDESCRIPTOR pixelFormatDescriptor)
+
+        // --- Public Externs ---
+        #region int ChoosePixelFormat(HDC hdc, PIXELFORMATDESCRIPTOR* ppfd)
+        /// <summary>
+        /// The <b>ChoosePixelFormat</b> function attempts to match an appropriate pixel format supported by a device context
+        /// to a given pixel format specification.
+        /// </summary>
+        /// <param name="deviceContext">
+        /// Specifies the device context that the function examines to determine the best match for the pixel format
+        /// descriptor pointed to by <i>ppfd</i>.
+        /// </param>
+        /// <param name="pixelFormatDescriptor">
+        /// <para>
+        ///		Pointer to a <see cref="Gdi.PIXELFORMATDESCRIPTOR" /> structure that specifies the requested pixel format.
+        ///		In this context, the members of the <b>PIXELFORMATDESCRIPTOR</b> structure that <i>ppfd</i>
+        ///		points to are used as follows:
+        ///	</para>
+        ///	<para>
+        ///		<b>nSize</b><br />
+        ///		Specifies the size of the <b>PIXELFORMATDESCRIPTOR</b> data structure. Set this member to
+        ///		<c>sizeof(PIXELFORMATDESCRIPTOR)</c>.
+        ///	</para>
+        ///	<para>
+        ///		<b>nVersion</b><br />
+        ///		Specifies the version number of the <b>PIXELFORMATDESCRIPTOR</b> data structure. Set this member to 1.
+        ///	</para>
+        ///	<para>
+        ///		<b>dwFlags</b><br />
+        ///		A set of bit flags that specify properties of the pixel buffer. You can combine the following bit
+        ///		flag constants by using bitwise-OR.<br /><br />
+        ///		If any of the following flags are set, the <b>ChoosePixelFormat</b> function attempts to match pixel
+        ///		formats that also have that flag or flags set. Otherwise, <b>ChoosePixelFormat</b> ignores that flag
+        ///		in the pixel formats:<br /><br />
+        ///		PFD_DRAW_TO_WINDOW<br />
+        ///		PFD_DRAW_TO_BITMAP<br />
+        ///		PFD_SUPPORT_GDI<br />
+        ///		PFD_SUPPORT_OPENGL<br /><br />
+        ///		If any of the following flags are set, <b>ChoosePixelFormat</b> attempts to match pixel formats that
+        ///		also have that flag or flags set. Otherwise, it attempts to match pixel formats without that flag set:<br /><br />
+        ///		PFD_DOUBLEBUFFER<br />
+        ///		PFD_STEREO<br /><br />
+        ///		If the following flag is set, the function ignores the PFD_DOUBLEBUFFER flag in the pixel formats:<br /><br />
+        ///		PFD_DOUBLEBUFFER_DONTCARE<br /><br />
+        ///		If the following flag is set, the function ignores the PFD_STEREO flag in the pixel formats:<br /><br />
+        ///		PFD_STEREO_DONTCARE<br />
+        ///	</para>
+        ///	<para>
+        ///		<b>iPixelType</b><br />
+        ///		Specifies the type of pixel format for the function to consider:<br /><br />
+        ///		PFD_TYPE_RGBA<br />
+        ///		PFD_TYPE_COLORINDEX<br />
+        ///	</para>
+        ///	<para>
+        ///		<b>cColorBits</b><br />
+        ///		Zero or greater.
+        ///	</para>
+        ///	<para>
+        ///		<b>cRedBits</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cRedShift</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cGreenBits</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cGreenShift</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cBlueBits</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cBlueShift</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cAlphaBits</b><br />
+        ///		Zero or greater.
+        ///	</para>
+        ///	<para>
+        ///		<b>cAlphaShift</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cAccumBits</b><br />
+        ///		Zero or greater.
+        ///	</para>
+        ///	<para>
+        ///		<b>cAccumRedBits</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cAccumGreenBits</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cAccumBlueBits</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cAccumAlphaBits</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>cDepthBits</b><br />
+        ///		Zero or greater.
+        ///	</para>
+        ///	<para>
+        ///		<b>cStencilBits</b><br />
+        ///		Zero or greater.
+        ///	</para>
+        ///	<para>
+        ///		<b>cAuxBuffers</b><br />
+        ///		Zero or greater.
+        ///	</para>
+        ///	<para>
+        ///		<b>iLayerType</b><br />
+        ///		Specifies one of the following layer type values:<br /><br />
+        ///		PFD_MAIN_PLANE<br />
+        ///		PFD_OVERLAY_PLANE<br />
+        ///		PFD_UNDERLAY_PLANE<br />
+        ///	</para>
+        ///	<para>
+        ///		<b>bReserved</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>dwLayerMask</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>dwVisibleMask</b><br />
+        ///		Not used.
+        ///	</para>
+        ///	<para>
+        ///		<b>dwDamageMask</b><br />
+        ///		Not used.
+        ///	</para>
+        /// </param>
+        /// <returns>
+        ///		If the function succeeds, the return value is a pixel format index (one-based) that is the closest match
+        ///		to the given pixel format descriptor.<br /><br />
+        ///		If the function fails, the return value is zero. To get extended error information,
+        ///		call see cref="Kernel.GetLastError" />.
+        /// </returns>
+        /// <remarks>
+        ///		You must ensure that the pixel format matched by the <b>ChoosePixelFormat</b> function satisfies your
+        ///		requirements. For example, if you request a pixel format with a 24-bit RGB color buffer but the device
+        ///		context offers only 8-bit RGB color buffers, the function returns a pixel format with an 8-bit RGB color
+        ///		buffer.<br /><br />
+        ///		The following code sample shows how to use <b>ChoosePixelFormat</b> to match a specified pixel
+        ///		format:<br /><br />
+        ///		<code>
+        ///			HDC hdc;
+        ///			int pixelFormat;
+        ///			Gdi.PIXELFORMATDESCRIPTOR pfd;
+        ///
+        ///			// size of this pfd
+        ///			pfd.nSize = (ushort) sizeof(Gdi.PIXELFORMATDESCRIPTOR);
+        ///
+        ///			// version number
+        ///			pfd.nVersion = 1;
+        ///
+        ///			// support window, support OpenGL, double buffered
+        ///			pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW | Gdi.PFD_SUPPORT_OPENGL | Gdi.PFD_DOUBLEBUFFER;
+        ///
+        ///			// RGBA type
+        ///			pfd.iPixelType = Gdi.PFD_TYPE_RGBA;
+        ///
+        ///			// 24-bit color depth
+        ///			pfd.cColorBits = 24;
+        ///
+        ///			// color bits and shift bits ignored
+        ///			pfd.cRedBits = 0;
+        ///			pfd.cRedShift = 0;
+        ///			pfd.cGreenBits = 0;
+        ///			pfd.cGreenShift = 0;
+        ///			pfd.cBlueBits = 0;
+        ///			pfd.cBlueShift = 0;
+        ///			pfd.cAlphaBits = 0;
+        ///			pfd.cAlphaShift = 0;
+        ///
+        ///			// no accumulation buffer, accum bits ignored
+        ///			pfd.cAccumBits = 0;
+        ///			pfd.cAccumRedBits = 0;
+        ///			pfd.cAccumGreenBits = 0;
+        ///			pfd.cAccumBlueBits = 0;
+        ///			pfd.cAccumAlphaBits = 0;
+        ///
+        ///			// no stencil buffer
+        ///			pfd.cStencilBits = 0;
+        ///
+        ///			// no auxiliary buffer
+        ///			pfd.cAuxBuffers = 0;
+        ///
+        ///			// main layer
+        ///			pfd.iLayerType = Gdi.PFD_MAIN_PLANE;
+        ///
+        ///			// reserved
+        ///			pfd.bReserved = 0;
+        ///
+        ///			// layer masks ignored
+        ///			pfd.dwLayerMask = 0;
+        ///			pfd.dwVisibleMask = 0;
+        ///			pfd.dwDamageMask = 0;
+        ///
+        ///			pixelFormat = Gdi.ChoosePixelFormat(hdc, &pfd);
+        ///		</code>
+        /// </remarks>
+        /// seealso cref="DescribePixelFormat" />
+        /// seealso cref="GetPixelFormat" />
+        /// <seealso cref="SetPixelFormat" />
+        [DllImport(GDI_NATIVE_LIBRARY, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern int ChoosePixelFormat(IntPtr deviceContext, ref PIXELFORMATDESCRIPTOR pixelFormatDescriptor);
+        #endregion int ChoosePixelFormat(HDC hdc, PIXELFORMATDESCRIPTOR* ppfd)
+
+        #region BOOL SetPixelFormat(HDC hdc, int iPixelFormat, PIXELFORMATDESCRIPTOR* ppfd)
+        /// <summary>
+        /// The <b>SetPixelFormat</b> function sets the pixel format of the specified device context to the format
+        /// specified by the <i>iPixelFormat</i> index.
+        /// </summary>
+        /// <param name="deviceContext">
+        ///		Specifies the device context whose pixel format the function attempts to set.
+        /// </param>
+        /// <param name="pixelFormat">
+        ///		Index that identifies the pixel format to set. The various pixel formats supported by a device
+        ///		context are identified by one-based indexes.
+        /// </param>
+        /// <param name="pixelFormatDescriptor">
+        ///		Pointer to a <see cref="Gdi.PIXELFORMATDESCRIPTOR" /> structure that contains the logical pixel
+        ///		format specification. The system's metafile component uses this structure to record the logical
+        ///		pixel format specification. The structure has no other effect upon the behavior of the
+        ///		<b>SetPixelFormat</b> function.
+        /// </param>
+        /// <returns>
+        ///		If the function succeeds, the return value is true.<br /><br />
+        ///		If the function fails, the return value is false. To get extended error information, call
+        ///		see cref="Kernel.GetLastError" />.
+        /// </returns>
+        /// <remarks>
+        ///		If <i>hdc</i> references a window, calling the <b>SetPixelFormat</b> function also changes the pixel format
+        ///		of the window. Setting the pixel format of a window more than once can lead to significant complications
+        ///		for the Window Manager and for multithread applications, so it is not allowed. An application can only set
+        ///		the pixel format of a window one time. Once a window's pixel format is set, it cannot be changed.<br /><br />
+        ///
+        ///		You should select a pixel format in the device context before calling the <see cref="Wgl.wglCreateContext" />
+        ///		function. The <b>wglCreateContext</b> function creates a rendering context for drawing on the device in the
+        ///		selected pixel format of the device context.<br /><br />
+        ///
+        ///		An OpenGL window has its own pixel format. Because of this, only device contexts retrieved for the client
+        ///		area of an OpenGL window are allowed to draw into the window. As a result, an OpenGL window should be created
+        ///		with the WS_CLIPCHILDREN and WS_CLIPSIBLINGS styles. Additionally, the window class attribute should not
+        ///		include the CS_PARENTDC style.<br /><br />
+        ///
+        ///		The following code example shows <b>SetPixelFormat</b> usage:<br /><br />
+        ///
+        ///		<code>
+        ///			HDC hdc;
+        ///			int pixelFormat;
+        ///			Gdi.PIXELFORMATDESCRIPTOR pfd;
+        ///
+        ///			// size of this pfd
+        ///			pfd.nSize = (ushort) sizeof(Gdi.PIXELFORMATDESCRIPTOR);
+        ///
+        ///			// version number
+        ///			pfd.nVersion = 1;
+        ///
+        ///			// support window, support OpenGL, double buffered
+        ///			pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW | Gdi.PFD_SUPPORT_OPENGL | Gdi.PFD_DOUBLEBUFFER;
+        ///
+        ///			// RGBA type
+        ///			pfd.iPixelType = Gdi.PFD_TYPE_RGBA;
+        ///
+        ///			// 24-bit color depth
+        ///			pfd.cColorBits = 24;
+        ///
+        ///			// color bits and shift bits ignored
+        ///			pfd.cRedBits = 0;
+        ///			pfd.cRedShift = 0;
+        ///			pfd.cGreenBits = 0;
+        ///			pfd.cGreenShift = 0;
+        ///			pfd.cBlueBits = 0;
+        ///			pfd.cBlueShift = 0;
+        ///			pfd.cAlphaBits = 0;
+        ///			pfd.cAlphaShift = 0;
+        ///
+        ///			// no accumulation buffer, accum bits ignored
+        ///			pfd.cAccumBits = 0;
+        ///			pfd.cAccumRedBits = 0;
+        ///			pfd.cAccumGreenBits = 0;
+        ///			pfd.cAccumBlueBits = 0;
+        ///			pfd.cAccumAlphaBits = 0;
+        ///
+        ///			// no stencil buffer
+        ///			pfd.cStencilBits = 0;
+        ///
+        ///			// no auxiliary buffer
+        ///			pfd.cAuxBuffers = 0;
+        ///
+        ///			// main layer
+        ///			pfd.iLayerType = Gdi.PFD_MAIN_PLANE;
+        ///
+        ///			// reserved
+        ///			pfd.bReserved = 0;
+        ///
+        ///			// layer masks ignored
+        ///			pfd.dwLayerMask = 0;
+        ///			pfd.dwVisibleMask = 0;
+        ///			pfd.dwDamageMask = 0;
+        ///
+        ///			pixelFormat = Gdi.ChoosePixelFormat(hdc, &pfd);
+        ///			
+        ///			// make that the pixel format of the device context
+        ///			Gdi.SetPixelFormat(hdc, pixelFormat, &pfd);
+        ///		</code>
+        /// </remarks>
+        /// <seealso cref="ChoosePixelFormat" />
+        /// seealso cref="DescribePixelFormat" />
+        /// seealso cref="GetPixelFormat" />
+        public static bool SetPixelFormat(IntPtr deviceContext, int pixelFormat, ref PIXELFORMATDESCRIPTOR pixelFormatDescriptor) {
+            Kernel.LoadLibrary("opengl32.dll");
+            return _SetPixelFormat(deviceContext, pixelFormat, ref pixelFormatDescriptor);
+        }
+        #endregion BOOL SetPixelFormat(HDC hdc, int iPixelFormat, PIXELFORMATDESCRIPTOR* ppfd)
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="deviceContext"></param>
+		/// <returns></returns>
+        [DllImport(GDI_NATIVE_LIBRARY, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern bool SwapBuffers(IntPtr deviceContext);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="deviceContext"></param>
+		/// <returns></returns>
+        [DllImport(GDI_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="SwapBuffers"), SuppressUnmanagedCodeSecurity]
+        public static extern int SwapBuffersFast([In] IntPtr deviceContext);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="height"></param>
+		/// <param name="width"></param>
+		/// <param name="escapement"></param>
+		/// <param name="orientation"></param>
+		/// <param name="weight"></param>
+		/// <param name="italic"></param>
+		/// <param name="underline"></param>
+		/// <param name="strikeOut"></param>
+		/// <param name="charSet"></param>
+		/// <param name="outputPrecision"></param>
+		/// <param name="clipPrecision"></param>
+		/// <param name="quality"></param>
+		/// <param name="pitchAndFamily"></param>
+		/// <param name="typeFace"></param>
+		/// <returns></returns>
+        [DllImport(GDI_NATIVE_LIBRARY, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr CreateFont(int height, int width, int escapement, int orientation, int weight, bool italic, bool underline, bool strikeOut, int charSet, int outputPrecision, int clipPrecision, int quality, int pitchAndFamily, string typeFace);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="objectHandle"></param>
+		/// <returns></returns>
+        [DllImport(GDI_NATIVE_LIBRARY, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern bool DeleteObject(IntPtr objectHandle);
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="deviceContext"></param>
+		/// <param name="objectHandle"></param>
+		/// <returns></returns>
+        [DllImport(GDI_NATIVE_LIBRARY), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SelectObject(IntPtr deviceContext, IntPtr objectHandle);
+
+        /// <summary>
+        /// Retrieves device-specific information for the specified device.
+        /// </summary>
+        /// <param name="deviceContext">Handle to the DC</param>
+        /// <param name="nIndex">Specifies the item to return</param>
+        /// <returns></returns>
+        [DllImport(GDI_NATIVE_LIBRARY, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern int GetDeviceCaps(IntPtr deviceContext, int nIndex);
+    }
+}
diff --git a/src/Tao.Platform.Windows/INSTALL b/src/Tao.Platform.Windows/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Platform.Windows/IlasmAttribute.cs b/src/Tao.Platform.Windows/IlasmAttribute.cs
new file mode 100644
index 0000000..e45208c
--- /dev/null
+++ b/src/Tao.Platform.Windows/IlasmAttribute.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+
+namespace Tao.Platform.Windows {
+    #region Class Documentation
+    /// <summary>
+    ///     Injects supplied MSIL into the method's body.
+    /// </summary>
+    /// <remarks>
+    ///     This is a hack as the C# compiler does not allow inline MSIL.  This is extracted and
+    ///     the appropriate MSIL injected by the PostProcessTao utility.
+    /// </remarks>
+    #endregion Class Documentation
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
+    public sealed class IlasmAttribute : Attribute
+    {
+        #region IlasmAttribute(string msil)
+        /// <summary>
+        ///     Injects the supplied MSIL into the tagged method's body.
+        /// </summary>
+        /// <param name="msil">
+        ///     The MSIL to inject.
+        /// </param>
+        public IlasmAttribute(string msil) {}
+        #endregion IlasmAttribute(string msil)
+    }
+}
diff --git a/src/Tao.Platform.Windows/Kernel.cs b/src/Tao.Platform.Windows/Kernel.cs
new file mode 100644
index 0000000..dec6eb4
--- /dev/null
+++ b/src/Tao.Platform.Windows/Kernel.cs
@@ -0,0 +1,1744 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Text;
+
+namespace Tao.Platform.Windows {
+    #region Class Documentation
+    /// <summary>
+    ///     Kernel binding for .NET, implementing Windows-specific kernel functionality.
+    /// </summary>
+    /// <remarks>
+    ///     Binds functions and definitions in kernel32.dll.
+    /// </remarks>
+    #endregion Class Documentation
+    public static class Kernel
+    {
+        // --- Fields ---
+        #region Private Constants
+        #region string KERNEL_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies Kernel32's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies kernel32.dll for Windows.
+        /// </remarks>
+        private const string KERNEL_NATIVE_LIBRARY = "kernel32.dll";
+        #endregion string KERNEL_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.StdCall" />.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.StdCall;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+
+        #region Public Structs
+        #region MEMORYSTATUS
+        /// <summary>
+        ///     <para>
+        ///         The <b>MEMORYSTATUS</b> structure contains information about the current state
+        ///         of both physical and virtual memory.
+        ///     </para>
+        ///     <para>
+        ///         The <see cref="GlobalMemoryStatus" /> function stores information in a
+        ///         <b>MEMORYSTATUS</b> structure.
+        ///     </para>
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>MEMORYSTATUS</b> reflects the state of memory at the time of the call.  It
+        ///         reflects the size of the paging file at that time.  The operating system can
+        ///         enlarge the paging file up to the maximum size set by the administrator.
+        ///     </para>
+        ///     <para>
+        ///         On computers with more than 4 GB of memory, the <b>MEMORYSTATUS</b> structure
+        ///         can return incorrect information.  Windows reports a value of -1 to indicate
+        ///         an overflow, while Windows NT reports a value that is the real amount of
+        ///         memory, modulo 4 GB.  If your application is at risk for this behavior, use
+        ///         the <b>GlobalMemoryStatusEx</b> function instead of the
+        ///         <see cref="GlobalMemoryStatus" /> function.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="GlobalMemoryStatus" />
+        // <seealso cref="GlobalMemoryStatusEx" />
+        // typedef struct _MEMORYSTATUS {
+        //     DWORD dwLength;
+        //     DWORD dwMemoryLoad;
+        //     SIZE_T dwTotalPhys;
+        //     SIZE_T dwAvailPhys;
+        //     SIZE_T dwTotalPageFile;
+        //     SIZE_T dwAvailPageFile;
+        //     SIZE_T dwTotalVirtual;
+        //     SIZE_T dwAvailVirtual;
+        // } MEMORYSTATUS, *LPMEMORYSTATUS;
+        [StructLayout(LayoutKind.Sequential)]
+        public struct MEMORYSTATUS {
+            #region int Length
+            /// <summary>
+            ///     Size of the <b>MEMORYSTATUS</b> data structure, in bytes.  You do not need to
+            ///     set this member before calling the <see cref="GlobalMemoryStatus" /> function;
+            ///     the function sets it.
+            /// </summary>
+            public int Length;
+            #endregion int Length
+
+            #region int MemoryLoad
+            /// <summary>
+            ///     <para>
+            ///         Approximate percentage of total physical memory that is in use.
+            ///     </para>
+            ///     <para>
+            ///         <b>Windows NT:</b>  Percentage of approximately the last 1000 pages of
+            ///         physical memory that is in use.
+            ///     </para>
+            /// </summary>
+            public int MemoryLoad;
+            #endregion int MemoryLoad
+
+            #region int TotalPhys
+            /// <summary>
+            ///     Total size of physical memory, in bytes.
+            /// </summary>
+            public int TotalPhys;
+            #endregion int TotalPhys
+
+            #region int AvailPhys
+            /// <summary>
+            ///     Size of physical memory available, in bytes.
+            /// </summary>
+            public int AvailPhys;
+            #endregion int AvailPhys
+
+            #region int TotalPageFile
+            /// <summary>
+            ///     Size of the committed memory limit, in bytes.
+            /// </summary>
+            public int TotalPageFile;
+            #endregion int TotalPageFile
+
+            #region int AvailPageFile
+            /// <summary>
+            ///     Size of available memory to commit, in bytes.
+            /// </summary>
+            public int AvailPageFile;
+            #endregion int AvailPageFile
+
+            #region int TotalVirtual
+            /// <summary>
+            ///     Total size of the user mode portion of the virtual address space of the
+            ///     calling process, in bytes.
+            /// </summary>
+            public int TotalVirtual;
+            #endregion int TotalVirtual
+
+            #region int AvailVirtual
+            /// <summary>
+            ///     Size of unreserved and uncommitted memory in the user mode portion of the
+            ///     virtual address space of the calling process, in bytes.
+            /// </summary>
+            public int AvailVirtual;
+            #endregion int AvailVirtual
+        }
+        #endregion MEMORYSTATUS
+
+        #region SYSTEM_INFO
+        /// <summary>
+        ///     The <b>SYSTEM_INFO</b> structure contains information about the current computer
+        ///     system.  This includes the architecture and type of the processor, the number of
+        ///     processors in the system, the page size, and other such information.
+        /// </summary>
+        /// <seealso cref="GetSystemInfo" />
+        /// <seealso cref="SYSTEM_INFO_UNION" />
+        // <seealso cref="MapViewOfFile" />
+        // <seealso cref="MapViewOfFileEx" />
+        // typedef struct _SYSTEM_INFO {
+        //     union {
+        //         DWORD dwOemId;          // Obsolete field...do not use
+        //         struct {
+        //             WORD wProcessorArchitecture;
+        //             WORD wReserved;
+        //         };
+        //     };
+        //     DWORD dwPageSize;
+        //     LPVOID lpMinimumApplicationAddress;
+        //     LPVOID lpMaximumApplicationAddress;
+        //     DWORD_PTR dwActiveProcessorMask;
+        //     DWORD dwNumberOfProcessors;
+        //     DWORD dwProcessorType;
+        //     DWORD dwAllocationGranularity;
+        //     WORD wProcessorLevel;
+        //     WORD wProcessorRevision;
+        // } SYSTEM_INFO, *LPSYSTEM_INFO;
+        [StructLayout(LayoutKind.Sequential)]
+        public struct SYSTEM_INFO {
+            #region SYSTEM_INFO_UNION SystemInfoUnion
+            /// <summary>
+            ///     Union for the OemId, ProcessorArchitecture, and Reserved fields of the
+            ///     SYSTEM_INFO structure.  See <see cref="SYSTEM_INFO_UNION" />.
+            /// </summary>
+            public SYSTEM_INFO_UNION SystemInfoUnion;
+            #endregion SYSTEM_INFO_UNION SystemInfoUnion
+
+            #region int PageSize
+            /// <summary>
+            ///     Page size and the granularity of page protection and commitment.  This is the
+            ///     page size used by the <b>VirtualAlloc</b> function.
+            /// </summary>
+            public int PageSize;
+            #endregion int PageSize
+
+            #region IntPtr MinimumApplicationAddress
+            /// <summary>
+            ///     Pointer to the lowest memory address accessible to applications and
+            ///     dynamic-link libraries (DLLs).
+            /// </summary>
+            public IntPtr MinimumApplicationAddress;
+            #endregion IntPtr MinimumApplicationAddress
+
+            #region IntPtr MaximumApplicationAddress
+            /// <summary>
+            ///     Pointer to the highest memory address accessible to applications and DLLs.
+            /// </summary>
+            public IntPtr MaximumApplicationAddress;
+            #endregion IntPtr MaximumApplicationAddress
+
+            #region int ActiveProcessorMask
+            /// <summary>
+            ///     Mask representing the set of processors configured into the system.  Bit 0 is
+            ///     processor 0; bit 31 is processor 31.
+            /// </summary>
+            public int ActiveProcessorMask;
+            #endregion int ActiveProcessorMask
+
+            #region int NumberOfProcessors
+            /// <summary>
+            ///     Number of processors in the system.
+            /// </summary>
+            public int NumberOfProcessors;
+            #endregion int NumberOfProcessors
+
+            #region int ProcessorType
+            /// <summary>
+            ///     <para>
+            ///         An obsolete member that is retained for compatibility with Windows NT 3.5
+            ///         and earlier.  Use the <i>SystemInfoUnion.ProcessorArchitecture</i>,
+            ///         <i>ProcessorLevel</i>, and <i>ProcessorRevision</i> members to determine
+            ///         the type of processor.
+            ///     </para>
+            ///     <para>
+            ///         <b>Windows Me/98/95:</b>  Specifies the type of processor in the system.
+            ///         This member is one of the following values:
+            ///     </para>
+            ///     <para>
+            ///         <see cref="WinNt.PROCESSOR_INTEL_386" />
+            ///     </para>
+            ///     <para>
+            ///         <see cref="WinNt.PROCESSOR_INTEL_486" />
+            ///     </para>
+            ///     <para>
+            ///         <see cref="WinNt.PROCESSOR_INTEL_PENTIUM" />
+            ///     </para>
+            /// </summary>
+            public int ProcessorType;
+            #endregion int ProcessorType
+
+            #region int AllocationGranularity
+            /// <summary>
+            ///     Granularity with which virtual memory is allocated.  For example, a
+            ///     <b>VirtualAlloc</b> request to allocate 1 byte will reserve an address space
+            ///     of <i>AllocationGranularity</i> bytes.  This value was hard coded as 64K in
+            ///     the past, but other hardware architectures may require different values.
+            /// </summary>
+            public int AllocationGranularity;
+            #endregion int AllocationGranularity
+
+            #region int ProcessorLevel
+            /// <summary>
+            ///     <para>
+            ///         System's architecture-dependent processor level.  It should be used only
+            ///         for display purposes.  To determine the feature set of a processor, use
+            ///         the <see cref="IsProcessorFeaturePresent" /> function.
+            ///     </para>
+            ///     <para>
+            ///         If <i>SystemInfoUnion.ProcessorArchitecture</i> is
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_INTEL" />, <i>ProcessorLevel</i>
+            ///         is defined by the CPU vendor.
+            ///     </para>
+            ///     <para>
+            ///         If <i>SystemInfoUnion.ProcessorArchitecture</i> is
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_IA64" />, <i>ProcessorLevel</i> is
+            ///         set to 1.
+            ///     </para>
+            ///     <para>
+            ///         If <i>SystemInfoUnion.ProcessorArchitecture</i> is
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_MIPS" />, <i>ProcessorLevel</i> is
+            ///         of the form 00xx, where xx is an 8-bit implementation number (bits 8-15 of
+            ///         the PRId register).  The member can be the following value:
+            ///     </para>
+            ///     <para>
+            ///         <list type="table">
+            ///             <listheader>
+            ///                 <term>Value</term>
+            ///                 <description>Description</description>
+            ///             </listheader>
+            ///             <item>
+            ///                 <term>0004</term>
+            ///                 <description>MIPS R4000</description>
+            ///             </item>
+            ///         </list>
+            ///     </para>
+            ///     <para>
+            ///         If <i>SystemInfoUnion.ProcessorArchitecture</i> is
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_ALPHA" />, <i>ProcessorLevel</i>
+            ///         is of the form xxxx, where xxxx is a 16-bit processor version number (the
+            ///         low-order 16 bits of a version number from the firmware).  The member can
+            ///         be one of the following values:
+            ///     </para>
+            ///     <para>
+            ///         <list type="table">
+            ///             <listheader>
+            ///                 <term>Value</term>
+            ///                 <description>Description</description>
+            ///             </listheader>
+            ///             <item>
+            ///                 <term>21064</term>
+            ///                 <description>Alpha 21064</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>21066</term>
+            ///                 <description>Alpha 21066</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>21164</term>
+            ///                 <description>Alpha 21164</description>
+            ///             </item>
+            ///         </list>
+            ///     </para>
+            ///     <para>
+            ///         If <i>SystemInfoUnion.ProcessorArchitecture</i> is
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_PPC" />, <i>ProcessorLevel</i> is
+            ///         of the form xxxx, where xxxx is a 16-bit processor version number (the
+            ///         high-order 16 bits of the Processor Version Register).  The member can be
+            ///         one of the following values:
+            ///     </para>
+            ///     <para>
+            ///         <list type="table">
+            ///             <listheader>
+            ///                 <term>Value</term>
+            ///                 <description>Description</description>
+            ///             </listheader>
+            ///             <item>
+            ///                 <term>1</term>
+            ///                 <description>PPC 601</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>3</term>
+            ///                 <description>PPC 603</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>4</term>
+            ///                 <description>PPC 604</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>6</term>
+            ///                 <description>PPC 603+</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>9</term>
+            ///                 <description>PPC 604+</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>20</term>
+            ///                 <description>PPC 620</description>
+            ///             </item>
+            ///         </list>
+            ///     </para>
+            /// </summary>
+            public int ProcessorLevel;
+            #endregion int ProcessorLevel
+
+            #region int ProcessorRevision
+            /// <summary>
+            ///     <para>
+            ///         Architecture-dependent processor revision.  The following table shows how
+            ///         the revision value is assembled for each type of processor architecture:
+            ///     </para>
+            ///     <para>
+            ///         <list type="table">
+            ///             <listheader>
+            ///                 <term>Processor</term>
+            ///                 <description>Description</description>
+            ///             </listheader>
+            ///             <item>
+            ///                 <term>Intel 80386 or 80486</term>
+            ///                 <description>
+            ///                     <para>
+            ///                         A value of the form xxyz.
+            ///                     </para>
+            ///                     <para>
+            ///                         If xx is equal to 0xFF, y - 0xA is the model number, and
+            ///                         z is the stepping identifier.  For example, an Intel
+            ///                         80486-D0 system returns 0xFFD0.
+            ///                     </para>
+            ///                     <para>
+            ///                         If xx is not equal to 0xFF, xx + 'A' is the stepping
+            ///                         letter and yz is the minor stepping.
+            ///                     </para>
+            ///                 </description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>Intel Pentium, Cyrix, or NextGen 586</term>
+            ///                 <description>
+            ///                     <para>
+            ///                         A value of the form xxyy, where xx is the model number and
+            ///                         yy is the stepping.  Display this value of 0x0201 as
+            ///                         follows:
+            ///                     </para>
+            ///                     <para>
+            ///                         Model xx, Stepping yy.
+            ///                     </para>
+            ///                 </description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>MIPS</term>
+            ///                 <description>
+            ///                     A value of the form 00xx, where xx is the 8-bit revision
+            ///                     number of the processor (the low-order 8 bits of the
+            ///                     PRId register).
+            ///                 </description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>ALPHA</term>
+            ///                 <description>
+            ///                     <para>
+            ///                         A value of the form xxyy, where xxyy is the low-order 16
+            ///                         bits of the processor revision number from the firmware.
+            ///                         Display this value as follows:
+            ///                     </para>
+            ///                     <para>
+            ///                         Model A+xx, Pass yy.
+            ///                     </para>
+            ///                 </description>
+            ///             </item>
+            ///             <item>
+            ///                 <term>PPC</term>
+            ///                 <description>
+            ///                     <para>
+            ///                         A value of the form xxyy, where xxyy is the low-order 16
+            ///                         bits of the processor version register.  Display this
+            ///                         value as follows:
+            ///                     </para>
+            ///                     <para>
+            ///                         xx.yy.
+            ///                     </para>
+            ///                 </description>
+            ///             </item>
+            ///         </list>
+            ///     </para>
+            /// </summary>
+            public int ProcessorRevision;
+            #endregion int ProcessorRevision
+        }
+        #endregion SYSTEM_INFO
+
+        #region SYSTEM_INFO_UNION
+        /// <summary>
+        ///     Union for the OemId, ProcessorArchitecture, and Reserved fields of the
+        ///     <see cref="SYSTEM_INFO" /> structure.
+        /// </summary>
+        /// <seealso cref="SYSTEM_INFO" />
+        //     union {
+        //         DWORD dwOemId;          // Obsolete field...do not use
+        //         struct {
+        //             WORD wProcessorArchitecture;
+        //             WORD wReserved;
+        //         };
+        //     };
+        [StructLayout(LayoutKind.Explicit)]
+        public struct SYSTEM_INFO_UNION {
+            #region int OemId
+            /// <summary>
+            ///     <para>
+            ///         An obsolete member that is retained for compatibility with Windows NT 3.5
+            ///         and earlier.  New applications should use the <i>ProcessorArchitecture</i>
+            ///         branch of the union.
+            ///     </para>
+            ///     <para>
+            ///         <b>Windows Me/98/95:</b>  The system always sets this member to zero, the
+            ///         value defined for <see cref="WinNt.PROCESSOR_ARCHITECTURE_INTEL" />.
+            ///     </para>
+            /// </summary>
+            [FieldOffset(0)]
+            public int OemId;
+            #endregion int OemId
+
+            #region short ProcessorArchitecture
+            /// <summary>
+            ///     <para>
+            ///         System's processor architecture.  This value can be one of the following
+            ///         values:
+            ///     </para>
+            ///     <para>
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_UNKNOWN" />
+            ///     </para>
+            ///     <para>
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_INTEL" />
+            ///     </para>
+            ///     <para>
+            ///         <b>Windows NT 3.51:</b>  <see cref="WinNt.PROCESSOR_ARCHITECTURE_MIPS" />
+            ///     </para>
+            ///     <para>
+            ///         <b>Windows NT 4.0 and earlier:</b>
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_ALPHA" />
+            ///     </para>
+            ///     <para>
+            ///         <b>Windows NT 4.0 and earlier:</b>
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_PPC" />
+            ///     </para>
+            ///     <para>
+            ///         <b>64-bit Windows:</b>  <see cref="WinNt.PROCESSOR_ARCHITECTURE_IA64" />,
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_IA32_ON_WIN64" />,
+            ///         <see cref="WinNt.PROCESSOR_ARCHITECTURE_AMD64" />
+            ///     </para>
+            /// </summary>
+            [FieldOffset(0)]
+            public short ProcessorArchitecture;
+            #endregion short ProcessorArchitecture
+
+            #region short Reserved
+            /// <summary>
+            ///     Reserved for future use.
+            /// </summary>
+            [FieldOffset(2)]
+            public short Reserved;
+            #endregion short Reserved
+        }
+        #endregion SYSTEM_INFO_UNION
+        #endregion Public Structs
+
+        // --- Public Externs ---
+        #region bool Beep(int frequency, int duration)
+        /// <summary>
+        ///     The <b>Beep</b> function generates simple tones on the speaker.  The function is
+        ///     synchronous; it does not return control to its caller until the sound finishes.
+        /// </summary>
+        /// <param name="frequency">
+        ///     <para>
+        ///         Frequency of the sound, in hertz.  This parameter must be in the range
+        ///         37 through 32,767 (0x25 through 0x7FFF).
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows 95/98/Me:</b>  The <b>Beep</b> function ignores this parameter.
+        ///     </para>
+        /// </param>
+        /// <param name="duration">
+        ///     <para>
+        ///         Duration of the sound, in milliseconds.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows 95/98/Me:</b>  The <b>Beep</b> function ignores this parameter.
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is true.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is false.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>Terminal Services:</b>  The beep is redirected to the client.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows 95/98/Me:</b>  On computers with a sound card, the function
+        ///         plays the default sound event.  On computers without a sound card, the
+        ///         function plays the standard system beep.
+        ///     </para>
+        /// </remarks>
+        // <seealso cref="User.MessageBeep" />
+        // WINBASEAPI BOOL WINAPI Beep(IN DWORD dwFreq, IN DWORD dwDuration);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern bool Beep(int frequency, int duration);
+        #endregion bool Beep(int frequency, int duration)
+
+        #region bool FreeLibrary(IntPtr moduleHandle)
+        /// <summary>
+        ///     The <b>FreeLibrary</b> function decrements the reference count of the loaded
+        ///     dynamic-link library (DLL).  When the reference count reaches zero, the module
+        ///     is unmapped from the address space of the calling process and the handle is no
+        ///     longer valid.
+        /// </summary>
+        /// <param name="moduleHandle">
+        ///     Handle to the loaded DLL module.  The <see cref="LoadLibrary" /> or
+        ///     <see cref="GetModuleHandle" /> function returns this handle.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is true.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is false.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         Each process maintains a reference count for each loaded library module.  This
+        ///         reference count is incremented each time <see cref="LoadLibrary" /> is called
+        ///         and is decremented each time <b>FreeLibrary</b> is called.  A DLL module
+        ///         loaded at process initialization due to load-time dynamic linking has a
+        ///         reference count of one.  This count is incremented if the same module is
+        ///         loaded by a call to <see cref="LoadLibrary" />.
+        ///     </para>
+        ///     <para>
+        ///         Before unmapping a library module, the system enables the DLL to detach from
+        ///         the process by calling the DLL's <b>DllMain</b> function, if it has one, with
+        ///         the DLL_PROCESS_DETACH value.  Doing so gives the DLL an opportunity to clean
+        ///         up resources allocated on behalf of the current process.  After the
+        ///         entry-point function returns, the library module is removed from the address
+        ///         space of the current process.
+        ///     </para>
+        ///     <para>
+        ///         It is not safe to call <b>FreeLibrary</b> from <b>DllMain</b>.  For more
+        ///         information, see the Remarks section in <b>DllMain</b>.
+        ///     </para>
+        ///     <para>
+        ///         Calling <b>FreeLibrary</b> does not affect other processes using the same
+        ///         library module.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="GetModuleHandle" />
+        /// <seealso cref="LoadLibrary" />
+        // <seealso cref="DllMain" />
+        // <seealso cref="FreeLibraryAndExitThread" />
+        // WINBASEAPI BOOL WINAPI FreeLibrary(IN OUT HMODULE hLibModule);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern bool FreeLibrary(IntPtr moduleHandle);
+        #endregion bool FreeLibrary(IntPtr moduleHandle)
+
+        #region int GetDllDirectory(int bufferLength, [Out] StringBuilder buffer)
+        /// <summary>
+        ///     The <b>GetDllDirectory</b> function retrieves the application-specific portion of
+        ///     the search path used to locate DLLs for the application.
+        /// </summary>
+        /// <param name="bufferLength">
+        ///     Size of the output buffer, in characters.
+        /// </param>
+        /// <param name="buffer">
+        ///     Pointer to a buffer that receives the application-specific portion of the search path.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is the length of the string copied
+        ///         to <i>buffer</i>, in characters, not including the terminating null character.
+        ///         If the return value is greater than <i>bufferLength</i>, it specifies the size
+        ///         of the buffer required for the path.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is zero.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <seealso cref="SetDllDirectory" />
+        // WINBASEAPI DWORD WINAPI GetDllDirectoryA(IN DWORD nBufferLength, OUT LPSTR lpBuffer);
+        // WINBASEAPI DWORD WINAPI GetDllDirectoryW(IN DWORD nBufferLength, OUT LPWSTR lpBuffer);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern int GetDllDirectory(int bufferLength, [Out] StringBuilder buffer);
+        #endregion int GetDllDirectory(int bufferLength, [Out] StringBuilder buffer)
+
+        #region int GetModuleFileName(IntPtr module, [Out] StringBuilder fileName, int size)
+        /// <summary>
+        ///     <para>
+        ///         The <b>GetModuleFileName</b> function retrieves the fully qualified path for
+        ///         the specified module.
+        ///     </para>
+        ///     <para>
+        ///         To specify the process that contains the module, use the
+        ///         <b>GetModuleFileNameEx</b> function.
+        ///     </para>
+        /// </summary>
+        /// <param name="module">
+        ///     Handle to the module whose path is being requested.  If this parameter is NULL,
+        ///     <b>GetModuleFileName</b> retrieves the path for the current module.
+        /// </param>
+        /// <param name="fileName">
+        ///     <para>
+        ///         Pointer to a buffer that receives a null-terminated string that specifies the
+        ///         fully-qualified path of the module.  If the length of the path exceeds the
+        ///         size specified by the <i>size</i> parameter, the function succeeds and the
+        ///         string is truncated to <i>size</i> characters and null terminated.
+        ///     </para>
+        ///     <para>
+        ///         The path can have the prefix "\\?\", depending on how the module was loaded.
+        ///     </para>
+        /// </param>
+        /// <param name="size">
+        ///     Size of the <i>filename</i> buffer, in TCHARs.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is the length of the string copied
+        ///         to the buffer, in TCHARs.  If the buffer is too small to hold the module name,
+        ///         the string is truncated to <i>size</i>, and the function returns <i>size</i>.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is zero.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         If a DLL is loaded in two processes, its file name in one process may differ
+        ///         in case from its file name in the other process.
+        ///     </para>
+        ///     <para>
+        ///         For the ANSI version of the function, the number of TCHARs is the number of
+        ///         bytes; for the Unicode version, it is the number of characters.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows Me/98/95:</b>  This function retrieves long file names when an
+        ///         application's version number is greater than or equal to 4.00 and the long
+        ///         file name is available.  Otherwise, it returns only 8.3 format file names.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="GetModuleHandle" />
+        /// <seealso cref="LoadLibrary" />
+        // <seealso cref="GetModuleFileNameEx" />
+        // WINBASEAPI DWORD WINAPI GetModuleFileNameA(IN HMODULE hModule, OUT LPSTR lpFilename, IN DWORD nSize);
+        // WINBASEAPI DWORD WINAPI GetModuleFileNameW(IN HMODULE hModule, OUT LPWSTR lpFilename, IN DWORD nSize);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern int GetModuleFileName(IntPtr module, [Out] StringBuilder fileName, int size);
+        #endregion int GetModuleFileName(IntPtr module, [Out] StringBuilder fileName, int size)
+
+        #region IntPtr GetModuleHandle(string moduleName)
+        /// <summary>
+        ///     <para>
+        ///         The <b>GetModuleHandle</b> function retrieves a module handle for the
+        ///         specified module if the file has been mapped into the address space of the
+        ///         calling process.
+        ///     </para>
+        ///     <para>
+        ///         To avoid the race conditions described in the Remarks section, use the
+        ///         <b>GetModuleHandleEx</b> function.
+        ///     </para>
+        /// </summary>
+        /// <param name="moduleName">
+        ///     <para>
+        ///         Pointer to a null-terminated string that contains the name of the module
+        ///         (either a .dll or .exe file).  If the file name extension is omitted, the
+        ///         default library extension .dll is appended.  The file name string can include
+        ///         a trailing point character (.) to indicate that the module name has no
+        ///         extension.  The string does not have to specify a path.  When specifying a
+        ///         path, be sure to use backslashes (\), not forward slashes (/).  The name is
+        ///         compared (case independently) to the names of modules currently mapped into
+        ///         the address space of the calling process.
+        ///     </para>
+        ///     <para>
+        ///         If this parameter is NULL, <b>GetModuleHandle</b> returns a handle to the
+        ///         file used to create the calling process.
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is a handle to the specified module
+        ///         (IntPtr).
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is NULL (IntPtr.Zero).  To get
+        ///         extended error information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The returned handle is not global or inheritable.  It cannot be duplicated
+        ///         or used by another process.
+        ///     </para>
+        ///     <para>
+        ///         The <b>GetModuleHandle</b> function returns a handle to a mapped module
+        ///         without incrementing its reference count.  Therefore, use care when passing
+        ///         the handle to the <see cref="FreeLibrary" /> function, because doing so can
+        ///         cause a DLL module to be unmapped prematurely.
+        ///     </para>
+        ///     <para>
+        ///         This function must be used carefully in a multithreaded application.  There
+        ///         is no guarantee that the module handle remains valid between the time this
+        ///         function returns the handle and the time it is used.  For example, a thread
+        ///         retrieves a module handle, but before it uses the handle, a second thread
+        ///         frees the module.  If the system loads another module, it could reuse the
+        ///         module handle that was recently freed.  Therefore, first thread would have
+        ///         a handle to a module different than the one intended.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="FreeLibrary" />
+        /// <seealso cref="GetModuleFileName" />
+        // <seealso cref="GetModuleHandleEx" />
+        // WINBASEAPI HMODULE WINAPI GetModuleHandleA(IN LPCSTR lpModuleName);
+        // WINBASEAPI HMODULE WINAPI GetModuleHandleW(IN LPCWSTR lpModuleName);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr GetModuleHandle(string moduleName);
+        #endregion IntPtr GetModuleHandle(string moduleName)
+
+        #region IntPtr GetProcAddress(IntPtr module, string processName)
+        /// <summary>
+        ///     The <b>GetProcAddress</b> function retrieves the address of an exported function
+        ///     or variable from the specified dynamic-link library (DLL).
+        /// </summary>
+        /// <param name="module">
+        ///     Handle to the DLL module that contains the function or variable.  The
+        ///     <see cref="LoadLibrary" /> or <see cref="GetModuleHandle" /> function returns
+        ///     this handle.
+        /// </param>
+        /// <param name="processName">
+        ///     Pointer to a null-terminated string that specifies the function or variable name,
+        ///     or the function's ordinal value.  If this parameter is an ordinal value, it must
+        ///     be in the low-order word; the high-order word must be zero.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is the address of the exported
+        ///         function or variable.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is NULL (IntPtr.Zero).  To get
+        ///         extended error information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The spelling and case of a function name pointed to by <i>processName</i> must
+        ///         be identical to that in the EXPORTS statement of the source DLL's
+        ///         module-definition (.def) file.  The exported names of functions may differ
+        ///         from the names you use when calling these functions in your code.  This
+        ///         difference is hidden by macros used in the SDK header files.
+        ///     </para>
+        ///     <para>
+        ///         The <i>processName</i> parameter can identify the DLL function by specifying
+        ///         an ordinal value associated with the function in the EXPORTS statement.
+        ///         <b>GetProcAddress</b> verifies that the specified ordinal is in the range 1
+        ///         through the highest ordinal value exported in the .def file.  The function
+        ///         then uses the ordinal as an index to read the function's address from a
+        ///         function table.  If the .def file does not number the functions consecutively
+        ///         from 1 to N (where N is the number of exported functions), an error can occur
+        ///         where <b>GetProcAddress</b> returns an invalid, non-NULL address, even though
+        ///         there is no function with the specified ordinal.
+        ///     </para>
+        ///     <para>
+        ///         In cases where the function may not exist, the function should be specified by
+        ///         name rather than by ordinal value.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="FreeLibrary" />
+        /// <seealso cref="GetModuleHandle" />
+        /// <seealso cref="LoadLibrary" />
+        // WINBASEAPI FARPROC WINAPI GetProcAddress(IN HMODULE hModule, IN LPCSTR lpProcName);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Ansi, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr GetProcAddress(IntPtr module, string processName);
+        #endregion IntPtr GetProcAddress(IntPtr module, string processName)
+
+        #region bool GetProcessWorkingSetSize(IntPtr process, out int minimumWorkingSetSize, out int maximumWorkingSetSize)
+        /// <summary>
+        ///     The <b>GetProcessWorkingSetSize</b> function retrieves the minimum and maximum
+        ///     working set sizes of the specified process.
+        /// </summary>
+        /// <param name="process">
+        ///     Handle to the process whose working set sizes will be obtained.  The handle must
+        ///     have the PROCESS_QUERY_INFORMATION access right.
+        /// </param>
+        /// <param name="minimumWorkingSetSize">
+        ///     Pointer to a variable that receives the minimum working set size of the specified
+        ///     process, in bytes.  The virtual memory manager attempts to keep at least this much
+        ///     memory resident in the process whenever the process is active.
+        /// </param>
+        /// <param name="maximumWorkingSetSize">
+        ///     Pointer to a variable that receives the maximum working set size of the specified
+        ///     process, in bytes.  The virtual memory manager attempts to keep no more than this
+        ///     much memory resident in the process whenever the process is active when memory is
+        ///     in short supply.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is true.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is false.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     The "working set" of a process is the set of memory pages currently visible to
+        ///     the process in physical RAM memory.  These pages are resident and available for
+        ///     an application to use without triggering a page fault.  The minimum and maximum
+        ///     working set sizes affect the virtual memory paging behavior of a process.
+        /// </remarks>
+        /// <seealso cref="SetProcessWorkingSetSize" />
+        // WINBASEAPI BOOL WINAPI GetProcessWorkingSetSize(IN HANDLE hProcess, OUT PSIZE_T lpMinimumWorkingSetSize, OUT PSIZE_T lpMaximumWorkingSetSize);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern bool GetProcessWorkingSetSize(IntPtr process, out int minimumWorkingSetSize, out int maximumWorkingSetSize);
+        #endregion bool GetProcessWorkingSetSize(IntPtr process, out int minimumWorkingSetSize, out int maximumWorkingSetSize)
+
+        #region int GetSystemDirectory([Out] StringBuilder buffer, int size)
+        /// <summary>
+        ///     <para>
+        ///         The <b>GetSystemDirectory</b> function retrieves the path of the system
+        ///         directory.  The system directory contains system such files such as
+        ///         dynamic-link libraries, drivers, and font files.
+        ///     </para>
+        ///     <para>
+        ///         This function is provided primarily for compatibility.  Applications should
+        ///         store code in the Program Files folder and persistent data in the Application
+        ///         Data folder in the user's profile.
+        ///     </para>
+        /// </summary>
+        /// <param name="buffer">
+        ///     Pointer to the buffer to receive the null-terminated string containing the path.
+        ///     This path does not end with a backslash unless the system directory is the root
+        ///     directory.  For example, if the system directory is named Windows\System on drive
+        ///     C, the path of the system directory retrieved by this function is
+        ///     C:\Windows\System.
+        /// </param>
+        /// <param name="size">
+        ///     Maximum size of the buffer, in TCHARs.  This value should be set to at least
+        ///     MAX_PATH+1 to allow sufficient space for the path and the null terminator.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is the length, in TCHARs, of the
+        ///         string copied to the buffer, not including the terminating null character.  If
+        ///         the length is greater than the size of the buffer, the return value is the
+        ///         size of the buffer required to hold the path.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is zero.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     Applications should not create files in the system directory.  If the user is
+        ///     running a shared version of the operating system, the application does not have
+        ///     write access to the system directory.
+        /// </remarks>
+        /// <seealso cref="GetWindowsDirectory" />
+        // <seealso cref="GetCurrentDirectory" />
+        // <seealso cref="SetCurrentDirectory" />
+        // WINBASEAPI UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize);
+        // WINBASEAPI UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern int GetSystemDirectory([Out] StringBuilder buffer, int size);
+        #endregion int GetSystemDirectory([Out] StringBuilder buffer, int size)
+
+        #region GetSystemInfo(out SYSTEM_INFO systemInfo)
+        /// <summary>
+        ///     <para>
+        ///         The <b>GetSystemInfo</b> function returns information about the current
+        ///         system.
+        ///     </para>
+        ///     <para>
+        ///         To retrieve accurate information for a Win32-based application running on
+        ///         WOW64, call the <b>GetNativeSystemInfo</b> function.
+        ///     </para>
+        /// </summary>
+        /// <param name="systemInfo">
+        ///     Pointer to a <see cref="SYSTEM_INFO" /> structure that receives the information.
+        /// </param>
+        /// <seealso cref="SYSTEM_INFO" />
+        // <seealso cref="GetNativeSystemInfo" />
+        // WINBASEAPI VOID WINAPI GetSystemInfo(OUT LPSYSTEM_INFO lpSystemInfo);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void GetSystemInfo(out SYSTEM_INFO systemInfo);
+        #endregion GetSystemInfo(out SYSTEM_INFO systemInfo)
+
+        #region int GetSystemWindowsDirectory([Out] StringBuilder buffer, int size)
+        /// <summary>
+        ///     The <b>GetSystemWindowsDirectory</b> function retrieves the path of the shared
+        ///     Windows directory on a multi-user system.
+        /// </summary>
+        /// <param name="buffer">
+        ///     Pointer to the buffer to receive a null-terminated string containing the path.
+        ///     This path does not end with a backslash unless the Windows directory is the root
+        ///     directory.  For example, if the Windows directory is named Windows on drive C,
+        ///     the path of the Windows directory retrieved by this function is C:\Windows.  If
+        ///     the system was installed in the root directory of drive C, the path retrieved
+        ///     is C:\.
+        /// </param>
+        /// <param name="size">
+        ///     Maximum size of the buffer specified by the <i>buffer</i> parameter, in TCHARs.
+        ///     This value should be set to at least MAX_PATH+1 to allow sufficient space for the
+        ///     path and the null-terminating character.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is the length of the string copied
+        ///         to the buffer, in TCHARs, not including the terminating null character.
+        ///     </para>
+        ///     <para>
+        ///         If the length is greater than the size of the buffer, the return value is the
+        ///         size of the buffer required to hold the path.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is zero.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         On a system that is running Terminal Server, each user has a unique Windows
+        ///         directory.  The system Windows directory is shared by all users, so it is the
+        ///         directory where an application should store initialization and help files that
+        ///         apply to all users.
+        ///     </para>
+        ///     <para>
+        ///         With Terminal Services, the <b>GetSystemWindowsDirectory</b> function
+        ///         retrieves the path of the system Windows directory, while the
+        ///         <see cref="GetWindowsDirectory" /> function retrieves the path of a Windows
+        ///         directory that is private for each user.  On a single-user system,
+        ///         <b>GetSystemWindowsDirectory</b> is the same as
+        ///         <see cref="GetWindowsDirectory" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows NT 4.0 Terminal Server Edition:</b>  To retrieve the shared
+        ///         Windows directory, call <see cref="GetSystemDirectory" /> and trim the
+        ///         "System32" element from the end of the returned path.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="GetWindowsDirectory" />
+        // WINBASEAPI UINT WINAPI GetSystemWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize);
+        // WINBASEAPI UINT WINAPI GetSystemWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern int GetSystemWindowsDirectory([Out] StringBuilder buffer, int size);
+        #endregion int GetSystemWindowsDirectory([Out] StringBuilder buffer, int size)
+
+        #region int GetTickCount()
+        /// <summary>
+        ///     The <b>GetTickCount</b> function retrieves the number of milliseconds that have
+        ///     elapsed since the system was started.  It is limited to the resolution of the
+        ///     system timer.  To obtain the system timer resolution, use the
+        ///     <b>GetSystemTimeAdjustment</b> function.
+        /// </summary>
+        /// <returns>
+        ///     The return value is the number of milliseconds that have elapsed since the system
+        ///     was started.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The elapsed time is stored as a DWORD value.  Therefore, the time will wrap
+        ///         around to zero if the system is run continuously for 49.7 days.
+        ///     </para>
+        ///     <para>
+        ///         If you need a higher resolution timer, use a multimedia timer or a
+        ///         high-resolution timer.
+        ///     </para>
+        ///     <para>
+        ///         To obtain the time elapsed since the computer was started, retrieve the System
+        ///         Up Time counter in the performance data in the registry key
+        ///         HKEY_PERFORMANCE_DATA.  The value returned is an 8-byte value.
+        ///     </para>
+        /// </remarks>
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int GetTickCount();
+        #endregion int GetTickCount()
+
+        #region int GetWindowsDirectory([Out] StringBuilder buffer, int size)
+        /// <summary>
+        ///     <para>
+        ///         The <b>GetWindowsDirectory</b> function retrieves the path of the Windows
+        ///         directory.  The Windows directory contains such files as applications,
+        ///         initialization files, and help files.
+        ///     </para>
+        ///     <para>
+        ///         This function is provided primarily for compatibility.  Applications should
+        ///         store code in the Program Files folder and persistent data in the Application
+        ///         Data folder in the user's profile.
+        ///     </para>
+        /// </summary>
+        /// <param name="buffer">
+        ///     Pointer to the buffer to receive the null-terminated string containing the path.
+        ///     This path does not end with a backslash unless the Windows directory is the root
+        ///     directory.  For example, if the Windows directory is named Windows on drive C, the
+        ///     path of the Windows directory retrieved by this function is C:\Windows.  If the
+        ///     system was installed in the root directory of drive C, the path retrieved is C:\.
+        /// </param>
+        /// <param name="size">
+        ///     Maximum size of the buffer specified by the <i>buffer</i> parameter, in TCHARs.
+        ///     This value should be set to MAX_PATH.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is the length of the string copied
+        ///         to the buffer, in TCHARs, not including the terminating null character.
+        ///     </para>
+        ///     <para>
+        ///         If the length is greater than the size of the buffer, the return value is the
+        ///         size of the buffer required to hold the path.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is zero.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The Windows directory is the directory where an application should store
+        ///         initialization and help files. If the user is running a shared version of the
+        ///         system, the Windows directory is guaranteed to be private for each user.
+        ///     </para>
+        ///     <para>
+        ///         If an application creates other files that it wants to store on a per-user
+        ///         basis, it should place them in the directory specified by the HOMEPATH
+        ///         environment variable.  This directory will be different for each user, if so
+        ///         specified by an administrator, through the User Manager administrative tool.
+        ///         HOMEPATH always specifies either the user's home directory, which is
+        ///         guaranteed to be private for each user, or a default directory (for example,
+        ///         C:\USERS\DEFAULT) where the user will have all access.
+        ///     </para>
+        ///     <para>
+        ///         <b>Terminal Services:</b>  If the application is running in a Terminal
+        ///         Services environment, each user has a unique Windows directory.  If an
+        ///         application that is not Terminal-Services-aware calls this function, it
+        ///         retrieves the path of the Windows directory on the client, not the Windows
+        ///         directory on the server.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="GetSystemDirectory" />
+        /// <seealso cref="GetSystemWindowsDirectory" />
+        // <seealso cref="GetCurrentDirectory" />
+        // WINBASEAPI UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize);
+        // WINBASEAPI UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern int GetWindowsDirectory([Out] StringBuilder buffer, int size);
+        #endregion int GetWindowsDirectory([Out] StringBuilder buffer, int size)
+
+        #region GlobalMemoryStatus(out MEMORYSTATUS buffer)
+        /// <summary>
+        ///     <para>
+        ///         The <b>GlobalMemoryStatus</b> function obtains information about the system's
+        ///         current usage of both physical and virtual memory.
+        ///     </para>
+        ///     <para>
+        ///         To obtain information about the extended portion of the virtual address space,
+        ///         or if your application may run on computers with more than 4 GB of main
+        ///         memory, use the <b>GlobalMemoryStatusEx</b> function.
+        ///     </para>
+        /// </summary>
+        /// <param name="buffer">
+        ///     Pointer to a <see cref="MEMORYSTATUS" /> structure.  The <b>GlobalMemoryStatus</b>
+        ///     function stores information about current memory availability into this structure.
+        /// </param>
+        /// <remarks>
+        ///     <para>
+        ///         You can use the <b>GlobalMemoryStatus</b> function to determine how much
+        ///         memory your application can allocate without severely impacting other
+        ///         applications.
+        ///     </para>
+        ///     <para>
+        ///         The information returned by the <b>GlobalMemoryStatus</b> function is
+        ///         volatile.  There is no guarantee that two sequential calls to this function
+        ///         will return the same information.
+        ///     </para>
+        ///     <para>
+        ///         On computers with more than 4 GB of memory, the <b>GlobalMemoryStatus</b>
+        ///         function can return incorrect information.  Windows 2000 and later report a
+        ///         value of -1 to indicate an overflow.  Earlier versions of Windows NT report a
+        ///         value that is the real amount of memory, modulo 4 GB.  For this reason, use
+        ///         the <b>GlobalMemoryStatusEx</b> function instead.
+        ///     </para>
+        ///     <para>
+        ///         On Intel x86 computers with more than 2 GB and less than 4 GB of memory, the
+        ///         <b>GlobalMemoryStatus</b> function will always return 2 GB in the
+        ///         <see cref="MEMORYSTATUS.TotalPhys" /> member of the
+        ///         <see cref="MEMORYSTATUS" /> structure.  Similarly, if the total available
+        ///         memory is between 2 and 4 GB, the <see cref="MEMORYSTATUS.AvailPhys" /> member
+        ///         of the <see cref="MEMORYSTATUS" /> structure will be rounded down to 2 GB.  If
+        ///         the executable is linked using the /LARGEADDRESSWARE linker option, then the
+        ///         <b>GlobalMemoryStatus</b> function will return the correct amount of physical
+        ///         memory in both members.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="MEMORYSTATUS" />
+        // <seealso cref="GlobalMemoryStatusEx" />
+        // WINBASEAPI VOID WINAPI GlobalMemoryStatus(IN OUT LPMEMORYSTATUS lpBuffer);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void GlobalMemoryStatus(out MEMORYSTATUS buffer);
+        #endregion GlobalMemoryStatus(out MEMORYSTATUS buffer)
+
+        #region bool IsProcessorFeaturePresent(int processorFeature)
+        /// <summary>
+        ///     The <b>IsProcessorFeaturePresent</b> function determines whether the specified
+        ///     processor feature is supported by the current computer.
+        /// </summary>
+        /// <param name="processorFeature">
+        ///     <para>
+        ///         Processor feature to be tested.  This parameter can be one of the following
+        ///         values:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="WinNt.PF_3DNOW_INSTRUCTIONS_AVAILABLE" /></term>
+        ///                 <description>
+        ///                     The 3D-Now instruction set is available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="WinNt.PF_COMPARE_EXCHANGE_DOUBLE" /></term>
+        ///                 <description>
+        ///                     The compare and exchange double operation is available (Pentium,
+        ///                     MIPS, and Alpha).
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="WinNt.PF_FLOATING_POINT_EMULATED" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Floating-point operations are emulated using a software
+        ///                         emulator.
+        ///                     </para>
+        ///                     <para>
+        ///                         This function returns true if floating-point operations are
+        ///                         emulated; otherwise, it returns false.
+        ///                     </para>
+        ///                     <para>
+        ///                         <b>Windows NT 4.0:</b>  This function returns false if
+        ///                         floating-point operations are emulated; otherwise, it returns
+        ///                         true.  This behavior is a bug that is fixed in later versions.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="WinNt.PF_FLOATING_POINT_PRECISION_ERRATA" /></term>
+        ///                 <description>
+        ///                     <b>Pentium:</b>  In rare circumstances, a floating-point precision
+        ///                     error can occur.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="WinNt.PF_MMX_INSTRUCTIONS_AVAILABLE" /></term>
+        ///                 <description>
+        ///                     The MMX instruction set is available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="WinNt.PF_PAE_ENABLED" /></term>
+        ///                 <description>
+        ///                     The processor is PAE-enabled.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="WinNt.PF_RDTSC_INSTRUCTION_AVAILABLE" /></term>
+        ///                 <description>
+        ///                     The RDTSC instruction is available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="WinNt.PF_XMMI_INSTRUCTIONS_AVAILABLE" /></term>
+        ///                 <description>
+        ///                     The SSE instruction set is available.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="WinNt.PF_XMMI64_INSTRUCTIONS_AVAILABLE" /></term>
+        ///                 <description>
+        ///                     The SSE2 instruction set is available.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the feature is supported, the return value is true.
+        ///     </para>
+        ///     <para>
+        ///         If the feature is not supported, the return value is false.
+        ///     </para>
+        /// </returns>
+        // WINBASEAPI BOOL WINAPI IsProcessorFeaturePresent(IN DWORD ProcessorFeature);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern bool IsProcessorFeaturePresent(int processorFeature);
+        #endregion bool IsProcessorFeaturePresent(int processorFeature)
+
+        #region IntPtr LoadLibrary(string fileName)
+        /// <summary>
+        ///     The <b>LoadLibrary</b> function maps the specified executable module into the
+        ///     address space of the calling process.
+        /// </summary>
+        /// <param name="fileName">
+        ///     <para>
+        ///         Pointer to a null-terminated string that names the executable module (either
+        ///         a .dll or .exe file).  The name specified is the file name of the module and
+        ///         is not related to the name stored in the library module itself, as specified
+        ///         by the LIBRARY keyword in the module-definition (.def) file.
+        ///     </para>
+        ///     <para>
+        ///         If the string specifies a path but the file does not exist in the specified
+        ///         directory, the function fails.  When specifying a path, be sure to use
+        ///         backslashes (\), not forward slashes (/).
+        ///     </para>
+        ///     <para>
+        ///         If the string does not specify a path, the function uses a standard search
+        ///         strategy to find the file.  See the Remarks for more information.
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is a handle to the module (IntPtr).
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is NULL (IntPtr.Zero).  To get
+        ///         extended error information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows Me/98/95:</b>  If you are using <b>LoadLibrary</b> to load a module
+        ///         that contains a resource whose numeric identifier is greater than 0x7FFF,
+        ///         <b>LoadLibrary</b> fails.  If you are attempting to load a 16-bit DLL directly
+        ///         from 32-bit code, <b>LoadLibrary</b> fails.  If you are attempting to load a
+        ///         DLL whose subsystem version is greater than 4.0, <b>LoadLibrary</b> fails.  If
+        ///         your <b>DllMain</b> function tries to call the Unicode version of a function,
+        ///         <b>LoadLibrary</b> fails.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         <b>LoadLibrary</b> can be used to map a DLL module and return a handle that
+        ///         can be used in <see cref="GetProcAddress" /> to get the address of a DLL
+        ///         function.  <b>LoadLibrary</b> can also be used to map other executable
+        ///         modules.  For example, the function can specify an .exe file to get a
+        ///         handle that can be used in <b>FindResource</b> or <b>LoadResource</b>.
+        ///         However, do not use <b>LoadLibrary</b> to run an .exe file, use the
+        ///         <b>CreateProcess</b> function.
+        ///     </para>
+        ///     <para>
+        ///         If the module is a DLL not already mapped for the calling process, the system
+        ///         calls the DLL's <b>DllMain</b> function with the DLL_PROCESS_ATTACH value.  If
+        ///         the DLL's entry-point function does not return TRUE, <b>LoadLibrary</b> fails
+        ///         and returns NULL.  (The system immediately calls your entry-point function
+        ///         with DLL_PROCESS_DETACH and unloads the DLL.)
+        ///     </para>
+        ///     <para>
+        ///         It is not safe to call <b>LoadLibrary</b> from <b>DllMain</b>.  For more
+        ///         information, see the Remarks section in <b>DllMain</b>.
+        ///     </para>
+        ///     <para>
+        ///         Module handles are not global or inheritable.  A call to <b>LoadLibrary</b> by
+        ///         one process does not produce a handle that another process can use � for
+        ///         example, in calling <see cref="GetProcAddress" />.  The other process must
+        ///         make its own call to <b>LoadLibrary</b> for the module before calling
+        ///         <see cref="GetProcAddress" />.
+        ///     </para>
+        ///     <para>
+        ///         If no file name extension is specified in the <i>fileName</i> parameter, the
+        ///         default library extension .dll is appended.  However, the file name string
+        ///         can include a trailing point character (.) to indicate that the module name
+        ///         has no extension.  When no path is specified, the function searches for loaded
+        ///         modules whose base name matches the base name of the module to be loaded.  If
+        ///         the name matches, the load succeeds.  Otherwise, the function searches for the
+        ///         file in the following sequence:
+        ///     </para>
+        ///     <para>
+        ///         <list type="number">
+        ///             <item>
+        ///                 <description>
+        ///                     The directory from which the application loaded.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <description>
+        ///                     The current directory.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <description>
+        ///                     The system directory.  Use the <see cref="GetSystemDirectory" />
+        ///                     function to get the path of this directory.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <description>
+        ///                     <para>
+        ///                         The 16-bit system directory.  There is no function that
+        ///                         obtains the path of this directory, but it is searched.
+        ///                     </para>
+        ///                     <para>
+        ///                         <b>Windows Me/98/95:</b>  This directory does not exist.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <description>
+        ///                     The Windows directory.  Use the <see cref="GetWindowsDirectory" />
+        ///                     function to get the path of this directory.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <description>
+        ///                     The directories that are listed in the PATH environment variable.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows Server 2003, Windows XP SP1:</b>  The default value of
+        ///         HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode is 1
+        ///         (current directory is searched after the system and Windows directories).
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows XP:</b>  If
+        ///         HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode is 1,
+        ///         the current directory is searched after the system and Windows directories,
+        ///         but before the directories in the PATH environment variable.  The default
+        ///         value is 0 (current directory is searched before the system and Windows
+        ///         directories).
+        ///     </para>
+        ///     <para>
+        ///         The first directory searched is the one directory containing the image file
+        ///         used to create the calling process (for more information, see the
+        ///         <b>CreateProcess</b> function).  Doing this allows private dynamic-link
+        ///         library (DLL) files associated with a process to be found without adding the
+        ///         process's installed directory to the PATH environment variable.
+        ///     </para>
+        ///     <para>
+        ///         The search path can be altered using the <see cref="SetDllDirectory" />
+        ///         function.  This solution is recommended instead of using
+        ///         <b>SetCurrentDirectory</b> or hard-coding the full path to the DLL.
+        ///     </para>
+        ///     <para>
+        ///         If a path is specified and there is a redirection file for the application,
+        ///         the function searches for the module in the application's directory.  If the
+        ///         module exists in the application's directory, the <b>LoadLibrary</b> function
+        ///         ignores the specified path and loads the module from the application's
+        ///         directory.  If the module does not exist in the application's directory,
+        ///         <b>LoadLibrary</b> loads the module from the specified directory.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="FreeLibrary" />
+        /// <seealso cref="GetProcAddress" />
+        /// <seealso cref="GetSystemDirectory" />
+        /// <seealso cref="GetWindowsDirectory" />
+        /// <seealso cref="SetDllDirectory" />
+        // <seealso cref="DllMain" />
+        // <seealso cref="FindResource" />
+        // <seealso cref="LoadLibraryEx" />
+        // <seealso cref="LoadResource" />
+        // WINBASEAPI HMODULE WINAPI LoadLibraryA(IN LPCSTR lpLibFileName);
+        // WINBASEAPI HMODULE WINAPI LoadLibraryW(IN LPCWSTR lpLibFileName);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr LoadLibrary(string fileName);
+        #endregion IntPtr LoadLibrary(string fileName)
+
+        #region bool QueryPerformanceCounter(out long performanceCount)
+        /// <summary>
+        ///     The <b>QueryPerformanceCounter</b> function retrieves the current value of the
+        ///     high-resolution performance counter.
+        /// </summary>
+        /// <param name="performanceCount">
+        ///     Pointer to a variable that receives the current performance-counter value, in
+        ///     counts.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is true.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is false.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     On a multiprocessor machine, it should not matter which processor is called.
+        ///     However, you can get different results on different processors due to bugs in the
+        ///     BIOS or the HAL.  To specify processor affinity for a thread, use the
+        ///     <b>SetThreadAffinityMask</b> function.
+        /// </remarks>
+        /// <seealso cref="QueryPerformanceCounterFast" />
+        /// <seealso cref="QueryPerformanceFrequency" />
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern bool QueryPerformanceCounter(out long performanceCount);
+        #endregion bool QueryPerformanceCounter(out long performanceCount)
+
+        #region int QueryPerformanceCounterFast(out long performanceCount)
+        /// <summary>
+        ///     The <b>QueryPerformanceCounterFast</b> function retrieves the current value of the
+        ///     high-resolution performance counter.
+        /// </summary>
+        /// <param name="performanceCount">
+        ///     Pointer to a variable that receives the current performance-counter value, in
+        ///     counts.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is true.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is false.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         This version of <see cref="QueryPerformanceCounter" /> is slightly faster.  It
+        ///         does not set the last Windows error.  Use with care.
+        ///     </para>
+        ///     <para>
+        ///         On a multiprocessor machine, it should not matter which processor is called.
+        ///         However, you can get different results on different processors due to bugs in
+        ///         the BIOS or the HAL.  To specify processor affinity for a thread, use the
+        ///         <b>SetThreadAffinityMask</b> function.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="QueryPerformanceCounter" />
+        /// <seealso cref="QueryPerformanceFrequency" />
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="QueryPerformanceCounter"), SuppressUnmanagedCodeSecurity]
+        public static extern int QueryPerformanceCounterFast(out long performanceCount);
+        #endregion int QueryPerformanceCounterFast(out long performanceCount)
+
+        #region bool QueryPerformanceFrequency(out long frequency)
+        /// <summary>
+        ///     The <b>QueryPerformanceFrequency</b> function retrieves the frequency of the
+        ///     high-resolution performance counter, if one exists.  The frequency cannot change
+        ///     while the system is running.
+        /// </summary>
+        /// <param name="frequency">
+        ///     Pointer to a variable that receives the current performance-counter frequency, in
+        ///     counts per second.  If the installed hardware does not support a high-resolution
+        ///     performance counter, this parameter can be zero.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the installed hardware supports a high-resolution performance counter, the
+        ///         return value is true.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is false.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.  For example, if
+        ///         the installed hardware does not support a high-resolution performance counter,
+        ///         the function fails.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <b>Note</b>  The frequency of the high-resolution performance counter is not the
+        ///     processor speed.
+        /// </remarks>
+        /// <seealso cref="QueryPerformanceCounter" />
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern bool QueryPerformanceFrequency(out long frequency);
+        #endregion #region bool QueryPerformanceFrequency(out long frequency)
+
+        #region bool SetDllDirectory(string pathName)
+        /// <summary>
+        ///     The <b>SetDllDirectory</b> function modifies the search path used to locate DLLs
+        ///     for the application.
+        /// </summary>
+        /// <param name="pathName">
+        ///     Pointer to a null-terminated string that specifies the directories to be added to
+        ///     the search path, separated by semicolons.  If this parameter is NULL, the default
+        ///     search path is used.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is true.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is false.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The <b>SetDllDirectory</b> function affects all subsequent calls to the
+        ///         <see cref="LoadLibrary" /> and <b>LoadLibraryEx</b> functions.  After calling
+        ///         <b>SetDllDirectory</b>, the DLL search path is:
+        ///     </para>
+        ///     <para>
+        ///         <list type="number">
+        ///             <item>
+        ///                 <description>
+        ///                     The directory from which the application loaded.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <description>
+        ///                     The directory specified by the <i>pathName</i> parameter.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <description>
+        ///                     The system directory.  Use the <see cref="GetSystemDirectory" />
+        ///                     function to get the path of this directory.  The name of this
+        ///                     directory is System32.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <description>
+        ///                     The 16-bit system directory.  There is no function that obtains
+        ///                     the path of this directory, but it is searched.  The name of this
+        ///                     directory is System.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <description>
+        ///                     The Windows directory.  Use the <see cref="GetWindowsDirectory" />
+        ///                     function to get the path of this directory.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <description>
+        ///                     The directories that are listed in the PATH environment variable.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         To revert to the default search path used by <see cref="LoadLibrary" /> and
+        ///         <b>LoadLibraryEx</b>, call <b>SetDllDirectory</b> with NULL.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="GetDllDirectory" />
+        /// <seealso cref="GetSystemDirectory" />
+        /// <seealso cref="GetWindowsDirectory" />
+        /// <seealso cref="LoadLibrary" />
+        // <seealso cref="LoadLibraryEx" />
+        // WINBASEAPI BOOL WINAPI SetDllDirectoryA(IN LPCSTR lpPathName);
+        // WINBASEAPI BOOL WINAPI SetDllDirectoryW(IN LPCWSTR lpPathName);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern bool SetDllDirectory(string pathName);
+        #endregion bool SetDllDirectory(string pathName)
+
+        #region bool SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize)
+        /// <summary>
+        ///     The <b>SetProcessWorkingSetSize</b> function sets the minimum and maximum working
+        ///     set sizes for the specified process.
+        /// </summary>
+        /// <param name="process">
+        ///     <para>
+        ///         Handle to the process whose working set sizes is to be set.
+        ///     </para>
+        ///     <para>
+        ///         The handle must have the PROCESS_SET_QUOTA access right.
+        ///     </para>
+        /// </param>
+        /// <param name="minimumWorkingSetSize">
+        ///     <para>
+        ///         Minimum working set size for the process, in bytes.  The virtual memory
+        ///         manager attempts to keep at least this much memory resident in the
+        ///         process whenever the process is active.
+        ///     </para>
+        ///     <para>
+        ///         If both <i>minimumWorkingSetSize</i> and <i>maximumWorkingSetSize</i> have the
+        ///         value -1, the function temporarily trims the working set of the specified
+        ///         process to zero.  This essentially swaps the process out of physical RAM
+        ///         memory.
+        ///     </para>
+        /// </param>
+        /// <param name="maximumWorkingSetSize">
+        ///     <para>
+        ///         Maximum working set size for the process, in bytes.  The virtual memory
+        ///         manager attempts to keep no more than this much memory resident in the
+        ///         process whenever the process is active and memory is in short supply.
+        ///     </para>
+        ///     <para>
+        ///         If both <i>minimumWorkingSetSize</i> and <i>maximumWorkingSetSize</i> have the
+        ///         value -1, the function temporarily trims the working set of the specified
+        ///         process to zero.  This essentially swaps the process out of physical RAM
+        ///         memory.
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is true.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is false.  To get extended error
+        ///         information, call <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The working set of a process is the set of memory pages currently visible to
+        ///         the process in physical RAM memory.  These pages are resident and available
+        ///         for an application to use without triggering a page fault.  The minimum and
+        ///         maximum working set sizes affect the virtual memory paging behavior of a
+        ///         process.
+        ///     </para>
+        ///     <para>
+        ///         The working set of the specified process can be emptied by specifying the
+        ///         value -1 for both the minimum and maximum working set sizes.
+        ///     </para>
+        ///     <para>
+        ///         If the values of either <i>minimumWorkingSetSize</i> or
+        ///         <i>maximumWorkingSetSize</i> are greater than the process' current working
+        ///         set sizes, the specified process must have the SE_INC_BASE_PRIORITY_NAME
+        ///         privilege.  Users in the Administrators and Power Users groups generally
+        ///         have this privilege.
+        ///     </para>
+        ///     <para>
+        ///         The operating system allocates working set sizes on a first-come,
+        ///         first-served basis.  For example, if an application successfully sets 40
+        ///         megabytes as its minimum working set size on a 64-megabyte system, and a
+        ///         second application requests a 40-megabyte working set size, the operating
+        ///         system denies the second application's request.
+        ///     </para>
+        ///     <para>
+        ///         Using the <b>SetProcessWorkingSetSize</b> function to set an application's
+        ///         minimum and maximum working set sizes does not guarantee that the requested
+        ///         memory will be reserved, or that it will remain resident at all times.  When
+        ///         the application is idle, or a low-memory situation causes a demand for memory,
+        ///         the operating system can reduce the application's working set.  An application
+        ///         can use the <b>VirtualLock</b> function to lock ranges of the application's
+        ///         virtual address space in memory; however, that can potentially degrade the
+        ///         performance of the system.
+        ///     </para>
+        ///     <para>
+        ///         When you increase the working set size of an application, you are taking away
+        ///         physical memory from the rest of the system.  This can degrade the performance
+        ///         of other applications and the system as a whole.  It can also lead to failures
+        ///         of operations that require physical memory to be present; for example,
+        ///         creating processes, threads, and kernel pool.  Thus, you must use the
+        ///         <b>SetProcessWorkingSetSize</b> function carefully.  You must always consider
+        ///         the performance of the whole system when you are designing an application.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="GetProcessWorkingSetSize" />
+        // <seealso cref="VirtualLock" />
+        // WINBASEAPI BOOL WINAPI SetProcessWorkingSetSize(IN HANDLE hProcess, IN SIZE_T dwMinimumWorkingSetSize, IN SIZE_T dwMaximumWorkingSetSize);
+        [DllImport(KERNEL_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern bool SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);
+        #endregion bool SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize)
+    }
+}
diff --git a/src/Tao.Platform.Windows/Makefile.am b/src/Tao.Platform.Windows/Makefile.am
new file mode 100644
index 0000000..4d76327
--- /dev/null
+++ b/src/Tao.Platform.Windows/Makefile.am
@@ -0,0 +1,32 @@
+
+ASSEMBLY = Tao.Platform.Windows
+SHORTNAME = tao-platform-windows
+VERSION = @TAOWINDOWS_VERSION@
+MAJOR = @TAOWINDOWS_MAJOR@
+
+PACKAGES =
+BINARY_LIBS = ../Tao.OpenGl/Tao.OpenGl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Drawing \
+        System.Windows.Forms
+RESOURCES =
+SOURCES = \
+        Gdi.cs \
+        IlasmAttribute.cs \
+        Kernel.cs \
+        SimpleOpenGlControl.cs \
+        User.cs \
+        Wgl.cs \
+        WglCore.cs \
+        WglDelegates.cs \
+        WglEnums.cs \
+        WglHelper.cs \
+        WinNt.cs \
+        Winmm.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.Platform.Windows/Makefile.in b/src/Tao.Platform.Windows/Makefile.in
new file mode 100644
index 0000000..21d270d
--- /dev/null
+++ b/src/Tao.Platform.Windows/Makefile.in
@@ -0,0 +1,429 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-platform-windows.pc.in $(top_srcdir)/Assembly.am \
+	AUTHORS COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.Platform.Windows
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-platform-windows.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOWINDOWS_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.Platform.Windows
+SHORTNAME = tao-platform-windows
+MAJOR = @TAOWINDOWS_MAJOR@
+PACKAGES = 
+BINARY_LIBS = ../Tao.OpenGl/Tao.OpenGl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Drawing \
+        System.Windows.Forms
+
+RESOURCES = 
+SOURCES = \
+        Gdi.cs \
+        IlasmAttribute.cs \
+        Kernel.cs \
+        SimpleOpenGlControl.cs \
+        User.cs \
+        Wgl.cs \
+        WglCore.cs \
+        WglDelegates.cs \
+        WglEnums.cs \
+        WglHelper.cs \
+        WinNt.cs \
+        Winmm.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.Platform.Windows/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.Platform.Windows/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-platform-windows.pc: $(top_builddir)/config.status $(srcdir)/tao-platform-windows.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.Platform.Windows/NEWS b/src/Tao.Platform.Windows/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Platform.Windows/Properties/AssemblyInfo.cs b/src/Tao.Platform.Windows/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..71cbf9b
--- /dev/null
+++ b/src/Tao.Platform.Windows/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.Platform.Windows")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework Windows Platform API Binding For .NET")]
+[assembly: AssemblyFileVersion("1.0.0.5")]
+[assembly: AssemblyInformationalVersion("1.0.0.5")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.Platform.Windows.dll")]
+[assembly: AssemblyTitle("Tao Framework Windows Platform API Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.5")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.Platform.Windows/README b/src/Tao.Platform.Windows/README
new file mode 100644
index 0000000..56d75e7
--- /dev/null
+++ b/src/Tao.Platform.Windows/README
@@ -0,0 +1,13 @@
+Tao.Platform.Windows 1.0.0.3
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.Platform.Windows is a Windows API binding for .NET.
+
+
+Change Log:
+
+1.0.0.0 - April 20, 2004:
+    Initial release.  Special thanks to Johan Sylwander for his work
+    on the nifty new control image.
diff --git a/src/Tao.Platform.Windows/SimpleOpenGlControl.cs b/src/Tao.Platform.Windows/SimpleOpenGlControl.cs
new file mode 100644
index 0000000..7ce25be
--- /dev/null
+++ b/src/Tao.Platform.Windows/SimpleOpenGlControl.cs
@@ -0,0 +1,516 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Tao.OpenGl;
+
+namespace Tao.Platform.Windows {
+    #region Class Documentation
+    /// <summary>
+    ///     Provides a simple OpenGL control allowing quick development of Windows Forms-based
+    ///     OpenGL applications.
+    /// </summary>
+    #endregion Class Documentation
+    public class SimpleOpenGlControl : UserControl {
+        // --- Fields ---
+        #region Private Fields
+        private IContainer components;                                      // Required for designer support
+        private IntPtr deviceContext = IntPtr.Zero;                         // GDI device context
+        private IntPtr renderingContext = IntPtr.Zero;                      // Rendering context
+        private IntPtr windowHandle = IntPtr.Zero;                          // Holds our window handle
+        private bool autoCheckErrors = false;                               // Should we provide glGetError()?
+        private bool autoFinish = false;                                    // Should we provide a glFinish()?
+        private bool autoMakeCurrent = true;                                // Should we automatically make the rendering context current?
+        private bool autoSwapBuffers = true;                                // Should we automatically swap buffers?
+        private byte accumBits = 0;                                         // Accumulation buffer bits
+        private byte colorBits = 32;                                        // Color buffer bits
+        private byte depthBits = 16;                                        // Depth buffer bits
+        private byte stencilBits = 0;                                       // Stencil buffer bits
+        private int errorCode = Gl.GL_NO_ERROR;                             // The GL error code
+
+        private int logScaleX = 96;                                         // DPI Resolution in X dir
+        private int logScaleY = 96;                                         // DPI Resolution in Y dir
+        #endregion Private Fields
+
+        #region Public Properties
+        #region LogScaleX
+        /// <summary>
+        /// Gets the number of logical pixels or dots per inch (dpi) in X-direction
+        /// </summary>
+        [Category("OpenGL Properties"), Description("Logical pixels per inch in X-direction.")]
+        public int LogScaleX
+        {
+            get
+            {
+                return logScaleX;
+            }
+        }
+        #endregion
+
+        #region LogScaleY
+        /// <summary>
+        /// Gets the number of logical pixels or dots per inch (dpi) in Y-direction
+        /// </summary>
+        [Category("OpenGL Properties"), Description("Logical pixels per inch in Y-direction.")]
+        public int LogScaleY
+        {
+            get
+            {
+                return logScaleY;
+            }
+        }
+        #endregion
+
+        #region AccumBits
+        /// <summary>
+        ///     Gets and sets the OpenGL control's accumulation buffer depth.
+        /// </summary>
+        [Category("OpenGL Properties"), Description("Accumulation buffer depth in bits.")]
+        public byte AccumBits {
+            get {
+                return accumBits;
+            }
+            set {
+                accumBits = value;
+            }
+        }
+        #endregion AccumBits
+
+        #region ColorBits
+        /// <summary>
+        ///     Gets and sets the OpenGL control's color buffer depth.
+        /// </summary>
+        [Category("OpenGL Properties"), Description("Color buffer depth in bits.")]
+        public byte ColorBits {
+            get {
+                return colorBits;
+            }
+            set {
+                colorBits = value;
+            }
+        }
+        #endregion ColorBits
+
+        #region DepthBits
+        /// <summary>
+        ///     Gets and sets the OpenGL control's depth buffer (Z-buffer) depth.
+        /// </summary>
+        [Category("OpenGL Properties"), Description("Depth buffer (Z-buffer) depth in bits.")]
+        public byte DepthBits {
+            get {
+                return depthBits;
+            }
+            set {
+                depthBits = value;
+            }
+        }
+        #endregion DepthBits
+
+        #region StencilBits
+        /// <summary>
+        ///     Gets and sets the OpenGL control's stencil buffer depth.
+        /// </summary>
+        [Category("OpenGL Properties"), Description("Stencil buffer depth in bits.")]
+        public byte StencilBits {
+            get {
+                return stencilBits;
+            }
+            set {
+                stencilBits = value;
+            }
+        }
+        #endregion StencilBits
+
+        #region AutoCheckErrors
+        /// <summary>
+        ///     Gets and sets the OpenGL control's automatic sending of a glGetError command
+        ///     after drawing.
+        /// </summary>
+        [Category("OpenGL Properties"), Description("Automatically send a glGetError command after drawing?")]
+        public bool AutoCheckErrors {
+            get {
+                return autoCheckErrors;
+            }
+            set {
+                autoCheckErrors = value;
+            }
+        }
+        #endregion AutoCheckErrors
+
+        #region AutoFinish
+        /// <summary>
+        ///     Gets and sets the OpenGL control's automatic sending of a glFinish command
+        ///     after drawing.
+        /// </summary>
+        [Category("OpenGL Properties"), Description("Automatically send a glFinish command after drawing?")]
+        public bool AutoFinish {
+            get {
+                return autoFinish;
+            }
+            set {
+                autoFinish = value;
+            }
+        }
+        #endregion AutoFinish
+
+        #region AutoMakeCurrent
+        /// <summary>
+        ///     Gets and sets the OpenGL control's automatic forcing of the rendering context to
+        ///     be current before drawing.
+        /// </summary>
+        [Category("OpenGL Properties"), Description("Automatically make the rendering context current before drawing?")]
+        public bool AutoMakeCurrent {
+            get {
+                return autoMakeCurrent;
+            }
+            set {
+                autoMakeCurrent = value;
+            }
+        }
+        #endregion AutoMakeCurrent
+
+        #region AutoSwapBuffers
+        /// <summary>
+        ///     Gets and sets the OpenGL control's automatic sending of a SwapBuffers command
+        ///     after drawing.
+        /// </summary>
+        [Category("OpenGL Properties"), Description("Automatically send a SwapBuffers command after drawing?")]
+        public bool AutoSwapBuffers {
+            get {
+                return autoSwapBuffers;
+            }
+            set {
+                autoSwapBuffers = value;
+            }
+        }
+        #endregion AutoSwapBuffers
+        #endregion Public Properties
+
+        #region Protected Property Overloads
+        #region CreateParams CreateParams
+        /// <summary>
+        ///     Overrides the control's class style parameters.
+        /// </summary>
+        protected override CreateParams CreateParams { 
+            get {
+                Int32 CS_VREDRAW = 0x1;
+                Int32 CS_HREDRAW = 0x2;
+                Int32 CS_OWNDC = 0x20;
+                CreateParams cp = base.CreateParams;
+                cp.ClassStyle = cp.ClassStyle | CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
+                return cp;
+            }
+        }
+        #endregion CreateParams CreateParams
+        #endregion Protected Property Overloads
+
+        // --- Constructors & Destructors ---
+        #region SimpleOpenGlControl()
+        /// <summary>
+        ///     Constructor.  Creates contexts and sets properties.
+        /// </summary>
+        public SimpleOpenGlControl() {
+            InitializeStyles();
+            InitializeComponent();
+            InitializeBackground();
+        }
+        #endregion SimpleOpenGlControl()
+
+        #region Dispose(bool disposing)
+        /// <summary>
+        ///     Disposes the control.
+        /// </summary>
+        /// <param name="disposing">Was the disposed manually called?</param>
+        protected override void Dispose(bool disposing) {
+            if(disposing) {
+                if(components != null) {
+                    components.Dispose();
+                }
+            }
+            DestroyContexts();
+            base.Dispose(disposing);
+        }
+        #endregion Dispose(bool disposing)
+
+        // --- Private Methods ---
+        #region InitializeBackground()
+        /// <summary>
+        ///     Loads the bitmap from the assembly's manifest resource.
+        /// </summary>
+        private void InitializeBackground() {
+            try {
+                Assembly assembly = Assembly.GetExecutingAssembly();
+                using(Stream imageStream = assembly.GetManifestResourceStream("TaoButton.jpg")) {
+                    this.BackgroundImage = (Image) Bitmap.FromStream(imageStream);
+                }
+            } catch (System.Exception e) {
+				e.ToString();
+                this.BackgroundImage = null;
+            }
+        }
+        #endregion InitializeBackground()
+
+        #region InitializeComponent()
+        /// <summary>
+        ///     Required for designer support.
+        /// </summary>
+        private void InitializeComponent() {
+            this.components = new System.ComponentModel.Container();
+            // 
+            // SimpleOpenGlControl
+            // 
+            this.BackColor = System.Drawing.Color.Black;
+            this.Size = new System.Drawing.Size(50, 50);
+        }
+        #endregion InitializeComponent()
+
+        #region InitializeStyles()
+        /// <summary>
+        ///     Initializes the control's styles.
+        /// </summary>
+        private void InitializeStyles() {
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+            this.SetStyle(ControlStyles.DoubleBuffer, false);
+            this.SetStyle(ControlStyles.Opaque, true);
+            this.SetStyle(ControlStyles.ResizeRedraw, true);
+            this.SetStyle(ControlStyles.UserPaint, true);
+        }
+        #endregion InitializeStyles()
+
+        // --- Public Methods ---
+        #region DestroyContexts()
+		/// <summary>
+		/// 
+		/// </summary>
+        public void DestroyContexts() {
+            if(renderingContext != IntPtr.Zero) {
+                Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero);
+                Wgl.wglDeleteContext(renderingContext);
+                renderingContext = IntPtr.Zero;
+            }
+
+            if(deviceContext != IntPtr.Zero) {
+                if(windowHandle != IntPtr.Zero) {
+                    User.ReleaseDC(windowHandle, deviceContext);
+                }
+                deviceContext = IntPtr.Zero;
+            }
+        }
+        #endregion DestroyContexts()
+
+        #region Draw()
+        /// <summary>
+        ///     Sends an see cref="UserControl.Invalidate"  command to this control, thus
+        ///     forcing a redraw to occur.
+        /// </summary>
+        public void Draw() {
+            this.Invalidate();
+        }
+        #endregion Draw()
+
+        #region InitializeContexts()
+        /// <summary>
+        ///     Creates the OpenGL contexts.
+        /// </summary>
+        public void InitializeContexts() {
+            int pixelFormat;                                                // Holds the selected pixel format
+
+            windowHandle = this.Handle;                                     // Get window handle
+
+            if(windowHandle == IntPtr.Zero) {                               // No window handle means something is wrong
+                MessageBox.Show("Window creation error.  No window handle.", "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                Environment.Exit(-1);
+            }
+
+            Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();// The pixel format descriptor
+            pfd.nSize = (short) Marshal.SizeOf(pfd);                        // Size of the pixel format descriptor
+            pfd.nVersion = 1;                                               // Version number (always 1)
+            pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW |                          // Format must support windowed mode
+                        Gdi.PFD_SUPPORT_OPENGL |                            // Format must support OpenGL
+                        Gdi.PFD_DOUBLEBUFFER;                               // Must support double buffering
+            pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;                      // Request an RGBA format
+            pfd.cColorBits = (byte) colorBits;                              // Select our color depth
+            pfd.cRedBits = 0;                                               // Individual color bits ignored
+            pfd.cRedShift = 0;
+            pfd.cGreenBits = 0;
+            pfd.cGreenShift = 0;
+            pfd.cBlueBits = 0;
+            pfd.cBlueShift = 0;
+            pfd.cAlphaBits = 0;                                             // No alpha buffer
+            pfd.cAlphaShift = 0;                                            // Alpha shift bit ignored
+            pfd.cAccumBits = accumBits;                                     // Accumulation buffer
+            pfd.cAccumRedBits = 0;                                          // Individual accumulation bits ignored
+            pfd.cAccumGreenBits = 0;
+            pfd.cAccumBlueBits = 0;
+            pfd.cAccumAlphaBits = 0;
+            pfd.cDepthBits = depthBits;                                     // Z-buffer (depth buffer)
+            pfd.cStencilBits = stencilBits;                                 // No stencil buffer
+            pfd.cAuxBuffers = 0;                                            // No auxiliary buffer
+            pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;                     // Main drawing layer
+            pfd.bReserved = 0;                                              // Reserved
+            pfd.dwLayerMask = 0;                                            // Layer masks ignored
+            pfd.dwVisibleMask = 0;
+            pfd.dwDamageMask = 0;
+
+            deviceContext = User.GetDC(windowHandle);                       // Attempt to get the device context
+            if(deviceContext == IntPtr.Zero) {                              // Did we not get a device context?
+                MessageBox.Show("Can not create a GL device context.", "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                Environment.Exit(-1);
+            }
+
+            pixelFormat = Gdi.ChoosePixelFormat(deviceContext, ref pfd);    // Attempt to find an appropriate pixel format
+            if(pixelFormat == 0) {                                          // Did windows not find a matching pixel format?
+                MessageBox.Show("Can not find a suitable PixelFormat.", "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                Environment.Exit(-1);
+            }
+
+            if(!Gdi.SetPixelFormat(deviceContext, pixelFormat, ref pfd)) {  // Are we not able to set the pixel format?
+                MessageBox.Show("Can not set the chosen PixelFormat.  Chosen PixelFormat was " + pixelFormat + ".", "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                Environment.Exit(-1);
+            }
+
+            logScaleX = Gdi.GetDeviceCaps(deviceContext, (int)Gdi.DevCaps.LOGPIXELSX); // Attempt to retrieve DPI-Setting 
+            logScaleY = Gdi.GetDeviceCaps(deviceContext, (int)Gdi.DevCaps.LOGPIXELSY); // Attempt to retrieve DPI-Setting 
+
+            renderingContext = Wgl.wglCreateContext(deviceContext);         // Attempt to get the rendering context
+            if(renderingContext == IntPtr.Zero) {                           // Are we not able to get a rendering context?
+                MessageBox.Show("Can not create a GL rendering context.", "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                Environment.Exit(-1);
+            }
+
+            MakeCurrent();                                                  // Attempt to activate the rendering context
+
+            // Force A Reset On The Working Set Size
+            Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+        }
+        #endregion InitializeContexts()
+
+        #region MakeCurrent()
+		/// <summary>
+		/// 
+		/// </summary>
+        public void MakeCurrent() {
+            // Are we not able to activate the rending context?
+            //if(deviceContext == IntPtr.Zero || renderingContext == IntPtr.Zero || !Wgl.wglMakeCurrent(deviceContext, renderingContext)) {
+            if(!Wgl.wglMakeCurrent(deviceContext, renderingContext)) {
+                MessageBox.Show("Can not activate the GL rendering context.", "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                Environment.Exit(-1);
+            }
+        }
+        #endregion MakeCurrent()
+
+        #region SwapBuffers()
+		/// <summary>
+		/// 
+		/// </summary>
+        public void SwapBuffers() {
+            Gdi.SwapBuffersFast(deviceContext);
+        }
+        #endregion SwapBuffers()
+
+        // --- Events ---
+        #region OnPaint(PaintEventArgs e)
+        /// <summary>
+        ///     Paints the control.
+        /// </summary>
+        /// <param name="e">The paint event arguments.</param>
+        protected override void OnPaint(PaintEventArgs e) {
+            if(this.DesignMode) {
+                e.Graphics.Clear(this.BackColor);
+                if (this.BackgroundImage != null)
+                    e.Graphics.DrawImage(this.BackgroundImage, this.ClientRectangle, 0, 0, this.BackgroundImage.Width, this.BackgroundImage.Height, GraphicsUnit.Pixel);
+                e.Graphics.Flush();
+                return;
+            }
+
+            if(deviceContext == IntPtr.Zero || renderingContext == IntPtr.Zero) {
+                MessageBox.Show("No device or rendering context available!");
+                return;
+            }
+
+            if(autoMakeCurrent) {
+                MakeCurrent();
+            }
+
+            base.OnPaint(e);
+
+            if(autoFinish) {
+                Gl.glFinish();
+            }
+
+            if(autoCheckErrors) {
+                errorCode = Gl.glGetError();
+                if(errorCode != Gl.GL_NO_ERROR) {
+                    switch(errorCode) {
+                        case Gl.GL_INVALID_ENUM:
+                            MessageBox.Show("GL_INVALID_ENUM - An unacceptable value has been specified for an enumerated argument.  The offending function has been ignored.", "OpenGL Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+                            break;
+                        case Gl.GL_INVALID_VALUE:
+                            MessageBox.Show("GL_INVALID_VALUE - A numeric argument is out of range.  The offending function has been ignored.", "OpenGL Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+                            break;
+                        case Gl.GL_INVALID_OPERATION:
+                            MessageBox.Show("GL_INVALID_OPERATION - The specified operation is not allowed in the current state.  The offending function has been ignored.", "OpenGL Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+                            break;
+                        case Gl.GL_STACK_OVERFLOW:
+                            MessageBox.Show("GL_STACK_OVERFLOW - This function would cause a stack overflow.  The offending function has been ignored.", "OpenGL Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+                            break;
+                        case Gl.GL_STACK_UNDERFLOW:
+                            MessageBox.Show("GL_STACK_UNDERFLOW - This function would cause a stack underflow.  The offending function has been ignored.", "OpenGL Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+                            break;
+                        case Gl.GL_OUT_OF_MEMORY:
+                            MessageBox.Show("GL_OUT_OF_MEMORY - There is not enough memory left to execute the function.  The state of OpenGL has been left undefined.", "OpenGL Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+                            break;
+                        default:
+                            MessageBox.Show("Unknown GL error.  This should never happen.", "OpenGL Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+                            break;
+                    }
+                }
+            }
+
+            if(autoSwapBuffers) {
+                SwapBuffers();
+            }
+        }
+        #endregion OnPaint(PaintEventArgs e)
+
+        #region OnPaintBackground(PaintEventArgs e)
+        /// <summary>
+        ///     Paints the background.
+        /// </summary>
+        /// <param name="e"></param>
+        protected override void OnPaintBackground(PaintEventArgs e) {
+        }
+        #endregion OnPaintBackground(PaintEventArgs e)
+    }
+}
diff --git a/src/Tao.Platform.Windows/Tao.Platform.Windows.csproj b/src/Tao.Platform.Windows/Tao.Platform.Windows.csproj
new file mode 100644
index 0000000..a954a89
--- /dev/null
+++ b/src/Tao.Platform.Windows/Tao.Platform.Windows.csproj
@@ -0,0 +1,144 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{228201EB-1A36-4E25-B59F-52255CBBE270}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.Platform.Windows</AssemblyName>
+    <AssemblyOriginatorKeyFile>../Tao.Platform.Windows/Tao.Platform.Windows.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.Platform.Windows</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Platform.Windows.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Platform.Windows.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Gdi.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="IlasmAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Kernel.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SimpleOpenGlControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="User.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Wgl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="WglCore.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="WglDelegates.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="WglEnums.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="WglHelper.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Winmm.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="WinNt.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.Platform.Windows.dll.config" />
+    <None Include="Tao.Platform.Windows.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.Platform.Windows/Tao.Platform.Windows.dll.config b/src/Tao.Platform.Windows/Tao.Platform.Windows.dll.config
new file mode 100644
index 0000000..b437af4
--- /dev/null
+++ b/src/Tao.Platform.Windows/Tao.Platform.Windows.dll.config
@@ -0,0 +1,2 @@
+<configuration>
+</configuration>
diff --git a/src/Tao.Platform.Windows/Tao.Platform.Windows.snk b/src/Tao.Platform.Windows/Tao.Platform.Windows.snk
new file mode 100644
index 0000000..8e4e168
Binary files /dev/null and b/src/Tao.Platform.Windows/Tao.Platform.Windows.snk differ
diff --git a/src/Tao.Platform.Windows/User.cs b/src/Tao.Platform.Windows/User.cs
new file mode 100644
index 0000000..3fa8b1b
--- /dev/null
+++ b/src/Tao.Platform.Windows/User.cs
@@ -0,0 +1,1102 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.Platform.Windows {
+    #region Class Documentation
+    /// <summary>
+    ///     User binding for .NET, implementing Windows-specific user functionality.
+    /// </summary>
+    /// <remarks>
+    ///     Binds functions and definitions in user32.dll.
+    /// </remarks>
+    #endregion Class Documentation
+    public static class User
+    {
+        // --- Fields ---
+        #region Private Constants
+        #region string USER_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies User32's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies user32.dll for Windows.
+        /// </remarks>
+        private const string USER_NATIVE_LIBRARY = "user32.dll";
+        #endregion string USER_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.StdCall" />.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.StdCall;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+
+        #region Public Constants
+
+        #region Class styles
+        // #define CS_VREDRAW 0x0001
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_VREDRAW = 0x0001;
+
+        // #define CS_HREDRAW 0x0002
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_HREDRAW = 0x0002;
+
+        // #define CS_DBLCLKS 0x0008
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_DBLCLKS = 0x0008;
+
+        // #define CS_OWNDC 0x0020
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_OWNDC = 0x0020;
+
+        // #define CS_CLASSDC 0x0040
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_CLASSDC = 0x0040;
+
+        // #define CS_PARENTDC 0x0080
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_PARENTDC = 0x0080;
+
+        // #define CS_NOCLOSE 0x0200
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_NOCLOSE = 0x0200;
+
+        // #define CS_SAVEBITS 0x0800
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_SAVEBITS = 0x0800;
+
+        // #define CS_BYTEALIGNCLIENT 0x1000
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_BYTEALIGNCLIENT = 0x1000;
+
+        // #define CS_BYTEALIGNWINDOW 0x2000
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_BYTEALIGNWINDOW = 0x2000;
+
+        // #define CS_GLOBALCLASS 0x4000
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_GLOBALCLASS = 0x4000;
+
+        // #define CS_IME 0x00010000
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_IME = 0x00010000;
+
+        // #define CS_DROPSHADOW 0x00020000
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CS_DROPSHADOW = 0x00020000;
+        #endregion Class styles
+
+        // #define CDS_UPDATEREGISTRY 0x00000001
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CDS_UPDATEREGISTRY = 0x00000001;
+
+        // #define CDS_TEST 0x00000002
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CDS_TEST = 0x00000002;
+
+        // #define CDS_FULLSCREEN 0x00000004
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int CDS_FULLSCREEN = 0x00000004;
+
+        // #define CDS_GLOBAL 0x00000008
+        // #define CDS_SET_PRIMARY 0x00000010
+        // #define CDS_VIDEOPARAMETERS 0x00000020
+        // #define CDS_RESET 0x40000000
+        // #define CDS_NORESET 0x10000000
+
+        // #define DISP_CHANGE_SUCCESSFUL 0
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int DISP_CHANGE_SUCCESSFUL = 0;
+
+        // #define DISP_CHANGE_RESTART 1
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int DISP_CHANGE_RESTART = 1;
+
+        // #define DISP_CHANGE_FAILED -1
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int DISP_CHANGE_FAILED = -1;
+
+        // #define DISP_CHANGE_BADMODE -2
+        // #define DISP_CHANGE_NOTUPDATED -3
+        // #define DISP_CHANGE_BADFLAGS -4
+        // #define DISP_CHANGE_BADPARAM -5
+        // #define DISP_CHANGE_BADDUALVIEW -6
+
+		/// <summary>
+		/// 
+		/// </summary>
+        public const int ENUM_CURRENT_SETTINGS = -1;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+        public enum SHOWWINDOW : uint
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_HIDE = 0,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_SHOWNORMAL = 1,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_NORMAL = 1,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_SHOWMINIMIZED = 2,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_SHOWMAXIMIZED = 3,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_MAXIMIZE = 3,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_SHOWNOACTIVATE = 4,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_SHOW = 5,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_MINIMIZE = 6,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_SHOWMINNOACTIVE = 7,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_SHOWNA = 8,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_RESTORE = 9,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_SHOWDEFAULT = 10,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_FORCEMINIMIZE = 11,
+            /// <summary>
+            /// 
+            /// </summary>
+            SW_MAX = 11,
+        }
+
+        #endregion Public Constants
+
+        // --- Public Externs ---
+        #region int ChangeDisplaySettings(ref Gdi.DEVMODE devMode, int flags)
+        /// <summary>
+        ///     <para>
+        ///         The <b>ChangeDisplaySettings</b> function changes the settings of the default
+        ///         display device to the specified graphics mode.
+        ///     </para>
+        ///     <para>
+        ///         To change the settings of a specified display device, use the
+        ///         <b>ChangeDisplaySettingsEx</b> function.
+        ///     </para>
+        /// </summary>
+        /// <param name="devMode">
+        ///     <para>
+        ///         Pointer to a <see cref="Gdi.DEVMODE" /> structure that describes the new
+        ///         graphics mode.  If <i>devMode</i> is NULL, all the values currently in the
+        ///         registry will be used for the display setting.  Passing NULL for the
+        ///         <i>devMode</i> parameter and 0 for the <i>flags</i> parameter is the easiest
+        ///         way to return to the default mode after a dynamic mode change.
+        ///     </para>
+        ///     <para>
+        ///         The <see cref="Gdi.DEVMODE.dmSize" /> member of <see cref="Gdi.DEVMODE" />
+        ///         must be initialized to the size, in bytes, of the <see cref="Gdi.DEVMODE" />
+        ///         structure.  The <see cref="Gdi.DEVMODE.dmDriverExtra" /> member of
+        ///         <see cref="Gdi.DEVMODE" /> must be initialized to indicate the number of bytes
+        ///         of private driver data following the <see cref="Gdi.DEVMODE" /> structure.  In
+        ///         addition, you can use any or all of the following members of the
+        ///         <see cref="Gdi.DEVMODE" /> structure:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DEVMODE.dmBitsPerPel" /></term>
+        ///                 <description>Bits per pixel.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DEVMODE.dmPelsWidth" /></term>
+        ///                 <description>Pixel width.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DEVMODE.dmPelsHeight" /></term>
+        ///                 <description>Pixel height.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DEVMODE.dmDisplayFlags" /></term>
+        ///                 <description>Mode flags.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DEVMODE.dmDisplayFrequency" /></term>
+        ///                 <description>Mode frequency.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>dmPosition</term>
+        ///                 <description>
+        ///                     <b>Windows 98/Me, Windows 2000/XP:</b> Position of the device in
+        ///                     a multimonitor configuration.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         In addition to using one or more of the preceding <see cref="Gdi.DEVMODE" />
+        ///         members, you must also set one or more of the following values in the
+        ///         <see cref="Gdi.DEVMODE.dmFields" /> member to change the display setting:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DM_BITSPERPEL" /></term>
+        ///                 <description>
+        ///                     Use the <see cref="Gdi.DEVMODE.dmBitsPerPel" /> value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DM_PELSWIDTH" /></term>
+        ///                 <description>
+        ///                     Use the <see cref="Gdi.DEVMODE.dmPelsWidth" /> value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DM_PELSHEIGHT" /></term>
+        ///                 <description>
+        ///                     Use the <see cref="Gdi.DEVMODE.dmPelsHeight" /> value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DM_DISPLAYFLAGS" /></term>
+        ///                 <description>
+        ///                     Use the <see cref="Gdi.DEVMODE.dmDisplayFlags" /> value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DM_DISPLAYFREQUENCY" /></term>
+        ///                 <description>
+        ///                     Use the <see cref="Gdi.DEVMODE.dmDisplayFrequency" /> value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DM_POSITION" </term>
+        ///                 <description>
+        ///                     <b>Windows 98/Me, Windows 2000/XP:</b> Use the dmPosition value.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="flags">
+        ///     <para>
+        ///         Indicates how the graphics mode should be changed.  This parameter can be one
+        ///         of the following values:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>0</term>
+        ///                 <description>
+        ///                     The graphics mode for the current screen will be changed
+        ///                     dynamically.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_FULLSCREEN" </term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The mode is temporary in nature.
+        ///                     </para>
+        ///                     <para>
+        ///                         <b>Windows NT/2000/XP:</b> If you change to and from another
+        ///                         desktop, this mode will not be reset.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_GLOBAL" </term>
+        ///                 <description>
+        ///                     The settings will be saved in the global settings area so that
+        ///                     they will affect all users on the machine.  Otherwise, only the
+        ///                     settings for the user are modified.  This flag is only valid when
+        ///                     specified with the see cref="Gdi.CDS_UPDATEREGISTRY"  flag.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_NORESET" </term>
+        ///                 <description>
+        ///                     The settings will be saved in the registry, but will not take
+        ///                     affect.  This flag is only valid when specified with the
+        ///                     see cref="Gdi.CDS_UPDATEREGISTRY"  flag.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_RESET" </term>
+        ///                 <description>
+        ///                     The settings should be changed, even if the requested settings are
+        ///                     the same as the current settings.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_SET_PRIMARY" </term>
+        ///                 <description>
+        ///                     This device will become the primary device.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_TEST" </term>
+        ///                 <description>
+        ///                     The system tests if the requested graphics mode could be set.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_UPDATEREGISTRY" </term>
+        ///                 <description>
+        ///                     The graphics mode for the current screen will be changed
+        ///                     dynamically and the graphics mode will be updated in the registry.
+        ///                     The mode information is stored in the USER profile.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         Specifying see cref="Gdi.CDS_TEST"  allows an application to determine
+        ///         which graphics modes are actually valid, without causing the system to
+        ///         change to that graphics mode.
+        ///     </para>
+        ///     <para>
+        ///         If see cref="Gdi.CDS_UPDATEREGISTRY"  is specified and it is possible to
+        ///         change the graphics mode dynamically, the information is stored in the
+        ///         registry and see cref="Gdi.DISP_CHANGE_SUCCESSFUL"  is returned.  If it is
+        ///         not possible to change the graphics mode dynamically, the information is
+        ///         stored in the registry and see cref="Gdi.DISP_CHANGE_RESTART"  is returned.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows NT/2000/XP:</b>  If see cref="Gdi.CDS_UPDATEREGISTRY"  is
+        ///         specified and the information could not be stored in the registry, the
+        ///         graphics mode is not changed and see cref="Gdi.DISP_CHANGE_NOTUPDATED"  is
+        ///         returned.
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         The <b>ChangeDisplaySettings</b> function returns one of the following values:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_SUCCESSFUL" </term>
+        ///                 <description>
+        ///                     The settings change was successful.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_BADDUALVIEW" </term>
+        ///                 <description>
+        ///                     <b>Windows XP:</b>  The settings change was unsuccessful because
+        ///                     system is DualView capable.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_BADFLAGS" </term>
+        ///                 <description>
+        ///                     An invalid set of flags was passed in.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_BADMODE" </term>
+        ///                 <description>
+        ///                     The graphics mode is not supported.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_BADPARAM" </term>
+        ///                 <description>
+        ///                     An invalid parameter was passed in.  This can include an invalid
+        ///                     flag or combination of flags.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_FAILED" </term>
+        ///                 <description>
+        ///                     The display driver failed the specified graphics mode.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_NOTUPDATED" </term>
+        ///                 <description>
+        ///                     <b>Windows NT/2000/XP:</b>  Unable to write settings to the
+        ///                     registry.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_RESTART" </term>
+        ///                 <description>
+        ///                     The computer must be restarted in order for the graphics mode to
+        ///                     work.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         To ensure that the <see cref="Gdi.DEVMODE" /> structure passed to
+        ///         <b>ChangeDisplaySettings</b> is valid and contains only values supported by
+        ///         the display driver, use the <see cref="Gdi.DEVMODE" /> returned by the
+        ///         <see cref="EnumDisplaySettings" /> function.
+        ///     </para>
+        ///     <para>
+        ///         When the display mode is changed dynamically, the <b>WM_DISPLAYCHANGE</b>
+        ///         message is sent to all running applications with the following message
+        ///         parameters:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>wParam</term>
+        ///                 <description>New bits per pixel.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>LOWORD(lParam)</term>
+        ///                 <description>New pixel width.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>HIWORD(lParam)</term>
+        ///                 <description>New pixel height.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows 95/98/Me:</b>  If the calling thread has any windows,
+        ///         <b>ChangeDisplaySettings</b> sends them the <b>WM_DISPLAYCHANGE</b> message
+        ///         immediately (for windows in all other threads, the message is sent when the
+        ///         thread can receive nonqueued messages).  This may cause the shell to get its
+        ///         message too soon and could squash icons.  To avoid this problem, have
+        ///         <b>ChangeDisplaySettings</b> do resolution switching by calling on a thread
+        ///         with no windows, for example, a new thread.
+        ///     </para>
+        /// </remarks>
+        /// seealso cref="CreateDC" 
+        /// <seealso cref="Gdi.DEVMODE" />
+        /// <seealso cref="EnumDisplaySettings" />
+        // <seealso cref="ChangeDisplaySettingsEx" />
+        // <seealso cref="EnumDisplayDevices" />
+        // <seealso cref="WM_DISPLAYCHANGE" />
+        // WINUSERAPI LONG WINAPI ChangeDisplaySettingsA(IN LPDEVMODEA lpDevMode, IN DWORD dwFlags);
+        // WINUSERAPI LONG WINAPI ChangeDisplaySettingsW(IN LPDEVMODEW lpDevMode, IN DWORD dwFlags);
+        [DllImport(USER_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern int ChangeDisplaySettings(ref Gdi.DEVMODE devMode, int flags);
+        #endregion int ChangeDisplaySettings(ref Gdi.DEVMODE devMode, int flags)
+
+        #region int ChangeDisplaySettings(IntPtr devMode, int flags)
+        /// <summary>
+        ///     <para>
+        ///         The <b>ChangeDisplaySettings</b> function changes the settings of the default
+        ///         display device to the specified graphics mode.
+        ///     </para>
+        ///     <para>
+        ///         To change the settings of a specified display device, use the
+        ///         <b>ChangeDisplaySettingsEx</b> function.
+        ///     </para>
+        /// </summary>
+        /// <param name="devMode">
+        ///     <para>
+        ///         Pointer to a <see cref="Gdi.DEVMODE" /> structure that describes the new
+        ///         graphics mode.  If <i>devMode</i> is NULL, all the values currently in the
+        ///         registry will be used for the display setting.  Passing NULL for the
+        ///         <i>devMode</i> parameter and 0 for the <i>flags</i> parameter is the easiest
+        ///         way to return to the default mode after a dynamic mode change.
+        ///     </para>
+        ///     <para>
+        ///         The <see cref="Gdi.DEVMODE.dmSize" /> member of <see cref="Gdi.DEVMODE" />
+        ///         must be initialized to the size, in bytes, of the <see cref="Gdi.DEVMODE" />
+        ///         structure.  The <see cref="Gdi.DEVMODE.dmDriverExtra" /> member of
+        ///         <see cref="Gdi.DEVMODE" /> must be initialized to indicate the number of bytes
+        ///         of private driver data following the <see cref="Gdi.DEVMODE" /> structure.  In
+        ///         addition, you can use any or all of the following members of the
+        ///         <see cref="Gdi.DEVMODE" /> structure:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DEVMODE.dmBitsPerPel" /></term>
+        ///                 <description>Bits per pixel.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DEVMODE.dmPelsWidth" /></term>
+        ///                 <description>Pixel width.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DEVMODE.dmPelsHeight" /></term>
+        ///                 <description>Pixel height.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DEVMODE.dmDisplayFlags" /></term>
+        ///                 <description>Mode flags.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DEVMODE.dmDisplayFrequency" /></term>
+        ///                 <description>Mode frequency.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>dmPosition</term>
+        ///                 <description>
+        ///                     <b>Windows 98/Me, Windows 2000/XP:</b> Position of the device in
+        ///                     a multimonitor configuration.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         In addition to using one or more of the preceding <see cref="Gdi.DEVMODE" />
+        ///         members, you must also set one or more of the following values in the
+        ///         <see cref="Gdi.DEVMODE.dmFields" /> member to change the display setting:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DM_BITSPERPEL" /></term>
+        ///                 <description>
+        ///                     Use the <see cref="Gdi.DEVMODE.dmBitsPerPel" /> value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DM_PELSWIDTH" /></term>
+        ///                 <description>
+        ///                     Use the <see cref="Gdi.DEVMODE.dmPelsWidth" /> value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DM_PELSHEIGHT" /></term>
+        ///                 <description>
+        ///                     Use the <see cref="Gdi.DEVMODE.dmPelsHeight" /> value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DM_DISPLAYFLAGS" /></term>
+        ///                 <description>
+        ///                     Use the <see cref="Gdi.DEVMODE.dmDisplayFlags" /> value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="Gdi.DM_DISPLAYFREQUENCY" /></term>
+        ///                 <description>
+        ///                     Use the <see cref="Gdi.DEVMODE.dmDisplayFrequency" /> value.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DM_POSITION" /></term>
+        ///                 <description>
+        ///                     <b>Windows 98/Me, Windows 2000/XP:</b> Use the dmPosition value.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <param name="flags">
+        ///     <para>
+        ///         Indicates how the graphics mode should be changed.  This parameter can be one
+        ///         of the following values:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>0</term>
+        ///                 <description>
+        ///                     The graphics mode for the current screen will be changed
+        ///                     dynamically.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_FULLSCREEN" </term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The mode is temporary in nature.
+        ///                     </para>
+        ///                     <para>
+        ///                         <b>Windows NT/2000/XP:</b> If you change to and from another
+        ///                         desktop, this mode will not be reset.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_GLOBAL" </term>
+        ///                 <description>
+        ///                     The settings will be saved in the global settings area so that
+        ///                     they will affect all users on the machine.  Otherwise, only the
+        ///                     settings for the user are modified.  This flag is only valid when
+        ///                     specified with the see cref="Gdi.CDS_UPDATEREGISTRY"  flag.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_NORESET" </term>
+        ///                 <description>
+        ///                     The settings will be saved in the registry, but will not take
+        ///                     affect.  This flag is only valid when specified with the
+        ///                     see cref="Gdi.CDS_UPDATEREGISTRY"  flag.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_RESET" </term>
+        ///                 <description>
+        ///                     The settings should be changed, even if the requested settings are
+        ///                     the same as the current settings.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_SET_PRIMARY" </term>
+        ///                 <description>
+        ///                     This device will become the primary device.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_TEST" /></term>
+        ///                 <description>
+        ///                     The system tests if the requested graphics mode could be set.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.CDS_UPDATEREGISTRY" /></term>
+        ///                 <description>
+        ///                     The graphics mode for the current screen will be changed
+        ///                     dynamically and the graphics mode will be updated in the registry.
+        ///                     The mode information is stored in the USER profile.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         Specifying see cref="Gdi.CDS_TEST" /> allows an application to determine
+        ///         which graphics modes are actually valid, without causing the system to
+        ///         change to that graphics mode.
+        ///     </para>
+        ///     <para>
+        ///         If see cref="Gdi.CDS_UPDATEREGISTRY" /> is specified and it is possible to
+        ///         change the graphics mode dynamically, the information is stored in the
+        ///         registry and see cref="Gdi.DISP_CHANGE_SUCCESSFUL" /> is returned.  If it is
+        ///         not possible to change the graphics mode dynamically, the information is
+        ///         stored in the registry and see cref="Gdi.DISP_CHANGE_RESTART" /> is returned.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows NT/2000/XP:</b>  If see cref="Gdi.CDS_UPDATEREGISTRY" /> is
+        ///         specified and the information could not be stored in the registry, the
+        ///         graphics mode is not changed and see cref="Gdi.DISP_CHANGE_NOTUPDATED" /> is
+        ///         returned.
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         The <b>ChangeDisplaySettings</b> function returns one of the following values:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_SUCCESSFUL" /></term>
+        ///                 <description>
+        ///                     The settings change was successful.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_BADDUALVIEW" /></term>
+        ///                 <description>
+        ///                     <b>Windows XP:</b>  The settings change was unsuccessful because
+        ///                     system is DualView capable.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_BADFLAGS" /></term>
+        ///                 <description>
+        ///                     An invalid set of flags was passed in.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_BADMODE" </term>
+        ///                 <description>
+        ///                     The graphics mode is not supported.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_BADPARAM" </term>
+        ///                 <description>
+        ///                     An invalid parameter was passed in.  This can include an invalid
+        ///                     flag or combination of flags.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_FAILED" /></term>
+        ///                 <description>
+        ///                     The display driver failed the specified graphics mode.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_NOTUPDATED" /></term>
+        ///                 <description>
+        ///                     <b>Windows NT/2000/XP:</b>  Unable to write settings to the
+        ///                     registry.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>see cref="Gdi.DISP_CHANGE_RESTART" /></term>
+        ///                 <description>
+        ///                     The computer must be restarted in order for the graphics mode to
+        ///                     work.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         To ensure that the <see cref="Gdi.DEVMODE" /> structure passed to
+        ///         <b>ChangeDisplaySettings</b> is valid and contains only values supported by
+        ///         the display driver, use the <see cref="Gdi.DEVMODE" /> returned by the
+        ///         <see cref="EnumDisplaySettings" /> function.
+        ///     </para>
+        ///     <para>
+        ///         When the display mode is changed dynamically, the <b>WM_DISPLAYCHANGE</b>
+        ///         message is sent to all running applications with the following message
+        ///         parameters:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>wParam</term>
+        ///                 <description>New bits per pixel.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>LOWORD(lParam)</term>
+        ///                 <description>New pixel width.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>HIWORD(lParam)</term>
+        ///                 <description>New pixel height.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows 95/98/Me:</b>  If the calling thread has any windows,
+        ///         <b>ChangeDisplaySettings</b> sends them the <b>WM_DISPLAYCHANGE</b> message
+        ///         immediately (for windows in all other threads, the message is sent when the
+        ///         thread can receive nonqueued messages).  This may cause the shell to get its
+        ///         message too soon and could squash icons.  To avoid this problem, have
+        ///         <b>ChangeDisplaySettings</b> do resolution switching by calling on a thread
+        ///         with no windows, for example, a new thread.
+        ///     </para>
+        /// </remarks>
+        /// seealso cref="CreateDC" />
+        /// <seealso cref="Gdi.DEVMODE" />
+        /// <seealso cref="EnumDisplaySettings" />
+        // <seealso cref="ChangeDisplaySettingsEx" />
+        // <seealso cref="EnumDisplayDevices" />
+        // <seealso cref="WM_DISPLAYCHANGE" />
+        // WINUSERAPI LONG WINAPI ChangeDisplaySettingsA(IN LPDEVMODEA lpDevMode, IN DWORD dwFlags);
+        // WINUSERAPI LONG WINAPI ChangeDisplaySettingsW(IN LPDEVMODEW lpDevMode, IN DWORD dwFlags);
+        [DllImport(USER_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern int ChangeDisplaySettings(IntPtr devMode, int flags);
+        #endregion int ChangeDisplaySettings(IntPtr devMode, int flags)
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="deviceName"></param>
+		/// <param name="modeNumber"></param>
+		/// <param name="devMode"></param>
+		/// <returns></returns>
+        [DllImport(USER_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern bool EnumDisplaySettings(string deviceName, int modeNumber, out Gdi.DEVMODE devMode);
+
+        #region IntPtr GetDC(IntPtr windowHandle)
+        /// <summary>
+        ///     <para>
+        ///         The <b>GetDC</b> function retrieves a handle to a display device context (DC)
+        ///         for the client area of a specified window or for the entire screen.  You can
+        ///         use the returned handle in subsequent GDI functions to draw in the DC.
+        ///     </para>
+        ///     <para>
+        ///         The see cref="GetDCEx" /> function is an extension to <b>GetDC</b>, which
+        ///         gives an application more control over how and whether clipping occurs in the
+        ///         client area.
+        ///     </para>
+        /// </summary>
+        /// <param name="windowHandle">
+        ///     <para>
+        ///         Handle to the window whose DC is to be retrieved.  If this value is null,
+        ///         <b>GetDC</b> retrieves the DC for the entire screen.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows 98/Me, Windows 2000/XP:</b> To get the DC for a specific display
+        ///         monitor, use the see cref="EnumDisplayMonitors" /> and
+        ///         see cref="Gdi.CreateDC" /> functions.
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         If the function succeeds, the return value is a handle to the DC for the
+        ///         specified window's client area.
+        ///     </para>
+        ///     <para>
+        ///         If the function fails, the return value is null.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows NT/2000/XP:</b> To get extended error information, call
+        ///         <see cref="Marshal.GetLastWin32Error" />.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The <b>GetDC</b> function retrieves a common, class, or private DC depending
+        ///         on the class style of the specified window.  For class and private DCs,
+        ///         <b>GetDC</b> leaves the previously assigned attributes unchanged.  However,
+        ///         for common DCs, <b>GetDC</b> assigns default attributes to the DC each time
+        ///         it is retrieved.  For example, the default font is System, which is a bitmap
+        ///         font.  Because of this, the handle for a common DC returned by <b>GetDC</b>
+        ///         does not tell you what font, color, or brush was used when the window was
+        ///         drawn.  To determine the font, call see cref="GetTextFace" />.
+        ///     </para>
+        ///     <para>
+        ///         Note that the handle to the DC can only be used by a single thread at any one
+        ///         time.
+        ///     </para>
+        ///     <para>
+        ///         After painting with a common DC, the <see cref="ReleaseDC" /> function must
+        ///         be called to release the DC.  Class and private DCs do not have to be
+        ///         released.  <see cref="ReleaseDC" /> must be called from the same thread that
+        ///         called <b>GetDC</b>.  The number of DCs is limited only by available memory.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows 95/98/Me:</b> There are only 5 common DCs available per thread,
+        ///         thus failure to release a DC can prevent other applications from accessing
+        ///         one.
+        ///     </para>
+        /// </remarks>
+        /// seealso cref="GetDCEx" />
+        /// <seealso cref="ReleaseDC" />
+        /// seealso cref="GetTextFace" />
+        /// seealso cref="GetWindowDC" />
+        // WINUSERAPI HDC WINAPI GetDC(IN HWND hWnd);
+        [DllImport(USER_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, SetLastError=true), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr GetDC(IntPtr windowHandle);
+        #endregion IntPtr GetDC(IntPtr windowHandle)
+
+        #region bool ReleaseDC(IntPtr windowHandle, IntPtr deviceContext)
+        /// <summary>
+        ///     <para>
+        ///         The <b>ReleaseDC</b> function releases a device context (DC), freeing it for
+        ///         use by other applications.  The effect of the <b>ReleaseDC</b> function
+        ///         depends on the type of DC.  It frees only common and window DCs.  It has no
+        ///         effect on class or private DCs.
+        ///     </para>
+        /// </summary>
+        /// <param name="windowHandle">
+        ///     <para>
+        ///         Handle to the window whose DC is to be released.
+        ///     </para>
+        /// </param>
+        /// <param name="deviceContext">
+        ///     <para>
+        ///         Handle to the DC to be released.
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         The return value indicates whether the DC was released.  If the DC was
+        ///         released, the return value is true.
+        ///     </para>
+        ///     <para>
+        ///         If the DC was not released, the return value is false.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The application must call the <b>ReleaseDC</b> function for each call to the
+        ///         see cref="GetWindowDC" /> function and for each call to the
+        ///         <see cref="GetDC" /> function that retrieves a common DC.
+        ///     </para>
+        ///     <para>
+        ///         An application cannot use the <b>ReleaseDC</b> function to release a DC that
+        ///         was created by calling the see cref="Gdi.CreateDC" /> function; instead, it
+        ///         must use the see cref="Gdi.DeleteDC" /> function.  <b>ReleaseDC</b> must be
+        ///         called from the same thread that called <b>GetDC</b>.
+        ///     </para>
+        /// </remarks>
+        /// seealso cref="Gdi.CreateDC" />
+        /// seealso cref="Gdi.DeleteDC" />
+        /// <seealso cref="GetDC" />
+        /// seealso cref="GetWindowDC" />
+        // WINUSERAPI int WINAPI ReleaseDC(IN HWND hWnd, IN HDC hDC);
+        [DllImport(USER_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern bool ReleaseDC(IntPtr windowHandle, IntPtr deviceContext);
+        #endregion bool ReleaseDC(IntPtr windowHandle, IntPtr deviceContext)
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="hWndChild"></param>
+        /// <param name="hWndNewParent"></param>
+        /// <returns></returns>
+        [DllImport(USER_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="lpClassName"></param>
+        /// <param name="lpWindowName"></param>
+        /// <returns></returns>
+        [DllImport(USER_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, SetLastError = true)]
+        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="hWnd"></param>
+        /// <param name="nCmdShow"></param>
+        /// <returns></returns>
+        [DllImport(USER_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION)]
+        public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="hWnd"></param>
+        /// <param name="hWndInsertAfter"></param>
+        /// <param name="X"></param>
+        /// <param name="Y"></param>
+        /// <param name="cx"></param>
+        /// <param name="cy"></param>
+        /// <param name="uFlags"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        [DllImport(USER_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION)]
+        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
+
+    }
+}
diff --git a/src/Tao.Platform.Windows/Wgl.cs b/src/Tao.Platform.Windows/Wgl.cs
new file mode 100644
index 0000000..5e41e92
--- /dev/null
+++ b/src/Tao.Platform.Windows/Wgl.cs
@@ -0,0 +1,2882 @@
+namespace Tao.Platform.Windows
+{
+    using System;
+    using System.Runtime.InteropServices;
+
+    public static partial class Wgl
+    {
+
+        public static 
+        IntPtr wglCreateContext(IntPtr hDc)
+        {
+            return Delegates.wglCreateContext((IntPtr)hDc);
+        }
+
+        public static 
+        Boolean wglDeleteContext(IntPtr oldContext)
+        {
+            return Delegates.wglDeleteContext((IntPtr)oldContext);
+        }
+
+        public static 
+        IntPtr wglGetCurrentContext()
+        {
+            return Delegates.wglGetCurrentContext();
+        }
+
+        public static 
+        Boolean wglMakeCurrent(IntPtr hDc, IntPtr newContext)
+        {
+            return Delegates.wglMakeCurrent((IntPtr)hDc, (IntPtr)newContext);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglCopyContext(IntPtr hglrcSrc, IntPtr hglrcDst, UInt32 mask)
+        {
+            return Delegates.wglCopyContext((IntPtr)hglrcSrc, (IntPtr)hglrcDst, (UInt32)mask);
+        }
+
+        public static 
+        Boolean wglCopyContext(IntPtr hglrcSrc, IntPtr hglrcDst, Int32 mask)
+        {
+            return Delegates.wglCopyContext((IntPtr)hglrcSrc, (IntPtr)hglrcDst, (UInt32)mask);
+        }
+
+        public static 
+        int wglChoosePixelFormat(IntPtr hDc, Gdi.PIXELFORMATDESCRIPTOR[] pPfd)
+        {
+            unsafe
+            {
+                fixed (Gdi.PIXELFORMATDESCRIPTOR* pPfd_ptr = pPfd)
+                {
+                    return Delegates.wglChoosePixelFormat((IntPtr)hDc, (Gdi.PIXELFORMATDESCRIPTOR*)pPfd_ptr);
+                }
+            }
+        }
+
+        public static 
+        int wglChoosePixelFormat(IntPtr hDc, ref Gdi.PIXELFORMATDESCRIPTOR pPfd)
+        {
+            unsafe
+            {
+                fixed (Gdi.PIXELFORMATDESCRIPTOR* pPfd_ptr = &pPfd)
+                {
+                    return Delegates.wglChoosePixelFormat((IntPtr)hDc, (Gdi.PIXELFORMATDESCRIPTOR*)pPfd_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        int wglChoosePixelFormat(IntPtr hDc, IntPtr pPfd)
+        {
+            unsafe
+            {
+                return Delegates.wglChoosePixelFormat((IntPtr)hDc, (Gdi.PIXELFORMATDESCRIPTOR*)pPfd);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        int wglDescribePixelFormat(IntPtr hdc, int ipfd, UInt32 cjpfd, Gdi.PIXELFORMATDESCRIPTOR[] ppfd)
+        {
+            unsafe
+            {
+                fixed (Gdi.PIXELFORMATDESCRIPTOR* ppfd_ptr = ppfd)
+                {
+                    return Delegates.wglDescribePixelFormat((IntPtr)hdc, (int)ipfd, (UInt32)cjpfd, (Gdi.PIXELFORMATDESCRIPTOR*)ppfd_ptr);
+                }
+            }
+        }
+
+        public static 
+        int wglDescribePixelFormat(IntPtr hdc, int ipfd, Int32 cjpfd, Gdi.PIXELFORMATDESCRIPTOR[] ppfd)
+        {
+            unsafe
+            {
+                fixed (Gdi.PIXELFORMATDESCRIPTOR* ppfd_ptr = ppfd)
+                {
+                    return Delegates.wglDescribePixelFormat((IntPtr)hdc, (int)ipfd, (UInt32)cjpfd, (Gdi.PIXELFORMATDESCRIPTOR*)ppfd_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        int wglDescribePixelFormat(IntPtr hdc, int ipfd, UInt32 cjpfd, ref Gdi.PIXELFORMATDESCRIPTOR ppfd)
+        {
+            unsafe
+            {
+                fixed (Gdi.PIXELFORMATDESCRIPTOR* ppfd_ptr = &ppfd)
+                {
+                    return Delegates.wglDescribePixelFormat((IntPtr)hdc, (int)ipfd, (UInt32)cjpfd, (Gdi.PIXELFORMATDESCRIPTOR*)ppfd_ptr);
+                }
+            }
+        }
+
+        public static 
+        int wglDescribePixelFormat(IntPtr hdc, int ipfd, Int32 cjpfd, ref Gdi.PIXELFORMATDESCRIPTOR ppfd)
+        {
+            unsafe
+            {
+                fixed (Gdi.PIXELFORMATDESCRIPTOR* ppfd_ptr = &ppfd)
+                {
+                    return Delegates.wglDescribePixelFormat((IntPtr)hdc, (int)ipfd, (UInt32)cjpfd, (Gdi.PIXELFORMATDESCRIPTOR*)ppfd_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        int wglDescribePixelFormat(IntPtr hdc, int ipfd, UInt32 cjpfd, IntPtr ppfd)
+        {
+            unsafe
+            {
+                return Delegates.wglDescribePixelFormat((IntPtr)hdc, (int)ipfd, (UInt32)cjpfd, (Gdi.PIXELFORMATDESCRIPTOR*)ppfd);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        int wglDescribePixelFormat(IntPtr hdc, int ipfd, Int32 cjpfd, IntPtr ppfd)
+        {
+            unsafe
+            {
+                return Delegates.wglDescribePixelFormat((IntPtr)hdc, (int)ipfd, (UInt32)cjpfd, (Gdi.PIXELFORMATDESCRIPTOR*)ppfd);
+            }
+        }
+
+        public static 
+        IntPtr wglGetCurrentDC()
+        {
+            return Delegates.wglGetCurrentDC();
+        }
+
+        public static 
+        IntPtr wglGetDefaultProcAddress(String lpszProc)
+        {
+            return Delegates.wglGetDefaultProcAddress((String)lpszProc);
+        }
+
+        public static 
+        IntPtr wglGetProcAddress(String lpszProc)
+        {
+            return Delegates.wglGetProcAddress((String)lpszProc);
+        }
+
+        public static 
+        int wglGetPixelFormat(IntPtr hdc)
+        {
+            return Delegates.wglGetPixelFormat((IntPtr)hdc);
+        }
+
+        public static 
+        Boolean wglSetPixelFormat(IntPtr hdc, int ipfd, Gdi.PIXELFORMATDESCRIPTOR[] ppfd)
+        {
+            unsafe
+            {
+                fixed (Gdi.PIXELFORMATDESCRIPTOR* ppfd_ptr = ppfd)
+                {
+                    return Delegates.wglSetPixelFormat((IntPtr)hdc, (int)ipfd, (Gdi.PIXELFORMATDESCRIPTOR*)ppfd_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglSetPixelFormat(IntPtr hdc, int ipfd, ref Gdi.PIXELFORMATDESCRIPTOR ppfd)
+        {
+            unsafe
+            {
+                fixed (Gdi.PIXELFORMATDESCRIPTOR* ppfd_ptr = &ppfd)
+                {
+                    return Delegates.wglSetPixelFormat((IntPtr)hdc, (int)ipfd, (Gdi.PIXELFORMATDESCRIPTOR*)ppfd_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglSetPixelFormat(IntPtr hdc, int ipfd, IntPtr ppfd)
+        {
+            unsafe
+            {
+                return Delegates.wglSetPixelFormat((IntPtr)hdc, (int)ipfd, (Gdi.PIXELFORMATDESCRIPTOR*)ppfd);
+            }
+        }
+
+        public static 
+        Boolean wglSwapBuffers(IntPtr hdc)
+        {
+            return Delegates.wglSwapBuffers((IntPtr)hdc);
+        }
+
+        public static 
+        Boolean wglShareLists(IntPtr hrcSrvShare, IntPtr hrcSrvSource)
+        {
+            return Delegates.wglShareLists((IntPtr)hrcSrvShare, (IntPtr)hrcSrvSource);
+        }
+
+        public static 
+        IntPtr wglCreateLayerContext(IntPtr hDc, int level)
+        {
+            return Delegates.wglCreateLayerContext((IntPtr)hDc, (int)level);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglDescribeLayerPlane(IntPtr hDc, int pixelFormat, int layerPlane, UInt32 nBytes, Gdi.LAYERPLANEDESCRIPTOR[] plpd)
+        {
+            unsafe
+            {
+                fixed (Gdi.LAYERPLANEDESCRIPTOR* plpd_ptr = plpd)
+                {
+                    return Delegates.wglDescribeLayerPlane((IntPtr)hDc, (int)pixelFormat, (int)layerPlane, (UInt32)nBytes, (Gdi.LAYERPLANEDESCRIPTOR*)plpd_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglDescribeLayerPlane(IntPtr hDc, int pixelFormat, int layerPlane, Int32 nBytes, Gdi.LAYERPLANEDESCRIPTOR[] plpd)
+        {
+            unsafe
+            {
+                fixed (Gdi.LAYERPLANEDESCRIPTOR* plpd_ptr = plpd)
+                {
+                    return Delegates.wglDescribeLayerPlane((IntPtr)hDc, (int)pixelFormat, (int)layerPlane, (UInt32)nBytes, (Gdi.LAYERPLANEDESCRIPTOR*)plpd_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglDescribeLayerPlane(IntPtr hDc, int pixelFormat, int layerPlane, UInt32 nBytes, ref Gdi.LAYERPLANEDESCRIPTOR plpd)
+        {
+            unsafe
+            {
+                fixed (Gdi.LAYERPLANEDESCRIPTOR* plpd_ptr = &plpd)
+                {
+                    return Delegates.wglDescribeLayerPlane((IntPtr)hDc, (int)pixelFormat, (int)layerPlane, (UInt32)nBytes, (Gdi.LAYERPLANEDESCRIPTOR*)plpd_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglDescribeLayerPlane(IntPtr hDc, int pixelFormat, int layerPlane, Int32 nBytes, ref Gdi.LAYERPLANEDESCRIPTOR plpd)
+        {
+            unsafe
+            {
+                fixed (Gdi.LAYERPLANEDESCRIPTOR* plpd_ptr = &plpd)
+                {
+                    return Delegates.wglDescribeLayerPlane((IntPtr)hDc, (int)pixelFormat, (int)layerPlane, (UInt32)nBytes, (Gdi.LAYERPLANEDESCRIPTOR*)plpd_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglDescribeLayerPlane(IntPtr hDc, int pixelFormat, int layerPlane, UInt32 nBytes, IntPtr plpd)
+        {
+            unsafe
+            {
+                return Delegates.wglDescribeLayerPlane((IntPtr)hDc, (int)pixelFormat, (int)layerPlane, (UInt32)nBytes, (Gdi.LAYERPLANEDESCRIPTOR*)plpd);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglDescribeLayerPlane(IntPtr hDc, int pixelFormat, int layerPlane, Int32 nBytes, IntPtr plpd)
+        {
+            unsafe
+            {
+                return Delegates.wglDescribeLayerPlane((IntPtr)hDc, (int)pixelFormat, (int)layerPlane, (UInt32)nBytes, (Gdi.LAYERPLANEDESCRIPTOR*)plpd);
+            }
+        }
+
+        public static 
+        int wglSetLayerPaletteEntries(IntPtr hdc, int iLayerPlane, int iStart, int cEntries, Int32[] pcr)
+        {
+            unsafe
+            {
+                fixed (Int32* pcr_ptr = pcr)
+                {
+                    return Delegates.wglSetLayerPaletteEntries((IntPtr)hdc, (int)iLayerPlane, (int)iStart, (int)cEntries, (Int32*)pcr_ptr);
+                }
+            }
+        }
+
+        public static 
+        int wglSetLayerPaletteEntries(IntPtr hdc, int iLayerPlane, int iStart, int cEntries, ref Int32 pcr)
+        {
+            unsafe
+            {
+                fixed (Int32* pcr_ptr = &pcr)
+                {
+                    return Delegates.wglSetLayerPaletteEntries((IntPtr)hdc, (int)iLayerPlane, (int)iStart, (int)cEntries, (Int32*)pcr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        int wglSetLayerPaletteEntries(IntPtr hdc, int iLayerPlane, int iStart, int cEntries, IntPtr pcr)
+        {
+            unsafe
+            {
+                return Delegates.wglSetLayerPaletteEntries((IntPtr)hdc, (int)iLayerPlane, (int)iStart, (int)cEntries, (Int32*)pcr);
+            }
+        }
+
+        public static 
+        int wglGetLayerPaletteEntries(IntPtr hdc, int iLayerPlane, int iStart, int cEntries, Int32[] pcr)
+        {
+            unsafe
+            {
+                fixed (Int32* pcr_ptr = pcr)
+                {
+                    return Delegates.wglGetLayerPaletteEntries((IntPtr)hdc, (int)iLayerPlane, (int)iStart, (int)cEntries, (Int32*)pcr_ptr);
+                }
+            }
+        }
+
+        public static 
+        int wglGetLayerPaletteEntries(IntPtr hdc, int iLayerPlane, int iStart, int cEntries, ref Int32 pcr)
+        {
+            unsafe
+            {
+                fixed (Int32* pcr_ptr = &pcr)
+                {
+                    return Delegates.wglGetLayerPaletteEntries((IntPtr)hdc, (int)iLayerPlane, (int)iStart, (int)cEntries, (Int32*)pcr_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        int wglGetLayerPaletteEntries(IntPtr hdc, int iLayerPlane, int iStart, int cEntries, IntPtr pcr)
+        {
+            unsafe
+            {
+                return Delegates.wglGetLayerPaletteEntries((IntPtr)hdc, (int)iLayerPlane, (int)iStart, (int)cEntries, (Int32*)pcr);
+            }
+        }
+
+        public static 
+        Boolean wglRealizeLayerPalette(IntPtr hdc, int iLayerPlane, Boolean bRealize)
+        {
+            return Delegates.wglRealizeLayerPalette((IntPtr)hdc, (int)iLayerPlane, (Boolean)bRealize);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglSwapLayerBuffers(IntPtr hdc, UInt32 fuFlags)
+        {
+            return Delegates.wglSwapLayerBuffers((IntPtr)hdc, (UInt32)fuFlags);
+        }
+
+        public static 
+        Boolean wglSwapLayerBuffers(IntPtr hdc, Int32 fuFlags)
+        {
+            return Delegates.wglSwapLayerBuffers((IntPtr)hdc, (UInt32)fuFlags);
+        }
+
+        public static 
+        Boolean wglUseFontBitmapsA(IntPtr hDC, Int32 first, Int32 count, Int32 listBase)
+        {
+            return Delegates.wglUseFontBitmapsA((IntPtr)hDC, (Int32)first, (Int32)count, (Int32)listBase);
+        }
+
+        public static 
+        Boolean wglUseFontBitmapsW(IntPtr hDC, Int32 first, Int32 count, Int32 listBase)
+        {
+            return Delegates.wglUseFontBitmapsW((IntPtr)hDC, (Int32)first, (Int32)count, (Int32)listBase);
+        }
+
+        public static 
+        Boolean wglUseFontOutlinesA(IntPtr hDC, Int32 first, Int32 count, Int32 listBase, float thickness, float deviation, Int32 fontMode, Gdi.GLYPHMETRICSFLOAT[] glyphMetrics)
+        {
+            unsafe
+            {
+                fixed (Gdi.GLYPHMETRICSFLOAT* glyphMetrics_ptr = glyphMetrics)
+                {
+                    return Delegates.wglUseFontOutlinesA((IntPtr)hDC, (Int32)first, (Int32)count, (Int32)listBase, (float)thickness, (float)deviation, (Int32)fontMode, (Gdi.GLYPHMETRICSFLOAT*)glyphMetrics_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglUseFontOutlinesA(IntPtr hDC, Int32 first, Int32 count, Int32 listBase, float thickness, float deviation, Int32 fontMode, ref Gdi.GLYPHMETRICSFLOAT glyphMetrics)
+        {
+            unsafe
+            {
+                fixed (Gdi.GLYPHMETRICSFLOAT* glyphMetrics_ptr = &glyphMetrics)
+                {
+                    return Delegates.wglUseFontOutlinesA((IntPtr)hDC, (Int32)first, (Int32)count, (Int32)listBase, (float)thickness, (float)deviation, (Int32)fontMode, (Gdi.GLYPHMETRICSFLOAT*)glyphMetrics_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglUseFontOutlinesA(IntPtr hDC, Int32 first, Int32 count, Int32 listBase, float thickness, float deviation, Int32 fontMode, IntPtr glyphMetrics)
+        {
+            unsafe
+            {
+                return Delegates.wglUseFontOutlinesA((IntPtr)hDC, (Int32)first, (Int32)count, (Int32)listBase, (float)thickness, (float)deviation, (Int32)fontMode, (Gdi.GLYPHMETRICSFLOAT*)glyphMetrics);
+            }
+        }
+
+        public static 
+        Boolean wglUseFontOutlinesW(IntPtr hDC, Int32 first, Int32 count, Int32 listBase, float thickness, float deviation, Int32 fontMode, Gdi.GLYPHMETRICSFLOAT[] glyphMetrics)
+        {
+            unsafe
+            {
+                fixed (Gdi.GLYPHMETRICSFLOAT* glyphMetrics_ptr = glyphMetrics)
+                {
+                    return Delegates.wglUseFontOutlinesW((IntPtr)hDC, (Int32)first, (Int32)count, (Int32)listBase, (float)thickness, (float)deviation, (Int32)fontMode, (Gdi.GLYPHMETRICSFLOAT*)glyphMetrics_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglUseFontOutlinesW(IntPtr hDC, Int32 first, Int32 count, Int32 listBase, float thickness, float deviation, Int32 fontMode, ref Gdi.GLYPHMETRICSFLOAT glyphMetrics)
+        {
+            unsafe
+            {
+                fixed (Gdi.GLYPHMETRICSFLOAT* glyphMetrics_ptr = &glyphMetrics)
+                {
+                    return Delegates.wglUseFontOutlinesW((IntPtr)hDC, (Int32)first, (Int32)count, (Int32)listBase, (float)thickness, (float)deviation, (Int32)fontMode, (Gdi.GLYPHMETRICSFLOAT*)glyphMetrics_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglUseFontOutlinesW(IntPtr hDC, Int32 first, Int32 count, Int32 listBase, float thickness, float deviation, Int32 fontMode, IntPtr glyphMetrics)
+        {
+            unsafe
+            {
+                return Delegates.wglUseFontOutlinesW((IntPtr)hDC, (Int32)first, (Int32)count, (Int32)listBase, (float)thickness, (float)deviation, (Int32)fontMode, (Gdi.GLYPHMETRICSFLOAT*)glyphMetrics);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        IntPtr wglCreateBufferRegionARB(IntPtr hDC, int iLayerPlane, UInt32 uType)
+        {
+            return Delegates.wglCreateBufferRegionARB((IntPtr)hDC, (int)iLayerPlane, (UInt32)uType);
+        }
+
+        public static 
+        IntPtr wglCreateBufferRegionARB(IntPtr hDC, int iLayerPlane, Int32 uType)
+        {
+            return Delegates.wglCreateBufferRegionARB((IntPtr)hDC, (int)iLayerPlane, (UInt32)uType);
+        }
+
+        public static 
+        void wglDeleteBufferRegionARB(IntPtr hRegion)
+        {
+            Delegates.wglDeleteBufferRegionARB((IntPtr)hRegion);
+        }
+
+        public static 
+        Boolean wglSaveBufferRegionARB(IntPtr hRegion, int x, int y, int width, int height)
+        {
+            return Delegates.wglSaveBufferRegionARB((IntPtr)hRegion, (int)x, (int)y, (int)width, (int)height);
+        }
+
+        public static 
+        Boolean wglRestoreBufferRegionARB(IntPtr hRegion, int x, int y, int width, int height, int xSrc, int ySrc)
+        {
+            return Delegates.wglRestoreBufferRegionARB((IntPtr)hRegion, (int)x, (int)y, (int)width, (int)height, (int)xSrc, (int)ySrc);
+        }
+
+        public static 
+        string wglGetExtensionsStringARB(IntPtr hdc)
+        {
+            unsafe
+            {
+                return System.Runtime.InteropServices.Marshal.PtrToStringAnsi(Delegates.wglGetExtensionsStringARB((IntPtr)hdc));
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribivARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, int[] piAttributes, [Out] int[] piValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = piAttributes)
+                fixed (int* piValues_ptr = piValues)
+                {
+                    return Delegates.wglGetPixelFormatAttribivARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (int*)piValues_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetPixelFormatAttribivARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, int[] piAttributes, [Out] int[] piValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = piAttributes)
+                fixed (int* piValues_ptr = piValues)
+                {
+                    return Delegates.wglGetPixelFormatAttribivARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (int*)piValues_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribivARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, ref int piAttributes, [Out] out int piValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = &piAttributes)
+                fixed (int* piValues_ptr = &piValues)
+                {
+                    Boolean retval = Delegates.wglGetPixelFormatAttribivARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (int*)piValues_ptr);
+                    piValues = *piValues_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetPixelFormatAttribivARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, ref int piAttributes, [Out] out int piValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = &piAttributes)
+                fixed (int* piValues_ptr = &piValues)
+                {
+                    Boolean retval = Delegates.wglGetPixelFormatAttribivARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (int*)piValues_ptr);
+                    piValues = *piValues_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribivARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, IntPtr piAttributes, [Out] IntPtr piValues)
+        {
+            unsafe
+            {
+                return Delegates.wglGetPixelFormatAttribivARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes, (int*)piValues);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribivARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, IntPtr piAttributes, [Out] IntPtr piValues)
+        {
+            unsafe
+            {
+                return Delegates.wglGetPixelFormatAttribivARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes, (int*)piValues);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribfvARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, int[] piAttributes, [Out] Single[] pfValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = piAttributes)
+                fixed (Single* pfValues_ptr = pfValues)
+                {
+                    return Delegates.wglGetPixelFormatAttribfvARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (Single*)pfValues_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetPixelFormatAttribfvARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, int[] piAttributes, [Out] Single[] pfValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = piAttributes)
+                fixed (Single* pfValues_ptr = pfValues)
+                {
+                    return Delegates.wglGetPixelFormatAttribfvARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (Single*)pfValues_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribfvARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, ref int piAttributes, [Out] out Single pfValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = &piAttributes)
+                fixed (Single* pfValues_ptr = &pfValues)
+                {
+                    Boolean retval = Delegates.wglGetPixelFormatAttribfvARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (Single*)pfValues_ptr);
+                    pfValues = *pfValues_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetPixelFormatAttribfvARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, ref int piAttributes, [Out] out Single pfValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = &piAttributes)
+                fixed (Single* pfValues_ptr = &pfValues)
+                {
+                    Boolean retval = Delegates.wglGetPixelFormatAttribfvARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (Single*)pfValues_ptr);
+                    pfValues = *pfValues_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribfvARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, IntPtr piAttributes, [Out] IntPtr pfValues)
+        {
+            unsafe
+            {
+                return Delegates.wglGetPixelFormatAttribfvARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes, (Single*)pfValues);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribfvARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, IntPtr piAttributes, [Out] IntPtr pfValues)
+        {
+            unsafe
+            {
+                return Delegates.wglGetPixelFormatAttribfvARB((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes, (Single*)pfValues);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglChoosePixelFormatARB(IntPtr hdc, int[] piAttribIList, Single[] pfAttribFList, UInt32 nMaxFormats, [Out] int[] piFormats, [Out] UInt32[] nNumFormats)
+        {
+            unsafe
+            {
+                fixed (int* piAttribIList_ptr = piAttribIList)
+                fixed (Single* pfAttribFList_ptr = pfAttribFList)
+                fixed (int* piFormats_ptr = piFormats)
+                fixed (UInt32* nNumFormats_ptr = nNumFormats)
+                {
+                    return Delegates.wglChoosePixelFormatARB((IntPtr)hdc, (int*)piAttribIList_ptr, (Single*)pfAttribFList_ptr, (UInt32)nMaxFormats, (int*)piFormats_ptr, (UInt32*)nNumFormats_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglChoosePixelFormatARB(IntPtr hdc, int[] piAttribIList, Single[] pfAttribFList, Int32 nMaxFormats, [Out] int[] piFormats, [Out] Int32[] nNumFormats)
+        {
+            unsafe
+            {
+                fixed (int* piAttribIList_ptr = piAttribIList)
+                fixed (Single* pfAttribFList_ptr = pfAttribFList)
+                fixed (int* piFormats_ptr = piFormats)
+                fixed (Int32* nNumFormats_ptr = nNumFormats)
+                {
+                    return Delegates.wglChoosePixelFormatARB((IntPtr)hdc, (int*)piAttribIList_ptr, (Single*)pfAttribFList_ptr, (UInt32)nMaxFormats, (int*)piFormats_ptr, (UInt32*)nNumFormats_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglChoosePixelFormatARB(IntPtr hdc, ref int piAttribIList, ref Single pfAttribFList, UInt32 nMaxFormats, [Out] out int piFormats, [Out] out UInt32 nNumFormats)
+        {
+            unsafe
+            {
+                fixed (int* piAttribIList_ptr = &piAttribIList)
+                fixed (Single* pfAttribFList_ptr = &pfAttribFList)
+                fixed (int* piFormats_ptr = &piFormats)
+                fixed (UInt32* nNumFormats_ptr = &nNumFormats)
+                {
+                    Boolean retval = Delegates.wglChoosePixelFormatARB((IntPtr)hdc, (int*)piAttribIList_ptr, (Single*)pfAttribFList_ptr, (UInt32)nMaxFormats, (int*)piFormats_ptr, (UInt32*)nNumFormats_ptr);
+                    piFormats = *piFormats_ptr;
+                    nNumFormats = *nNumFormats_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglChoosePixelFormatARB(IntPtr hdc, ref int piAttribIList, ref Single pfAttribFList, Int32 nMaxFormats, [Out] out int piFormats, [Out] out Int32 nNumFormats)
+        {
+            unsafe
+            {
+                fixed (int* piAttribIList_ptr = &piAttribIList)
+                fixed (Single* pfAttribFList_ptr = &pfAttribFList)
+                fixed (int* piFormats_ptr = &piFormats)
+                fixed (Int32* nNumFormats_ptr = &nNumFormats)
+                {
+                    Boolean retval = Delegates.wglChoosePixelFormatARB((IntPtr)hdc, (int*)piAttribIList_ptr, (Single*)pfAttribFList_ptr, (UInt32)nMaxFormats, (int*)piFormats_ptr, (UInt32*)nNumFormats_ptr);
+                    piFormats = *piFormats_ptr;
+                    nNumFormats = *nNumFormats_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglChoosePixelFormatARB(IntPtr hdc, IntPtr piAttribIList, IntPtr pfAttribFList, UInt32 nMaxFormats, [Out] IntPtr piFormats, [Out] IntPtr nNumFormats)
+        {
+            unsafe
+            {
+                return Delegates.wglChoosePixelFormatARB((IntPtr)hdc, (int*)piAttribIList, (Single*)pfAttribFList, (UInt32)nMaxFormats, (int*)piFormats, (UInt32*)nNumFormats);
+            }
+        }
+
+        public static 
+        Boolean wglChoosePixelFormatARB(IntPtr hdc, IntPtr piAttribIList, IntPtr pfAttribFList, Int32 nMaxFormats, [Out] IntPtr piFormats, [Out] IntPtr nNumFormats)
+        {
+            unsafe
+            {
+                return Delegates.wglChoosePixelFormatARB((IntPtr)hdc, (int*)piAttribIList, (Single*)pfAttribFList, (UInt32)nMaxFormats, (int*)piFormats, (UInt32*)nNumFormats);
+            }
+        }
+
+        public static 
+        Boolean wglMakeContextCurrentARB(IntPtr hDrawDC, IntPtr hReadDC, IntPtr hglrc)
+        {
+            return Delegates.wglMakeContextCurrentARB((IntPtr)hDrawDC, (IntPtr)hReadDC, (IntPtr)hglrc);
+        }
+
+        public static 
+        IntPtr wglGetCurrentReadDCARB()
+        {
+            return Delegates.wglGetCurrentReadDCARB();
+        }
+
+        public static 
+        IntPtr wglCreatePbufferARB(IntPtr hDC, int iPixelFormat, int iWidth, int iHeight, int[] piAttribList)
+        {
+            unsafe
+            {
+                fixed (int* piAttribList_ptr = piAttribList)
+                {
+                    return Delegates.wglCreatePbufferARB((IntPtr)hDC, (int)iPixelFormat, (int)iWidth, (int)iHeight, (int*)piAttribList_ptr);
+                }
+            }
+        }
+
+        public static 
+        IntPtr wglCreatePbufferARB(IntPtr hDC, int iPixelFormat, int iWidth, int iHeight, ref int piAttribList)
+        {
+            unsafe
+            {
+                fixed (int* piAttribList_ptr = &piAttribList)
+                {
+                    return Delegates.wglCreatePbufferARB((IntPtr)hDC, (int)iPixelFormat, (int)iWidth, (int)iHeight, (int*)piAttribList_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        IntPtr wglCreatePbufferARB(IntPtr hDC, int iPixelFormat, int iWidth, int iHeight, IntPtr piAttribList)
+        {
+            unsafe
+            {
+                return Delegates.wglCreatePbufferARB((IntPtr)hDC, (int)iPixelFormat, (int)iWidth, (int)iHeight, (int*)piAttribList);
+            }
+        }
+
+        public static 
+        IntPtr wglGetPbufferDCARB(IntPtr hPbuffer)
+        {
+            return Delegates.wglGetPbufferDCARB((IntPtr)hPbuffer);
+        }
+
+        public static 
+        int wglReleasePbufferDCARB(IntPtr hPbuffer, IntPtr hDC)
+        {
+            return Delegates.wglReleasePbufferDCARB((IntPtr)hPbuffer, (IntPtr)hDC);
+        }
+
+        public static 
+        Boolean wglDestroyPbufferARB(IntPtr hPbuffer)
+        {
+            return Delegates.wglDestroyPbufferARB((IntPtr)hPbuffer);
+        }
+
+        public static 
+        Boolean wglQueryPbufferARB(IntPtr hPbuffer, int iAttribute, [Out] int[] piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = piValue)
+                {
+                    return Delegates.wglQueryPbufferARB((IntPtr)hPbuffer, (int)iAttribute, (int*)piValue_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglQueryPbufferARB(IntPtr hPbuffer, int iAttribute, [Out] out int piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = &piValue)
+                {
+                    Boolean retval = Delegates.wglQueryPbufferARB((IntPtr)hPbuffer, (int)iAttribute, (int*)piValue_ptr);
+                    piValue = *piValue_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglQueryPbufferARB(IntPtr hPbuffer, int iAttribute, [Out] IntPtr piValue)
+        {
+            unsafe
+            {
+                return Delegates.wglQueryPbufferARB((IntPtr)hPbuffer, (int)iAttribute, (int*)piValue);
+            }
+        }
+
+        public static 
+        Boolean wglBindTexImageARB(IntPtr hPbuffer, int iBuffer)
+        {
+            return Delegates.wglBindTexImageARB((IntPtr)hPbuffer, (int)iBuffer);
+        }
+
+        public static 
+        Boolean wglReleaseTexImageARB(IntPtr hPbuffer, int iBuffer)
+        {
+            return Delegates.wglReleaseTexImageARB((IntPtr)hPbuffer, (int)iBuffer);
+        }
+
+        public static 
+        Boolean wglSetPbufferAttribARB(IntPtr hPbuffer, int[] piAttribList)
+        {
+            unsafe
+            {
+                fixed (int* piAttribList_ptr = piAttribList)
+                {
+                    return Delegates.wglSetPbufferAttribARB((IntPtr)hPbuffer, (int*)piAttribList_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglSetPbufferAttribARB(IntPtr hPbuffer, ref int piAttribList)
+        {
+            unsafe
+            {
+                fixed (int* piAttribList_ptr = &piAttribList)
+                {
+                    return Delegates.wglSetPbufferAttribARB((IntPtr)hPbuffer, (int*)piAttribList_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglSetPbufferAttribARB(IntPtr hPbuffer, IntPtr piAttribList)
+        {
+            unsafe
+            {
+                return Delegates.wglSetPbufferAttribARB((IntPtr)hPbuffer, (int*)piAttribList);
+            }
+        }
+
+        public static
+        IntPtr wglCreateContextAttribsARB(IntPtr hDC, IntPtr shareHGLRC, int[] attribs)
+        {
+            return Delegates.wglCreateContextAttribsARB(hDC, shareHGLRC, attribs);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool wglCreateDisplayColorTableEXT(UInt16 id)
+        {
+            return Delegates.wglCreateDisplayColorTableEXT((UInt16)id);
+        }
+
+        public static 
+        bool wglCreateDisplayColorTableEXT(Int16 id)
+        {
+            return Delegates.wglCreateDisplayColorTableEXT((UInt16)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool wglLoadDisplayColorTableEXT(UInt16[] table, UInt32 length)
+        {
+            unsafe
+            {
+                fixed (UInt16* table_ptr = table)
+                {
+                    return Delegates.wglLoadDisplayColorTableEXT((UInt16*)table_ptr, (UInt32)length);
+                }
+            }
+        }
+
+        public static 
+        bool wglLoadDisplayColorTableEXT(Int16[] table, Int32 length)
+        {
+            unsafe
+            {
+                fixed (Int16* table_ptr = table)
+                {
+                    return Delegates.wglLoadDisplayColorTableEXT((UInt16*)table_ptr, (UInt32)length);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool wglLoadDisplayColorTableEXT(ref UInt16 table, UInt32 length)
+        {
+            unsafe
+            {
+                fixed (UInt16* table_ptr = &table)
+                {
+                    return Delegates.wglLoadDisplayColorTableEXT((UInt16*)table_ptr, (UInt32)length);
+                }
+            }
+        }
+
+        public static 
+        bool wglLoadDisplayColorTableEXT(ref Int16 table, Int32 length)
+        {
+            unsafe
+            {
+                fixed (Int16* table_ptr = &table)
+                {
+                    return Delegates.wglLoadDisplayColorTableEXT((UInt16*)table_ptr, (UInt32)length);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool wglLoadDisplayColorTableEXT(IntPtr table, UInt32 length)
+        {
+            unsafe
+            {
+                return Delegates.wglLoadDisplayColorTableEXT((UInt16*)table, (UInt32)length);
+            }
+        }
+
+        public static 
+        bool wglLoadDisplayColorTableEXT(IntPtr table, Int32 length)
+        {
+            unsafe
+            {
+                return Delegates.wglLoadDisplayColorTableEXT((UInt16*)table, (UInt32)length);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        bool wglBindDisplayColorTableEXT(UInt16 id)
+        {
+            return Delegates.wglBindDisplayColorTableEXT((UInt16)id);
+        }
+
+        public static 
+        bool wglBindDisplayColorTableEXT(Int16 id)
+        {
+            return Delegates.wglBindDisplayColorTableEXT((UInt16)id);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void wglDestroyDisplayColorTableEXT(UInt16 id)
+        {
+            Delegates.wglDestroyDisplayColorTableEXT((UInt16)id);
+        }
+
+        public static 
+        void wglDestroyDisplayColorTableEXT(Int16 id)
+        {
+            Delegates.wglDestroyDisplayColorTableEXT((UInt16)id);
+        }
+
+        public static 
+        string wglGetExtensionsStringEXT()
+        {
+            unsafe
+            {
+                return System.Runtime.InteropServices.Marshal.PtrToStringAnsi(Delegates.wglGetExtensionsStringEXT());
+            }
+        }
+
+        public static 
+        Boolean wglMakeContextCurrentEXT(IntPtr hDrawDC, IntPtr hReadDC, IntPtr hglrc)
+        {
+            return Delegates.wglMakeContextCurrentEXT((IntPtr)hDrawDC, (IntPtr)hReadDC, (IntPtr)hglrc);
+        }
+
+        public static 
+        IntPtr wglGetCurrentReadDCEXT()
+        {
+            return Delegates.wglGetCurrentReadDCEXT();
+        }
+
+        public static 
+        IntPtr wglCreatePbufferEXT(IntPtr hDC, int iPixelFormat, int iWidth, int iHeight, int[] piAttribList)
+        {
+            unsafe
+            {
+                fixed (int* piAttribList_ptr = piAttribList)
+                {
+                    return Delegates.wglCreatePbufferEXT((IntPtr)hDC, (int)iPixelFormat, (int)iWidth, (int)iHeight, (int*)piAttribList_ptr);
+                }
+            }
+        }
+
+        public static 
+        IntPtr wglCreatePbufferEXT(IntPtr hDC, int iPixelFormat, int iWidth, int iHeight, ref int piAttribList)
+        {
+            unsafe
+            {
+                fixed (int* piAttribList_ptr = &piAttribList)
+                {
+                    return Delegates.wglCreatePbufferEXT((IntPtr)hDC, (int)iPixelFormat, (int)iWidth, (int)iHeight, (int*)piAttribList_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        IntPtr wglCreatePbufferEXT(IntPtr hDC, int iPixelFormat, int iWidth, int iHeight, IntPtr piAttribList)
+        {
+            unsafe
+            {
+                return Delegates.wglCreatePbufferEXT((IntPtr)hDC, (int)iPixelFormat, (int)iWidth, (int)iHeight, (int*)piAttribList);
+            }
+        }
+
+        public static 
+        IntPtr wglGetPbufferDCEXT(IntPtr hPbuffer)
+        {
+            return Delegates.wglGetPbufferDCEXT((IntPtr)hPbuffer);
+        }
+
+        public static 
+        int wglReleasePbufferDCEXT(IntPtr hPbuffer, IntPtr hDC)
+        {
+            return Delegates.wglReleasePbufferDCEXT((IntPtr)hPbuffer, (IntPtr)hDC);
+        }
+
+        public static 
+        Boolean wglDestroyPbufferEXT(IntPtr hPbuffer)
+        {
+            return Delegates.wglDestroyPbufferEXT((IntPtr)hPbuffer);
+        }
+
+        public static 
+        Boolean wglQueryPbufferEXT(IntPtr hPbuffer, int iAttribute, [Out] int[] piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = piValue)
+                {
+                    return Delegates.wglQueryPbufferEXT((IntPtr)hPbuffer, (int)iAttribute, (int*)piValue_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglQueryPbufferEXT(IntPtr hPbuffer, int iAttribute, [Out] out int piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = &piValue)
+                {
+                    Boolean retval = Delegates.wglQueryPbufferEXT((IntPtr)hPbuffer, (int)iAttribute, (int*)piValue_ptr);
+                    piValue = *piValue_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglQueryPbufferEXT(IntPtr hPbuffer, int iAttribute, [Out] IntPtr piValue)
+        {
+            unsafe
+            {
+                return Delegates.wglQueryPbufferEXT((IntPtr)hPbuffer, (int)iAttribute, (int*)piValue);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribivEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, [Out] int[] piAttributes, [Out] int[] piValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = piAttributes)
+                fixed (int* piValues_ptr = piValues)
+                {
+                    return Delegates.wglGetPixelFormatAttribivEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (int*)piValues_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetPixelFormatAttribivEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, [Out] int[] piAttributes, [Out] int[] piValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = piAttributes)
+                fixed (int* piValues_ptr = piValues)
+                {
+                    return Delegates.wglGetPixelFormatAttribivEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (int*)piValues_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribivEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, [Out] out int piAttributes, [Out] out int piValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = &piAttributes)
+                fixed (int* piValues_ptr = &piValues)
+                {
+                    Boolean retval = Delegates.wglGetPixelFormatAttribivEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (int*)piValues_ptr);
+                    piAttributes = *piAttributes_ptr;
+                    piValues = *piValues_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetPixelFormatAttribivEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, [Out] out int piAttributes, [Out] out int piValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = &piAttributes)
+                fixed (int* piValues_ptr = &piValues)
+                {
+                    Boolean retval = Delegates.wglGetPixelFormatAttribivEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (int*)piValues_ptr);
+                    piAttributes = *piAttributes_ptr;
+                    piValues = *piValues_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribivEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, [Out] IntPtr piAttributes, [Out] IntPtr piValues)
+        {
+            unsafe
+            {
+                return Delegates.wglGetPixelFormatAttribivEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes, (int*)piValues);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribivEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, [Out] IntPtr piAttributes, [Out] IntPtr piValues)
+        {
+            unsafe
+            {
+                return Delegates.wglGetPixelFormatAttribivEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes, (int*)piValues);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribfvEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, [Out] int[] piAttributes, [Out] Single[] pfValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = piAttributes)
+                fixed (Single* pfValues_ptr = pfValues)
+                {
+                    return Delegates.wglGetPixelFormatAttribfvEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (Single*)pfValues_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetPixelFormatAttribfvEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, [Out] int[] piAttributes, [Out] Single[] pfValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = piAttributes)
+                fixed (Single* pfValues_ptr = pfValues)
+                {
+                    return Delegates.wglGetPixelFormatAttribfvEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (Single*)pfValues_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribfvEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, [Out] out int piAttributes, [Out] out Single pfValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = &piAttributes)
+                fixed (Single* pfValues_ptr = &pfValues)
+                {
+                    Boolean retval = Delegates.wglGetPixelFormatAttribfvEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (Single*)pfValues_ptr);
+                    piAttributes = *piAttributes_ptr;
+                    pfValues = *pfValues_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetPixelFormatAttribfvEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, [Out] out int piAttributes, [Out] out Single pfValues)
+        {
+            unsafe
+            {
+                fixed (int* piAttributes_ptr = &piAttributes)
+                fixed (Single* pfValues_ptr = &pfValues)
+                {
+                    Boolean retval = Delegates.wglGetPixelFormatAttribfvEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes_ptr, (Single*)pfValues_ptr);
+                    piAttributes = *piAttributes_ptr;
+                    pfValues = *pfValues_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribfvEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, [Out] IntPtr piAttributes, [Out] IntPtr pfValues)
+        {
+            unsafe
+            {
+                return Delegates.wglGetPixelFormatAttribfvEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes, (Single*)pfValues);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetPixelFormatAttribfvEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, Int32 nAttributes, [Out] IntPtr piAttributes, [Out] IntPtr pfValues)
+        {
+            unsafe
+            {
+                return Delegates.wglGetPixelFormatAttribfvEXT((IntPtr)hdc, (int)iPixelFormat, (int)iLayerPlane, (UInt32)nAttributes, (int*)piAttributes, (Single*)pfValues);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglChoosePixelFormatEXT(IntPtr hdc, int[] piAttribIList, Single[] pfAttribFList, UInt32 nMaxFormats, [Out] int[] piFormats, [Out] UInt32[] nNumFormats)
+        {
+            unsafe
+            {
+                fixed (int* piAttribIList_ptr = piAttribIList)
+                fixed (Single* pfAttribFList_ptr = pfAttribFList)
+                fixed (int* piFormats_ptr = piFormats)
+                fixed (UInt32* nNumFormats_ptr = nNumFormats)
+                {
+                    return Delegates.wglChoosePixelFormatEXT((IntPtr)hdc, (int*)piAttribIList_ptr, (Single*)pfAttribFList_ptr, (UInt32)nMaxFormats, (int*)piFormats_ptr, (UInt32*)nNumFormats_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglChoosePixelFormatEXT(IntPtr hdc, int[] piAttribIList, Single[] pfAttribFList, Int32 nMaxFormats, [Out] int[] piFormats, [Out] Int32[] nNumFormats)
+        {
+            unsafe
+            {
+                fixed (int* piAttribIList_ptr = piAttribIList)
+                fixed (Single* pfAttribFList_ptr = pfAttribFList)
+                fixed (int* piFormats_ptr = piFormats)
+                fixed (Int32* nNumFormats_ptr = nNumFormats)
+                {
+                    return Delegates.wglChoosePixelFormatEXT((IntPtr)hdc, (int*)piAttribIList_ptr, (Single*)pfAttribFList_ptr, (UInt32)nMaxFormats, (int*)piFormats_ptr, (UInt32*)nNumFormats_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglChoosePixelFormatEXT(IntPtr hdc, ref int piAttribIList, ref Single pfAttribFList, UInt32 nMaxFormats, [Out] out int piFormats, [Out] out UInt32 nNumFormats)
+        {
+            unsafe
+            {
+                fixed (int* piAttribIList_ptr = &piAttribIList)
+                fixed (Single* pfAttribFList_ptr = &pfAttribFList)
+                fixed (int* piFormats_ptr = &piFormats)
+                fixed (UInt32* nNumFormats_ptr = &nNumFormats)
+                {
+                    Boolean retval = Delegates.wglChoosePixelFormatEXT((IntPtr)hdc, (int*)piAttribIList_ptr, (Single*)pfAttribFList_ptr, (UInt32)nMaxFormats, (int*)piFormats_ptr, (UInt32*)nNumFormats_ptr);
+                    piFormats = *piFormats_ptr;
+                    nNumFormats = *nNumFormats_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglChoosePixelFormatEXT(IntPtr hdc, ref int piAttribIList, ref Single pfAttribFList, Int32 nMaxFormats, [Out] out int piFormats, [Out] out Int32 nNumFormats)
+        {
+            unsafe
+            {
+                fixed (int* piAttribIList_ptr = &piAttribIList)
+                fixed (Single* pfAttribFList_ptr = &pfAttribFList)
+                fixed (int* piFormats_ptr = &piFormats)
+                fixed (Int32* nNumFormats_ptr = &nNumFormats)
+                {
+                    Boolean retval = Delegates.wglChoosePixelFormatEXT((IntPtr)hdc, (int*)piAttribIList_ptr, (Single*)pfAttribFList_ptr, (UInt32)nMaxFormats, (int*)piFormats_ptr, (UInt32*)nNumFormats_ptr);
+                    piFormats = *piFormats_ptr;
+                    nNumFormats = *nNumFormats_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglChoosePixelFormatEXT(IntPtr hdc, IntPtr piAttribIList, IntPtr pfAttribFList, UInt32 nMaxFormats, [Out] IntPtr piFormats, [Out] IntPtr nNumFormats)
+        {
+            unsafe
+            {
+                return Delegates.wglChoosePixelFormatEXT((IntPtr)hdc, (int*)piAttribIList, (Single*)pfAttribFList, (UInt32)nMaxFormats, (int*)piFormats, (UInt32*)nNumFormats);
+            }
+        }
+
+        public static 
+        Boolean wglChoosePixelFormatEXT(IntPtr hdc, IntPtr piAttribIList, IntPtr pfAttribFList, Int32 nMaxFormats, [Out] IntPtr piFormats, [Out] IntPtr nNumFormats)
+        {
+            unsafe
+            {
+                return Delegates.wglChoosePixelFormatEXT((IntPtr)hdc, (int*)piAttribIList, (Single*)pfAttribFList, (UInt32)nMaxFormats, (int*)piFormats, (UInt32*)nNumFormats);
+            }
+        }
+
+        public static 
+        Boolean wglSwapIntervalEXT(int interval)
+        {
+            return Delegates.wglSwapIntervalEXT((int)interval);
+        }
+
+        public static 
+        int wglGetSwapIntervalEXT()
+        {
+            return Delegates.wglGetSwapIntervalEXT();
+        }
+
+        public static 
+        IntPtr wglAllocateMemoryNV(Int32 size, Single readfreq, Single writefreq, Single priority)
+        {
+            return Delegates.wglAllocateMemoryNV((Int32)size, (Single)readfreq, (Single)writefreq, (Single)priority);
+        }
+
+        public static 
+        void wglFreeMemoryNV([Out] IntPtr[] pointer)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pointer_ptr = pointer)
+                {
+                    Delegates.wglFreeMemoryNV((IntPtr*)pointer_ptr);
+                }
+            }
+        }
+
+        public static 
+        void wglFreeMemoryNV([Out] out IntPtr pointer)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pointer_ptr = &pointer)
+                {
+                    Delegates.wglFreeMemoryNV((IntPtr*)pointer_ptr);
+                    pointer = *pointer_ptr;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        void wglFreeMemoryNV([Out] IntPtr pointer)
+        {
+            unsafe
+            {
+                Delegates.wglFreeMemoryNV((IntPtr*)pointer);
+            }
+        }
+
+        public static 
+        Boolean wglGetSyncValuesOML(IntPtr hdc, [Out] Int64[] ust, [Out] Int64[] msc, [Out] Int64[] sbc)
+        {
+            unsafe
+            {
+                fixed (Int64* ust_ptr = ust)
+                fixed (Int64* msc_ptr = msc)
+                fixed (Int64* sbc_ptr = sbc)
+                {
+                    return Delegates.wglGetSyncValuesOML((IntPtr)hdc, (Int64*)ust_ptr, (Int64*)msc_ptr, (Int64*)sbc_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetSyncValuesOML(IntPtr hdc, [Out] out Int64 ust, [Out] out Int64 msc, [Out] out Int64 sbc)
+        {
+            unsafe
+            {
+                fixed (Int64* ust_ptr = &ust)
+                fixed (Int64* msc_ptr = &msc)
+                fixed (Int64* sbc_ptr = &sbc)
+                {
+                    Boolean retval = Delegates.wglGetSyncValuesOML((IntPtr)hdc, (Int64*)ust_ptr, (Int64*)msc_ptr, (Int64*)sbc_ptr);
+                    ust = *ust_ptr;
+                    msc = *msc_ptr;
+                    sbc = *sbc_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetSyncValuesOML(IntPtr hdc, [Out] IntPtr ust, [Out] IntPtr msc, [Out] IntPtr sbc)
+        {
+            unsafe
+            {
+                return Delegates.wglGetSyncValuesOML((IntPtr)hdc, (Int64*)ust, (Int64*)msc, (Int64*)sbc);
+            }
+        }
+
+        public static 
+        Boolean wglGetMscRateOML(IntPtr hdc, [Out] Int32[] numerator, [Out] Int32[] denominator)
+        {
+            unsafe
+            {
+                fixed (Int32* numerator_ptr = numerator)
+                fixed (Int32* denominator_ptr = denominator)
+                {
+                    return Delegates.wglGetMscRateOML((IntPtr)hdc, (Int32*)numerator_ptr, (Int32*)denominator_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetMscRateOML(IntPtr hdc, [Out] out Int32 numerator, [Out] out Int32 denominator)
+        {
+            unsafe
+            {
+                fixed (Int32* numerator_ptr = &numerator)
+                fixed (Int32* denominator_ptr = &denominator)
+                {
+                    Boolean retval = Delegates.wglGetMscRateOML((IntPtr)hdc, (Int32*)numerator_ptr, (Int32*)denominator_ptr);
+                    numerator = *numerator_ptr;
+                    denominator = *denominator_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetMscRateOML(IntPtr hdc, [Out] IntPtr numerator, [Out] IntPtr denominator)
+        {
+            unsafe
+            {
+                return Delegates.wglGetMscRateOML((IntPtr)hdc, (Int32*)numerator, (Int32*)denominator);
+            }
+        }
+
+        public static 
+        Int64 wglSwapBuffersMscOML(IntPtr hdc, Int64 target_msc, Int64 divisor, Int64 remainder)
+        {
+            return Delegates.wglSwapBuffersMscOML((IntPtr)hdc, (Int64)target_msc, (Int64)divisor, (Int64)remainder);
+        }
+
+        public static 
+        Int64 wglSwapLayerBuffersMscOML(IntPtr hdc, int fuPlanes, Int64 target_msc, Int64 divisor, Int64 remainder)
+        {
+            return Delegates.wglSwapLayerBuffersMscOML((IntPtr)hdc, (int)fuPlanes, (Int64)target_msc, (Int64)divisor, (Int64)remainder);
+        }
+
+        public static 
+        Boolean wglWaitForMscOML(IntPtr hdc, Int64 target_msc, Int64 divisor, Int64 remainder, [Out] Int64[] ust, [Out] Int64[] msc, [Out] Int64[] sbc)
+        {
+            unsafe
+            {
+                fixed (Int64* ust_ptr = ust)
+                fixed (Int64* msc_ptr = msc)
+                fixed (Int64* sbc_ptr = sbc)
+                {
+                    return Delegates.wglWaitForMscOML((IntPtr)hdc, (Int64)target_msc, (Int64)divisor, (Int64)remainder, (Int64*)ust_ptr, (Int64*)msc_ptr, (Int64*)sbc_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglWaitForMscOML(IntPtr hdc, Int64 target_msc, Int64 divisor, Int64 remainder, [Out] out Int64 ust, [Out] out Int64 msc, [Out] out Int64 sbc)
+        {
+            unsafe
+            {
+                fixed (Int64* ust_ptr = &ust)
+                fixed (Int64* msc_ptr = &msc)
+                fixed (Int64* sbc_ptr = &sbc)
+                {
+                    Boolean retval = Delegates.wglWaitForMscOML((IntPtr)hdc, (Int64)target_msc, (Int64)divisor, (Int64)remainder, (Int64*)ust_ptr, (Int64*)msc_ptr, (Int64*)sbc_ptr);
+                    ust = *ust_ptr;
+                    msc = *msc_ptr;
+                    sbc = *sbc_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglWaitForMscOML(IntPtr hdc, Int64 target_msc, Int64 divisor, Int64 remainder, [Out] IntPtr ust, [Out] IntPtr msc, [Out] IntPtr sbc)
+        {
+            unsafe
+            {
+                return Delegates.wglWaitForMscOML((IntPtr)hdc, (Int64)target_msc, (Int64)divisor, (Int64)remainder, (Int64*)ust, (Int64*)msc, (Int64*)sbc);
+            }
+        }
+
+        public static 
+        Boolean wglWaitForSbcOML(IntPtr hdc, Int64 target_sbc, [Out] Int64[] ust, [Out] Int64[] msc, [Out] Int64[] sbc)
+        {
+            unsafe
+            {
+                fixed (Int64* ust_ptr = ust)
+                fixed (Int64* msc_ptr = msc)
+                fixed (Int64* sbc_ptr = sbc)
+                {
+                    return Delegates.wglWaitForSbcOML((IntPtr)hdc, (Int64)target_sbc, (Int64*)ust_ptr, (Int64*)msc_ptr, (Int64*)sbc_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglWaitForSbcOML(IntPtr hdc, Int64 target_sbc, [Out] out Int64 ust, [Out] out Int64 msc, [Out] out Int64 sbc)
+        {
+            unsafe
+            {
+                fixed (Int64* ust_ptr = &ust)
+                fixed (Int64* msc_ptr = &msc)
+                fixed (Int64* sbc_ptr = &sbc)
+                {
+                    Boolean retval = Delegates.wglWaitForSbcOML((IntPtr)hdc, (Int64)target_sbc, (Int64*)ust_ptr, (Int64*)msc_ptr, (Int64*)sbc_ptr);
+                    ust = *ust_ptr;
+                    msc = *msc_ptr;
+                    sbc = *sbc_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglWaitForSbcOML(IntPtr hdc, Int64 target_sbc, [Out] IntPtr ust, [Out] IntPtr msc, [Out] IntPtr sbc)
+        {
+            unsafe
+            {
+                return Delegates.wglWaitForSbcOML((IntPtr)hdc, (Int64)target_sbc, (Int64*)ust, (Int64*)msc, (Int64*)sbc);
+            }
+        }
+
+        public static 
+        Boolean wglGetDigitalVideoParametersI3D(IntPtr hDC, int iAttribute, [Out] int[] piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = piValue)
+                {
+                    return Delegates.wglGetDigitalVideoParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetDigitalVideoParametersI3D(IntPtr hDC, int iAttribute, [Out] out int piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = &piValue)
+                {
+                    Boolean retval = Delegates.wglGetDigitalVideoParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue_ptr);
+                    piValue = *piValue_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetDigitalVideoParametersI3D(IntPtr hDC, int iAttribute, [Out] IntPtr piValue)
+        {
+            unsafe
+            {
+                return Delegates.wglGetDigitalVideoParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue);
+            }
+        }
+
+        public static 
+        Boolean wglSetDigitalVideoParametersI3D(IntPtr hDC, int iAttribute, int[] piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = piValue)
+                {
+                    return Delegates.wglSetDigitalVideoParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglSetDigitalVideoParametersI3D(IntPtr hDC, int iAttribute, ref int piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = &piValue)
+                {
+                    return Delegates.wglSetDigitalVideoParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglSetDigitalVideoParametersI3D(IntPtr hDC, int iAttribute, IntPtr piValue)
+        {
+            unsafe
+            {
+                return Delegates.wglSetDigitalVideoParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue);
+            }
+        }
+
+        public static 
+        Boolean wglGetGammaTableParametersI3D(IntPtr hDC, int iAttribute, [Out] int[] piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = piValue)
+                {
+                    return Delegates.wglGetGammaTableParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGammaTableParametersI3D(IntPtr hDC, int iAttribute, [Out] out int piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = &piValue)
+                {
+                    Boolean retval = Delegates.wglGetGammaTableParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue_ptr);
+                    piValue = *piValue_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGammaTableParametersI3D(IntPtr hDC, int iAttribute, [Out] IntPtr piValue)
+        {
+            unsafe
+            {
+                return Delegates.wglGetGammaTableParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue);
+            }
+        }
+
+        public static 
+        Boolean wglSetGammaTableParametersI3D(IntPtr hDC, int iAttribute, int[] piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = piValue)
+                {
+                    return Delegates.wglSetGammaTableParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglSetGammaTableParametersI3D(IntPtr hDC, int iAttribute, ref int piValue)
+        {
+            unsafe
+            {
+                fixed (int* piValue_ptr = &piValue)
+                {
+                    return Delegates.wglSetGammaTableParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglSetGammaTableParametersI3D(IntPtr hDC, int iAttribute, IntPtr piValue)
+        {
+            unsafe
+            {
+                return Delegates.wglSetGammaTableParametersI3D((IntPtr)hDC, (int)iAttribute, (int*)piValue);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGammaTableI3D(IntPtr hDC, int iEntries, [Out] UInt16[] puRed, [Out] UInt16[] puGreen, [Out] UInt16[] puBlue)
+        {
+            unsafe
+            {
+                fixed (UInt16* puRed_ptr = puRed)
+                fixed (UInt16* puGreen_ptr = puGreen)
+                fixed (UInt16* puBlue_ptr = puBlue)
+                {
+                    return Delegates.wglGetGammaTableI3D((IntPtr)hDC, (int)iEntries, (UInt16*)puRed_ptr, (UInt16*)puGreen_ptr, (UInt16*)puBlue_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGammaTableI3D(IntPtr hDC, int iEntries, [Out] Int16[] puRed, [Out] Int16[] puGreen, [Out] Int16[] puBlue)
+        {
+            unsafe
+            {
+                fixed (Int16* puRed_ptr = puRed)
+                fixed (Int16* puGreen_ptr = puGreen)
+                fixed (Int16* puBlue_ptr = puBlue)
+                {
+                    return Delegates.wglGetGammaTableI3D((IntPtr)hDC, (int)iEntries, (UInt16*)puRed_ptr, (UInt16*)puGreen_ptr, (UInt16*)puBlue_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGammaTableI3D(IntPtr hDC, int iEntries, [Out] out UInt16 puRed, [Out] out UInt16 puGreen, [Out] out UInt16 puBlue)
+        {
+            unsafe
+            {
+                fixed (UInt16* puRed_ptr = &puRed)
+                fixed (UInt16* puGreen_ptr = &puGreen)
+                fixed (UInt16* puBlue_ptr = &puBlue)
+                {
+                    Boolean retval = Delegates.wglGetGammaTableI3D((IntPtr)hDC, (int)iEntries, (UInt16*)puRed_ptr, (UInt16*)puGreen_ptr, (UInt16*)puBlue_ptr);
+                    puRed = *puRed_ptr;
+                    puGreen = *puGreen_ptr;
+                    puBlue = *puBlue_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGammaTableI3D(IntPtr hDC, int iEntries, [Out] out Int16 puRed, [Out] out Int16 puGreen, [Out] out Int16 puBlue)
+        {
+            unsafe
+            {
+                fixed (Int16* puRed_ptr = &puRed)
+                fixed (Int16* puGreen_ptr = &puGreen)
+                fixed (Int16* puBlue_ptr = &puBlue)
+                {
+                    Boolean retval = Delegates.wglGetGammaTableI3D((IntPtr)hDC, (int)iEntries, (UInt16*)puRed_ptr, (UInt16*)puGreen_ptr, (UInt16*)puBlue_ptr);
+                    puRed = *puRed_ptr;
+                    puGreen = *puGreen_ptr;
+                    puBlue = *puBlue_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGammaTableI3D(IntPtr hDC, int iEntries, [Out] IntPtr puRed, [Out] IntPtr puGreen, [Out] IntPtr puBlue)
+        {
+            unsafe
+            {
+                return Delegates.wglGetGammaTableI3D((IntPtr)hDC, (int)iEntries, (UInt16*)puRed, (UInt16*)puGreen, (UInt16*)puBlue);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglSetGammaTableI3D(IntPtr hDC, int iEntries, UInt16[] puRed, UInt16[] puGreen, UInt16[] puBlue)
+        {
+            unsafe
+            {
+                fixed (UInt16* puRed_ptr = puRed)
+                fixed (UInt16* puGreen_ptr = puGreen)
+                fixed (UInt16* puBlue_ptr = puBlue)
+                {
+                    return Delegates.wglSetGammaTableI3D((IntPtr)hDC, (int)iEntries, (UInt16*)puRed_ptr, (UInt16*)puGreen_ptr, (UInt16*)puBlue_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglSetGammaTableI3D(IntPtr hDC, int iEntries, Int16[] puRed, Int16[] puGreen, Int16[] puBlue)
+        {
+            unsafe
+            {
+                fixed (Int16* puRed_ptr = puRed)
+                fixed (Int16* puGreen_ptr = puGreen)
+                fixed (Int16* puBlue_ptr = puBlue)
+                {
+                    return Delegates.wglSetGammaTableI3D((IntPtr)hDC, (int)iEntries, (UInt16*)puRed_ptr, (UInt16*)puGreen_ptr, (UInt16*)puBlue_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglSetGammaTableI3D(IntPtr hDC, int iEntries, ref UInt16 puRed, ref UInt16 puGreen, ref UInt16 puBlue)
+        {
+            unsafe
+            {
+                fixed (UInt16* puRed_ptr = &puRed)
+                fixed (UInt16* puGreen_ptr = &puGreen)
+                fixed (UInt16* puBlue_ptr = &puBlue)
+                {
+                    return Delegates.wglSetGammaTableI3D((IntPtr)hDC, (int)iEntries, (UInt16*)puRed_ptr, (UInt16*)puGreen_ptr, (UInt16*)puBlue_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglSetGammaTableI3D(IntPtr hDC, int iEntries, ref Int16 puRed, ref Int16 puGreen, ref Int16 puBlue)
+        {
+            unsafe
+            {
+                fixed (Int16* puRed_ptr = &puRed)
+                fixed (Int16* puGreen_ptr = &puGreen)
+                fixed (Int16* puBlue_ptr = &puBlue)
+                {
+                    return Delegates.wglSetGammaTableI3D((IntPtr)hDC, (int)iEntries, (UInt16*)puRed_ptr, (UInt16*)puGreen_ptr, (UInt16*)puBlue_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglSetGammaTableI3D(IntPtr hDC, int iEntries, IntPtr puRed, IntPtr puGreen, IntPtr puBlue)
+        {
+            unsafe
+            {
+                return Delegates.wglSetGammaTableI3D((IntPtr)hDC, (int)iEntries, (UInt16*)puRed, (UInt16*)puGreen, (UInt16*)puBlue);
+            }
+        }
+
+        public static 
+        Boolean wglEnableGenlockI3D(IntPtr hDC)
+        {
+            return Delegates.wglEnableGenlockI3D((IntPtr)hDC);
+        }
+
+        public static 
+        Boolean wglDisableGenlockI3D(IntPtr hDC)
+        {
+            return Delegates.wglDisableGenlockI3D((IntPtr)hDC);
+        }
+
+        public static 
+        Boolean wglIsEnabledGenlockI3D(IntPtr hDC, [Out] Boolean[] pFlag)
+        {
+            unsafe
+            {
+                fixed (Boolean* pFlag_ptr = pFlag)
+                {
+                    return Delegates.wglIsEnabledGenlockI3D((IntPtr)hDC, (Boolean*)pFlag_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglIsEnabledGenlockI3D(IntPtr hDC, [Out] out Boolean pFlag)
+        {
+            unsafe
+            {
+                fixed (Boolean* pFlag_ptr = &pFlag)
+                {
+                    Boolean retval = Delegates.wglIsEnabledGenlockI3D((IntPtr)hDC, (Boolean*)pFlag_ptr);
+                    pFlag = *pFlag_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglIsEnabledGenlockI3D(IntPtr hDC, [Out] IntPtr pFlag)
+        {
+            unsafe
+            {
+                return Delegates.wglIsEnabledGenlockI3D((IntPtr)hDC, (Boolean*)pFlag);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGenlockSourceI3D(IntPtr hDC, UInt32 uSource)
+        {
+            return Delegates.wglGenlockSourceI3D((IntPtr)hDC, (UInt32)uSource);
+        }
+
+        public static 
+        Boolean wglGenlockSourceI3D(IntPtr hDC, Int32 uSource)
+        {
+            return Delegates.wglGenlockSourceI3D((IntPtr)hDC, (UInt32)uSource);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGenlockSourceI3D(IntPtr hDC, [Out] UInt32[] uSource)
+        {
+            unsafe
+            {
+                fixed (UInt32* uSource_ptr = uSource)
+                {
+                    return Delegates.wglGetGenlockSourceI3D((IntPtr)hDC, (UInt32*)uSource_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSourceI3D(IntPtr hDC, [Out] Int32[] uSource)
+        {
+            unsafe
+            {
+                fixed (Int32* uSource_ptr = uSource)
+                {
+                    return Delegates.wglGetGenlockSourceI3D((IntPtr)hDC, (UInt32*)uSource_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGenlockSourceI3D(IntPtr hDC, [Out] out UInt32 uSource)
+        {
+            unsafe
+            {
+                fixed (UInt32* uSource_ptr = &uSource)
+                {
+                    Boolean retval = Delegates.wglGetGenlockSourceI3D((IntPtr)hDC, (UInt32*)uSource_ptr);
+                    uSource = *uSource_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSourceI3D(IntPtr hDC, [Out] out Int32 uSource)
+        {
+            unsafe
+            {
+                fixed (Int32* uSource_ptr = &uSource)
+                {
+                    Boolean retval = Delegates.wglGetGenlockSourceI3D((IntPtr)hDC, (UInt32*)uSource_ptr);
+                    uSource = *uSource_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSourceI3D(IntPtr hDC, [Out] IntPtr uSource)
+        {
+            unsafe
+            {
+                return Delegates.wglGetGenlockSourceI3D((IntPtr)hDC, (UInt32*)uSource);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGenlockSourceEdgeI3D(IntPtr hDC, UInt32 uEdge)
+        {
+            return Delegates.wglGenlockSourceEdgeI3D((IntPtr)hDC, (UInt32)uEdge);
+        }
+
+        public static 
+        Boolean wglGenlockSourceEdgeI3D(IntPtr hDC, Int32 uEdge)
+        {
+            return Delegates.wglGenlockSourceEdgeI3D((IntPtr)hDC, (UInt32)uEdge);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGenlockSourceEdgeI3D(IntPtr hDC, [Out] UInt32[] uEdge)
+        {
+            unsafe
+            {
+                fixed (UInt32* uEdge_ptr = uEdge)
+                {
+                    return Delegates.wglGetGenlockSourceEdgeI3D((IntPtr)hDC, (UInt32*)uEdge_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSourceEdgeI3D(IntPtr hDC, [Out] Int32[] uEdge)
+        {
+            unsafe
+            {
+                fixed (Int32* uEdge_ptr = uEdge)
+                {
+                    return Delegates.wglGetGenlockSourceEdgeI3D((IntPtr)hDC, (UInt32*)uEdge_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGenlockSourceEdgeI3D(IntPtr hDC, [Out] out UInt32 uEdge)
+        {
+            unsafe
+            {
+                fixed (UInt32* uEdge_ptr = &uEdge)
+                {
+                    Boolean retval = Delegates.wglGetGenlockSourceEdgeI3D((IntPtr)hDC, (UInt32*)uEdge_ptr);
+                    uEdge = *uEdge_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSourceEdgeI3D(IntPtr hDC, [Out] out Int32 uEdge)
+        {
+            unsafe
+            {
+                fixed (Int32* uEdge_ptr = &uEdge)
+                {
+                    Boolean retval = Delegates.wglGetGenlockSourceEdgeI3D((IntPtr)hDC, (UInt32*)uEdge_ptr);
+                    uEdge = *uEdge_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSourceEdgeI3D(IntPtr hDC, [Out] IntPtr uEdge)
+        {
+            unsafe
+            {
+                return Delegates.wglGetGenlockSourceEdgeI3D((IntPtr)hDC, (UInt32*)uEdge);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGenlockSampleRateI3D(IntPtr hDC, UInt32 uRate)
+        {
+            return Delegates.wglGenlockSampleRateI3D((IntPtr)hDC, (UInt32)uRate);
+        }
+
+        public static 
+        Boolean wglGenlockSampleRateI3D(IntPtr hDC, Int32 uRate)
+        {
+            return Delegates.wglGenlockSampleRateI3D((IntPtr)hDC, (UInt32)uRate);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGenlockSampleRateI3D(IntPtr hDC, [Out] UInt32[] uRate)
+        {
+            unsafe
+            {
+                fixed (UInt32* uRate_ptr = uRate)
+                {
+                    return Delegates.wglGetGenlockSampleRateI3D((IntPtr)hDC, (UInt32*)uRate_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSampleRateI3D(IntPtr hDC, [Out] Int32[] uRate)
+        {
+            unsafe
+            {
+                fixed (Int32* uRate_ptr = uRate)
+                {
+                    return Delegates.wglGetGenlockSampleRateI3D((IntPtr)hDC, (UInt32*)uRate_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGenlockSampleRateI3D(IntPtr hDC, [Out] out UInt32 uRate)
+        {
+            unsafe
+            {
+                fixed (UInt32* uRate_ptr = &uRate)
+                {
+                    Boolean retval = Delegates.wglGetGenlockSampleRateI3D((IntPtr)hDC, (UInt32*)uRate_ptr);
+                    uRate = *uRate_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSampleRateI3D(IntPtr hDC, [Out] out Int32 uRate)
+        {
+            unsafe
+            {
+                fixed (Int32* uRate_ptr = &uRate)
+                {
+                    Boolean retval = Delegates.wglGetGenlockSampleRateI3D((IntPtr)hDC, (UInt32*)uRate_ptr);
+                    uRate = *uRate_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSampleRateI3D(IntPtr hDC, [Out] IntPtr uRate)
+        {
+            unsafe
+            {
+                return Delegates.wglGetGenlockSampleRateI3D((IntPtr)hDC, (UInt32*)uRate);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGenlockSourceDelayI3D(IntPtr hDC, UInt32 uDelay)
+        {
+            return Delegates.wglGenlockSourceDelayI3D((IntPtr)hDC, (UInt32)uDelay);
+        }
+
+        public static 
+        Boolean wglGenlockSourceDelayI3D(IntPtr hDC, Int32 uDelay)
+        {
+            return Delegates.wglGenlockSourceDelayI3D((IntPtr)hDC, (UInt32)uDelay);
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGenlockSourceDelayI3D(IntPtr hDC, [Out] UInt32[] uDelay)
+        {
+            unsafe
+            {
+                fixed (UInt32* uDelay_ptr = uDelay)
+                {
+                    return Delegates.wglGetGenlockSourceDelayI3D((IntPtr)hDC, (UInt32*)uDelay_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSourceDelayI3D(IntPtr hDC, [Out] Int32[] uDelay)
+        {
+            unsafe
+            {
+                fixed (Int32* uDelay_ptr = uDelay)
+                {
+                    return Delegates.wglGetGenlockSourceDelayI3D((IntPtr)hDC, (UInt32*)uDelay_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetGenlockSourceDelayI3D(IntPtr hDC, [Out] out UInt32 uDelay)
+        {
+            unsafe
+            {
+                fixed (UInt32* uDelay_ptr = &uDelay)
+                {
+                    Boolean retval = Delegates.wglGetGenlockSourceDelayI3D((IntPtr)hDC, (UInt32*)uDelay_ptr);
+                    uDelay = *uDelay_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSourceDelayI3D(IntPtr hDC, [Out] out Int32 uDelay)
+        {
+            unsafe
+            {
+                fixed (Int32* uDelay_ptr = &uDelay)
+                {
+                    Boolean retval = Delegates.wglGetGenlockSourceDelayI3D((IntPtr)hDC, (UInt32*)uDelay_ptr);
+                    uDelay = *uDelay_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetGenlockSourceDelayI3D(IntPtr hDC, [Out] IntPtr uDelay)
+        {
+            unsafe
+            {
+                return Delegates.wglGetGenlockSourceDelayI3D((IntPtr)hDC, (UInt32*)uDelay);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglQueryGenlockMaxSourceDelayI3D(IntPtr hDC, [Out] UInt32[] uMaxLineDelay, [Out] UInt32[] uMaxPixelDelay)
+        {
+            unsafe
+            {
+                fixed (UInt32* uMaxLineDelay_ptr = uMaxLineDelay)
+                fixed (UInt32* uMaxPixelDelay_ptr = uMaxPixelDelay)
+                {
+                    return Delegates.wglQueryGenlockMaxSourceDelayI3D((IntPtr)hDC, (UInt32*)uMaxLineDelay_ptr, (UInt32*)uMaxPixelDelay_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglQueryGenlockMaxSourceDelayI3D(IntPtr hDC, [Out] Int32[] uMaxLineDelay, [Out] Int32[] uMaxPixelDelay)
+        {
+            unsafe
+            {
+                fixed (Int32* uMaxLineDelay_ptr = uMaxLineDelay)
+                fixed (Int32* uMaxPixelDelay_ptr = uMaxPixelDelay)
+                {
+                    return Delegates.wglQueryGenlockMaxSourceDelayI3D((IntPtr)hDC, (UInt32*)uMaxLineDelay_ptr, (UInt32*)uMaxPixelDelay_ptr);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglQueryGenlockMaxSourceDelayI3D(IntPtr hDC, [Out] out UInt32 uMaxLineDelay, [Out] out UInt32 uMaxPixelDelay)
+        {
+            unsafe
+            {
+                fixed (UInt32* uMaxLineDelay_ptr = &uMaxLineDelay)
+                fixed (UInt32* uMaxPixelDelay_ptr = &uMaxPixelDelay)
+                {
+                    Boolean retval = Delegates.wglQueryGenlockMaxSourceDelayI3D((IntPtr)hDC, (UInt32*)uMaxLineDelay_ptr, (UInt32*)uMaxPixelDelay_ptr);
+                    uMaxLineDelay = *uMaxLineDelay_ptr;
+                    uMaxPixelDelay = *uMaxPixelDelay_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglQueryGenlockMaxSourceDelayI3D(IntPtr hDC, [Out] out Int32 uMaxLineDelay, [Out] out Int32 uMaxPixelDelay)
+        {
+            unsafe
+            {
+                fixed (Int32* uMaxLineDelay_ptr = &uMaxLineDelay)
+                fixed (Int32* uMaxPixelDelay_ptr = &uMaxPixelDelay)
+                {
+                    Boolean retval = Delegates.wglQueryGenlockMaxSourceDelayI3D((IntPtr)hDC, (UInt32*)uMaxLineDelay_ptr, (UInt32*)uMaxPixelDelay_ptr);
+                    uMaxLineDelay = *uMaxLineDelay_ptr;
+                    uMaxPixelDelay = *uMaxPixelDelay_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        public static 
+        Boolean wglQueryGenlockMaxSourceDelayI3D(IntPtr hDC, [Out] IntPtr uMaxLineDelay, [Out] IntPtr uMaxPixelDelay)
+        {
+            unsafe
+            {
+                return Delegates.wglQueryGenlockMaxSourceDelayI3D((IntPtr)hDC, (UInt32*)uMaxLineDelay, (UInt32*)uMaxPixelDelay);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        IntPtr wglCreateImageBufferI3D(IntPtr hDC, Int32 dwSize, UInt32 uFlags)
+        {
+            return Delegates.wglCreateImageBufferI3D((IntPtr)hDC, (Int32)dwSize, (UInt32)uFlags);
+        }
+
+        public static 
+        IntPtr wglCreateImageBufferI3D(IntPtr hDC, Int32 dwSize, Int32 uFlags)
+        {
+            return Delegates.wglCreateImageBufferI3D((IntPtr)hDC, (Int32)dwSize, (UInt32)uFlags);
+        }
+
+        public static 
+        Boolean wglDestroyImageBufferI3D(IntPtr hDC, IntPtr pAddress)
+        {
+            unsafe
+            {
+                return Delegates.wglDestroyImageBufferI3D((IntPtr)hDC, (IntPtr)pAddress);
+            }
+        }
+
+        public static 
+        Boolean wglDestroyImageBufferI3D(IntPtr hDC, [In, Out] object pAddress)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    return Delegates.wglDestroyImageBufferI3D((IntPtr)hDC, (IntPtr)pAddress_ptr.AddrOfPinnedObject());
+                }
+                finally
+                {
+                    pAddress_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr[] pEvent, IntPtr pAddress, Int32[] pSize, UInt32 count)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pEvent_ptr = pEvent)
+                fixed (Int32* pSize_ptr = pSize)
+                {
+                    return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent_ptr, (IntPtr)pAddress, (Int32*)pSize_ptr, (UInt32)count);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr[] pEvent, IntPtr pAddress, Int32[] pSize, Int32 count)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pEvent_ptr = pEvent)
+                fixed (Int32* pSize_ptr = pSize)
+                {
+                    return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent_ptr, (IntPtr)pAddress, (Int32*)pSize_ptr, (UInt32)count);
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr[] pEvent, [In, Out] object pAddress, Int32[] pSize, UInt32 count)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pEvent_ptr = pEvent)
+                fixed (Int32* pSize_ptr = pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent_ptr, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr[] pEvent, [In, Out] object pAddress, Int32[] pSize, Int32 count)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pEvent_ptr = pEvent)
+                fixed (Int32* pSize_ptr = pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent_ptr, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr[] pEvent, [In, Out] object pAddress, ref Int32 pSize, UInt32 count)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pEvent_ptr = pEvent)
+                fixed (Int32* pSize_ptr = &pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent_ptr, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr[] pEvent, [In, Out] object pAddress, ref Int32 pSize, Int32 count)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pEvent_ptr = pEvent)
+                fixed (Int32* pSize_ptr = &pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent_ptr, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, ref IntPtr pEvent, [In, Out] object pAddress, Int32[] pSize, UInt32 count)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pEvent_ptr = &pEvent)
+                fixed (Int32* pSize_ptr = pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent_ptr, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, ref IntPtr pEvent, [In, Out] object pAddress, Int32[] pSize, Int32 count)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pEvent_ptr = &pEvent)
+                fixed (Int32* pSize_ptr = pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent_ptr, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, ref IntPtr pEvent, [In, Out] object pAddress, ref Int32 pSize, UInt32 count)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pEvent_ptr = &pEvent)
+                fixed (Int32* pSize_ptr = &pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent_ptr, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, ref IntPtr pEvent, [In, Out] object pAddress, ref Int32 pSize, Int32 count)
+        {
+            unsafe
+            {
+                fixed (IntPtr* pEvent_ptr = &pEvent)
+                fixed (Int32* pSize_ptr = &pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent_ptr, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr pEvent, [In, Out] object pAddress, IntPtr pSize, UInt32 count)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize, (UInt32)count);
+                }
+                finally
+                {
+                    pAddress_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr pEvent, [In, Out] object pAddress, IntPtr pSize, Int32 count)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize, (UInt32)count);
+                }
+                finally
+                {
+                    pAddress_ptr.Free();
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr pEvent, [In, Out] object pAddress, Int32[] pSize, UInt32 count)
+        {
+            unsafe
+            {
+                fixed (Int32* pSize_ptr = pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr pEvent, [In, Out] object pAddress, Int32[] pSize, Int32 count)
+        {
+            unsafe
+            {
+                fixed (Int32* pSize_ptr = pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr pEvent, [In, Out] object pAddress, ref Int32 pSize, UInt32 count)
+        {
+            unsafe
+            {
+                fixed (Int32* pSize_ptr = &pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglAssociateImageBufferEventsI3D(IntPtr hDC, IntPtr pEvent, [In, Out] object pAddress, ref Int32 pSize, Int32 count)
+        {
+            unsafe
+            {
+                fixed (Int32* pSize_ptr = &pSize)
+                {
+                    System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                    try
+                    {
+                        return Delegates.wglAssociateImageBufferEventsI3D((IntPtr)hDC, (IntPtr*)pEvent, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (Int32*)pSize_ptr, (UInt32)count);
+                    }
+                    finally
+                    {
+                        pAddress_ptr.Free();
+                    }
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglReleaseImageBufferEventsI3D(IntPtr hDC, IntPtr pAddress, UInt32 count)
+        {
+            unsafe
+            {
+                return Delegates.wglReleaseImageBufferEventsI3D((IntPtr)hDC, (IntPtr)pAddress, (UInt32)count);
+            }
+        }
+
+        public static 
+        Boolean wglReleaseImageBufferEventsI3D(IntPtr hDC, IntPtr pAddress, Int32 count)
+        {
+            unsafe
+            {
+                return Delegates.wglReleaseImageBufferEventsI3D((IntPtr)hDC, (IntPtr)pAddress, (UInt32)count);
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglReleaseImageBufferEventsI3D(IntPtr hDC, [In, Out] object pAddress, UInt32 count)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    return Delegates.wglReleaseImageBufferEventsI3D((IntPtr)hDC, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (UInt32)count);
+                }
+                finally
+                {
+                    pAddress_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        Boolean wglReleaseImageBufferEventsI3D(IntPtr hDC, [In, Out] object pAddress, Int32 count)
+        {
+            unsafe
+            {
+                System.Runtime.InteropServices.GCHandle pAddress_ptr = System.Runtime.InteropServices.GCHandle.Alloc(pAddress, System.Runtime.InteropServices.GCHandleType.Pinned);
+                try
+                {
+                    return Delegates.wglReleaseImageBufferEventsI3D((IntPtr)hDC, (IntPtr)pAddress_ptr.AddrOfPinnedObject(), (UInt32)count);
+                }
+                finally
+                {
+                    pAddress_ptr.Free();
+                }
+            }
+        }
+
+        public static 
+        Boolean wglEnableFrameLockI3D()
+        {
+            return Delegates.wglEnableFrameLockI3D();
+        }
+
+        public static 
+        Boolean wglDisableFrameLockI3D()
+        {
+            return Delegates.wglDisableFrameLockI3D();
+        }
+
+        public static 
+        Boolean wglIsEnabledFrameLockI3D([Out] Boolean[] pFlag)
+        {
+            unsafe
+            {
+                fixed (Boolean* pFlag_ptr = pFlag)
+                {
+                    return Delegates.wglIsEnabledFrameLockI3D((Boolean*)pFlag_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglIsEnabledFrameLockI3D([Out] out Boolean pFlag)
+        {
+            unsafe
+            {
+                fixed (Boolean* pFlag_ptr = &pFlag)
+                {
+                    Boolean retval = Delegates.wglIsEnabledFrameLockI3D((Boolean*)pFlag_ptr);
+                    pFlag = *pFlag_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglIsEnabledFrameLockI3D([Out] IntPtr pFlag)
+        {
+            unsafe
+            {
+                return Delegates.wglIsEnabledFrameLockI3D((Boolean*)pFlag);
+            }
+        }
+
+        public static 
+        Boolean wglQueryFrameLockMasterI3D([Out] Boolean[] pFlag)
+        {
+            unsafe
+            {
+                fixed (Boolean* pFlag_ptr = pFlag)
+                {
+                    return Delegates.wglQueryFrameLockMasterI3D((Boolean*)pFlag_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglQueryFrameLockMasterI3D([Out] out Boolean pFlag)
+        {
+            unsafe
+            {
+                fixed (Boolean* pFlag_ptr = &pFlag)
+                {
+                    Boolean retval = Delegates.wglQueryFrameLockMasterI3D((Boolean*)pFlag_ptr);
+                    pFlag = *pFlag_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglQueryFrameLockMasterI3D([Out] IntPtr pFlag)
+        {
+            unsafe
+            {
+                return Delegates.wglQueryFrameLockMasterI3D((Boolean*)pFlag);
+            }
+        }
+
+        public static 
+        Boolean wglGetFrameUsageI3D([Out] float[] pUsage)
+        {
+            unsafe
+            {
+                fixed (float* pUsage_ptr = pUsage)
+                {
+                    return Delegates.wglGetFrameUsageI3D((float*)pUsage_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglGetFrameUsageI3D([Out] out float pUsage)
+        {
+            unsafe
+            {
+                fixed (float* pUsage_ptr = &pUsage)
+                {
+                    Boolean retval = Delegates.wglGetFrameUsageI3D((float*)pUsage_ptr);
+                    pUsage = *pUsage_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglGetFrameUsageI3D([Out] IntPtr pUsage)
+        {
+            unsafe
+            {
+                return Delegates.wglGetFrameUsageI3D((float*)pUsage);
+            }
+        }
+
+        public static 
+        Boolean wglBeginFrameTrackingI3D()
+        {
+            return Delegates.wglBeginFrameTrackingI3D();
+        }
+
+        public static 
+        Boolean wglEndFrameTrackingI3D()
+        {
+            return Delegates.wglEndFrameTrackingI3D();
+        }
+
+        public static 
+        Boolean wglQueryFrameTrackingI3D([Out] Int32[] pFrameCount, [Out] Int32[] pMissedFrames, [Out] float[] pLastMissedUsage)
+        {
+            unsafe
+            {
+                fixed (Int32* pFrameCount_ptr = pFrameCount)
+                fixed (Int32* pMissedFrames_ptr = pMissedFrames)
+                fixed (float* pLastMissedUsage_ptr = pLastMissedUsage)
+                {
+                    return Delegates.wglQueryFrameTrackingI3D((Int32*)pFrameCount_ptr, (Int32*)pMissedFrames_ptr, (float*)pLastMissedUsage_ptr);
+                }
+            }
+        }
+
+        public static 
+        Boolean wglQueryFrameTrackingI3D([Out] out Int32 pFrameCount, [Out] out Int32 pMissedFrames, [Out] out float pLastMissedUsage)
+        {
+            unsafe
+            {
+                fixed (Int32* pFrameCount_ptr = &pFrameCount)
+                fixed (Int32* pMissedFrames_ptr = &pMissedFrames)
+                fixed (float* pLastMissedUsage_ptr = &pLastMissedUsage)
+                {
+                    Boolean retval = Delegates.wglQueryFrameTrackingI3D((Int32*)pFrameCount_ptr, (Int32*)pMissedFrames_ptr, (float*)pLastMissedUsage_ptr);
+                    pFrameCount = *pFrameCount_ptr;
+                    pMissedFrames = *pMissedFrames_ptr;
+                    pLastMissedUsage = *pLastMissedUsage_ptr;
+                    return retval;
+                }
+            }
+        }
+
+        [System.CLSCompliant(false)]
+        public static 
+        Boolean wglQueryFrameTrackingI3D([Out] IntPtr pFrameCount, [Out] IntPtr pMissedFrames, [Out] IntPtr pLastMissedUsage)
+        {
+            unsafe
+            {
+                return Delegates.wglQueryFrameTrackingI3D((Int32*)pFrameCount, (Int32*)pMissedFrames, (float*)pLastMissedUsage);
+            }
+        }
+
+    }
+}
diff --git a/src/Tao.Platform.Windows/WglCore.cs b/src/Tao.Platform.Windows/WglCore.cs
new file mode 100644
index 0000000..5224bbd
--- /dev/null
+++ b/src/Tao.Platform.Windows/WglCore.cs
@@ -0,0 +1,86 @@
+namespace Tao.Platform.Windows
+{
+    using System;
+    using System.Runtime.InteropServices;
+
+    partial class Wgl
+    {
+
+        internal static partial class Imports
+        {
+
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglCreateContext", ExactSpelling = true)]
+            internal extern static IntPtr CreateContext(IntPtr hDc);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglDeleteContext", ExactSpelling = true)]
+            internal extern static Boolean DeleteContext(IntPtr oldContext);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglGetCurrentContext", ExactSpelling = true)]
+            internal extern static IntPtr GetCurrentContext();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglMakeCurrent", ExactSpelling = true)]
+            internal extern static Boolean MakeCurrent(IntPtr hDc, IntPtr newContext);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglCopyContext", ExactSpelling = true)]
+            internal extern static Boolean CopyContext(IntPtr hglrcSrc, IntPtr hglrcDst, UInt32 mask);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglChoosePixelFormat", ExactSpelling = true)]
+            internal extern static unsafe int ChoosePixelFormat(IntPtr hDc, Gdi.PIXELFORMATDESCRIPTOR* pPfd);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglDescribePixelFormat", ExactSpelling = true)]
+            internal extern static unsafe int DescribePixelFormat(IntPtr hdc, int ipfd, UInt32 cjpfd, Gdi.PIXELFORMATDESCRIPTOR* ppfd);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglGetCurrentDC", ExactSpelling = true)]
+            internal extern static IntPtr GetCurrentDC();
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglGetDefaultProcAddress", ExactSpelling = true)]
+            internal extern static IntPtr GetDefaultProcAddress(String lpszProc);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglGetProcAddress", ExactSpelling = true)]
+            internal extern static IntPtr GetProcAddress(String lpszProc);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglGetPixelFormat", ExactSpelling = true)]
+            internal extern static int GetPixelFormat(IntPtr hdc);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglSetPixelFormat", ExactSpelling = true)]
+            internal extern static unsafe Boolean SetPixelFormat(IntPtr hdc, int ipfd, Gdi.PIXELFORMATDESCRIPTOR* ppfd);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglSwapBuffers", ExactSpelling = true)]
+            internal extern static Boolean SwapBuffers(IntPtr hdc);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglShareLists", ExactSpelling = true)]
+            internal extern static Boolean ShareLists(IntPtr hrcSrvShare, IntPtr hrcSrvSource);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglCreateLayerContext", ExactSpelling = true)]
+            internal extern static IntPtr CreateLayerContext(IntPtr hDc, int level);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglDescribeLayerPlane", ExactSpelling = true)]
+            internal extern static unsafe Boolean DescribeLayerPlane(IntPtr hDc, int pixelFormat, int layerPlane, UInt32 nBytes, Gdi.LAYERPLANEDESCRIPTOR* plpd);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglSetLayerPaletteEntries", ExactSpelling = true)]
+            internal extern static unsafe int SetLayerPaletteEntries(IntPtr hdc, int iLayerPlane, int iStart, int cEntries, Int32* pcr);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglGetLayerPaletteEntries", ExactSpelling = true)]
+            internal extern static unsafe int GetLayerPaletteEntries(IntPtr hdc, int iLayerPlane, int iStart, int cEntries, Int32* pcr);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglRealizeLayerPalette", ExactSpelling = true)]
+            internal extern static Boolean RealizeLayerPalette(IntPtr hdc, int iLayerPlane, Boolean bRealize);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglSwapLayerBuffers", ExactSpelling = true)]
+            internal extern static Boolean SwapLayerBuffers(IntPtr hdc, UInt32 fuFlags);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglUseFontBitmapsA", CharSet = CharSet.Auto)]
+            internal extern static Boolean UseFontBitmapsA(IntPtr hDC, Int32 first, Int32 count, Int32 listBase);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglUseFontBitmapsW", CharSet = CharSet.Auto)]
+            internal extern static Boolean UseFontBitmapsW(IntPtr hDC, Int32 first, Int32 count, Int32 listBase);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglUseFontOutlinesA", CharSet = CharSet.Auto)]
+            internal extern static unsafe Boolean UseFontOutlinesA(IntPtr hDC, Int32 first, Int32 count, Int32 listBase, float thickness, float deviation, Int32 fontMode, Gdi.GLYPHMETRICSFLOAT* glyphMetrics);
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            [System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglUseFontOutlinesW", CharSet = CharSet.Auto)]
+            internal extern static unsafe Boolean UseFontOutlinesW(IntPtr hDC, Int32 first, Int32 count, Int32 listBase, float thickness, float deviation, Int32 fontMode, Gdi.GLYPHMETRICSFLOAT* glyphMetrics);
+        }
+    }
+}
diff --git a/src/Tao.Platform.Windows/WglDelegates.cs b/src/Tao.Platform.Windows/WglDelegates.cs
new file mode 100644
index 0000000..40704ca
--- /dev/null
+++ b/src/Tao.Platform.Windows/WglDelegates.cs
@@ -0,0 +1,308 @@
+namespace Tao.Platform.Windows
+{
+    using System;
+    using System.Runtime.InteropServices;
+    #pragma warning disable 0649
+
+    partial class Wgl
+    {
+        internal static partial class Delegates
+        {
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr CreateContext(IntPtr hDc);
+            internal static CreateContext wglCreateContext;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean DeleteContext(IntPtr oldContext);
+            internal static DeleteContext wglDeleteContext;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetCurrentContext();
+            internal static GetCurrentContext wglGetCurrentContext;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean MakeCurrent(IntPtr hDc, IntPtr newContext);
+            internal static MakeCurrent wglMakeCurrent;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean CopyContext(IntPtr hglrcSrc, IntPtr hglrcDst, UInt32 mask);
+            internal static CopyContext wglCopyContext;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate int ChoosePixelFormat(IntPtr hDc, Gdi.PIXELFORMATDESCRIPTOR* pPfd);
+            internal unsafe static ChoosePixelFormat wglChoosePixelFormat;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate int DescribePixelFormat(IntPtr hdc, int ipfd, UInt32 cjpfd, Gdi.PIXELFORMATDESCRIPTOR* ppfd);
+            internal unsafe static DescribePixelFormat wglDescribePixelFormat;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetCurrentDC();
+            internal static GetCurrentDC wglGetCurrentDC;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetDefaultProcAddress(String lpszProc);
+            internal static GetDefaultProcAddress wglGetDefaultProcAddress;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetProcAddress(String lpszProc);
+            internal static GetProcAddress wglGetProcAddress;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate int GetPixelFormat(IntPtr hdc);
+            internal static GetPixelFormat wglGetPixelFormat;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean SetPixelFormat(IntPtr hdc, int ipfd, Gdi.PIXELFORMATDESCRIPTOR* ppfd);
+            internal unsafe static SetPixelFormat wglSetPixelFormat;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean SwapBuffers(IntPtr hdc);
+            internal static SwapBuffers wglSwapBuffers;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean ShareLists(IntPtr hrcSrvShare, IntPtr hrcSrvSource);
+            internal static ShareLists wglShareLists;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr CreateLayerContext(IntPtr hDc, int level);
+            internal static CreateLayerContext wglCreateLayerContext;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean DescribeLayerPlane(IntPtr hDc, int pixelFormat, int layerPlane, UInt32 nBytes, Gdi.LAYERPLANEDESCRIPTOR* plpd);
+            internal unsafe static DescribeLayerPlane wglDescribeLayerPlane;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate int SetLayerPaletteEntries(IntPtr hdc, int iLayerPlane, int iStart, int cEntries, Int32* pcr);
+            internal unsafe static SetLayerPaletteEntries wglSetLayerPaletteEntries;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate int GetLayerPaletteEntries(IntPtr hdc, int iLayerPlane, int iStart, int cEntries, Int32* pcr);
+            internal unsafe static GetLayerPaletteEntries wglGetLayerPaletteEntries;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean RealizeLayerPalette(IntPtr hdc, int iLayerPlane, Boolean bRealize);
+            internal static RealizeLayerPalette wglRealizeLayerPalette;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean SwapLayerBuffers(IntPtr hdc, UInt32 fuFlags);
+            internal static SwapLayerBuffers wglSwapLayerBuffers;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean UseFontBitmapsA(IntPtr hDC, Int32 first, Int32 count, Int32 listBase);
+            internal static UseFontBitmapsA wglUseFontBitmapsA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean UseFontBitmapsW(IntPtr hDC, Int32 first, Int32 count, Int32 listBase);
+            internal static UseFontBitmapsW wglUseFontBitmapsW;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean UseFontOutlinesA(IntPtr hDC, Int32 first, Int32 count, Int32 listBase, float thickness, float deviation, Int32 fontMode, Gdi.GLYPHMETRICSFLOAT* glyphMetrics);
+            internal unsafe static UseFontOutlinesA wglUseFontOutlinesA;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean UseFontOutlinesW(IntPtr hDC, Int32 first, Int32 count, Int32 listBase, float thickness, float deviation, Int32 fontMode, Gdi.GLYPHMETRICSFLOAT* glyphMetrics);
+            internal unsafe static UseFontOutlinesW wglUseFontOutlinesW;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr CreateBufferRegionARB(IntPtr hDC, int iLayerPlane, UInt32 uType);
+            internal static CreateBufferRegionARB wglCreateBufferRegionARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DeleteBufferRegionARB(IntPtr hRegion);
+            internal static DeleteBufferRegionARB wglDeleteBufferRegionARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean SaveBufferRegionARB(IntPtr hRegion, int x, int y, int width, int height);
+            internal static SaveBufferRegionARB wglSaveBufferRegionARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean RestoreBufferRegionARB(IntPtr hRegion, int x, int y, int width, int height, int xSrc, int ySrc);
+            internal static RestoreBufferRegionARB wglRestoreBufferRegionARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetExtensionsStringARB(IntPtr hdc);
+            internal static GetExtensionsStringARB wglGetExtensionsStringARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetPixelFormatAttribivARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, int* piAttributes, [Out] int* piValues);
+            internal unsafe static GetPixelFormatAttribivARB wglGetPixelFormatAttribivARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetPixelFormatAttribfvARB(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, int* piAttributes, [Out] Single* pfValues);
+            internal unsafe static GetPixelFormatAttribfvARB wglGetPixelFormatAttribfvARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean ChoosePixelFormatARB(IntPtr hdc, int* piAttribIList, Single* pfAttribFList, UInt32 nMaxFormats, [Out] int* piFormats, [Out] UInt32* nNumFormats);
+            internal unsafe static ChoosePixelFormatARB wglChoosePixelFormatARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean MakeContextCurrentARB(IntPtr hDrawDC, IntPtr hReadDC, IntPtr hglrc);
+            internal static MakeContextCurrentARB wglMakeContextCurrentARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetCurrentReadDCARB();
+            internal static GetCurrentReadDCARB wglGetCurrentReadDCARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate IntPtr CreatePbufferARB(IntPtr hDC, int iPixelFormat, int iWidth, int iHeight, int* piAttribList);
+            internal unsafe static CreatePbufferARB wglCreatePbufferARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetPbufferDCARB(IntPtr hPbuffer);
+            internal static GetPbufferDCARB wglGetPbufferDCARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate int ReleasePbufferDCARB(IntPtr hPbuffer, IntPtr hDC);
+            internal static ReleasePbufferDCARB wglReleasePbufferDCARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean DestroyPbufferARB(IntPtr hPbuffer);
+            internal static DestroyPbufferARB wglDestroyPbufferARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean QueryPbufferARB(IntPtr hPbuffer, int iAttribute, [Out] int* piValue);
+            internal unsafe static QueryPbufferARB wglQueryPbufferARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean BindTexImageARB(IntPtr hPbuffer, int iBuffer);
+            internal static BindTexImageARB wglBindTexImageARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean ReleaseTexImageARB(IntPtr hPbuffer, int iBuffer);
+            internal static ReleaseTexImageARB wglReleaseTexImageARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean SetPbufferAttribARB(IntPtr hPbuffer, int* piAttribList);
+            internal unsafe static SetPbufferAttribARB wglSetPbufferAttribARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr CreateContextAttribsARB(IntPtr hDC, IntPtr shareHGLRC, int[] attribs);
+            internal static CreateContextAttribsARB wglCreateContextAttribsARB;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool CreateDisplayColorTableEXT(UInt16 id);
+            internal static CreateDisplayColorTableEXT wglCreateDisplayColorTableEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate bool LoadDisplayColorTableEXT(UInt16* table, UInt32 length);
+            internal unsafe static LoadDisplayColorTableEXT wglLoadDisplayColorTableEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate bool BindDisplayColorTableEXT(UInt16 id);
+            internal static BindDisplayColorTableEXT wglBindDisplayColorTableEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate void DestroyDisplayColorTableEXT(UInt16 id);
+            internal static DestroyDisplayColorTableEXT wglDestroyDisplayColorTableEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetExtensionsStringEXT();
+            internal static GetExtensionsStringEXT wglGetExtensionsStringEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean MakeContextCurrentEXT(IntPtr hDrawDC, IntPtr hReadDC, IntPtr hglrc);
+            internal static MakeContextCurrentEXT wglMakeContextCurrentEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetCurrentReadDCEXT();
+            internal static GetCurrentReadDCEXT wglGetCurrentReadDCEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate IntPtr CreatePbufferEXT(IntPtr hDC, int iPixelFormat, int iWidth, int iHeight, int* piAttribList);
+            internal unsafe static CreatePbufferEXT wglCreatePbufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate IntPtr GetPbufferDCEXT(IntPtr hPbuffer);
+            internal static GetPbufferDCEXT wglGetPbufferDCEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate int ReleasePbufferDCEXT(IntPtr hPbuffer, IntPtr hDC);
+            internal static ReleasePbufferDCEXT wglReleasePbufferDCEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean DestroyPbufferEXT(IntPtr hPbuffer);
+            internal static DestroyPbufferEXT wglDestroyPbufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean QueryPbufferEXT(IntPtr hPbuffer, int iAttribute, [Out] int* piValue);
+            internal unsafe static QueryPbufferEXT wglQueryPbufferEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetPixelFormatAttribivEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, [Out] int* piAttributes, [Out] int* piValues);
+            internal unsafe static GetPixelFormatAttribivEXT wglGetPixelFormatAttribivEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetPixelFormatAttribfvEXT(IntPtr hdc, int iPixelFormat, int iLayerPlane, UInt32 nAttributes, [Out] int* piAttributes, [Out] Single* pfValues);
+            internal unsafe static GetPixelFormatAttribfvEXT wglGetPixelFormatAttribfvEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean ChoosePixelFormatEXT(IntPtr hdc, int* piAttribIList, Single* pfAttribFList, UInt32 nMaxFormats, [Out] int* piFormats, [Out] UInt32* nNumFormats);
+            internal unsafe static ChoosePixelFormatEXT wglChoosePixelFormatEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean SwapIntervalEXT(int interval);
+            internal static SwapIntervalEXT wglSwapIntervalEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate int GetSwapIntervalEXT();
+            internal static GetSwapIntervalEXT wglGetSwapIntervalEXT;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate IntPtr AllocateMemoryNV(Int32 size, Single readfreq, Single writefreq, Single priority);
+            internal unsafe static AllocateMemoryNV wglAllocateMemoryNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate void FreeMemoryNV([Out] IntPtr* pointer);
+            internal unsafe static FreeMemoryNV wglFreeMemoryNV;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetSyncValuesOML(IntPtr hdc, [Out] Int64* ust, [Out] Int64* msc, [Out] Int64* sbc);
+            internal unsafe static GetSyncValuesOML wglGetSyncValuesOML;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetMscRateOML(IntPtr hdc, [Out] Int32* numerator, [Out] Int32* denominator);
+            internal unsafe static GetMscRateOML wglGetMscRateOML;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int64 SwapBuffersMscOML(IntPtr hdc, Int64 target_msc, Int64 divisor, Int64 remainder);
+            internal static SwapBuffersMscOML wglSwapBuffersMscOML;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Int64 SwapLayerBuffersMscOML(IntPtr hdc, int fuPlanes, Int64 target_msc, Int64 divisor, Int64 remainder);
+            internal static SwapLayerBuffersMscOML wglSwapLayerBuffersMscOML;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean WaitForMscOML(IntPtr hdc, Int64 target_msc, Int64 divisor, Int64 remainder, [Out] Int64* ust, [Out] Int64* msc, [Out] Int64* sbc);
+            internal unsafe static WaitForMscOML wglWaitForMscOML;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean WaitForSbcOML(IntPtr hdc, Int64 target_sbc, [Out] Int64* ust, [Out] Int64* msc, [Out] Int64* sbc);
+            internal unsafe static WaitForSbcOML wglWaitForSbcOML;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetDigitalVideoParametersI3D(IntPtr hDC, int iAttribute, [Out] int* piValue);
+            internal unsafe static GetDigitalVideoParametersI3D wglGetDigitalVideoParametersI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean SetDigitalVideoParametersI3D(IntPtr hDC, int iAttribute, int* piValue);
+            internal unsafe static SetDigitalVideoParametersI3D wglSetDigitalVideoParametersI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetGammaTableParametersI3D(IntPtr hDC, int iAttribute, [Out] int* piValue);
+            internal unsafe static GetGammaTableParametersI3D wglGetGammaTableParametersI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean SetGammaTableParametersI3D(IntPtr hDC, int iAttribute, int* piValue);
+            internal unsafe static SetGammaTableParametersI3D wglSetGammaTableParametersI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetGammaTableI3D(IntPtr hDC, int iEntries, [Out] UInt16* puRed, [Out] UInt16* puGreen, [Out] UInt16* puBlue);
+            internal unsafe static GetGammaTableI3D wglGetGammaTableI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean SetGammaTableI3D(IntPtr hDC, int iEntries, UInt16* puRed, UInt16* puGreen, UInt16* puBlue);
+            internal unsafe static SetGammaTableI3D wglSetGammaTableI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean EnableGenlockI3D(IntPtr hDC);
+            internal static EnableGenlockI3D wglEnableGenlockI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean DisableGenlockI3D(IntPtr hDC);
+            internal static DisableGenlockI3D wglDisableGenlockI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean IsEnabledGenlockI3D(IntPtr hDC, [Out] Boolean* pFlag);
+            internal unsafe static IsEnabledGenlockI3D wglIsEnabledGenlockI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean GenlockSourceI3D(IntPtr hDC, UInt32 uSource);
+            internal static GenlockSourceI3D wglGenlockSourceI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetGenlockSourceI3D(IntPtr hDC, [Out] UInt32* uSource);
+            internal unsafe static GetGenlockSourceI3D wglGetGenlockSourceI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean GenlockSourceEdgeI3D(IntPtr hDC, UInt32 uEdge);
+            internal static GenlockSourceEdgeI3D wglGenlockSourceEdgeI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetGenlockSourceEdgeI3D(IntPtr hDC, [Out] UInt32* uEdge);
+            internal unsafe static GetGenlockSourceEdgeI3D wglGetGenlockSourceEdgeI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean GenlockSampleRateI3D(IntPtr hDC, UInt32 uRate);
+            internal static GenlockSampleRateI3D wglGenlockSampleRateI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetGenlockSampleRateI3D(IntPtr hDC, [Out] UInt32* uRate);
+            internal unsafe static GetGenlockSampleRateI3D wglGetGenlockSampleRateI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean GenlockSourceDelayI3D(IntPtr hDC, UInt32 uDelay);
+            internal static GenlockSourceDelayI3D wglGenlockSourceDelayI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetGenlockSourceDelayI3D(IntPtr hDC, [Out] UInt32* uDelay);
+            internal unsafe static GetGenlockSourceDelayI3D wglGetGenlockSourceDelayI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean QueryGenlockMaxSourceDelayI3D(IntPtr hDC, [Out] UInt32* uMaxLineDelay, [Out] UInt32* uMaxPixelDelay);
+            internal unsafe static QueryGenlockMaxSourceDelayI3D wglQueryGenlockMaxSourceDelayI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate IntPtr CreateImageBufferI3D(IntPtr hDC, Int32 dwSize, UInt32 uFlags);
+            internal unsafe static CreateImageBufferI3D wglCreateImageBufferI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean DestroyImageBufferI3D(IntPtr hDC, IntPtr pAddress);
+            internal static DestroyImageBufferI3D wglDestroyImageBufferI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean AssociateImageBufferEventsI3D(IntPtr hDC, IntPtr* pEvent, IntPtr pAddress, Int32* pSize, UInt32 count);
+            internal unsafe static AssociateImageBufferEventsI3D wglAssociateImageBufferEventsI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean ReleaseImageBufferEventsI3D(IntPtr hDC, IntPtr pAddress, UInt32 count);
+            internal static ReleaseImageBufferEventsI3D wglReleaseImageBufferEventsI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean EnableFrameLockI3D();
+            internal static EnableFrameLockI3D wglEnableFrameLockI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean DisableFrameLockI3D();
+            internal static DisableFrameLockI3D wglDisableFrameLockI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean IsEnabledFrameLockI3D([Out] Boolean* pFlag);
+            internal unsafe static IsEnabledFrameLockI3D wglIsEnabledFrameLockI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean QueryFrameLockMasterI3D([Out] Boolean* pFlag);
+            internal unsafe static QueryFrameLockMasterI3D wglQueryFrameLockMasterI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean GetFrameUsageI3D([Out] float* pUsage);
+            internal unsafe static GetFrameUsageI3D wglGetFrameUsageI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean BeginFrameTrackingI3D();
+            internal static BeginFrameTrackingI3D wglBeginFrameTrackingI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal delegate Boolean EndFrameTrackingI3D();
+            internal static EndFrameTrackingI3D wglEndFrameTrackingI3D;
+            [System.Security.SuppressUnmanagedCodeSecurity()]
+            internal unsafe delegate Boolean QueryFrameTrackingI3D([Out] Int32* pFrameCount, [Out] Int32* pMissedFrames, [Out] float* pLastMissedUsage);
+            internal unsafe static QueryFrameTrackingI3D wglQueryFrameTrackingI3D;
+        }
+    }
+    #pragma warning restore 0649
+}
diff --git a/src/Tao.Platform.Windows/WglEnums.cs b/src/Tao.Platform.Windows/WglEnums.cs
new file mode 100644
index 0000000..c80b594
--- /dev/null
+++ b/src/Tao.Platform.Windows/WglEnums.cs
@@ -0,0 +1,211 @@
+namespace Tao.Platform.Windows
+{
+    public static partial class Wgl
+    {
+        // Manually added, GlBindGen seems to skip this one
+        public const int WGL_FONT_POLYGONS = ((int)1);
+
+        public const int WGL_SWAP_METHOD_EXT = ((int)0x2007);
+        public const int WGL_MIPMAP_TEXTURE_ARB = ((int)0x2074);
+        public const int WGL_NO_ACCELERATION_ARB = ((int)0x2025);
+        public const int WGL_SAMPLE_BUFFERS_EXT = ((int)0x2041);
+        public const int WGL_BIND_TO_TEXTURE_RGB_ARB = ((int)0x2070);
+        public const int WGL_AUX_BUFFERS_EXT = ((int)0x2024);
+        public const int WGL_AUX0_ARB = ((int)0x2087);
+        public const int WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D = ((int)0x204A);
+        public const int WGL_ACCUM_ALPHA_BITS_EXT = ((int)0x2021);
+        public const int WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV = ((int)0x20B1);
+        public const int WGL_IMAGE_BUFFER_LOCK_I3D = ((int)0x00000002);
+        public const int WGL_BLUE_SHIFT_EXT = ((int)0x201A);
+        public const int WGL_NEED_SYSTEM_PALETTE_EXT = ((int)0x2005);
+        public const int WGL_SHARE_ACCUM_EXT = ((int)0x200E);
+        public const int WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = ((int)0x207E);
+        public const int WGL_DRAW_TO_PBUFFER_ARB = ((int)0x202D);
+        public const int WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D = ((int)0x2053);
+        public const int WGL_TEXTURE_CUBE_MAP_ARB = ((int)0x2078);
+        public const int WGL_TYPE_RGBA_FLOAT_ARB = ((int)0x21A0);
+        public const int WGL_FULL_ACCELERATION_EXT = ((int)0x2027);
+        public const int WGL_ACCUM_GREEN_BITS_EXT = ((int)0x201F);
+        public const int WGL_BACK_COLOR_BUFFER_BIT_ARB = ((int)0x00000002);
+        public const int WGL_ACCUM_GREEN_BITS_ARB = ((int)0x201F);
+        public const int WGL_MAX_PBUFFER_WIDTH_EXT = ((int)0x202F);
+        public const int WGL_ACCUM_RED_BITS_EXT = ((int)0x201E);
+        public const int WGL_AUX9_ARB = ((int)0x2090);
+        public const int WGL_TRANSPARENT_EXT = ((int)0x200A);
+        public const int WGL_ACCUM_ALPHA_BITS_ARB = ((int)0x2021);
+        public const int WGL_GENERIC_ACCELERATION_EXT = ((int)0x2026);
+        public const int WGL_AUX2_ARB = ((int)0x2089);
+        public const int WGL_PIXEL_TYPE_EXT = ((int)0x2013);
+        public const int WGL_NUMBER_PIXEL_FORMATS_EXT = ((int)0x2000);
+        public const int WGL_ACCELERATION_ARB = ((int)0x2003);
+        public const int WGL_IMAGE_BUFFER_MIN_ACCESS_I3D = ((int)0x00000001);
+        public const int WGL_DOUBLE_BUFFER_EXT = ((int)0x2011);
+        public const int WGL_NEED_PALETTE_EXT = ((int)0x2004);
+        public const int WGL_TEXTURE_FLOAT_RG_NV = ((int)0x20B6);
+        public const int WGL_DEPTH_FLOAT_EXT = ((int)0x2040);
+        public const int WGL_BLUE_BITS_ARB = ((int)0x2019);
+        public const int WGL_ACCUM_BITS_EXT = ((int)0x201D);
+        public const int WGL_MAX_PBUFFER_WIDTH_ARB = ((int)0x202F);
+        public const int WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = ((int)0x2080);
+        public const int WGL_NUMBER_OVERLAYS_ARB = ((int)0x2008);
+        public const int WGL_TEXTURE_RGB_ARB = ((int)0x2075);
+        public const int WGL_SUPPORT_GDI_EXT = ((int)0x200F);
+        public const int WGL_PBUFFER_HEIGHT_EXT = ((int)0x2035);
+        public const int WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV = ((int)0x20A4);
+        public const int WGL_SAMPLE_BUFFERS_ARB = ((int)0x2041);
+        public const int WGL_TRANSPARENT_ALPHA_VALUE_ARB = ((int)0x203A);
+        public const int WGL_GREEN_SHIFT_ARB = ((int)0x2018);
+        public const int WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV = ((int)0x20A1);
+        public const int WGL_TYPE_COLORINDEX_EXT = ((int)0x202C);
+        public const int WGL_SHARE_STENCIL_ARB = ((int)0x200D);
+        public const int WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D = ((int)0x2048);
+        public const int WGL_SHARE_DEPTH_EXT = ((int)0x200C);
+        public const int WGL_NO_ACCELERATION_EXT = ((int)0x2025);
+        public const int WGL_BLUE_SHIFT_ARB = ((int)0x201A);
+        public const int WGL_SUPPORT_GDI_ARB = ((int)0x200F);
+        public const int WGL_NO_TEXTURE_ARB = ((int)0x2077);
+        public const int WGL_TEXTURE_FLOAT_RGBA_NV = ((int)0x20B8);
+        public const int WGL_DEPTH_TEXTURE_FORMAT_NV = ((int)0x20A5);
+        public const int WGL_TRANSPARENT_BLUE_VALUE_ARB = ((int)0x2039);
+        public const int WGL_DEPTH_BUFFER_BIT_ARB = ((int)0x00000004);
+        public const int WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = ((int)0x2082);
+        public const int WGL_SWAP_EXCHANGE_ARB = ((int)0x2028);
+        public const int WGL_TRANSPARENT_RED_VALUE_ARB = ((int)0x2037);
+        public const int WGL_SWAP_COPY_ARB = ((int)0x2029);
+        public const int WGL_GREEN_SHIFT_EXT = ((int)0x2018);
+        public const int WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = ((int)0x2081);
+        public const int WGL_TYPE_RGBA_EXT = ((int)0x202B);
+        public const int WGL_TYPE_RGBA_FLOAT_ATI = ((int)0x21A0);
+        public const int WGL_NUMBER_PIXEL_FORMATS_ARB = ((int)0x2000);
+        public const int WGL_TEXTURE_RGBA_ARB = ((int)0x2076);
+        public const int WGL_SWAP_COPY_EXT = ((int)0x2029);
+        public const int WGL_NEED_SYSTEM_PALETTE_ARB = ((int)0x2005);
+        public const int WGL_TEXTURE_FLOAT_RGB_NV = ((int)0x20B7);
+        public const int WGL_SWAP_UNDEFINED_ARB = ((int)0x202A);
+        public const int WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D = ((int)0x2049);
+        public const int WGL_GENLOCK_SOURCE_EDGE_RISING_I3D = ((int)0x204B);
+        public const int WGL_SWAP_LAYER_BUFFERS_EXT = ((int)0x2006);
+        public const int WGL_SWAP_UNDEFINED_EXT = ((int)0x202A);
+        public const int WGL_FULL_ACCELERATION_ARB = ((int)0x2027);
+        public const int WGL_NUMBER_UNDERLAYS_ARB = ((int)0x2009);
+        public const int WGL_BIND_TO_TEXTURE_RGBA_ARB = ((int)0x2071);
+        public const int WGL_TRANSPARENT_GREEN_VALUE_ARB = ((int)0x2038);
+        public const int WGL_PIXEL_TYPE_ARB = ((int)0x2013);
+        public const int WGL_NEED_PALETTE_ARB = ((int)0x2004);
+        public const int WGL_NUMBER_OVERLAYS_EXT = ((int)0x2008);
+        public const int WGL_DEPTH_BITS_EXT = ((int)0x2022);
+        public const int WGL_AUX3_ARB = ((int)0x208A);
+        public const int WGL_DEPTH_BITS_ARB = ((int)0x2022);
+        public const int WGL_GENERIC_ACCELERATION_ARB = ((int)0x2026);
+        public const int WGL_TYPE_RGBA_ARB = ((int)0x202B);
+        public const int WGL_DRAW_TO_WINDOW_EXT = ((int)0x2001);
+        public const int WGL_TEXTURE_2D_ARB = ((int)0x207A);
+        public const int WGL_STENCIL_BUFFER_BIT_ARB = ((int)0x00000008);
+        public const int WGL_SWAP_EXCHANGE_EXT = ((int)0x2028);
+        public const int WGL_SHARE_STENCIL_EXT = ((int)0x200D);
+        public const int WGL_STEREO_ARB = ((int)0x2012);
+        public const int WGL_SHARE_ACCUM_ARB = ((int)0x200E);
+        public const int WGL_TEXTURE_RECTANGLE_NV = ((int)0x20A2);
+        public const int WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV = ((int)0x20B3);
+        public const int WGL_STENCIL_BITS_EXT = ((int)0x2023);
+        public const int WGL_MIPMAP_LEVEL_ARB = ((int)0x207B);
+        public const int WGL_DRAW_TO_WINDOW_ARB = ((int)0x2001);
+        public const int WGL_AUX5_ARB = ((int)0x208C);
+        public const int WGL_DEPTH_COMPONENT_NV = ((int)0x20A7);
+        public const int WGL_AUX1_ARB = ((int)0x2088);
+        public const int WGL_TEXTURE_DEPTH_COMPONENT_NV = ((int)0x20A6);
+        public const int WGL_FRONT_LEFT_ARB = ((int)0x2083);
+        public const int WGL_MAX_PBUFFER_HEIGHT_EXT = ((int)0x2030);
+        public const int WGL_RED_BITS_EXT = ((int)0x2015);
+        public const int WGL_GENLOCK_SOURCE_EXTENAL_TTL_I3D = ((int)0x2047);
+        public const int WGL_RED_SHIFT_ARB = ((int)0x2016);
+        public const int WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = ((int)0x207F);
+        public const int WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D = ((int)0x2051);
+        public const int WGL_TRANSPARENT_INDEX_VALUE_ARB = ((int)0x203B);
+        public const int WGL_ALPHA_BITS_EXT = ((int)0x201B);
+        public const int WGL_TRANSPARENT_VALUE_EXT = ((int)0x200B);
+        public const int WGL_BIND_TO_TEXTURE_DEPTH_NV = ((int)0x20A3);
+        public const int WGL_TEXTURE_1D_ARB = ((int)0x2079);
+        public const int WGL_MAX_PBUFFER_PIXELS_ARB = ((int)0x202E);
+        public const int WGL_SUPPORT_OPENGL_ARB = ((int)0x2010);
+        public const int WGL_TEXTURE_TARGET_ARB = ((int)0x2073);
+        public const int WGL_SAMPLE_BUFFERS_3DFX = ((int)0x2060);
+        public const int WGL_TEXTURE_FLOAT_R_NV = ((int)0x20B5);
+        public const int WGL_COLOR_BITS_EXT = ((int)0x2014);
+        public const int WGL_BACK_RIGHT_ARB = ((int)0x2086);
+        public const int WGL_PBUFFER_HEIGHT_ARB = ((int)0x2035);
+        public const int WGL_ACCUM_BLUE_BITS_ARB = ((int)0x2020);
+        public const int WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = ((int)0x207D);
+        public const int WGL_GENLOCK_SOURCE_EXTENAL_SYNC_I3D = ((int)0x2045);
+        public const int WGL_SWAP_METHOD_ARB = ((int)0x2007);
+        public const int WGL_AUX8_ARB = ((int)0x208F);
+        public const int WGL_TYPE_COLORINDEX_ARB = ((int)0x202C);
+        public const int WGL_DRAW_TO_PBUFFER_EXT = ((int)0x202D);
+        public const int WGL_CUBE_MAP_FACE_ARB = ((int)0x207C);
+        public const int WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D = ((int)0x204C);
+        public const int WGL_SAMPLES_3DFX = ((int)0x2061);
+        public const int WGL_MAX_PBUFFER_PIXELS_EXT = ((int)0x202E);
+        public const int WGL_DOUBLE_BUFFER_ARB = ((int)0x2011);
+        public const int WGL_STEREO_EXT = ((int)0x2012);
+        public const int WGL_RED_SHIFT_EXT = ((int)0x2016);
+        public const int WGL_ALPHA_BITS_ARB = ((int)0x201B);
+        public const int WGL_COLOR_BITS_ARB = ((int)0x2014);
+        public const int WGL_GAMMA_TABLE_SIZE_I3D = ((int)0x204E);
+        public const int WGL_AUX_BUFFERS_ARB = ((int)0x2024);
+        public const int WGL_ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB = ((int)0x2054);
+        public const int WGL_FRONT_COLOR_BUFFER_BIT_ARB = ((int)0x00000001);
+        public const int WGL_SAMPLES_EXT = ((int)0x2042);
+        public const int WGL_ALPHA_SHIFT_EXT = ((int)0x201C);
+        public const int WGL_ACCELERATION_EXT = ((int)0x2003);
+        public const int WGL_AUX6_ARB = ((int)0x208D);
+        public const int WGL_FRONT_RIGHT_ARB = ((int)0x2084);
+        public const int WGL_PBUFFER_WIDTH_ARB = ((int)0x2034);
+        public const int WGL_PBUFFER_LARGEST_ARB = ((int)0x2033);
+        public const int WGL_NUMBER_UNDERLAYS_EXT = ((int)0x2009);
+        public const int WGL_ACCUM_BITS_ARB = ((int)0x201D);
+        public const int WGL_STENCIL_BITS_ARB = ((int)0x2023);
+        public const int WGL_ACCUM_BLUE_BITS_EXT = ((int)0x2020);
+        public const int WGL_MAX_PBUFFER_HEIGHT_ARB = ((int)0x2030);
+        public const int WGL_AUX4_ARB = ((int)0x208B);
+        public const int WGL_TEXTURE_FORMAT_ARB = ((int)0x2072);
+        public const int WGL_ACCUM_RED_BITS_ARB = ((int)0x201E);
+        public const int WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV = ((int)0x20B4);
+        public const int WGL_FLOAT_COMPONENTS_NV = ((int)0x20B0);
+        public const int WGL_TRANSPARENT_ARB = ((int)0x200A);
+        public const int WGL_RED_BITS_ARB = ((int)0x2015);
+        public const int WGL_GREEN_BITS_ARB = ((int)0x2017);
+        public const int WGL_GENLOCK_SOURCE_MULTIVIEW_I3D = ((int)0x2044);
+        public const int WGL_BLUE_BITS_EXT = ((int)0x2019);
+        public const int WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV = ((int)0x20B2);
+        public const int WGL_GREEN_BITS_EXT = ((int)0x2017);
+        public const int WGL_SHARE_DEPTH_ARB = ((int)0x200C);
+        public const int WGL_ALPHA_SHIFT_ARB = ((int)0x201C);
+        public const int WGL_PBUFFER_WIDTH_EXT = ((int)0x2034);
+        public const int WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV = ((int)0x20A0);
+        public const int WGL_SWAP_LAYER_BUFFERS_ARB = ((int)0x2006);
+        public const int WGL_ERROR_INVALID_PIXEL_TYPE_ARB = ((int)0x2043);
+        public const int WGL_AUX7_ARB = ((int)0x208E);
+        public const int WGL_PBUFFER_LOST_ARB = ((int)0x2036);
+        public const int WGL_ERROR_INVALID_PIXEL_TYPE_EXT = ((int)0x2043);
+        public const int WGL_SAMPLES_ARB = ((int)0x2042);
+        public const int WGL_GENLOCK_SOURCE_EXTENAL_FIELD_I3D = ((int)0x2046);
+        public const int WGL_GAMMA_EXCLUDE_DESKTOP_I3D = ((int)0x204F);
+        public const int WGL_FONT_LINES = ((int)0);
+        public const int WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D = ((int)0x2052);
+        public const int WGL_OPTIMAL_PBUFFER_HEIGHT_EXT = ((int)0x2032);
+        public const int WGL_PBUFFER_LARGEST_EXT = ((int)0x2033);
+        public const int WGL_DRAW_TO_BITMAP_EXT = ((int)0x2002);
+        public const int WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D = ((int)0x2050);
+        public const int WGL_OPTIMAL_PBUFFER_WIDTH_EXT = ((int)0x2031);
+        public const int WGL_DRAW_TO_BITMAP_ARB = ((int)0x2002);
+        public const int WGL_BACK_LEFT_ARB = ((int)0x2085);
+        public const int WGL_SUPPORT_OPENGL_EXT = ((int)0x2010);
+        public const int WGL_CONTEXT_DEBUG_BIT_ARB = ((int)0x0001);
+        public const int WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = ((int)0x0002);
+        public const int WGL_CONTEXT_MAJOR_VERSION_ARB = ((int)0x2091);
+        public const int WGL_CONTEXT_MINOR_VERSION_ARB = ((int)0x2092);
+        public const int WGL_CONTEXT_LAYER_PLANE_ARB = ((int)0x2093);
+        public const int WGL_CONTEXT_FLAGS_ARB = ((int)0x2094);
+        public const int ERROR_INVALID_VERSION_ARB = ((int)0x2095);
+    }
+}
diff --git a/src/Tao.Platform.Windows/WglHelper.cs b/src/Tao.Platform.Windows/WglHelper.cs
new file mode 100644
index 0000000..de01060
--- /dev/null
+++ b/src/Tao.Platform.Windows/WglHelper.cs
@@ -0,0 +1,287 @@
+#region License
+/*
+MIT License
+Copyright �2003-2007 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+#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;
+using System.IO;
+
+#endregion
+
+namespace Tao.Platform.Windows
+{
+    public static partial class Wgl
+    {
+        #region --- Fields ---
+
+        static StringBuilder sb = new StringBuilder();
+        static object gl_lock = new object();
+
+        internal const string Library = "opengl32.dll";
+
+        private static SortedList<string, bool> AvailableExtensions = new SortedList<string, bool>();
+        private static bool rebuildExtensionList;
+
+        private static Type glClass;
+        private static Type delegatesClass;
+        private static Type importsClass;
+        private static FieldInfo[] delegates;
+
+        #endregion
+
+        #region --- Static Constructor ---
+
+        static Wgl()
+        {
+            glClass = typeof(Wgl);
+            delegatesClass = glClass.GetNestedType("Delegates", BindingFlags.Static | BindingFlags.NonPublic);
+            importsClass = glClass.GetNestedType("Imports", BindingFlags.Static | BindingFlags.NonPublic);
+            // 'Touch' Imports class to force initialization. We don't want anything yet, just to have
+            // this class ready.
+            if (Imports.FunctionMap != null) { }
+            ReloadFunctions();
+        }
+
+        #endregion
+
+        #region --- Methods ---
+
+        #region internal static partial class Imports
+
+        /// <summary>
+        /// Contains DllImports for the core OpenGL functions.
+        /// </summary>
+        internal static partial class Imports
+        {
+            /// <summary>
+            ///  Build a string->MethodInfo map to speed up extension loading.
+            /// </summary>
+            internal static SortedList<string, MethodInfo> FunctionMap;  // This is faster than either Dictionary or SortedDictionary
+            static Imports()
+            {
+                MethodInfo[] methods = importsClass.GetMethods(BindingFlags.Static | BindingFlags.NonPublic);
+                FunctionMap = new SortedList<string, MethodInfo>(methods.Length);
+                foreach (MethodInfo m in methods)
+                    FunctionMap.Add(m.Name, m);
+            }
+        }
+
+        #endregion
+
+        #region public static Delegate GetDelegate(string name, Type signature)
+
+        /// <summary>
+        /// Creates a System.Delegate that can be used to call an OpenGL function, core or extension.
+        /// </summary>
+        /// <param name="name">The name of the OpenGL function (eg. "glNewList")</param>
+        /// <param name="signature">The signature of the OpenGL function.</param>
+        /// <returns>
+        /// 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.
+        /// </returns>
+        public static Delegate GetDelegate(string name, Type signature)
+        {
+            MethodInfo m;
+            Delegate r = GetExtensionDelegate(name, signature) ??
+                  (Imports.FunctionMap.TryGetValue((name.Substring(3)), out m) ?
+                   Delegate.CreateDelegate(signature, m) : null);
+
+            return r;
+        }
+
+        #endregion
+
+        #region public static void ReloadFunctions()
+
+        /// <summary>
+        /// Loads all OpenGL functions (core and extensions).
+        /// </summary>
+        /// <remarks>
+        /// <para>
+        /// This function will be automatically called the first time you use any opengl function. There is 
+        /// </para>
+        /// <para>
+        /// 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.
+        /// </para>
+        /// </remarks>
+        public static void ReloadFunctions()
+        {
+            // Using reflection is more than 3 times faster than directly loading delegates on the first
+            // run, probably due to code generation overhead. Subsequent runs are faster with direct loading
+            // than with reflection, but the first time is more significant.
+
+            if (delegates == null)
+                delegates = delegatesClass.GetFields(BindingFlags.Static | BindingFlags.NonPublic);
+
+            foreach (FieldInfo f in delegates)
+                f.SetValue(null, GetDelegate(f.Name, f.FieldType));
+
+            rebuildExtensionList = true;
+        }
+
+        static void set(object d, Delegate value)
+        {
+            d = value;
+        }
+
+        #endregion
+
+        #region public static bool ReloadFunction(string function)
+
+        /// <summary>
+        /// Tries to reload the given OpenGL function (core or extension).
+        /// </summary>
+        /// <param name="function">The name of the OpenGL function (i.e. glShaderSource)</param>
+        /// <returns>True if the function was found and reloaded, false otherwise.</returns>
+        /// <remarks>
+        /// <para>
+        /// Use this function if you require greater granularity when loading OpenGL entry points.
+        /// </para>
+        /// <para>
+        /// 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.
+        /// </para>
+        /// <para>
+        /// This function returns true if the given OpenGL function is supported, false otherwise.
+        /// </para>
+        /// <para>
+        /// To query for supported extensions use the IsExtensionSupported() function instead.
+        /// </para>
+        /// </remarks>
+        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 = GetDelegate(f.Name, f.FieldType);
+
+            if (@new == null) return false;
+
+            if (old == null || old.Target != @new.Target)
+            {
+                f.SetValue(null, @new);
+            }
+
+            return @new != null;
+        }
+
+        #endregion
+
+        #region internal static Delegate GetExtensionDelegate(string name, Type signature)
+
+        /// <summary>
+        /// Creates a System.Delegate that can be used to call a dynamically exported OpenGL function.
+        /// </summary>
+        /// <param name="name">The name of the OpenGL function (eg. "glNewList")</param>
+        /// <param name="signature">The signature of the OpenGL function.</param>
+        /// <returns>
+        /// 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.
+        /// </returns>
+        internal static Delegate GetExtensionDelegate(string name, Type signature)
+        {
+            IntPtr address = Imports.GetProcAddress(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
+
+        #region public static bool IsExtensionSupported(string name)
+
+        /// <summary>
+        /// Determines whether the specified OpenGL extension category is available in
+        /// the current OpenGL context. Equivalent to IsExtensionSupported(name, true)
+        /// </summary>
+        /// <param name="name">The string for the OpenGL extension category (eg. "GL_ARB_multitexture")</param>
+        /// <returns>True if the specified extension is available, false otherwise.</returns>
+        public static bool IsExtensionSupported(string name)
+        {
+            if (rebuildExtensionList)
+                BuildExtensionList();
+
+            lock (gl_lock)
+            {
+                sb.Remove(0, sb.Length);
+                if (!name.StartsWith("WGL_"))
+                    sb.Append("wgl_");
+                sb.Append(name.ToLower());
+
+                // Search the cache for the string.
+                return AvailableExtensions.ContainsKey(sb.ToString());
+            }
+        }
+
+        #endregion
+
+
+        #region BuildExtensionList
+        internal static void BuildExtensionList()
+        {
+            AvailableExtensions.Clear();
+
+            string extension_string = "";
+            try
+            {
+                extension_string = wglGetExtensionsStringARB(wglGetCurrentDC());
+            }
+            catch (NullReferenceException)
+            { }
+
+            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.ToLower(), true);
+        }
+        #endregion
+
+        #endregion
+    }
+}
diff --git a/src/Tao.Platform.Windows/WinNt.cs b/src/Tao.Platform.Windows/WinNt.cs
new file mode 100644
index 0000000..e5590cb
--- /dev/null
+++ b/src/Tao.Platform.Windows/WinNt.cs
@@ -0,0 +1,411 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.Platform.Windows {
+    #region Class Documentation
+    /// <summary>
+    ///     WinNT binding for .NET, implementing Windows NT-specific functionality.
+    /// </summary>
+    #endregion Class Documentation
+    public static class WinNt
+    {
+        // --- Fields ---
+        #region Public Constants
+        #region int PROCESSOR_INTEL_386
+        /// <summary>
+        ///     Intel i386 processor.
+        /// </summary>
+        // #define PROCESSOR_INTEL_386 386
+        public const int PROCESSOR_INTEL_386 = 386;
+        #endregion int PROCESSOR_INTEL_386
+
+        #region int PROCESSOR_INTEL_486
+        /// <summary>
+        ///     Intel i486 processor.
+        /// </summary>
+        // #define PROCESSOR_INTEL_486 486
+        public const int PROCESSOR_INTEL_486 = 486;
+        #endregion int PROCESSOR_INTEL_486
+
+        #region int PROCESSOR_INTEL_PENTIUM
+        /// <summary>
+        ///     Intel Pentium processor.
+        /// </summary>
+        // #define PROCESSOR_INTEL_PENTIUM 586
+        public const int PROCESSOR_INTEL_PENTIUM = 586;
+        #endregion int PROCESSOR_INTEL_PENTIUM
+
+        #region int PROCESSOR_INTEL_IA64
+        /// <summary>
+        ///     Intel IA64 processor.
+        /// </summary>
+        // #define PROCESSOR_INTEL_IA64 2200
+        public const int PROCESSOR_INTEL_IA64 = 2200;
+        #endregion int PROCESSOR_INTEL_IA64
+
+        #region int PROCESSOR_AMD_X8664
+        /// <summary>
+        ///     AMD X86 64 processor.
+        /// </summary>
+        // #define PROCESSOR_AMD_X8664 8664
+        public const int PROCESSOR_AMD_X8664 = 8664;
+        #endregion int PROCESSOR_AMD_X8664
+
+        #region int PROCESSOR_MIPS_R4000
+        /// <summary>
+        ///     MIPS R4000, R4101, R3910 processor.
+        /// </summary>
+        // #define PROCESSOR_MIPS_R4000 4000 // incl R4101 & R3910 for Windows CE
+        public const int PROCESSOR_MIPS_R4000 = 4000;
+        #endregion int PROCESSOR_MIPS_R4000
+
+        #region int PROCESSOR_ALPHA_21064
+        /// <summary>
+        ///     Alpha 210 64 processor.
+        /// </summary>
+        // #define PROCESSOR_ALPHA_21064 21064
+        public const int PROCESSOR_ALPHA_21064 = 21064;
+        #endregion int PROCESSOR_ALPHA_21064
+
+        #region int PROCESSOR_PPC_601
+        /// <summary>
+        ///     PPC 601 processor.
+        /// </summary>
+        // #define PROCESSOR_PPC_601 601
+        public const int PROCESSOR_PPC_601 = 601;
+        #endregion int PROCESSOR_PPC_601
+
+        #region int PROCESSOR_PPC_603
+        /// <summary>
+        ///     PPC 603 processor.
+        /// </summary>
+        // #define PROCESSOR_PPC_603 603
+        public const int PROCESSOR_PPC_603 = 603;
+        #endregion int PROCESSOR_PPC_603
+
+        #region int PROCESSOR_PPC_604
+        /// <summary>
+        ///     PPC 604 processor.
+        /// </summary>
+        // #define PROCESSOR_PPC_604 604
+        public const int PROCESSOR_PPC_604 = 604;
+        #endregion int PROCESSOR_PPC_604
+
+        #region int PROCESSOR_PPC_620
+        /// <summary>
+        ///     PPC 620 processor.
+        /// </summary>
+        // #define PROCESSOR_PPC_620 620
+        public const int PROCESSOR_PPC_620 = 620;
+        #endregion int PROCESSOR_PPC_620
+
+        #region int PROCESSOR_HITACHI_SH3
+        /// <summary>
+        ///     Hitachi SH3 processor.
+        /// </summary>
+        // #define PROCESSOR_HITACHI_SH3 10003 // Windows CE
+        public const int PROCESSOR_HITACHI_SH3 = 10003;
+        #endregion int PROCESSOR_HITACHI_SH3
+
+        #region int PROCESSOR_HITACHI_SH3E
+        /// <summary>
+        ///     Hitachi SH3E processor.
+        /// </summary>
+        // #define PROCESSOR_HITACHI_SH3E 10004 // Windows CE
+        public const int PROCESSOR_HITACHI_SH3E = 10004;
+        #endregion int PROCESSOR_HITACHI_SH3E
+
+        #region int PROCESSOR_HITACHI_SH4
+        /// <summary>
+        ///     Hitachi SH4 processor.
+        /// </summary>
+        // #define PROCESSOR_HITACHI_SH4 10005 // Windows CE
+        public const int PROCESSOR_HITACHI_SH4 = 10005;
+        #endregion int PROCESSOR_HITACHI_SH4
+
+        #region int PROCESSOR_MOTOROLA_821
+        /// <summary>
+        ///     Motorola 821 processor.
+        /// </summary>
+        // #define PROCESSOR_MOTOROLA_821 821 // Windows CE
+        public const int PROCESSOR_MOTOROLA_821 = 821;
+        #endregion int PROCESSOR_MOTOROLA_821
+
+        #region int PROCESSOR_SHx_SH3
+        /// <summary>
+        ///     SHx SH3 processor.
+        /// </summary>
+        // #define PROCESSOR_SHx_SH3 103 // Windows CE
+        public const int PROCESSOR_SHx_SH3 = 103;
+        #endregion int PROCESSOR_SHx_SH3
+
+        #region int PROCESSOR_SHx_SH4
+        /// <summary>
+        ///     SHx SH4 processor.
+        /// </summary>
+        // #define PROCESSOR_SHx_SH4 104 // Windows CE
+        public const int PROCESSOR_SHx_SH4 = 104;
+        #endregion int PROCESSOR_SHx_SH4
+
+        #region int PROCESSOR_STRONGARM
+        /// <summary>
+        ///     StrongARM processor.
+        /// </summary>
+        // #define PROCESSOR_STRONGARM 2577 // Windows CE - 0xA11
+        public const int PROCESSOR_STRONGARM = 2577;
+        #endregion int PROCESSOR_STRONGARM
+
+        #region int PROCESSOR_ARM720
+        /// <summary>
+        ///     ARM 720 processor.
+        /// </summary>
+        // #define PROCESSOR_ARM720 1824 // Windows CE - 0x720
+        public const int PROCESSOR_ARM720 = 1824;
+        #endregion int PROCESSOR_ARM720
+
+        #region int PROCESSOR_ARM820
+        /// <summary>
+        ///     ARM 820 processor.
+        /// </summary>
+        // #define PROCESSOR_ARM820 2080 // Windows CE - 0x820
+        public const int PROCESSOR_ARM820 = 2080;
+        #endregion int PROCESSOR_ARM820
+
+        #region int PROCESSOR_ARM920
+        /// <summary>
+        ///     ARM 920 processor.
+        /// </summary>
+        // #define PROCESSOR_ARM920 2336 // Windows CE - 0x920
+        public const int PROCESSOR_ARM920 = 2336;
+        #endregion int PROCESSOR_ARM920
+
+        #region int PROCESSOR_ARM_7TDMI
+        /// <summary>
+        ///     ARM 7TDMI processor.
+        /// </summary>
+        // #define PROCESSOR_ARM_7TDMI 70001 // Windows CE
+        public const int PROCESSOR_ARM_7TDMI = 70001;
+        #endregion int PROCESSOR_ARM_7TDMI
+
+        #region int PROCESSOR_OPTIL
+        /// <summary>
+        ///     MSIL processor.
+        /// </summary>
+        // #define PROCESSOR_OPTIL 0x494f // MSIL
+        public const int PROCESSOR_OPTIL = 0x494f;
+        #endregion int PROCESSOR_OPTIL
+
+        #region short PROCESSOR_ARCHITECTURE_INTEL
+        /// <summary>
+        ///     Intel architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_INTEL 0
+        public const short PROCESSOR_ARCHITECTURE_INTEL = 0;
+        #endregion short PROCESSOR_ARCHITECTURE_INTEL
+
+        #region short PROCESSOR_ARCHITECTURE_MIPS
+        /// <summary>
+        ///     MIPS architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_MIPS 1
+        public const short PROCESSOR_ARCHITECTURE_MIPS = 1;
+        #endregion short PROCESSOR_ARCHITECTURE_MIPS
+
+        #region short PROCESSOR_ARCHITECTURE_ALPHA
+        /// <summary>
+        ///     Alpha architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_ALPHA 2
+        public const short PROCESSOR_ARCHITECTURE_ALPHA = 2;
+        #endregion short PROCESSOR_ARCHITECTURE_ALPHA
+
+        #region short PROCESSOR_ARCHITECTURE_PPC
+        /// <summary>
+        ///     PPC architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_PPC 3
+        public const short PROCESSOR_ARCHITECTURE_PPC = 3;
+        #endregion short PROCESSOR_ARCHITECTURE_PPC
+
+        #region short PROCESSOR_ARCHITECTURE_SHX
+        /// <summary>
+        ///     SHX architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_SHX 4
+        public const short PROCESSOR_ARCHITECTURE_SHX = 4;
+        #endregion short PROCESSOR_ARCHITECTURE_SHX
+
+        #region short PROCESSOR_ARCHITECTURE_ARM
+        /// <summary>
+        ///     ARM architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_ARM 5
+        public const short PROCESSOR_ARCHITECTURE_ARM = 5;
+        #endregion short PROCESSOR_ARCHITECTURE_ARM
+
+        #region short PROCESSOR_ARCHITECTURE_IA64
+        /// <summary>
+        ///     IA64 architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_IA64 6
+        public const short PROCESSOR_ARCHITECTURE_IA64 = 6;
+        #endregion short PROCESSOR_ARCHITECTURE_IA64
+
+        #region short PROCESSOR_ARCHITECTURE_ALPHA64
+        /// <summary>
+        ///     Alpha64 architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_ALPHA64 7
+        public const short PROCESSOR_ARCHITECTURE_ALPHA64 = 7;
+        #endregion short PROCESSOR_ARCHITECTURE_ALPHA64
+
+        #region short PROCESSOR_ARCHITECTURE_MSIL
+        /// <summary>
+        ///     MSIL architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_MSIL 8
+        public const short PROCESSOR_ARCHITECTURE_MSIL = 8;
+        #endregion short PROCESSOR_ARCHITECTURE_MSIL
+
+        #region short PROCESSOR_ARCHITECTURE_AMD64
+        /// <summary>
+        ///     AMD64 architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_AMD64 9
+        public const short PROCESSOR_ARCHITECTURE_AMD64 = 9;
+        #endregion short PROCESSOR_ARCHITECTURE_AMD64
+
+        #region short PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
+        /// <summary>
+        ///     IA32 On Win64 architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
+        public const short PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 = 10;
+        #endregion short PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
+
+        #region short PROCESSOR_ARCHITECTURE_UNKNOWN
+        /// <summary>
+        ///     Unknown architecture.
+        /// </summary>
+        // #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
+        public const short PROCESSOR_ARCHITECTURE_UNKNOWN = unchecked((short) 0xFFFF);
+        #endregion short PROCESSOR_ARCHITECTURE_UNKNOWN
+
+        #region int PF_FLOATING_POINT_PRECISION_ERRATA
+        /// <summary>
+        ///     In rare circumstances, on a Pentium, a floating-point precision error can occur.
+        /// </summary>
+        // #define PF_FLOATING_POINT_PRECISION_ERRATA 0
+        public const int PF_FLOATING_POINT_PRECISION_ERRATA = 0;
+        #endregion int PF_FLOATING_POINT_PRECISION_ERRATA
+
+        #region int PF_FLOATING_POINT_EMULATED
+        /// <summary>
+        ///     Floating-point operations are emulated using a software emulator.
+        /// </summary>
+        // #define PF_FLOATING_POINT_EMULATED 1
+        public const int PF_FLOATING_POINT_EMULATED = 1;
+        #endregion int PF_FLOATING_POINT_EMULATED
+
+        #region int PF_COMPARE_EXCHANGE_DOUBLE
+        /// <summary>
+        ///     The compare and exchange double operation is available (Pentium, MIPS, and Alpha).
+        /// </summary>
+        // #define PF_COMPARE_EXCHANGE_DOUBLE 2
+        public const int PF_COMPARE_EXCHANGE_DOUBLE = 2;
+        #endregion int PF_COMPARE_EXCHANGE_DOUBLE
+
+        #region int PF_MMX_INSTRUCTIONS_AVAILABLE
+        /// <summary>
+        ///     The MMX instruction set is available.
+        /// </summary>
+        // #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
+        public const int PF_MMX_INSTRUCTIONS_AVAILABLE = 3;
+        #endregion int PF_MMX_INSTRUCTIONS_AVAILABLE
+
+        #region int PF_PPC_MOVEMEM_64BIT_OK
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        // #define PF_PPC_MOVEMEM_64BIT_OK 4
+        public const int PF_PPC_MOVEMEM_64BIT_OK = 4;
+        #endregion int PF_PPC_MOVEMEM_64BIT_OK
+
+        #region int PF_ALPHA_BYTE_INSTRUCTIONS
+        /// <summary>
+        ///     Unknown.
+        /// </summary>
+        // #define PF_ALPHA_BYTE_INSTRUCTIONS 5
+        public const int PF_ALPHA_BYTE_INSTRUCTIONS = 5;
+        #endregion int PF_ALPHA_BYTE_INSTRUCTIONS
+
+        #region int PF_XMMI_INSTRUCTIONS_AVAILABLE
+        /// <summary>
+        ///     The SSE instruction set is available.
+        /// </summary>
+        // #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
+        public const int PF_XMMI_INSTRUCTIONS_AVAILABLE = 6;
+        #endregion int PF_XMMI_INSTRUCTIONS_AVAILABLE
+
+        #region int PF_3DNOW_INSTRUCTIONS_AVAILABLE
+        /// <summary>
+        ///     The 3D-Now instruction set is available.
+        /// </summary>
+        // #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
+        public const int PF_3DNOW_INSTRUCTIONS_AVAILABLE = 7;
+        #endregion int PF_3DNOW_INSTRUCTIONS_AVAILABLE
+
+        #region int PF_RDTSC_INSTRUCTION_AVAILABLE
+        /// <summary>
+        ///     The RDTSC instruction is available.
+        /// </summary>
+        // #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
+        public const int PF_RDTSC_INSTRUCTION_AVAILABLE = 8;
+        #endregion int PF_RDTSC_INSTRUCTION_AVAILABLE
+
+        #region int PF_PAE_ENABLED
+        /// <summary>
+        ///     The processor is PAE-enabled.
+        /// </summary>
+        // #define PF_PAE_ENABLED 9
+        public const int PF_PAE_ENABLED = 9;
+        #endregion int PF_PAE_ENABLED
+
+        #region int PF_XMMI64_INSTRUCTIONS_AVAILABLE
+        /// <summary>
+        ///     The SSE2 instruction set is available.
+        /// </summary>
+        // #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
+        public const int PF_XMMI64_INSTRUCTIONS_AVAILABLE = 10;
+        #endregion int PF_XMMI64_INSTRUCTIONS_AVAILABLE
+        #endregion Public Constants
+    }
+}
diff --git a/src/Tao.Platform.Windows/Winmm.cs b/src/Tao.Platform.Windows/Winmm.cs
new file mode 100644
index 0000000..5306563
--- /dev/null
+++ b/src/Tao.Platform.Windows/Winmm.cs
@@ -0,0 +1,1473 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Tao.Platform.Windows {
+    #region Class Documentation
+    /// <summary>
+    ///     Windows Multimedia binding for .NET, implementing Windows-specific multimedia
+    ///     functionality.
+    /// </summary>
+    /// <remarks>
+    ///     Binds functions and definitions in winmm.dll.
+    /// </remarks>
+    #endregion Class Documentation
+    public static class Winmm
+    {
+        // --- Fields ---
+        #region Private Constants
+        #region String WINMM_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies Winmm's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies winmm.dll for Windows.
+        /// </remarks>
+        private const String WINMM_NATIVE_LIBRARY = "winmm.dll";
+        #endregion String WINMM_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.StdCall" />.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION = CallingConvention.StdCall;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+
+        #region Public Constants
+        #region Int32 SND_SYNC
+        /// <summary>
+        ///     Synchronous playback of a sound event.  <b>PlaySound</b> returns after the sound
+        ///     event completes.
+        /// </summary>
+        // #define SND_SYNC 0x0000 /* play synchronously (default) */
+        public static Int32 SND_SYNC = 0x0000;
+        #endregion Int32 SND_SYNC
+
+        #region Int32 SND_ASYNC
+        /// <summary>
+        ///     The sound is played asynchronously and <b>PlaySound</b> returns immediately after
+        ///     beginning the sound.  To terminate an asynchronously played waveform sound, call
+        ///     <b>PlaySound</b> with <i>sound</i> set to NULL.
+        /// </summary>
+        // #define SND_ASYNC 0x0001 /* play asynchronously */
+        public static Int32 SND_ASYNC = 0x0001;
+        #endregion Int32 SND_ASYNC
+
+        #region Int32 SND_NODEFAULT
+        /// <summary>
+        ///     No default sound event is used.  If the sound cannot be found, <b>PlaySound</b>
+        ///     returns silently without playing the default sound.
+        /// </summary>
+        // #define SND_NODEFAULT 0x0002 /* silence (!default) if sound not found */
+        public static Int32 SND_NODEFAULT = 0x0002;
+        #endregion Int32 SND_NODEFAULT
+
+        #region Int32 SND_MEMORY
+        /// <summary>
+        ///     A sound event's file is loaded in RAM.  The parameter specified by <i>sound</i>
+        ///     must point to an image of a sound in memory.
+        /// </summary>
+        // #define SND_MEMORY 0x0004 /* pszSound points to a memory file */
+        public static Int32 SND_MEMORY = 0x0004;
+        #endregion Int32 SND_MEMORY
+
+        #region Int32 SND_LOOP
+        /// <summary>
+        ///     The sound plays repeatedly until <b>PlaySound</b> is called again with the
+        ///     <i>sound</i> parameter set to NULL.  You must also specify the
+        ///     <see cref="SND_ASYNC" /> flag to indicate an asynchronous sound event.
+        /// </summary>
+        // #define SND_LOOP 0x0008 /* loop the sound until next sndPlaySound */
+        public static Int32 SND_LOOP = 0x0008;
+        #endregion Int32 SND_LOOP
+
+        #region Int32 SND_NOSTOP
+        /// <summary>
+        ///     <para>
+        ///         The specified sound event will yield to another sound event that is already
+        ///         playing.  If a sound cannot be played because the resource needed to
+        ///         generate that sound is busy playing another sound, the function immediately
+        ///         returns FALSE without playing the requested sound.
+        ///     </para>
+        ///     <para>
+        ///         If this flag is not specified, <b>PlaySound</b> attempts to stop the currently
+        ///         playing sound so that the device can be used to play the new sound.
+        ///     </para>
+        /// </summary>
+        // #define SND_NOSTOP 0x0010 /* don't stop any currently playing sound */
+        public static Int32 SND_NOSTOP = 0x0010;
+        #endregion Int32 SND_NOSTOP
+
+        #region Int32 SND_NOWAIT
+        /// <summary>
+        ///     If the driver is busy, return immediately without playing the sound.
+        /// </summary>
+        // #define SND_NOWAIT 0x00002000L /* don't wait if the driver is busy */
+        public static Int32 SND_NOWAIT = 0x00002000;
+        #endregion Int32 SND_NOWAIT
+
+        #region Int32 SND_ALIAS
+        /// <summary>
+        ///     The <i>sound</i> parameter is a system-event alias in the registry or the WIN.INI
+        ///     file.  Do not use with either <see cref="SND_FILENAME" /> or
+        ///     <see cref="SND_RESOURCE" />.
+        /// </summary>
+        // #define SND_ALIAS 0x00010000L /* name is a registry alias */
+        public static Int32 SND_ALIAS = 0x00010000;
+        #endregion Int32 SND_ALIAS
+
+        #region Int32 SND_ALIAS_ID
+        /// <summary>
+        ///     The <i>sound</i> parameter is a predefined sound identifier.
+        /// </summary>
+        // #define SND_ALIAS_ID 0x00110000L /* alias is a predefined ID */
+        public static Int32 SND_ALIAS_ID = 0x00110000;
+        #endregion Int32 SND_ALIAS_ID
+
+        #region Int32 SND_FILENAME
+        /// <summary>
+        ///     The <i>sound</i> parameter is a filename.
+        /// </summary>
+        // #define SND_FILENAME 0x00020000L /* name is file name */
+        public static Int32 SND_FILENAME = 0x00020000;
+        #endregion Int32 SND_FILENAME
+
+        #region Int32 SND_RESOURCE
+        /// <summary>
+        ///     The <i>sound</i> parameter is a resource identifier; <i>mod</i> must identify the
+        ///     instance that contains the resource.
+        /// </summary>
+        // #define SND_RESOURCE 0x00040004L /* name is resource name or atom */
+        public static Int32 SND_RESOURCE = 0x00040004;
+        #endregion Int32 SND_RESOURCE
+
+        #region Int32 SND_PURGE
+        /// <summary>
+        ///     <para>
+        ///         Sounds are to be stopped for the calling task.  If <i>sound</i> is not
+        ///         NULL, all instances of the specified sound are stopped.  If <i>sound</i> is
+        ///         NULL, all sounds that are playing on behalf of the calling task are stopped.
+        ///     </para>
+        ///     <para>
+        ///         You must also specify the instance handle to stop <see cref="SND_RESOURCE" />
+        ///         events.
+        ///     </para>
+        /// </summary>
+        // #define SND_PURGE 0x0040 /* purge non-static events for task */
+        public static Int32 SND_PURGE = 0x0040;
+        #endregion Int32 SND_PURGE
+
+        #region Int32 SND_APPLICATION
+        /// <summary>
+        ///     The sound is played using an application-specific association.
+        /// </summary>
+        // #define SND_APPLICATION 0x0080 /* look for application specific association */
+        public static Int32 SND_APPLICATION = 0x0080;
+        #endregion Int32 SND_APPLICATION
+
+        #region Int32 TIMERR_BASE
+        /// <summary>
+        ///     Timer base identifier.
+        /// </summary>
+        // #define TIMERR_BASE            96
+        public static Int32 TIMERR_BASE = 96;
+        #endregion Int32 TIMERR_BASE
+
+        #region Int32 TIMERR_NOERROR
+        /// <summary>
+        ///     Successful.
+        /// </summary>
+        // #define TIMERR_NOERROR (0) /* no error */
+        public static Int32 TIMERR_NOERROR = 0;
+        #endregion Int32 TIMERR_NOERROR
+
+        #region Int32 TIMERR_NOCANDO
+        /// <summary>
+        ///     Resolution specified is out of range.
+        /// </summary>
+        // #define TIMERR_NOCANDO (TIMERR_BASE+1) /* request not completed */
+        public static Int32 TIMERR_NOCANDO = TIMERR_BASE + 1;
+        #endregion Int32 TIMERR_NOCANDO
+
+        #region Int32 JOY_BUTTON1
+        /// <summary>
+        ///     First joystick button is pressed.
+        /// </summary>
+        // #define JOY_BUTTON1 1
+        public static Int32 JOY_BUTTON1 = 1;
+        #endregion Int32 JOY_BUTTON1
+
+        #region Int32 JOY_BUTTON2
+        /// <summary>
+        ///     Second joystick button is pressed.
+        /// </summary>
+        // #define JOY_BUTTON2 2
+        public static Int32 JOY_BUTTON2 = 2;
+        #endregion Int32 JOY_BUTTON2
+
+        #region Int32 JOY_BUTTON3
+        /// <summary>
+        ///     Third joystick button is pressed.
+        /// </summary>
+        // #define JOY_BUTTON3 4
+        public static Int32 JOY_BUTTON3 = 4;
+        #endregion Int32 JOY_BUTTON3
+
+        #region Int32 JOY_BUTTON4
+        /// <summary>
+        ///     Four joystick button is pressed.
+        /// </summary>
+        // #define JOY_BUTTON4 8
+        public static Int32 JOY_BUTTON4 = 8;
+        #endregion Int32 JOY_BUTTON4
+
+        #region Int32 JOYCAPS_HASZ
+        /// <summary>
+        ///     Joystick has z-coordinate information.
+        /// </summary>
+        // #define JOYCAPS_HASZ 1
+        public static Int32 JOYCAPS_HASZ = 1;
+        #endregion Int32 JOYCAPS_HASZ
+
+        #region Int32 JOYCAPS_HASR
+        /// <summary>
+        ///     Joystick has rudder (fourth axis) information.
+        /// </summary>
+        // #define JOYCAPS_HASR 2
+        public static Int32 JOYCAPS_HASR = 2;
+        #endregion Int32 JOYCAPS_HASR
+
+        #region Int32 JOYCAPS_HASU
+        /// <summary>
+        ///     Joystick has u-coordinate (fifth axis) information.
+        /// </summary>
+        // #define JOYCAPS_HASU 4
+        public static Int32 JOYCAPS_HASU = 4;
+        #endregion Int32 JOYCAPS_HASU
+
+        #region Int32 JOYCAPS_HASV
+        /// <summary>
+        ///     Joystick has v-coordinate (sixth axis) information.
+        /// </summary>
+        // #define JOYCAPS_HASU 8
+        public static Int32 JOYCAPS_HASV = 8;
+        #endregion Int32 JOYCAPS_HASV
+
+        #region Int32 JOYCAPS_HASPOV
+        /// <summary>
+        ///     Joystick has point-of-view information.
+        /// </summary>
+        // #define JOYCAPS_HASPOV 16
+        public static Int32 JOYCAPS_HASPOV = 16;
+        #endregion Int32 JOYCAPS_HASPOV
+
+        #region Int32 JOYCAPS_POV4DIR
+        /// <summary>
+        ///     Joystick point-of-view supports discrete values (centered, forward, backward, left, and right).
+        /// </summary>
+        // #define JOYCAPS_HASPOV 32
+        public static Int32 JOYCAPS_POV4DIR = 32;
+        #endregion Int32 JOYCAPS_POV4DIR
+
+        #region Int32 JOYCAPS_POVCTS
+        /// <summary>
+        ///     Joystick point-of-view supports continuous degree bearings.
+        /// </summary>
+        // #define JOYCAPS_POVCTS 32
+        public static Int32 JOYCAPS_POVCTS = 64;
+        #endregion Int32 JOYCAPS_POVCTS
+        
+        #region Int32 JOY_RETURNX
+        /// <summary></summary>
+        // #define JOY_RETURNX 0x00000001
+        public static Int32 JOY_RETURNX = 0x00000001;
+        #endregion Int32 JOY_RETURNX
+        
+        #region Int32 JOY_RETURNY
+        /// <summary></summary>
+        // #define JOY_RETURNY 0x00000002
+        public static Int32 JOY_RETURNY = 0x00000002;
+        #endregion Int32 JOY_RETURNY
+        
+        #region Int32 JOY_RETURNZ
+        /// <summary></summary>
+        // #define JOY_RETURNZ 0x00000002
+        public static Int32 JOY_RETURNZ = 0x00000004;
+        #endregion Int32 JOY_RETURNZ
+        
+        #region Int32 JOY_RETURNR
+        /// <summary></summary>
+        // #define JOY_RETURNR 0x00000008
+        public static Int32 JOY_RETURNR = 0x00000008;
+        #endregion Int32 JOY_RETURNR
+        
+        #region Int32 JOY_RETURNU
+        /// <summary></summary>
+        // #define JOY_RETURNU 0x00000010
+        public static Int32 JOY_RETURNU = 0x00000010;
+        #endregion Int32 JOY_RETURNU
+        
+        #region Int32 JOY_RETURNV
+        /// <summary></summary>
+        // #define JOY_RETURNV 0x00000020
+        public static Int32 JOY_RETURNV = 0x00000020;
+        #endregion Int32 JOY_RETURNV
+        
+        #region Int32 JOY_RETURNPOV
+        /// <summary></summary>
+        // #define JOY_RETURNPOV 0x00000040
+        public static Int32 JOY_RETURNPOV = 0x00000040;
+        #endregion Int32 JOY_RETURNPOV
+        
+        #region Int32 JOY_RETURNBUTTONS
+        /// <summary></summary>
+        // #define JOY_RETURNBUTTONS 0x00000080
+        public static Int32 JOY_RETURNBUTTONS = 0x00000080;
+        #endregion Int32 JOY_RETURNBUTTONS
+        
+        #region Int32 JOY_RETURNRAWDATA
+        /// <summary></summary>
+        // #define JOY_RETURNRAWDATA 0x00000100
+        public static Int32 JOY_RETURNRAWDATA = 0x00000100;
+        #endregion Int32 JOY_RETURNRAWDATA
+        
+        #region Int32 JOY_RETURNPOVCTS
+        /// <summary></summary>
+        // #define JOY_RETURNPOVCTS 0x00000200
+        public static Int32 JOY_RETURNPOVCTS = 0x00000200;
+        #endregion Int32 JOY_RETURNPOVCTS
+        
+        #region Int32 JOY_RETURNCENTERED
+        /// <summary></summary>
+        // #define JOY_RETURNCENTERED 0x00000200
+        public static Int32 JOY_RETURNCENTERED = 0x00000400;
+        #endregion Int32 JOY_RETURNCENTERED
+        
+        #region Int32 JOY_USEDEADZONE
+        /// <summary></summary>
+        // #define JOY_USEDEADZONE 0x00000800
+        public static Int32 JOY_USEDEADZONE = 0x00000800;
+        #endregion Int32 JOY_USEDEADZONE
+        
+        #region Int32 JOY_RETURNALL
+        /// <summary></summary>
+        // #define JOY_RETURNALL (JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | 
+        //         JOY_RETURNR | JOY_RETURNU | JOY_RETURNV | 
+        //         JOY_RETURNPOV | JOY_RETURNBUTTONS)
+        public static Int32 JOY_RETURNALL = (JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNR | JOY_RETURNU | JOY_RETURNV | JOY_RETURNPOV | JOY_RETURNBUTTONS);
+        #endregion Int32 JOY_RETURNALL
+        
+        #region Int32 JOY_CAL_READALWAYS
+        /// <summary></summary>
+        // #define JOY_CAL_READALWAYS 0x00010000
+        public static Int32 JOY_CAL_READALWAYS = 0x00010000;
+        #endregion Int32 JOY_CAL_READALWAYS
+        
+        #region Int32 JOY_CAL_READXYONLY
+        /// <summary></summary>
+        // #define JOY_CAL_READXYONLY 0x00010000
+        public static Int32 JOY_CAL_READXYONLY = 0x00020000;
+        #endregion Int32 JOY_CAL_READXYONLY
+        
+        #region Int32 JOY_CAL_READ3
+        /// <summary></summary>
+        // #define JOY_CAL_READ3 0x00040000
+        public static Int32 JOY_CAL_READ3 = 0x00040000;
+        #endregion Int32 JOY_CAL_READ3
+        
+        #region Int32 JOY_CAL_READ4
+        /// <summary></summary>
+        // #define JOY_CAL_READ4 0x00080000
+        public static Int32 JOY_CAL_READ4 = 0x00080000;
+        #endregion Int32 JOY_CAL_READ4
+        
+        #region Int32 JOY_CAL_READXONLY
+        /// <summary></summary>
+        // #define JOY_CAL_READXONLY 0x00100000
+        public static Int32 JOY_CAL_READXONLY = 0x00100000;
+        #endregion Int32 JOY_CAL_READXONLY
+        
+        #region Int32 JOY_CAL_READYONLY
+        /// <summary></summary>
+        // #define JOY_CAL_READXONLY 0x00200000
+        public static Int32 JOY_CAL_READYONLY = 0x00200000;
+        #endregion Int32 JOY_CAL_READYONLY
+        
+        #region Int32 JOY_CAL_READ5
+        /// <summary></summary>
+        // #define JOY_CAL_READ5 0x00400000
+        public static Int32 JOY_CAL_READ5 = 0x00400000;
+        #endregion Int32 JOY_CAL_READ5
+        
+        #region Int32 JOY_CAL_READ6
+        /// <summary></summary>
+        // #define JOY_CAL_READ6 0x00800000
+        public static Int32 JOY_CAL_READ6 = 0x00800000;
+        #endregion Int32 JOY_CAL_READ6
+        
+        #region Int32 JOY_CAL_READZONLY
+        /// <summary></summary>
+        // #define JOY_CAL_READZONLY 0x00800000
+        public static Int32 JOY_CAL_READZONLY = 0x00800000;
+        #endregion Int32 JOY_CAL_READZONLY
+        
+        #region Int32 JOY_CAL_READRONLY
+        /// <summary></summary>
+        // #define JOY_CAL_READRONLY 0x02000000
+        public static Int32 JOY_CAL_READRONLY = 0x02000000;
+        #endregion Int32 JOY_CAL_READRONLY
+        
+        #region Int32 JOY_CAL_READUONLY
+        /// <summary></summary>
+        // #define JOY_CAL_READUONLY 0x04000000
+        public static Int32 JOY_CAL_READUONLY = 0x04000000;
+        #endregion Int32 JOY_CAL_READUONLY
+        
+        #region Int32 JOY_CAL_READVONLY
+        /// <summary></summary>
+        // #define JOY_CAL_READVONLY 0x04000000
+        public static Int32 JOY_CAL_READVONLY = 0x08000000;
+        #endregion Int32 JOY_CAL_READVONLY
+        
+        #region Int32 JOY_POVCENTERED
+        /// <summary></summary>
+        // #define JOY_POVCENTERED (WORD) -1
+        public static Int32 JOY_POVCENTERED = -1;
+        #endregion Int32 JOY_POVCENTERED
+        
+        #region Int32 JOY_POVFORWARD
+        /// <summary></summary>
+        // #define JOY_POVFORWARD 0
+        public static Int32 JOY_POVFORWARD = 0;
+        #endregion Int32 JOY_POVFORWARD
+        
+        #region Int32 JOY_POVRIGHT
+        /// <summary></summary>
+        // #define JOY_POVRIGHT 9000
+        public static Int32 JOY_POVRIGHT = 9000;
+        #endregion Int32 JOY_POVRIGHT
+        
+        #region Int32 JOY_POVBACKWARD
+        /// <summary></summary>
+        // #define JOY_POVBACKWARD 18000
+        public static Int32 JOY_POVBACKWARD = 18000;
+        #endregion Int32 JOY_POVBACKWARD
+        
+        #region Int32 JOY_POVLEFT
+        /// <summary></summary>
+        // #define JOY_POVLEFT 27000
+        public static Int32 JOY_POVLEFT = 27000;
+        #endregion Int32 JOY_POVLEFT
+
+        #region Int32 MMSYSERR_BASE
+        /// <summary></summary>
+        // #define MMSYSERR_BASE 0
+        public static Int32 MMSYSERR_BASE = 0;
+        #endregion Int32 MMSYSERR_BASE
+
+        #region Int32 MMSYSERR_NOERROR
+        /// <summary></summary>
+        // #define MMSYSERR_NOERROR 0
+        public static Int32 MMSYSERR_NOERROR = 0;
+        #endregion Int32 MMSYSERR_NOERROR
+        
+        #region Int32 MMSYSERR_ERROR
+        /// <summary></summary>
+        // #define MMSYSERR_ERROR 1
+        public static Int32 MMSYSERR_ERROR = 1;
+        #endregion Int32 MMSYSERR_ERROR
+        
+        #region Int32 MMSYSERR_BADDEVICEID
+        /// <summary></summary>
+        // #define MMSYSERR_BADDEVICEID 2
+        public static Int32 MMSYSERR_BADDEVICEID = 2;
+        #endregion Int32 MMSYSERR_BADDEVICEID
+        
+        #region Int32 MMSYSERR_NOTENABLED
+        /// <summary></summary>
+        // #define MMSYSERR_NOTENABLED 3
+        public static Int32 MMSYSERR_NOTENABLED = 3;
+        #endregion Int32 MMSYSERR_NOTENABLED
+        
+        #region Int32 MMSYSERR_ALLOCATED
+        /// <summary></summary>
+        // #define MMSYSERR_ALLOCATED 4
+        public static Int32 MMSYSERR_ALLOCATED = 4;
+        #endregion Int32 MMSYSERR_ALLOCATED
+        
+        #region Int32 MMSYSERR_INVALHANDLE
+        /// <summary></summary>
+        // #define MMSYSERR_INVALHANDLE 5
+        public static Int32 MMSYSERR_INVALHANDLE = 5;
+        #endregion Int32 MMSYSERR_INVALHANDLE
+        
+        #region Int32 MMSYSERR_NODRIVER
+        /// <summary></summary>
+        // #define MMSYSERR_NODRIVER 6
+        public static Int32 MMSYSERR_NODRIVER = 6;
+        #endregion Int32 MMSYSERR_NODRIVER
+        
+        #region Int32 MMSYSERR_NOMEM
+        /// <summary></summary>
+        // #define MMSYSERR_NOMEM 7
+        public static Int32 MMSYSERR_NOMEM = 7;
+        #endregion Int32 MMSYSERR_NOMEM
+        
+        #region Int32 MMSYSERR_NOTSUPPORTED
+        /// <summary></summary>
+        // #define MMSYSERR_NOTSUPPORTED 8
+        public static Int32 MMSYSERR_NOTSUPPORTED = 8;
+        #endregion Int32 MMSYSERR_NOTSUPPORTED
+
+        #region Int32 MMSYSERR_BADERRNUM
+        /// <summary></summary>
+        // #define MMSYSERR_BADERRNUM 9
+        public static Int32 MMSYSERR_BADERRNUM = 9;
+        #endregion Int32 MMSYSERR_BADERRNUM
+
+        #region Int32 MMSYSERR_INVALFLAG
+        /// <summary></summary>
+        // #define MMSYSERR_INVALFLAG 10
+        public static Int32 MMSYSERR_INVALFLAG = 10;
+        #endregion Int32 MMSYSERR_INVALFLAG
+
+        #region Int32 MMSYSERR_INVALPARAM
+        /// <summary></summary>
+        // #define MMSYSERR_INVALPARAM 11
+        public static Int32 MMSYSERR_INVALPARAM = 11;
+        #endregion Int32 MMSYSERR_INVALPARAM
+
+        #region Int32 MMSYSERR_LASTERROR
+        /// <summary></summary>
+        // #define MMSYSERR_LASTERROR 11
+        public static Int32 MMSYSERR_LASTERROR = 11;
+        #endregion Int32 MMSYSERR_LASTERROR
+
+        #region Int32 JOYERR_NOERROR
+        /// <summary></summary>
+        // #define JOYERR_NOERROR 0
+        public static Int32 JOYERR_NOERROR = 0;
+        #endregion Int32 JOYERR_NOERROR
+
+        #region Int32 JOYERR_PARMS
+        /// <summary></summary>
+        // #define JOYERR_PARMS 165
+        public static Int32 JOYERR_PARMS = 165;
+        #endregion Int32 JOYERR_PARMS
+
+        #region Int32 JOYERR_NOCANDO
+        /// <summary></summary>
+        // #define JOYERR_NOCANDO 166
+        public static Int32 JOYERR_NOCANDO = 166;
+        #endregion Int32 JOYERR_NOCANDO
+
+        #region Int32 JOYERR_UNPLUGGED
+        /// <summary></summary>
+        // #define JOYERR_UNPLUGGED 167
+        public static Int32 JOYERR_UNPLUGGED = 167;
+        #endregion Int32 JOYERR_UNPLUGGED
+
+        #region Int32 JOYSTICKID1
+        /// <summary></summary>
+        // #define JOYSTICKID1 0
+        public static Int32 JOYSTICKID1 = 0;
+        #endregion Int32 JOYSTICKID1
+
+        #region Int32 JOYSTICKID2
+        /// <summary></summary>
+        // #define JOYSTICKID2 1
+        public static Int32 JOYSTICKID2 = 1;
+        #endregion Int32 JOYSTICKID2
+
+        #region Int32 MM_JOY1MOVE
+        /// <summary></summary>
+        // #define MM_JOY1MOVE 0x3A0
+        public static Int32 MM_JOY1MOVE = 0x3A0;
+        #endregion Int32 MM_JOY1MOVE
+
+        #region Int32 MM_JOY2MOVE
+        /// <summary></summary>
+        // #define MM_JOY2MOVE 0x3A1
+        public static Int32 MM_JOY2MOVE = 0x3A1;
+        #endregion Int32 MM_JOY2MOVE
+
+        #region Int32 MM_JOY1ZMOVE
+        /// <summary></summary>
+        // #define MM_JOY1ZMOVE 0x3A2
+        public static Int32 MM_JOY1ZMOVE = 0x3A2;
+        #endregion Int32 MM_JOY1ZMOVE
+
+        #region Int32 MM_JOY2ZMOVE
+        /// <summary></summary>
+        // #define MM_JOY2ZMOVE 0x3A3
+        public static Int32 MM_JOY2ZMOVE = 0x3A3;
+        #endregion Int32 MM_JOY2ZMOVE
+
+        #endregion Public Constants
+
+        // --- Structures & Classes ---
+        #region JOYCAPS
+        /// <summary>
+        ///     The JOYCAPS structure contains information about the joystick capabilities.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>Requirements</b>
+        ///     </para>
+        ///     <para>
+        ///         Windows NT/2000/XP: Included in Windows NT 3.1 and later.
+        ///         Windows 95/98/Me: Included in Windows 95 and later.
+        ///         Header: Declared in Mmsystem.h; include Windows.h.
+        ///         Unicode: Declared as Unicode and ANSI structures.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Winmm.JOYINFO"/>
+        /// <seealso cref="Winmm.JOYINFOEX"/>
+        /// <seealso cref="Winmm.joySetCapture"/>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct JOYCAPS
+        {
+            /// <summary>
+            ///     Manufacturer identifier. Manufacturer identifiers are defined in Manufacturer and Product Identifiers.
+            /// </summary>
+            [CLSCompliant(false)]
+            public ushort wMid;
+            /// <summary>
+            ///     Product identifier. Product identifiers are defined in Manufacturer and Product Identifiers.
+            /// </summary>
+            [CLSCompliant(false)]
+            public ushort wPid;
+            /// <summary>
+            ///     Null-terminated string containing the joystick product name.
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
+            public String szPname;
+            /// <summary>
+            ///     Minimum X-coordinate.
+            /// </summary>
+            public Int32 wXmin;
+            /// <summary>
+            ///     Maximum X-coordinate.
+            /// </summary>
+            public Int32 wXmax;
+            /// <summary>
+            /// Minimum Y-coordinate.
+            /// </summary>
+            public Int32 wYmin;
+            /// <summary>
+            ///     Maximum Y-coordinate.
+            /// </summary>
+            public Int32 wYmax;
+            /// <summary>
+            ///     Minimum Z-coordinate.
+            /// </summary>
+            public Int32 wZmin;
+            /// <summary>
+            ///     Maximum Z-coordinate.
+            /// </summary>
+            public Int32 wZmax;
+            /// <summary>
+            ///     Number of joystick buttons.
+            /// </summary>
+            public Int32 wNumButtons;
+            /// <summary>
+            ///     Smallest polling frequency supported when captured by the <see cref="joySetCapture"/> function.
+            /// </summary>
+            public Int32 wPeriodMin;
+            /// <summary>
+            ///     Largest polling frequency supported when captured by <see cref="joySetCapture"/>.
+            /// </summary>
+            public Int32 wPeriodMax;
+            /// <summary>
+            ///     Minimum rudder value. The rudder is a fourth axis of movement.
+            /// </summary>
+            public Int32 wRmin;
+            /// <summary>
+            ///     Maximum rudder value. The rudder is a fourth axis of movement.
+            /// </summary>
+            public Int32 wRmax;
+            /// <summary>
+            ///     Minimum u-coordinate (fifth axis) values.
+            /// </summary>
+            public Int32 wUmin;
+            /// <summary>
+            ///     Maximum u-coordinate (fifth axis) values.
+            /// </summary>
+            public Int32 wUmax;
+            /// <summary>
+            ///     Minimum v-coordinate (sixth axis) values.
+            /// </summary>
+            public Int32 wVmin;
+            /// <summary>
+            ///     Maximum v-coordinate (sixth axis) values.
+            /// </summary>
+            public Int32 wVmax;
+            /// <summary>
+            ///     Joystick capabilities The following flags define individual capabilities that a joystick might have:
+            /// </summary>
+            /// <remarks>
+            ///     <see cref="JOYCAPS_HASZ"/> - Joystick has z-coordinate information.
+            ///     <see cref="JOYCAPS_HASR"/> - Joystick has rudder (fourth axis) information.
+            ///     <see cref="JOYCAPS_HASU"/> - Joystick has u-coordinate (fifth axis) information.
+            ///     <see cref="JOYCAPS_HASV"/> - Joystick has v-coordinate (sixth axis) information.
+            ///     <see cref="JOYCAPS_HASPOV"/> - Joystick has point-of-view information.
+            ///     <see cref="JOYCAPS_POV4DIR"/> - Joystick point-of-view supports discrete values (centered, forward, backward, left, and right).
+            ///     <see cref="JOYCAPS_POVCTS"/> - Joystick point-of-view supports continuous degree bearings.
+            /// </remarks>
+            public Int32 wCaps;
+            /// <summary>
+            ///     Maximum number of axes supported by the joystick.
+            /// </summary>
+            public Int32 wMaxAxes;
+            /// <summary>
+            ///     Number of axes currently in use by the joystick.
+            /// </summary>
+            public Int32 wNumAxes;
+            /// <summary>
+            ///     Maximum number of buttons supported by the joystick.
+            /// </summary>
+            public Int32 wMaxButtons;
+            /// <summary>
+            ///     Null-terminated string containing the registry key for the joystick.
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
+            public String szRegKey;
+            /// <summary>
+            ///     Null-terminated string identifying the joystick driver OEM.
+            /// </summary>
+            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
+            public String szOEMVxD;
+        }
+        #endregion JOYCAPS
+
+        #region JOYINFO
+        /// <summary>
+        /// The JOYINFO structure contains information about the joystick position and button state.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         <b>Requirements</b>
+        ///     </para>
+        ///     <para>
+        ///         Windows NT/2000/XP: Included in Windows NT 3.1 and later.
+        ///         Windows 95/98/Me: Included in Windows 95 and later.
+        ///         Header: Declared in Mmsystem.h; include Windows.h.
+        ///     </para>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct JOYINFO
+        {
+            /// <summary>
+            ///     Current X-coordinate.
+            /// </summary>
+            public Int32 wXpos;
+            /// <summary>
+            ///     Current Y-coordinate.
+            /// </summary>
+            public Int32 wYpos;
+            /// <summary>
+            ///     Current Z-coordinate.
+            /// </summary>
+            public Int32 wZpos;
+            /// <summary>
+            ///     Current state of joystick buttons.
+            /// </summary>
+            /// <remarks>
+            ///     <para>According to one or more of the following values:</para>
+            ///     <para>
+            ///         <see cref="JOY_BUTTON1"/> - First joystick button is pressed.
+            ///         <see cref="JOY_BUTTON2"/> - Second joystick button is pressed.
+            ///         <see cref="JOY_BUTTON3"/> - Third joystick button is pressed.
+            ///         <see cref="JOY_BUTTON4"/> - Fourth joystick button is pressed.
+            ///     </para>
+            /// </remarks>
+            public Int32 wButtons;
+        }
+        #endregion JOYINFO
+
+        #region JOYINFOEX
+        /// <summary>
+        ///     The JOYINFOEX structure contains extended information about the joystick position, point-of-view position, and button state.
+        /// </summary>
+        /// <remarks>
+        ///     <para>
+        ///         The value of the dwSize member is also used to identify the version number for the structure when it's passed to the <see cref="joyGetPosEx"/> function.
+        ///     </para>
+        ///     <para>
+        ///         Most devices with a point-of-view control have only five positions. When the JOY_RETURNPOV flag is set, these positions are reported by using the following constants:
+        ///     </para>
+        ///     <para>
+        ///         <see cref="JOY_POVBACKWARD"/> - Point-of-view hat is pressed backward. The value 18,000 represents an orientation of 180.00 degrees (to the rear).
+        ///         <see cref="JOY_POVCENTERED"/> - Point-of-view hat is in the neutral position. The value -1 means the point-of-view hat has no angle to report.
+        ///         <see cref="JOY_POVFORWARD"/> - Point-of-view hat is pressed forward. The value 0 represents an orientation of 0.00 degrees (straight ahead).
+        ///         <see cref="JOY_POVLEFT"/> - Point-of-view hat is being pressed to the left. The value 27,000 represents an orientation of 270.00 degrees (90.00 degrees to the left).
+        ///         <see cref="JOY_POVRIGHT"/> - Point-of-view hat is pressed to the right. The value 9,000 represents an orientation of 90.00 degrees (to the right).
+        ///     </para>
+        ///     <para>
+        ///         The default joystick driver currently supports these five discrete directions. If an application can accept only the defined point-of-view values, it must use the JOY_RETURNPOV flag. If an application can accept other degree readings, it should use the JOY_RETURNPOVCTS flag to obtain continuous data if it is available. The JOY_RETURNPOVCTS flag also supports the JOY_POV constants used with the JOY_RETURNPOV flag.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="joyGetPosEx"/>
+        [StructLayout(LayoutKind.Sequential)]
+        public struct JOYINFOEX
+        {
+            /// <summary>
+            /// Size, in bytes, of this structure.
+            /// </summary>
+            public Int32 dwSize;
+            /// <summary>
+            /// Flags indicating the valid information returned in this structure. Members that do not contain valid information are set to zero.
+            /// </summary>
+            /// <remarks>
+            /// <para>
+            ///     <see cref="JOY_RETURNALL"/> - Equivalent to setting all of the JOY_RETURN bits except JOY_RETURNRAWDATA.
+            ///     <see cref="JOY_RETURNBUTTONS"/> - The dwButtons member contains valid information about the state of each joystick button.
+            ///     <see cref="JOY_RETURNCENTERED"/> - Centers the joystick neutral position to the middle value of each axis of movement.
+            ///     <see cref="JOY_RETURNPOV"/> - The dwPOV member contains valid information about the point-of-view control, expressed in discrete units.
+            ///     <see cref="JOY_RETURNPOVCTS"/> - The dwPOV member contains valid information about the point-of-view control expressed in continuous, one-hundredth degree units.
+            ///     <see cref="JOY_RETURNR"/> - The dwRpos member contains valid rudder pedal data. This information represents another (fourth) axis.
+            ///     <see cref="JOY_RETURNRAWDATA"/>	- Data stored in this structure is uncalibrated joystick readings.
+            ///     <see cref="JOY_RETURNU"/> - The dwUpos member contains valid data for a fifth axis of the joystick, if such an axis is available, or returns zero otherwise.
+            ///     <see cref="JOY_RETURNV"/> - The dwVpos member contains valid data for a sixth axis of the joystick, if such an axis is available, or returns zero otherwise.
+            ///     <see cref="JOY_RETURNX"/> - The dwXpos member contains valid data for the x-coordinate of the joystick.
+            ///     <see cref="JOY_RETURNY"/> - The dwYpos member contains valid data for the y-coordinate of the joystick.
+            ///     <see cref="JOY_RETURNZ"/> - The dwZpos member contains valid data for the z-coordinate of the joystick.
+            ///     <see cref="JOY_USEDEADZONE"/> - Expands the range for the neutral position of the joystick and calls this range the dead zone. The joystick driver returns a constant value for all positions in the dead zone.
+            /// </para>
+            /// <para>
+            ///     The following flags provide data to calibrate a joystick and are intended for custom calibration applications.
+            /// </para>
+            /// <para>
+            ///     <see cref="JOY_CAL_READ3"/> - Read the x-, y-, and z-coordinates and store the raw values in dwXpos, dwYpos, and dwZpos.
+            ///     <see cref="JOY_CAL_READ4"/> - Read the rudder information and the x-, y-, and z-coordinates and store the raw values in dwXpos, dwYpos, dwZpos, and dwRpos.
+            ///     <see cref="JOY_CAL_READ5"/> - Read the rudder information and the x-, y-, z-, and u-coordinates and store the raw values in dwXpos, dwYpos, dwZpos, dwRpos, and dwUpos.
+            ///     <see cref="JOY_CAL_READ6"/> - Read the raw v-axis data if a joystick mini driver is present that will provide the data. Returns zero otherwise.
+            ///     <see cref="JOY_CAL_READALWAYS"/> - Read the joystick port even if the driver does not detect a device.
+            ///     <see cref="JOY_CAL_READRONLY"/> - Read the rudder information if a joystick mini-driver is present that will provide the data and store the raw value in dwRpos. Return zero otherwise.
+            ///     <see cref="JOY_CAL_READXONLY"/> - Read the x-coordinate and store the raw (uncalibrated) value in dwXpos.
+            ///     <see cref="JOY_CAL_READXYONLY"/> - Reads the x- and y-coordinates and place the raw values in dwXpos and dwYpos.
+            ///     <see cref="JOY_CAL_READYONLY"/> - Reads the y-coordinate and store the raw value in dwYpos.
+            ///     <see cref="JOY_CAL_READZONLY"/> - Read the z-coordinate and store the raw value in dwZpos.
+            ///     <see cref="JOY_CAL_READUONLY"/> - Read the u-coordinate if a joystick mini-driver is present that will provide the data and store the raw value in dwUpos. Return zero otherwise.
+            ///     <see cref="JOY_CAL_READVONLY"/> - Read the v-coordinate if a joystick mini-driver is present that will provide the data and store the raw value in dwVpos. Return zero otherwise.
+            /// </para>
+            /// </remarks>
+            public Int32 dwFlags;
+            /// <summary>
+            /// Current X-coordinate.
+            /// </summary>
+            public Int32 dwXpos;
+            /// <summary>
+            /// Current Y-coordinate.
+            /// </summary>
+            public Int32 dwYpos;
+            /// <summary>
+            /// Current Z-coordinate.
+            /// </summary>
+            public Int32 dwZpos;
+            /// <summary>
+            /// Current position of the rudder or fourth joystick axis.
+            /// </summary>
+            public Int32 dwRpos;
+            /// <summary>
+            /// Current fifth axis position.
+            /// </summary>
+            public Int32 dwUpos;
+            /// <summary>
+            /// Current sixth axis position.
+            /// </summary>
+            public Int32 dwVpos;
+            /// <summary>
+            /// Current state of the 32 joystick buttons. The value of this member can be set to any combination of JOY_BUTTONn flags, where n is a value in the range of 1 through 32 corresponding to the button that is pressed.
+            /// </summary>
+            public Int32 dwButtons;
+            /// <summary>
+            /// Current button number that is pressed.
+            /// </summary>
+            public Int32 dwButtonNumber;
+            /// <summary>
+            /// Current position of the point-of-view control. Values for this member are in the range 0 through 35,900. These values represent the angle, in degrees, of each view multiplied by 100.
+            /// </summary>
+            public Int32 dwPOV;
+            /// <summary>
+            /// Reserved; do not use.
+            /// </summary>
+            public Int32 dwReserved1;
+            /// <summary>
+            /// Reserved; do not use.
+            /// </summary>
+            public Int32 dwReserved2;
+        }
+        #endregion JOYINFOEX
+
+        // --- Public Externs ---
+        #region Boolean PlaySound(String sound, IntPtr mod, Int32 soundFlags)
+        /// <summary>
+        ///     The <b>PlaySound</b> function plays a sound specified by the given filename,
+        ///     resource, or system event.  (A system event may be associated with a sound in the
+        ///     registry or in the WIN.INI file.)
+        /// </summary>
+        /// <param name="sound">
+        ///     <para>
+        ///         A string that specifies the sound to play.  If this parameter is NULL, any
+        ///         currently playing waveform sound is stopped.  To stop a non-waveform sound,
+        ///         specify <see cref="SND_PURGE" /> in the <i>soundFlags</i> parameter.
+        ///     </para>
+        ///     <para>
+        ///         Three flags in <i>soundFlags</i> (<see cref="SND_ALIAS" />,
+        ///         <see cref="SND_FILENAME" />, and <see cref="SND_RESOURCE" />) determine
+        ///         whether the name is interpreted as an alias for a system event, a filename, or
+        ///         a resource identifier.  If none of these flags are specified, <b>PlaySound</b>
+        ///         searches the registry or the WIN.INI file for an association with the
+        ///         specified sound name.  If an association is found, the sound event is played.
+        ///         If no association is found in the registry, the name is interpreted as a
+        ///         filename.
+        ///     </para>
+        /// </param>
+        /// <param name="mod">
+        ///     Handle to the executable file that contains the resource to be loaded.  This
+        ///     parameter must be NULL unless <see cref="SND_RESOURCE" /> is specified in
+        ///     <i>soundFlags</i>.
+        /// </param>
+        /// <param name="soundFlags">
+        ///     <para>
+        ///         Flags for playing the sound.  The following values are defined:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Value</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SND_APPLICATION" /></term>
+        ///                 <description>
+        ///                     The sound is played using an application-specific association.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_ALIAS" /></term>
+        ///                 <description>
+        ///                     The <i>sound</i> parameter is a system-event alias in the registry
+        ///                     or the WIN.INI file.  Do not use with either
+        ///                     <see cref="SND_FILENAME" /> or <see cref="SND_RESOURCE" />.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_ALIAS_ID" /></term>
+        ///                 <description>
+        ///                     The <i>sound</i> parameter is a predefined sound identifier.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_ASYNC" /></term>
+        ///                 <description>
+        ///                     The sound is played asynchronously and <b>PlaySound</b> returns
+        ///                     immediately after beginning the sound.  To terminate an
+        ///                     asynchronously played waveform sound, call <b>PlaySound</b> with
+        ///                     <i>sound</i> set to NULL.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_FILENAME" /></term>
+        ///                 <description>
+        ///                     The <i>sound</i> parameter is a filename.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_LOOP" /></term>
+        ///                 <description>
+        ///                     The sound plays repeatedly until <b>PlaySound</b> is called again
+        ///                     with the <i>sound</i> parameter set to NULL.  You must also
+        ///                     specify the <see cref="SND_ASYNC" /> flag to indicate an
+        ///                     asynchronous sound event.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_MEMORY" /></term>
+        ///                 <description>
+        ///                     A sound event's file is loaded in RAM.  The parameter specified by
+        ///                     <i>sound</i> must point to an image of a sound in memory.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_NODEFAULT" /></term>
+        ///                 <description>
+        ///                     No default sound event is used.  If the sound cannot be found,
+        ///                     <b>PlaySound</b> returns silently without playing the default
+        ///                     sound.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_NOSTOP" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         The specified sound event will yield to another sound event
+        ///                         that is already playing.  If a sound cannot be played because
+        ///                         the resource needed to generate that sound is busy playing
+        ///                         another sound, the function immediately returns FALSE without
+        ///                         playing the requested sound.
+        ///                     </para>
+        ///                     <para>
+        ///                         If this flag is not specified, <b>PlaySound</b> attempts to
+        ///                         stop the currently playing sound so that the device can be
+        ///                         used to play the new sound.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_NOWAIT" /></term>
+        ///                 <description>
+        ///                     If the driver is busy, return immediately without playing the
+        ///                     sound.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_PURGE" /></term>
+        ///                 <description>
+        ///                     <para>
+        ///                         Sounds are to be stopped for the calling task.  If
+        ///                         <i>sound</i> is not NULL, all instances of the specified sound
+        ///                         are stopped.  If <i>sound</i> is NULL, all sounds that are
+        ///                         playing on behalf of the calling task are stopped.
+        ///                     </para>
+        ///                     <para>
+        ///                         You must also specify the instance handle to stop
+        ///                         <see cref="SND_RESOURCE" /> events.
+        ///                     </para>
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_RESOURCE" /></term>
+        ///                 <description>
+        ///                     The <i>sound</i> parameter is a resource identifier; <i>mod</i>
+        ///                     must identify the instance that contains the resource.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SND_SYNC" /></term>
+        ///                 <description>
+        ///                     Synchronous playback of a sound event.  <b>PlaySound</b> returns
+        ///                     after the sound event completes.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns TRUE if successful or FALSE otherwise.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The sound specified by <i>sound</i> must fit into available physical memory
+        ///         and be playable by an installed waveform-audio device driver.
+        ///         <b>PlaySound</b> searches the following directories for sound files: the
+        ///         current directory; the Windows directory; the Windows system directory;
+        ///         directories listed in the PATH environment variable; and the list of
+        ///         directories mapped in a network.  For more information about the directory
+        ///         search order, see the documentation for the <b>OpenFile</b> function.
+        ///     </para>
+        ///     <para>
+        ///         If it cannot find the specified sound, <b>PlaySound</b> uses the default
+        ///         system event sound entry instead.  If the function can find neither the
+        ///         system default entry nor the default sound, it makes no sound and returns
+        ///         FALSE.
+        ///     </para>
+        /// </remarks>
+        // WINMMAPI BOOL WINAPI PlaySoundA(IN LPCSTR pszSound, IN HMODULE hmod, IN DWORD fdwSound);
+        // WINMMAPI BOOL WINAPI PlaySoundW(IN LPCWSTR pszSound, IN HMODULE hmod, IN DWORD fdwSound);
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, CharSet=CharSet.Auto), SuppressUnmanagedCodeSecurity]
+        public static extern Boolean PlaySound(String sound, IntPtr mod, Int32 soundFlags);
+        #endregion Boolean PlaySound(String sound, IntPtr mod, Int32 soundFlags)
+
+        #region timeBeginPeriod(Int32 period)
+        /// <summary>
+        ///     The <b>timeBeginPeriod</b> function sets the minimum timer resolution for an
+        ///     application or device driver.
+        /// </summary>
+        /// <param name="period">
+        ///     Minimum timer resolution, in milliseconds, for the application or device driver.
+        /// </param>
+        /// <returns>
+        ///     Returns <see cref="TIMERR_NOERROR" /> if successful or
+        ///     <see cref="TIMERR_NOCANDO" /> if the resolution specified in <i>period</i> is out
+        ///     of range.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         Call this function immediately before using timer services, and call the
+        ///         <see cref="timeEndPeriod" /> function immediately after you are finished
+        ///         using the timer services.
+        ///     </para>
+        ///     <para>
+        ///         You must match each call to <b>timeBeginPeriod</b> with a call to
+        ///         <see cref="timeEndPeriod" />, specifying the same minimum resolution in both
+        ///         calls.  An application can make multiple <b>timeBeginPeriod</b> calls as long
+        ///         as each call is matched with a call to <see cref="timeEndPeriod" />.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="timeEndPeriod" />
+        // WINMMAPI MMRESULT WINAPI timeBeginPeriod(IN UINT uPeriod);
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 timeBeginPeriod(Int32 period);
+        #endregion timeBeginPeriod(Int32 period)
+
+        #region timeEndPeriod(Int32 period)
+        /// <summary>
+        ///     The <b>timeEndPeriod</b> function clears a previously set minimum timer
+        ///     resolution.
+        /// </summary>
+        /// <param name="period">
+        ///     Minimum timer resolution specified in the previous call to the
+        ///     <see cref="timeBeginPeriod" /> function.
+        /// </param>
+        /// <returns>
+        ///     Returns <see cref="TIMERR_NOERROR" /> if successful or
+        ///     <see cref="TIMERR_NOCANDO" /> if the resolution specified in <i>period</i> is out
+        ///     of range
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         Call this function immediately after you are finished using timer services.
+        ///     </para>
+        ///     <para>
+        ///         You must match each call to <see cref="timeBeginPeriod" /> with a call to
+        ///         <b>timeEndPeriod</b>, specifying the same minimum resolution in both calls.
+        ///         An application can make multiple <see cref="timeBeginPeriod" /> calls as long
+        ///         as each call is matched with a call to <b>timeEndPeriod</b>.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="timeBeginPeriod" />
+        // WINMMAPI MMRESULT WINAPI timeEndPeriod(IN UINT uPeriod)
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 timeEndPeriod(Int32 period);
+        #endregion timeEndPeriod(Int32 period)
+
+        #region Int32 timeGetTime()
+        /// <summary>
+        ///     The <b>timeGetTime</b> function retrieves the system time, in milliseconds.
+        ///     The system time is the time elapsed since Windows was started.
+        /// </summary>
+        /// <returns>
+        ///     Returns the system time, in milliseconds.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The only difference between this function and the <b>timeGetSystemTime</b>
+        ///         function is that <b>timeGetSystemTime</b> uses the <b>MMTIME</b> structure to
+        ///         return the system time.  The <b>timeGetTime</b> function has less overhead
+        ///         than <b>timeGetSystemTime</b>.
+        ///     </para>
+        ///     <para>
+        ///         Note that the value returned by the <b>timeGetTime</b> function is a DWORD
+        ///         value.  The return value wraps around to 0 every 2^32 milliseconds, which is
+        ///         about 49.71 days.  This can cause problems in code that directly uses the
+        ///         <b>timeGetTime</b> return value in computations, particularly where the value
+        ///         is used to control code execution.  You should always use the difference
+        ///         between two <b>timeGetTime</b> return values in computations.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows NT/2000:</b> The default precision of the <b>timeGetTime</b>
+        ///         function can be five milliseconds or more, depending on the machine.  You
+        ///         can use the <see cref="timeBeginPeriod" /> and <see cref="timeEndPeriod" />
+        ///         functions to increase the precision of <b>timeGetTime</b>.  If you do so, the
+        ///         minimum difference between successive values returned by <b>timeGetTime</b>
+        ///         can be as large as the minimum period value set using
+        ///         <see cref="timeBeginPeriod" /> and <see cref="timeEndPeriod" />.  Use the
+        ///         <see cref="Kernel.QueryPerformanceCounter" /> and
+        ///         <see cref="Kernel.QueryPerformanceFrequency" /> functions to measure short
+        ///         time intervals at a high resolution.
+        ///     </para>
+        ///     <para>
+        ///         <b>Windows 95:</b> The default precision of the <b>timeGetTime</b> function is
+        ///         1 millisecond.  In other words, the <b>timeGetTime</b> function can return
+        ///         successive values that differ by just 1 millisecond.  This is true no matter
+        ///         what calls have been made to the <b>timeBeginPeriod</b> and
+        ///         <b>timeEndPeriod</b> functions.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="Kernel.QueryPerformanceCounter" />
+        /// <seealso cref="Kernel.QueryPerformanceFrequency" />
+        /// <seealso cref="timeBeginPeriod" />
+        /// <seealso cref="timeEndPeriod" />
+        // <seealso cref="MMTIME" />
+        // <seealso cref="timeGetSystemTime" />
+        // WINMMAPI DWORD WINAPI timeGetTime(void);
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 timeGetTime();
+        #endregion Int32 timeGetTime()
+
+        #region Int32 joyConfigChanged(Int64 dwFlags)
+        /// <summary>
+        ///     The joyConfigChanged function informs the joystick driver that the configuration has changed and should be reloaded from the registry.
+        /// </summary>
+        /// <param name="dwFlags">
+        ///     Reserved for future use. Must equal zero.
+        /// </param>
+        /// <returns>
+        ///     Returns JOYERR_NOERROR if successful. Returns JOYERR_PARMS if the parameter is non-zero.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         This function causes a window message to be sent to all top-level windows. This message may be defined by applications that need to respond to changes in joystick calibration by using RegisterWindowMessage with the following message ID:
+        ///     </para>
+        ///     <code>
+        ///         #define JOY_CONFIGCHANGED_MSGSTRING     "MSJSTICK_VJOYD_MSGSTR"
+        ///     </code>
+        /// </remarks>
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 joyConfigChanged(Int64 dwFlags);
+        #endregion Int32 joyConfigChanged(Int64 dwFlags)
+
+        #region Int32 joyGetDevCaps(UIntPtr uJoyID, ref JOYCAPS pjc, Int32 cbjc)
+        /// <summary>
+        ///     The joyGetDevCaps function queries a joystick to determine its capabilities.
+        /// </summary>
+        /// <param name="uJoyID">
+        ///     Identifier of the joystick to be queried. Valid values for uJoyID range from -1 to 15. A value of -1 enables retrieval of the szRegKey member of the JOYCAPS structure whether a device is present or not. For Windows NT 4.0, valid values are limited to zero (JOYSTICKID1) and JOYSTICKID2.
+        /// </param>
+        /// <param name="pjc">
+        ///     Pointer to a <see cref="JOYCAPS"/> structure to contain the capabilities of the joystick.
+        /// </param>
+        /// <param name="cbjc"> 
+        ///     Size, in bytes, of the JOYCAPS structure.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         Returns JOYERR_NOERROR if successful or one of the following error values:
+        ///     </para>
+        ///     <para>
+        ///         <see cref="MMSYSERR_NODRIVER"/> - The joystick driver is not present. Windows NT/2000/XP: The specified joystick identifier is invalid.
+        ///         <see cref="MMSYSERR_INVALPARAM"/> - An invalid parameter was passed. Windows 95/98/Me: The specified joystick identifier is invalid.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         Use the <see cref="joyGetNumDevs"/> function to determine the number of joystick devices supported by the driver.
+        ///     </para>
+        ///     <para>
+        ///         Windows NT/2000/XP: This method fails when passed an invalid value for the cbjc parameter.
+        ///         Windows 95/98/Me: This method succeeds when passed an invalid value for the cbjc parameter.
+        ///     </para>
+        /// </remarks>
+        /// <seealso cref="JOYCAPS"/>
+        /// <seealso cref="joyGetNumDevs"/>
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 joyGetDevCaps(IntPtr uJoyID, ref JOYCAPS pjc, Int32 cbjc);
+        #endregion Int32 joyGetDevCaps(IntPtr uJoyID, ref JOYCAPS pjc, Int32 cbjc)
+
+        #region Int32 joyGetNumDevs()
+        /// <summary>
+        ///     The joyGetNumDevs function queries the joystick driver for the number of joysticks it supports.
+        /// </summary>
+        /// <returns>
+        ///     The joyGetNumDevs function returns the number of joysticks supported by the current driver or zero if no driver is installed.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         Use the <see cref="joyGetPos"/> function to determine whether a given joystick is physically attached to the system. If the specified joystick is not connected, joyGetPos returns a <see cref="JOYERR_UNPLUGGED"/> error value.
+        ///     </para>
+        /// </remarks>
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 joyGetNumDevs();
+        #endregion Int32 joyGetNumDevs()
+
+        #region Int32 joyGetPos(Int32 uJoyID, ref JOYINFO pji)
+        /// <summary>
+        ///     The joyGetPos function queries a joystick for its position and button status.
+        /// </summary>
+        /// <param name="uJoyID">
+        ///     Identifier of the joystick to be queried. Valid values for uJoyID range from zero (<see cref="JOYSTICKID1"/>) to 15, except for Windows NT 4.0. For Windows NT 4.0, valid values are limited to <see cref="JOYSTICKID1"/> and <see cref="JOYSTICKID2"/>.
+        /// </param>
+        /// <param name="pji">
+        ///     Pointer to a <see cref="JOYINFO"/> structure that contains the position and button status of the joystick.
+        /// </param>
+        /// <returns>
+        ///     Returns <see cref="JOYERR_NOERROR"/> if successful or one of the following error values.
+        ///     <para>
+        ///         <see cref="MMSYSERR_NODRIVER"/> - The joystick driver is not present.
+        ///         <see cref="MMSYSERR_INVALPARAM"/> - An invalid parameter was passed.
+        ///         <see cref="JOYERR_UNPLUGGED"/> - The specified joystick is not connected to the system.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     For devices that have four to six axes of movement, a point-of-view control, or more than four buttons, use the <see cref="joyGetPosEx"/> function.
+        /// </remarks>
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 joyGetPos(Int32 uJoyID, ref JOYINFO pji);
+        #endregion Int32 joyGetPos(Int32 uJoyID, ref JOYINFO pji)
+
+        #region Int32 joyGetPosEx(Int32 uJoyID, ref JOYINFOEX pji)
+        /// <summary>
+        ///     The joyGetPosEx function queries a joystick for its position and button status.
+        /// </summary>
+        /// <param name="uJoyID">
+        ///     Identifier of the joystick to be queried. Valid values for uJoyID range from zero (<see cref="JOYSTICKID1"/>) to 15, except for Windows NT 4.0. For Windows NT 4.0, valid values are limited to <see cref="JOYSTICKID1"/> and <see cref="JOYSTICKID2"/>.
+        /// </param>
+        /// <param name="pji">
+        ///     Pointer to a <see cref="JOYINFOEX"/> structure that contains extended position information and button status of the joystick. You must set the dwSize and dwFlags members or joyGetPosEx will fail. The information returned from joyGetPosEx depends on the flags you specify in dwFlags.
+        /// </param>
+        /// <returns>
+        ///     Returns JOYERR_NOERROR if successful or one of the following error values.
+        ///     <para>
+        ///         Returns JOYERR_NOERROR if successful or one of the following error values.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="MMSYSERR_NODRIVER"/> - The joystick driver is not present.
+        ///         <see cref="MMSYSERR_INVALPARAM"/> - An invalid parameter was passed. Windows 95/98/Me: The specified joystick identifier is invalid.
+        ///         <see cref="MMSYSERR_BADDEVICEID"/> - Windows 95/98/Me: The specified joystick identifier is invalid.
+        ///         <see cref="JOYERR_UNPLUGGED"/> - The specified joystick is not connected to the system.
+        ///         <see cref="JOYERR_PARMS"/> - Windows NT/2000/XP: The specified joystick identifier is invalid.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     This function provides access to extended devices such as rudder pedals, point-of-view hats, devices with a large number of buttons, and coordinate systems using up to six axes. For joystick devices that use three axes or fewer and have fewer than four buttons, use the joyGetPos function.
+        /// </remarks>
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 joyGetPosEx(Int32 uJoyID, ref JOYINFOEX pji);
+        #endregion Int32 joyGetPosEx(Int32 uJoyID, ref JOYINFOEX pji)
+
+        #region Int32 joyGetThreshold(Int32 uJoyID, UIntPtr puThreshold)
+        /// <summary>
+        ///     The joyGetThreshold function queries a joystick for its current movement threshold.
+        /// </summary>
+        /// <param name="uJoyID">
+        ///     Identifier of the joystick. Valid values for uJoyID range from zero (<see cref="JOYSTICKID1"/>) to 15, except for Windows NT 4.0. For Windows NT 4.0, valid values are limited to <see cref="JOYSTICKID1"/> and <see cref="JOYSTICKID2"/>.
+        /// </param>
+        /// <param name="puThreshold">
+        ///     Pointer to a variable that contains the movement threshold value.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         Returns JOYERR_NOERROR if successful or one of the following error values.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="MMSYSERR_NODRIVER"/> - The joystick driver is not present.
+        ///         <see cref="MMSYSERR_INVALPARAM"/> - An invalid parameter was passed.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     The movement threshold is the distance the joystick must be moved before a joystick position-change message (<see cref="MM_JOY1MOVE"/>, <see cref="MM_JOY1ZMOVE"/>, <see cref="MM_JOY2MOVE"/>, or <see cref="MM_JOY2ZMOVE"/>) is sent to a window that has captured the device. The threshold is initially zero.
+        /// </remarks>
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 joyGetThreshold(Int32 uJoyID, IntPtr puThreshold);
+        #endregion Int32 joyGetThreshold(Int32 uJoyID, UIntPtr puThreshold)
+
+        #region Int32 joyReleaseCapture(Int32 uJoyID)
+        /// <summary>
+        ///     The joyReleaseCapture function releases the specified captured joystick.
+        /// </summary>
+        /// <param name="uJoyID">
+        ///     Identifier of the joystick. Valid values for uJoyID range from zero (<see cref="JOYSTICKID1"/>) to 15, except for Windows NT 4.0. For Windows NT 4.0, valid values are limited to <see cref="JOYSTICKID1"/> and <see cref="JOYSTICKID2"/>.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         Returns <see cref="JOYERR_NOERROR"/> if successful or one of the following error values.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="MMSYSERR_NODRIVER"/> - The joystick driver is not present.
+        ///         <see cref="MMSYSERR_INVALPARAM"/> - Windows 95/98/Me: The specified joystick device identifier uJoyID is invalid. Windows NT/2000/XP: The specified joystick identifier is valid, but the joystick has not been captured.
+        ///         <see cref="JOYERR_PARMS"/> - Windows NT/2000/XP: The specified joystick device identifier uJoyID is invalid.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     Windows 95/98/Me: This method returns JOYERR_NOERROR when passed a valid joystick identifier that has not been captured.
+        /// </remarks>
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 joyReleaseCapture(Int32 uJoyID);
+        #endregion Int32 joyReleaseCapture(Int32 uJoyID)
+
+        #region Int32 joySetCapture(int hwnd, Int32 uJoyID, Int32 uPeriod, bool fChanged)
+        /// <summary>
+        ///     The joySetCature function captures a joystick by causing its messages to be sent to the specified window.
+        /// </summary>
+        /// <param name="hwnd">
+        ///     Handle to the window to receive the joystick messages.
+        /// </param>
+        /// <param name="uJoyID">
+        ///     Identifier of the joystick. Valid values for uJoyID range from zero (<see cref="JOYSTICKID1"/>) to 15, except for Windows NT 4.0. For Windows NT 4.0, valid values are limited to <see cref="JOYSTICKID1"/> and <see cref="JOYSTICKID2"/>.
+        /// </param>
+        /// <param name="uPeriod">
+        ///     Polling frequency, in milliseconds.
+        /// </param>
+        /// <param name="fChanged">
+        ///     Change position flag. Specify TRUE for this parameter to send messages only when the position changes by a value greater than the joystick movement threshold. Otherwise, messages are sent at the polling frequency specified in uPeriod.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         Returns JOYERR_NOERROR if successful or one of the following error values.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="MMSYSERR_NODRIVER"/> - The joystick driver is not present.
+        ///         <see cref="MMSYSERR_INVALPARAM"/> - Windows 95/98/Me: Invalid joystick ID or hwnd is NULL.
+        ///         <see cref="JOYERR_NOCANDO"/> - Cannot capture joystick input because a required service (such as a Windows timer) is unavailable.
+        ///         <see cref="JOYERR_UNPLUGGED"/> - The specified joystick is not connected to the system.
+        ///         <see cref="JOYERR_PARMS"/> - Windows NT/2000/XP: Invalid joystick ID or hwnd is NULL.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     This function fails if the specified joystick is currently captured. Call the joyReleaseCapture function to release the captured joystick, or destroy the window to release the joystick automatically.
+        /// </remarks>
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 joySetCapture(int hwnd, Int32 uJoyID, Int32 uPeriod, bool fChanged);
+        #endregion Int32 joySetCapture(int hwnd, Int32 uJoyID, Int32 uPeriod, bool fChanged)
+
+        #region Int32 joySetThreshold(Int32 uJoyID, Int32 uThreshold)
+        /// <summary>
+        ///     The joySetThreshold function sets the movement threshold of a joystick.
+        /// </summary>
+        /// <param name="uJoyID">
+        ///     Identifier of the joystick. Valid values for uJoyID range from zero (<see cref="JOYSTICKID1"/>) to 15, except for Windows NT 4.0. For Windows NT 4.0, valid values are limited to <see cref="JOYSTICKID1"/> and <see cref="JOYSTICKID2"/>.
+        /// </param>
+        /// <param name="uThreshold">
+        ///     New movement threshold.
+        /// </param>
+        /// <returns>
+        ///     <para>
+        ///         Returns JOYERR_NOERROR if successful or one of the following error values.
+        ///     </para>
+        ///     <para>
+        ///         <see cref="MMSYSERR_NODRIVER"/> - The joystick driver is not present.
+        ///         <see cref="JOYERR_PARMS"/> - The specified joystick device identifier uJoyID is invalid.
+        ///     </para>
+        /// </returns>
+        /// <remarks>
+        ///     The movement threshold is the distance the joystick must be moved before a joystick position-change message (<see cref="MM_JOY1MOVE"/>, <see cref="MM_JOY1ZMOVE"/>, <see cref="MM_JOY2MOVE"/>, or <see cref="MM_JOY2ZMOVE"/>) is sent to a window that has captured the device. The threshold is initially zero.
+        /// </remarks>
+        [DllImport(WINMM_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern Int32 joySetThreshold(Int32 uJoyID, Int32 uThreshold);
+        #endregion Int32 joySetThreshold(Int32 uJoyID, Int32 uThreshold)
+
+    }
+}
\ No newline at end of file
diff --git a/src/Tao.Platform.Windows/tao-platform-windows.pc.in b/src/Tao.Platform.Windows/tao-platform-windows.pc.in
new file mode 100644
index 0000000..3eb1d98
--- /dev/null
+++ b/src/Tao.Platform.Windows/tao-platform-windows.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.Platform.Windows
+Description: Windows-specific section of the Tao framework
+Version: @TAOWINDOWS_VERSION@
+Requires:
+Libs: -r:${libdir}/mono/tao-platform-windows- at TAOWINDOWS_MAJOR@/Tao.Platform.Windows.dll
+
diff --git a/src/Tao.Platform.X11/API.cs b/src/Tao.Platform.X11/API.cs
new file mode 100644
index 0000000..7a6c99e
--- /dev/null
+++ b/src/Tao.Platform.X11/API.cs
@@ -0,0 +1,1069 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+
+namespace Tao.Platform.X11
+{
+    #region Types
+
+    // using XID = System.Int32;
+    using Window = System.IntPtr;
+    using Drawable = System.IntPtr;
+    using Font = System.IntPtr;
+    using Pixmap = System.IntPtr;
+    using Cursor = System.IntPtr;
+    using Colormap = System.IntPtr;
+    using GContext = System.IntPtr;
+    using KeySym = System.IntPtr;
+    using Mask = System.IntPtr;
+    using Atom = System.IntPtr;
+    using VisualID = System.IntPtr;
+    using Time = System.UInt32;
+    using KeyCode = System.Byte;    // Or maybe ushort?
+
+    using Display = System.IntPtr;
+    using XPointer = System.IntPtr;
+
+    #endregion
+
+    #region internal static class API
+
+    internal static class API
+    {
+        // Prevent BeforeFieldInit optimization.
+        static API() { }
+
+        private const string _dll_name = "libX11.so.6";
+        private const string _dll_name_vid = "libXxf86vm.so.1";
+
+        // Display management
+        [DllImport(_dll_name, EntryPoint = "XOpenDisplay")]
+        extern internal static IntPtr OpenDisplay([MarshalAs(UnmanagedType.LPTStr)] string display_name);
+
+        [DllImport(_dll_name, EntryPoint = "XCloseDisplay")]
+        extern internal static void CloseDisplay(Display display);
+
+        [DllImport(_dll_name, EntryPoint = "XCreateColormap")]
+        extern internal static IntPtr CreateColormap(Display display, Window window, IntPtr visual, int alloc);
+
+        #region Window handling
+
+        [DllImport(_dll_name, EntryPoint = "XRootWindow")]
+        internal static extern Window RootWindow(Display display, int screen);
+
+        [DllImport(_dll_name, EntryPoint = "XCreateWindow")]
+        internal extern static Window CreateWindow(
+            Display display,
+            Window parent,
+            int x, int y,
+            //uint width, uint height,
+            int width, int height,
+            //uint border_width,
+            int border_width,
+            int depth,
+            //uint @class,
+            int @class,
+            IntPtr visual,
+            [MarshalAs(UnmanagedType.SysUInt)] CreateWindowMask valuemask,
+            SetWindowAttributes attributes
+        );
+
+        [DllImport(_dll_name, EntryPoint = "XCreateSimpleWindow")]
+        internal extern static Window CreateSimpleWindow(
+            Display display,
+            Window parent,
+            int x, int y,
+            int width, int height,
+            int border_width,
+            long border,
+            long background
+        );
+
+        [DllImport(_dll_name, EntryPoint = "XResizeWindow")]
+        internal extern static int XResizeWindow(Display display, Window window, int width, int height);
+
+        [DllImport(_dll_name, EntryPoint = "XDestroyWindow")]
+        internal extern static void DestroyWindow(Display display, Window window);
+
+        [DllImport(_dll_name, EntryPoint = "XMapWindow")]
+        extern internal static void MapWindow(Display display, Window window);
+
+        [DllImport(_dll_name, EntryPoint = "XMapRaised")]
+        extern internal static void MapRaised(Display display, Window window);
+
+        #endregion
+
+        [DllImport(_dll_name, EntryPoint = "XDefaultScreen")]
+        extern internal static int DefaultScreen(Display display);
+
+        [DllImport(_dll_name, EntryPoint = "XDefaultVisual")]
+        extern internal static IntPtr DefaultVisual(Display display, int screen_number);
+
+        #region XFree
+
+        /// <summary>
+        /// Frees the memory used by an X structure. Only use on unmanaged structures!
+        /// </summary>
+        /// <param name="data">A pointer to the structure that will be freed.</param>
+        [DllImport(_dll_name, EntryPoint = "XFree")]
+        extern internal static void Free(IntPtr data);
+
+        #endregion
+
+        #region Event queue management
+
+        [System.Security.SuppressUnmanagedCodeSecurity]
+        [DllImport(_dll_name, EntryPoint = "XEventsQueued")]
+        extern internal static int EventsQueued(Display display, int mode);
+
+        [System.Security.SuppressUnmanagedCodeSecurity]
+        [DllImport(_dll_name, EntryPoint = "XPending")]
+        extern internal static int Pending(Display display);
+
+        //[System.Security.SuppressUnmanagedCodeSecurity]
+        [DllImport(_dll_name, EntryPoint = "XNextEvent")]
+        extern internal static void NextEvent(
+            Display display,
+            [MarshalAs(UnmanagedType.AsAny)][In, Out]object e);
+
+        [DllImport(_dll_name, EntryPoint = "XNextEvent")]
+        extern internal static void NextEvent(Display display, [In, Out] IntPtr e);
+
+        [DllImport(_dll_name, EntryPoint = "XPeekEvent")]
+        extern internal static void PeekEvent(
+            Display display,
+            [MarshalAs(UnmanagedType.AsAny)][In, Out]object event_return
+        );
+
+        [DllImport(_dll_name, EntryPoint = "XPeekEvent")]
+        extern internal static void PeekEvent(Display display, [In, Out]XEvent event_return);
+
+        [DllImport(_dll_name, EntryPoint = "XSendEvent")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        extern internal static bool SendEvent(Display display, Window window, bool propagate,
+            [MarshalAs(UnmanagedType.SysInt)]EventMask event_mask, ref XEvent event_send);
+
+        /// <summary>
+        /// The XSelectInput() function requests that the X server report the events associated
+        /// with the specified event mask.
+        /// </summary>
+        /// <param name="display">Specifies the connection to the X server.</param>
+        /// <param name="w">Specifies the window whose events you are interested in.</param>
+        /// <param name="event_mask">Specifies the event mask.</param>
+        /// <remarks>
+        /// Initially, X will not report any of these events.
+        /// Events are reported relative to a window.
+        /// If a window is not interested in a device event,
+        /// it usually propagates to the closest ancestor that is interested,
+        /// unless the do_not_propagate mask prohibits it.
+        /// Setting the event-mask attribute of a window overrides any previous call for the same window but not for other clients. Multiple clients can select for the same events on the same window with the following restrictions: 
+        /// <para>Multiple clients can select events on the same window because their event masks are disjoint. When the X server generates an event, it reports it to all interested clients. </para>
+        /// <para>Only one client at a time can select CirculateRequest, ConfigureRequest, or MapRequest events, which are associated with the event mask SubstructureRedirectMask. </para>
+        /// <para>Only one client at a time can select a ResizeRequest event, which is associated with the event mask ResizeRedirectMask. </para>
+        /// <para>Only one client at a time can select a ButtonPress event, which is associated with the event mask ButtonPressMask. </para>
+        /// <para>The server reports the event to all interested clients. </para>
+        /// <para>XSelectInput() can generate a BadWindow error.</para>
+        /// </remarks>
+        [DllImport(_dll_name, EntryPoint = "XSelectInput")]
+        internal static extern void SelectInput(Display display, Window w, EventMask event_mask);
+
+        /// <summary>
+        /// When the predicate procedure finds a match, XCheckIfEvent() copies the matched event into the client-supplied XEvent structure and returns True. (This event is removed from the queue.) If the predicate procedure finds no match, XCheckIfEvent() returns False, and the output buffer will have been flushed. All earlier events stored in the queue are not discarded.
+        /// </summary>
+        /// <param name="display">Specifies the connection to the X server.</param>
+        /// <param name="event_return">Returns a copy of the matched event's associated structure.</param>
+        /// <param name="predicate">Specifies the procedure that is to be called to determine if the next event in the queue matches what you want</param>
+        /// <param name="arg">Specifies the user-supplied argument that will be passed to the predicate procedure.</param>
+        /// <returns>true if the predicate returns true for some event, false otherwise</returns>
+        [DllImport(_dll_name, EntryPoint = "XCheckIfEvent")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        internal static extern bool CheckIfEvent(Display display, ref XEvent event_return,
+            /*[MarshalAs(UnmanagedType.FunctionPtr)] */ CheckEventPredicate predicate, /*XPointer*/ IntPtr arg);
+
+        [DllImport(_dll_name, EntryPoint = "XIfEvent")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        internal static extern bool IfEvent(Display display, ref XEvent event_return,
+            /*[MarshalAs(UnmanagedType.FunctionPtr)] */ CheckEventPredicate predicate, /*XPointer*/ IntPtr arg);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate bool CheckEventPredicate(Display display, ref XEvent @event, IntPtr arg);
+
+        [DllImport(_dll_name, EntryPoint = "XCheckMaskEvent")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        internal static extern bool CheckMaskEvent(Display display, EventMask event_mask, ref XEvent event_return);
+
+        #endregion
+
+        #region Pointer and Keyboard functions
+
+        [DllImport(_dll_name, EntryPoint = "XGrabPointer")]
+        extern internal static ErrorCodes GrabPointer(Display display, IntPtr grab_window,
+            bool owner_events, int event_mask, GrabMode pointer_mode, GrabMode keyboard_mode,
+            IntPtr confine_to, IntPtr cursor, int time);
+
+        [DllImport(_dll_name, EntryPoint = "XUngrabPointer")]
+        extern internal static ErrorCodes UngrabPointer(Display display, int time);
+
+        [DllImport(_dll_name, EntryPoint = "XGrabKeyboard")]
+        extern internal static ErrorCodes GrabKeyboard(Display display, IntPtr grab_window,
+            bool owner_events, GrabMode pointer_mode, GrabMode keyboard_mode, int time);
+
+        [DllImport(_dll_name, EntryPoint = "XUngrabKeyboard")]
+        extern internal static void UngrabKeyboard(Display display, int time);
+
+        /// <summary>
+        /// The XGetKeyboardMapping() function returns the symbols for the specified number of KeyCodes starting with first_keycode.
+        /// </summary>
+        /// <param name="display">Specifies the connection to the X server.</param>
+        /// <param name="first_keycode">Specifies the first KeyCode that is to be returned.</param>
+        /// <param name="keycode_count">Specifies the number of KeyCodes that are to be returned</param>
+        /// <param name="keysyms_per_keycode_return">Returns the number of KeySyms per KeyCode.</param>
+        /// <returns></returns>
+        /// <remarks>
+        /// <para>The value specified in first_keycode must be greater than or equal to min_keycode as returned by XDisplayKeycodes(), or a BadValue error results. In addition, the following expression must be less than or equal to max_keycode as returned by XDisplayKeycodes(): </para>
+        /// <para>first_keycode + keycode_count - 1 </para>
+        /// <para>If this is not the case, a BadValue error results. The number of elements in the KeySyms list is: </para>
+        /// <para>keycode_count * keysyms_per_keycode_return </para>
+        /// <para>KeySym number N, counting from zero, for KeyCode K has the following index in the list, counting from zero: </para>
+        /// <para> (K - first_code) * keysyms_per_code_return + N </para>
+        /// <para>The X server arbitrarily chooses the keysyms_per_keycode_return value to be large enough to report all requested symbols. A special KeySym value of NoSymbol is used to fill in unused elements for individual KeyCodes. To free the storage returned by XGetKeyboardMapping(), use XFree(). </para>
+        /// <para>XGetKeyboardMapping() can generate a BadValue error.</para>
+        /// <para>Diagnostics:</para>
+        /// <para>BadValue:	Some numeric value falls outside the range of values accepted by the request. Unless a specific range is specified for an argument, the full range defined by the argument's type is accepted. Any argument defined as a set of alternatives can generate this error.</para>
+        /// </remarks>
+        [DllImport(_dll_name, EntryPoint = "XGetKeyboardMapping")]
+        internal static extern KeySym GetKeyboardMapping(Display display, KeyCode first_keycode, int keycode_count,
+            ref int keysyms_per_keycode_return);
+
+        /// <summary>
+        /// The XDisplayKeycodes() function returns the min-keycodes and max-keycodes supported by the specified display.
+        /// </summary>
+        /// <param name="display">Specifies the connection to the X server.</param>
+        /// <param name="min_keycodes_return">Returns the minimum number of KeyCodes</param>
+        /// <param name="max_keycodes_return">Returns the maximum number of KeyCodes.</param>
+        /// <remarks> The minimum number of KeyCodes returned is never less than 8, and the maximum number of KeyCodes returned is never greater than 255. Not all KeyCodes in this range are required to have corresponding keys.</remarks>
+        [DllImport(_dll_name, EntryPoint = "XDisplayKeycodes")]
+        internal static extern void DisplayKeycodes(Display display, ref int min_keycodes_return, ref int max_keycodes_return);
+
+        #endregion
+
+        #region Xf86VidMode internal structures
+
+        [StructLayout(LayoutKind.Sequential)]
+        internal struct XF86VidModeModeLine
+        {
+            short hdisplay;   /* Number of display pixels horizontally */
+            short hsyncstart; /* Horizontal sync start */
+            short hsyncend;   /* Horizontal sync end */
+            short htotal;     /* Total horizontal pixels */
+            short vdisplay;   /* Number of display pixels vertically */
+            short vsyncstart; /* Vertical sync start */
+            short vsyncend;   /* Vertical sync start */
+            short vtotal;     /* Total vertical pixels */
+            int flags;      /* Mode flags */
+            int privsize;   /* Size of private */
+            IntPtr _private;   /* Server privates */
+        }
+
+        /// <summary>
+        /// Specifies an XF86 display mode.
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        internal struct XF86VidModeModeInfo
+        {
+            /// <summary>
+            /// Pixel clock.
+            /// </summary>
+            internal int dotclock;
+
+            /// <summary>
+            /// Number of display pixels horizontally
+            /// </summary>
+            internal short hdisplay;
+
+            /// <summary>
+            /// Horizontal sync start
+            /// </summary>
+            internal short hsyncstart;
+
+            /// <summary>
+            /// Horizontal sync end
+            /// </summary>
+            internal short hsyncend;
+
+            /// <summary>
+            /// Total horizontal pixel
+            /// </summary>
+            internal short htotal;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            internal short hskew;
+
+            /// <summary>
+            /// Number of display pixels vertically
+            /// </summary>
+            internal short vdisplay;
+
+            /// <summary>
+            /// Vertical sync start
+            /// </summary>
+            internal short vsyncstart;
+
+            /// <summary>
+            /// Vertical sync end
+            /// </summary>
+            internal short vsyncend;
+
+            /// <summary>
+            /// Total vertical pixels
+            /// </summary>
+            internal short vtotal;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            internal short vskew;
+
+            /// <summary>
+            /// Mode flags
+            /// </summary>
+            internal int flags;
+
+            int privsize;   /* Size of private */
+            IntPtr _private;   /* Server privates */
+        }
+
+        //Monitor information:
+        [StructLayout(LayoutKind.Sequential)]
+        internal struct XF86VidModeMonitor
+        {
+            [MarshalAs(UnmanagedType.LPStr)]
+            string vendor;     /* Name of manufacturer */
+            [MarshalAs(UnmanagedType.LPStr)]
+            string model;      /* Model name */
+            float EMPTY;      /* unused, for backward compatibility */
+            byte nhsync;     /* Number of horiz sync ranges */
+            /*XF86VidModeSyncRange* */
+            IntPtr hsync;/* Horizontal sync ranges */
+            byte nvsync;     /* Number of vert sync ranges */
+            /*XF86VidModeSyncRange* */
+            IntPtr vsync;/* Vertical sync ranges */
+        }
+
+        [StructLayout(LayoutKind.Sequential)]
+        internal struct XF86VidModeSyncRange
+        {
+            float hi;         /* Top of range */
+            float lo;         /* Bottom of range */
+        }
+
+        [StructLayout(LayoutKind.Sequential)]
+        internal struct XF86VidModeNotifyEvent
+        {
+            int type;                      /* of event */
+            ulong serial;          /* # of last request processed by server */
+            bool send_event;               /* true if this came from a SendEvent req */
+            Display display;              /* Display the event was read from */
+            IntPtr root;                   /* root window of event screen */
+            int state;                     /* What happened */
+            int kind;                      /* What happened */
+            bool forced;                   /* extents of new region */
+            /* Time */
+            IntPtr time;                     /* event timestamp */
+        }
+
+        [StructLayout(LayoutKind.Sequential)]
+        internal struct XF86VidModeGamma
+        {
+            float red;                     /* Red Gamma value */
+            float green;                   /* Green Gamma value */
+            float blue;                    /* Blue Gamma value */
+        }
+        #endregion
+
+        #region libXxf86vm Functions
+
+        [DllImport(_dll_name_vid)]
+        extern internal static bool XF86VidModeQueryExtension(
+            Display display,
+            out int event_base_return,
+            out int error_base_return);
+        /*
+        [DllImport(_dll_name_vid)]
+        extern internal static bool XF86VidModeSwitchMode(
+            Display display,
+            int screen,
+            int zoom);
+        */
+
+        [DllImport(_dll_name_vid)]
+        extern internal static bool XF86VidModeSwitchToMode(
+            Display display,
+            int screen,
+            IntPtr
+            /*XF86VidModeModeInfo* */ modeline);
+
+
+        [DllImport(_dll_name_vid)]
+        extern internal static bool XF86VidModeQueryVersion(
+            Display display,
+            out int major_version_return,
+            out int minor_version_return);
+
+        [DllImport(_dll_name_vid)]
+        extern internal static bool XF86VidModeGetAllModeLines(
+            Display display,
+            int screen,
+            out int modecount_return,
+            /*XF86VidModeModeInfo***  <-- yes, that's three *'s. */
+            out IntPtr modesinfo);
+
+        [DllImport(_dll_name_vid)]
+        extern internal static bool XF86VidModeSetViewPort(
+            Display display,
+            int screen,
+            int x,
+            int y);
+
+        /*
+Bool XF86VidModeSetClientVersion(
+    Display *display);
+
+Bool XF86VidModeGetModeLine(
+    Display *display,
+    int screen,
+    int *dotclock_return,
+    XF86VidModeModeLine *modeline);
+
+Bool XF86VidModeDeleteModeLine(
+    Display *display,
+    int screen,
+    XF86VidModeModeInfo *modeline);
+
+Bool XF86VidModeModModeLine(
+    Display *display,
+    int screen,
+    XF86VidModeModeLine *modeline);
+
+Status XF86VidModeValidateModeLine(
+    Display *display,
+    int screen,
+    XF86VidModeModeLine *modeline);
+
+
+Bool XF86VidModeLockModeSwitch(
+    Display *display,
+    int screen,
+    int lock);
+
+Bool XF86VidModeGetMonitor(
+    Display *display,
+    int screen,
+    XF86VidModeMonitor *monitor);
+
+Bool XF86VidModeGetViewPort(
+    Display *display,
+    int screen,
+    int *x_return,
+    int *y_return);
+
+
+XF86VidModeGetDotClocks(
+    Display *display,
+    int screen,
+    int *flags return,
+    int *number of clocks return,
+    int *max dot clock return,
+    int **clocks return);
+
+XF86VidModeGetGamma(
+    Display *display,
+    int screen,
+    XF86VidModeGamma *Gamma);
+
+XF86VidModeSetGamma(
+    Display *display,
+    int screen,
+    XF86VidModeGamma *Gamma);
+
+XF86VidModeGetGammaRamp(
+    Display *display,
+    int screen,
+    int size,
+    unsigned short *red array,
+    unsigned short *green array,
+    unsigned short *blue array);
+
+XF86VidModeSetGammaRamp(
+    Display *display,
+    int screen,
+    int size,
+    unsigned short *red array,
+    unsigned short *green array,
+    unsigned short *blue array);
+
+XF86VidModeGetGammaRampSize(
+    Display *display,
+    int screen,
+    int *size);
+         * */
+
+        #endregion
+
+        [DllImport(_dll_name, EntryPoint = "XLookupKeysym")]
+        internal static extern KeySym LookupKeysym(ref XKeyEvent key_event, int index);
+
+    }
+    #endregion
+
+    #region X11 Structures
+
+    #region internal class VisualInfo
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public class VisualInfo
+    {
+        internal IntPtr visual;
+        internal int visualid;
+        internal int screen;
+        internal int depth;
+        internal int @class;
+        internal long redMask;
+        internal long greenMask;
+        internal long blueMask;
+        internal int colormap_size;
+        internal int bits_per_rgb;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public override string ToString()
+        {
+            // return base.ToString();
+            return String.Format("id ({0}), screen ({1}), depth ({2}), class ({3})",
+                visualid, screen, depth, @class);
+        }
+    }
+
+    #endregion
+
+    #region internal class SetWindowAttributes
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal class SetWindowAttributes
+    {
+        /// <summary>
+        /// background, None, or ParentRelative
+        /// </summary>
+        internal Pixmap background_pixmap;
+        /// <summary>
+        /// background pixel
+        /// </summary>
+        internal long background_pixel;
+        /// <summary>
+        /// border of the window or CopyFromParent
+        /// </summary>
+        internal Pixmap border_pixmap;
+        /// <summary>
+        /// border pixel value
+        /// </summary>
+        internal long border_pixel;
+        /// <summary>
+        /// one of bit gravity values
+        /// </summary>
+        internal int bit_gravity;
+        /// <summary>
+        /// one of the window gravity values
+        /// </summary>
+        internal int win_gravity;
+        /// <summary>
+        /// NotUseful, WhenMapped, Always
+        /// </summary>
+        internal int backing_store;
+        /// <summary>
+        /// planes to be preserved if possible
+        /// </summary>
+        internal long backing_planes;
+        /// <summary>
+        /// value to use in restoring planes
+        /// </summary>
+        internal long backing_pixel;
+        /// <summary>
+        /// should bits under be saved? (popups)
+        /// </summary>
+        internal bool save_under;
+        /// <summary>
+        /// set of events that should be saved
+        /// </summary>
+        internal EventMask event_mask;
+        /// <summary>
+        /// set of events that should not propagate
+        /// </summary>
+        internal long do_not_propagate_mask;
+        /// <summary>
+        /// boolean value for override_redirect
+        /// </summary>
+        internal bool override_redirect;
+        /// <summary>
+        /// color map to be associated with window
+        /// </summary>
+        internal Colormap colormap;
+        /// <summary>
+        /// cursor to be displayed (or None)
+        /// </summary>
+        internal Cursor cursor;
+    }
+
+    #endregion
+
+    #region internal struct SizeHints
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct SizeHints
+    {
+        internal long flags;         /* marks which fields in this structure are defined */
+        internal int x, y;           /* Obsolete */
+        internal int width, height;  /* Obsolete */
+        internal int min_width, min_height;
+        internal int max_width, max_height;
+        internal int width_inc, height_inc;
+        internal Rectangle min_aspect, max_aspect;
+        internal int base_width, base_height;
+        internal int win_gravity;
+        internal struct Rectangle
+        {
+            internal int x;       /* numerator */
+            internal int y;       /* denominator */
+            private void stop_the_compiler_warnings() { x = y = 0; }
+        }
+        /* this structure may be extended in the future */
+    }
+
+    #endregion
+
+    #endregion
+
+    #region X11 Constants and Enums
+
+    internal struct Constants
+    {
+        internal const int QueuedAlready = 0;
+        internal const int QueuedAfterReading = 1;
+        internal const int QueuedAfterFlush = 2;
+
+        internal const int CopyFromParent	= 0;
+        internal const int CWX = 1;
+        internal const int InputOutput = 1;
+        internal const int InputOnly = 2;
+    }
+
+    internal enum ErrorCodes : int
+    {
+        Success = 0,
+        BadRequest = 1,
+        BadValue = 2,
+        BadWindow = 3,
+        BadPixmap = 4,
+        BadAtom = 5,
+        BadCursor = 6,
+        BadFont = 7,
+        BadMatch = 8,
+        BadDrawable = 9,
+        BadAccess = 10,
+        BadAlloc = 11,
+        BadColor = 12,
+        BadGC = 13,
+        BadIDChoice = 14,
+        BadName = 15,
+        BadLength = 16,
+        BadImplementation = 17,
+    }
+
+    [Flags]
+    internal enum CreateWindowMask : long//: ulong
+    {
+        CWBackPixmap	= (1L<<0),
+        CWBackPixel     = (1L<<1),
+        CWSaveUnder	    = (1L<<10),
+        CWEventMask	    = (1L<<11),
+        CWDontPropagate	= (1L<<12),
+        CWColormap  	= (1L<<13),
+        CWCursor	    = (1L<<14),
+        CWBorderPixmap	= (1L<<2),
+        CWBorderPixel	= (1L<<3),
+        CWBitGravity	= (1L<<4),
+        CWWinGravity	= (1L<<5),
+        CWBackingStore	= (1L<<6),
+        CWBackingPlanes	= (1L<<7),
+        CWBackingPixel 	= (1L<<8),
+        CWOverrideRedirect	= (1L<<9),
+
+        //CWY	= (1<<1),
+        //CWWidth	= (1<<2),
+        //CWHeight	= (1<<3),
+        //CWBorderWidth	= (1<<4),
+        //CWSibling	= (1<<5),
+        //CWStackMode	= (1<<6),
+    }
+
+    #region XKey
+
+    /// <summary>
+    /// Defines LATIN-1 and miscellaneous keys.
+    /// </summary>
+    internal enum XKey
+    {
+        /*
+         * TTY function keys, cleverly chosen to map to ASCII, for convenience of
+         * programming, but could have been arbitrary (at the cost of lookup
+         * tables in client code).
+         */
+
+        BackSpace                   = 0xff08,  /* Back space, back char */
+        Tab                         = 0xff09,
+        Linefeed                    = 0xff0a,  /* Linefeed, LF */
+        Clear                       = 0xff0b,
+        Return                      = 0xff0d,  /* Return, enter */
+        Pause                       = 0xff13,  /* Pause, hold */
+        Scroll_Lock                 = 0xff14,
+        Sys_Req                     = 0xff15,
+        Escape                      = 0xff1b,
+        Delete                      = 0xffff,  /* Delete, rubout */
+
+
+
+        /* International & multi-key character composition */
+
+        Multi_key                   = 0xff20,  /* Multi-key character compose */
+        Codeinput                   = 0xff37,
+        SingleCandidate             = 0xff3c,
+        MultipleCandidate           = 0xff3d,
+        PreviousCandidate           = 0xff3e,
+                
+        /* Japanese keyboard support */
+
+        Kanji                       = 0xff21,  /* Kanji, Kanji convert */
+        Muhenkan                    = 0xff22,  /* Cancel Conversion */
+        Henkan_Mode                 = 0xff23,  /* Start/Stop Conversion */
+        Henkan                      = 0xff23,  /* Alias for Henkan_Mode */
+        Romaji                      = 0xff24,  /* to Romaji */
+        Hiragana                    = 0xff25,  /* to Hiragana */
+        Katakana                    = 0xff26,  /* to Katakana */
+        Hiragana_Katakana           = 0xff27,  /* Hiragana/Katakana toggle */
+        Zenkaku                     = 0xff28,  /* to Zenkaku */
+        Hankaku                     = 0xff29,  /* to Hankaku */
+        Zenkaku_Hankaku             = 0xff2a,  /* Zenkaku/Hankaku toggle */
+        Touroku                     = 0xff2b,  /* Add to Dictionary */
+        Massyo                      = 0xff2c,  /* Delete from Dictionary */
+        Kana_Lock                   = 0xff2d,  /* Kana Lock */
+        Kana_Shift                  = 0xff2e,  /* Kana Shift */
+        Eisu_Shift                  = 0xff2f,  /* Alphanumeric Shift */
+        Eisu_toggle                 = 0xff30,  /* Alphanumeric toggle */
+        Kanji_Bangou                = 0xff37,  /* Codeinput */
+        Zen_Koho                    = 0xff3d,  /* Multiple/All Candidate(s) */
+        Mae_Koho                    = 0xff3e,  /* Previous Candidate */
+
+        /* 0xff31 thru 0xff3f are under XK_KOREAN */
+
+        /* Cursor control & motion */
+
+        Home                        = 0xff50,
+        Left                        = 0xff51,  /* Move left, left arrow */
+        Up                          = 0xff52,  /* Move up, up arrow */
+        Right                       = 0xff53,  /* Move right, right arrow */
+        Down                        = 0xff54,  /* Move down, down arrow */
+        Prior                       = 0xff55,  /* Prior, previous */
+        Page_Up                     = 0xff55,
+        Next                        = 0xff56,  /* Next */
+        Page_Down                   = 0xff56,
+        End                         = 0xff57,  /* EOL */
+        Begin                       = 0xff58,  /* BOL */
+
+
+        /* Misc functions */
+
+        Select                      = 0xff60,  /* Select, mark */
+        Print                       = 0xff61,
+        Execute                     = 0xff62,  /* Execute, run, do */
+        Insert                      = 0xff63,  /* Insert, insert here */
+        Undo                        = 0xff65,
+        Redo                        = 0xff66,  /* Redo, again */
+        Menu                        = 0xff67,
+        Find                        = 0xff68,  /* Find, search */
+        Cancel                      = 0xff69,  /* Cancel, stop, abort, exit */
+        Help                        = 0xff6a,  /* Help */
+        Break                       = 0xff6b,
+        Mode_switch                 = 0xff7e,  /* Character set switch */
+        script_switch               = 0xff7e,  /* Alias for mode_switch */
+        Num_Lock                    = 0xff7f,
+
+        /* Keypad functions, keypad numbers cleverly chosen to map to ASCII */
+
+        KP_Space                    = 0xff80,  /* Space */
+        KP_Tab                      = 0xff89,
+        KP_Enter                    = 0xff8d,  /* Enter */
+        KP_F1                       = 0xff91,  /* PF1, KP_A, ... */
+        KP_F2                       = 0xff92,
+        KP_F3                       = 0xff93,
+        KP_F4                       = 0xff94,
+        KP_Home                     = 0xff95,
+        KP_Left                     = 0xff96,
+        KP_Up                       = 0xff97,
+        KP_Right                    = 0xff98,
+        KP_Down                     = 0xff99,
+        KP_Prior                    = 0xff9a,
+        KP_Page_Up                  = 0xff9a,
+        KP_Next                     = 0xff9b,
+        KP_Page_Down                = 0xff9b,
+        KP_End                      = 0xff9c,
+        KP_Begin                    = 0xff9d,
+        KP_Insert                   = 0xff9e,
+        KP_Delete                   = 0xff9f,
+        KP_Equal                    = 0xffbd,  /* Equals */
+        KP_Multiply                 = 0xffaa,
+        KP_Add                      = 0xffab,
+        KP_Separator                = 0xffac,  /* Separator, often comma */
+        KP_Subtract                 = 0xffad,
+        KP_Decimal                  = 0xffae,
+        KP_Divide                   = 0xffaf,
+
+        KP_0                        = 0xffb0,
+        KP_1                        = 0xffb1,
+        KP_2                        = 0xffb2,
+        KP_3                        = 0xffb3,
+        KP_4                        = 0xffb4,
+        KP_5                        = 0xffb5,
+        KP_6                        = 0xffb6,
+        KP_7                        = 0xffb7,
+        KP_8                        = 0xffb8,
+        KP_9                        = 0xffb9,
+
+        /*
+         * Auxiliary functions; note the duplicate definitions for left and right
+         * function keys;  Sun keyboards and a few other manufacturers have such
+         * function key groups on the left and/or right sides of the keyboard.
+         * We've not found a keyboard with more than 35 function keys total.
+         */
+
+        F1                          = 0xffbe,
+        F2                          = 0xffbf,
+        F3                          = 0xffc0,
+        F4                          = 0xffc1,
+        F5                          = 0xffc2,
+        F6                          = 0xffc3,
+        F7                          = 0xffc4,
+        F8                          = 0xffc5,
+        F9                          = 0xffc6,
+        F10                         = 0xffc7,
+        F11                         = 0xffc8,
+        L1                          = 0xffc8,
+        F12                         = 0xffc9,
+        L2                          = 0xffc9,
+        F13                         = 0xffca,
+        L3                          = 0xffca,
+        F14                         = 0xffcb,
+        L4                          = 0xffcb,
+        F15                         = 0xffcc,
+        L5                          = 0xffcc,
+        F16                         = 0xffcd,
+        L6                          = 0xffcd,
+        F17                         = 0xffce,
+        L7                          = 0xffce,
+        F18                         = 0xffcf,
+        L8                          = 0xffcf,
+        F19                         = 0xffd0,
+        L9                          = 0xffd0,
+        F20                         = 0xffd1,
+        L10                         = 0xffd1,
+        F21                         = 0xffd2,
+        R1                          = 0xffd2,
+        F22                         = 0xffd3,
+        R2                          = 0xffd3,
+        F23                         = 0xffd4,
+        R3                          = 0xffd4,
+        F24                         = 0xffd5,
+        R4                          = 0xffd5,
+        F25                         = 0xffd6,
+        R5                          = 0xffd6,
+        F26                         = 0xffd7,
+        R6                          = 0xffd7,
+        F27                         = 0xffd8,
+        R7                          = 0xffd8,
+        F28                         = 0xffd9,
+        R8                          = 0xffd9,
+        F29                         = 0xffda,
+        R9                          = 0xffda,
+        F30                         = 0xffdb,
+        R10                         = 0xffdb,
+        F31                         = 0xffdc,
+        R11                         = 0xffdc,
+        F32                         = 0xffdd,
+        R12                         = 0xffdd,
+        F33                         = 0xffde,
+        R13                         = 0xffde,
+        F34                         = 0xffdf,
+        R14                         = 0xffdf,
+        F35                         = 0xffe0,
+        R15                         = 0xffe0,
+
+        /* Modifiers */
+
+        Shift_L                     = 0xffe1,  /* Left shift */
+        Shift_R                     = 0xffe2,  /* Right shift */
+        Control_L                   = 0xffe3,  /* Left control */
+        Control_R                   = 0xffe4,  /* Right control */
+        Caps_Lock                   = 0xffe5,  /* Caps lock */
+        Shift_Lock                  = 0xffe6,  /* Shift lock */
+
+        Meta_L                      = 0xffe7,  /* Left meta */
+        Meta_R                      = 0xffe8,  /* Right meta */
+        Alt_L                       = 0xffe9,  /* Left alt */
+        Alt_R                       = 0xffea,  /* Right alt */
+        Super_L                     = 0xffeb,  /* Left super */
+        Super_R                     = 0xffec,  /* Right super */
+        Hyper_L                     = 0xffed,  /* Left hyper */
+        Hyper_R                     = 0xffee,  /* Right hyper */
+
+        /*
+         * Latin 1
+         * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF)
+         * Byte 3 = 0
+         */
+
+        space                       = 0x0020,  /* U+0020 SPACE */
+        exclam                      = 0x0021,  /* U+0021 EXCLAMATION MARK */
+        quotedbl                    = 0x0022,  /* U+0022 QUOTATION MARK */
+        numbersign                  = 0x0023,  /* U+0023 NUMBER SIGN */
+        dollar                      = 0x0024,  /* U+0024 DOLLAR SIGN */
+        percent                     = 0x0025,  /* U+0025 PERCENT SIGN */
+        ampersand                   = 0x0026,  /* U+0026 AMPERSAND */
+        apostrophe                  = 0x0027,  /* U+0027 APOSTROPHE */
+        quoteright                  = 0x0027,  /* deprecated */
+        parenleft                   = 0x0028,  /* U+0028 LEFT PARENTHESIS */
+        parenright                  = 0x0029,  /* U+0029 RIGHT PARENTHESIS */
+        asterisk                    = 0x002a,  /* U+002A ASTERISK */
+        plus                        = 0x002b,  /* U+002B PLUS SIGN */
+        comma                       = 0x002c,  /* U+002C COMMA */
+        minus                       = 0x002d,  /* U+002D HYPHEN-MINUS */
+        period                      = 0x002e,  /* U+002E FULL STOP */
+        slash                       = 0x002f,  /* U+002F SOLIDUS */
+        Number0                           = 0x0030,  /* U+0030 DIGIT ZERO */
+        Number1                           = 0x0031,  /* U+0031 DIGIT ONE */
+        Number2                           = 0x0032,  /* U+0032 DIGIT TWO */
+        Number3                           = 0x0033,  /* U+0033 DIGIT THREE */
+        Number4                           = 0x0034,  /* U+0034 DIGIT FOUR */
+        Number5                           = 0x0035,  /* U+0035 DIGIT FIVE */
+        Number6                           = 0x0036,  /* U+0036 DIGIT SIX */
+        Number7                           = 0x0037,  /* U+0037 DIGIT SEVEN */
+        Number8                           = 0x0038,  /* U+0038 DIGIT EIGHT */
+        Number9                     = 0x0039,  /* U+0039 DIGIT NINE */
+        colon                       = 0x003a,  /* U+003A COLON */
+        semicolon                   = 0x003b,  /* U+003B SEMICOLON */
+        less                        = 0x003c,  /* U+003C LESS-THAN SIGN */
+        equal                       = 0x003d,  /* U+003D EQUALS SIGN */
+        greater                     = 0x003e,  /* U+003E GREATER-THAN SIGN */
+        question                    = 0x003f,  /* U+003F QUESTION MARK */
+        at                          = 0x0040,  /* U+0040 COMMERCIAL AT */
+        A                           = 0x0041,  /* U+0041 LATIN CAPITAL LETTER A */
+        B                           = 0x0042,  /* U+0042 LATIN CAPITAL LETTER B */
+        C                           = 0x0043,  /* U+0043 LATIN CAPITAL LETTER C */
+        D                           = 0x0044,  /* U+0044 LATIN CAPITAL LETTER D */
+        E                           = 0x0045,  /* U+0045 LATIN CAPITAL LETTER E */
+        F                           = 0x0046,  /* U+0046 LATIN CAPITAL LETTER F */
+        G                           = 0x0047,  /* U+0047 LATIN CAPITAL LETTER G */
+        H                           = 0x0048,  /* U+0048 LATIN CAPITAL LETTER H */
+        I                           = 0x0049,  /* U+0049 LATIN CAPITAL LETTER I */
+        J                           = 0x004a,  /* U+004A LATIN CAPITAL LETTER J */
+        K                           = 0x004b,  /* U+004B LATIN CAPITAL LETTER K */
+        L                           = 0x004c,  /* U+004C LATIN CAPITAL LETTER L */
+        M                           = 0x004d,  /* U+004D LATIN CAPITAL LETTER M */
+        N                           = 0x004e,  /* U+004E LATIN CAPITAL LETTER N */
+        O                           = 0x004f,  /* U+004F LATIN CAPITAL LETTER O */
+        P                           = 0x0050,  /* U+0050 LATIN CAPITAL LETTER P */
+        Q                           = 0x0051,  /* U+0051 LATIN CAPITAL LETTER Q */
+        R                           = 0x0052,  /* U+0052 LATIN CAPITAL LETTER R */
+        S                           = 0x0053,  /* U+0053 LATIN CAPITAL LETTER S */
+        T                           = 0x0054,  /* U+0054 LATIN CAPITAL LETTER T */
+        U                           = 0x0055,  /* U+0055 LATIN CAPITAL LETTER U */
+        V                           = 0x0056,  /* U+0056 LATIN CAPITAL LETTER V */
+        W                           = 0x0057,  /* U+0057 LATIN CAPITAL LETTER W */
+        X                           = 0x0058,  /* U+0058 LATIN CAPITAL LETTER X */
+        Y                           = 0x0059,  /* U+0059 LATIN CAPITAL LETTER Y */
+        Z                           = 0x005a,  /* U+005A LATIN CAPITAL LETTER Z */
+        bracketleft                 = 0x005b,  /* U+005B LEFT SQUARE BRACKET */
+        backslash                   = 0x005c,  /* U+005C REVERSE SOLIDUS */
+        bracketright                = 0x005d,  /* U+005D RIGHT SQUARE BRACKET */
+        asciicircum                 = 0x005e,  /* U+005E CIRCUMFLEX ACCENT */
+        underscore                  = 0x005f,  /* U+005F LOW LINE */
+        grave                       = 0x0060,  /* U+0060 GRAVE ACCENT */
+        quoteleft                   = 0x0060,  /* deprecated */
+        a                           = 0x0061,  /* U+0061 LATIN SMALL LETTER A */
+        b                           = 0x0062,  /* U+0062 LATIN SMALL LETTER B */
+        c                           = 0x0063,  /* U+0063 LATIN SMALL LETTER C */
+        d                           = 0x0064,  /* U+0064 LATIN SMALL LETTER D */
+        e                           = 0x0065,  /* U+0065 LATIN SMALL LETTER E */
+        f                           = 0x0066,  /* U+0066 LATIN SMALL LETTER F */
+        g                           = 0x0067,  /* U+0067 LATIN SMALL LETTER G */
+        h                           = 0x0068,  /* U+0068 LATIN SMALL LETTER H */
+        i                           = 0x0069,  /* U+0069 LATIN SMALL LETTER I */
+        j                           = 0x006a,  /* U+006A LATIN SMALL LETTER J */
+        k                           = 0x006b,  /* U+006B LATIN SMALL LETTER K */
+        l                           = 0x006c,  /* U+006C LATIN SMALL LETTER L */
+        m                           = 0x006d,  /* U+006D LATIN SMALL LETTER M */
+        n                           = 0x006e,  /* U+006E LATIN SMALL LETTER N */
+        o                           = 0x006f,  /* U+006F LATIN SMALL LETTER O */
+        p                           = 0x0070,  /* U+0070 LATIN SMALL LETTER P */
+        q                           = 0x0071,  /* U+0071 LATIN SMALL LETTER Q */
+        r                           = 0x0072,  /* U+0072 LATIN SMALL LETTER R */
+        s                           = 0x0073,  /* U+0073 LATIN SMALL LETTER S */
+        t                           = 0x0074,  /* U+0074 LATIN SMALL LETTER T */
+        u                           = 0x0075,  /* U+0075 LATIN SMALL LETTER U */
+        v                           = 0x0076,  /* U+0076 LATIN SMALL LETTER V */
+        w                           = 0x0077,  /* U+0077 LATIN SMALL LETTER W */
+        x                           = 0x0078,  /* U+0078 LATIN SMALL LETTER X */
+        y                           = 0x0079,  /* U+0079 LATIN SMALL LETTER Y */
+        z                           = 0x007a,  /* U+007A LATIN SMALL LETTER Z */
+        braceleft                   = 0x007b,  /* U+007B LEFT CURLY BRACKET */
+        bar                         = 0x007c,  /* U+007C VERTICAL LINE */
+        braceright                  = 0x007d,  /* U+007D RIGHT CURLY BRACKET */
+        asciitilde                  = 0x007e,  /* U+007E TILDE */
+    }
+
+    #endregion
+
+    #endregion
+}
diff --git a/src/Tao.Platform.X11/AUTHORS b/src/Tao.Platform.X11/AUTHORS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Platform.X11/COPYING b/src/Tao.Platform.X11/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.Platform.X11/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.Platform.X11/ChangeLog b/src/Tao.Platform.X11/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Platform.X11/Functions.cs b/src/Tao.Platform.X11/Functions.cs
new file mode 100644
index 0000000..0e9c4f6
--- /dev/null
+++ b/src/Tao.Platform.X11/Functions.cs
@@ -0,0 +1,344 @@
+#region License
+/*
+MIT License
+Copyright ©2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+
+namespace Tao.Platform.X11
+{
+    class Functions
+    {
+        [DllImport("libX11", EntryPoint = "XOpenDisplay")]
+        internal extern static IntPtr XOpenDisplay(IntPtr display);
+        [DllImport("libX11", EntryPoint = "XCloseDisplay")]
+        internal extern static int XCloseDisplay(IntPtr display);
+        [DllImport("libX11", EntryPoint = "XSynchronize")]
+        internal extern static IntPtr XSynchronize(IntPtr display, bool onoff);
+
+        [DllImport("libX11", EntryPoint = "XCreateWindow")]
+        internal extern static IntPtr XCreateWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, int depth, int xclass, IntPtr visual, UIntPtr valuemask, ref XSetWindowAttributes attributes);
+        [DllImport("libX11", EntryPoint = "XCreateSimpleWindow")]
+        internal extern static IntPtr XCreateSimpleWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, UIntPtr border, UIntPtr background);
+        [DllImport("libX11", EntryPoint = "XMapWindow")]
+        internal extern static int XMapWindow(IntPtr display, IntPtr window);
+        [DllImport("libX11", EntryPoint = "XUnmapWindow")]
+        internal extern static int XUnmapWindow(IntPtr display, IntPtr window);
+        [DllImport("libX11", EntryPoint = "XMapSubwindows")]
+        internal extern static int XMapSubindows(IntPtr display, IntPtr window);
+        [DllImport("libX11", EntryPoint = "XUnmapSubwindows")]
+        internal extern static int XUnmapSubwindows(IntPtr display, IntPtr window);
+        [DllImport("libX11", EntryPoint = "XRootWindow")]
+        internal extern static IntPtr XRootWindow(IntPtr display, int screen_number);
+        [DllImport("libX11", EntryPoint = "XNextEvent")]
+        internal extern static IntPtr XNextEvent(IntPtr display, ref XEvent xevent);
+        [DllImport("libX11")]
+        internal extern static int XConnectionNumber(IntPtr diplay);
+        [DllImport("libX11")]
+        internal extern static int XPending(IntPtr diplay);
+        [DllImport("libX11", EntryPoint = "XSelectInput")]
+        internal extern static IntPtr XSelectInput(IntPtr display, IntPtr window, IntPtr mask);
+
+        [DllImport("libX11", EntryPoint = "XDestroyWindow")]
+        internal extern static int XDestroyWindow(IntPtr display, IntPtr window);
+
+        [DllImport("libX11", EntryPoint = "XReparentWindow")]
+        internal extern static int XReparentWindow(IntPtr display, IntPtr window, IntPtr parent, int x, int y);
+        [DllImport("libX11", EntryPoint = "XMoveResizeWindow")]
+        internal extern static int XMoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height);
+
+        [DllImport("libX11", EntryPoint = "XResizeWindow")]
+        internal extern static int XResizeWindow(IntPtr display, IntPtr window, int width, int height);
+
+        [DllImport("libX11", EntryPoint = "XGetWindowAttributes")]
+        internal extern static int XGetWindowAttributes(IntPtr display, IntPtr window, ref XWindowAttributes attributes);
+
+        [DllImport("libX11", EntryPoint = "XFlush")]
+        internal extern static int XFlush(IntPtr display);
+
+        [DllImport("libX11", EntryPoint = "XSetWMName")]
+        internal extern static int XSetWMName(IntPtr display, IntPtr window, ref XTextProperty text_prop);
+
+        [DllImport("libX11", EntryPoint = "XStoreName")]
+        internal extern static int XStoreName(IntPtr display, IntPtr window, string window_name);
+
+        [DllImport("libX11", EntryPoint = "XFetchName")]
+        internal extern static int XFetchName(IntPtr display, IntPtr window, ref IntPtr window_name);
+
+        [DllImport("libX11", EntryPoint = "XSendEvent")]
+        internal extern static int XSendEvent(IntPtr display, IntPtr window, bool propagate, IntPtr event_mask, ref XEvent send_event);
+
+        [DllImport("libX11", EntryPoint = "XQueryTree")]
+        internal extern static int XQueryTree(IntPtr display, IntPtr window, out IntPtr root_return, out IntPtr parent_return, out IntPtr children_return, out int nchildren_return);
+
+        [DllImport("libX11", EntryPoint = "XFree")]
+        internal extern static int XFree(IntPtr data);
+
+        [DllImport("libX11", EntryPoint = "XRaiseWindow")]
+        internal extern static int XRaiseWindow(IntPtr display, IntPtr window);
+
+        [DllImport("libX11", EntryPoint = "XLowerWindow")]
+        internal extern static uint XLowerWindow(IntPtr display, IntPtr window);
+
+        [DllImport("libX11", EntryPoint = "XConfigureWindow")]
+        internal extern static uint XConfigureWindow(IntPtr display, IntPtr window, ChangeWindowFlags value_mask, ref XWindowChanges values);
+
+        [DllImport("libX11", EntryPoint = "XInternAtom")]
+        internal extern static IntPtr XInternAtom(IntPtr display, string atom_name, bool only_if_exists);
+
+        [DllImport("libX11", EntryPoint = "XInternAtoms")]
+        internal extern static int XInternAtoms(IntPtr display, string[] atom_names, int atom_count, bool only_if_exists, IntPtr[] atoms);
+
+        [DllImport("libX11", EntryPoint = "XSetWMProtocols")]
+        internal extern static int XSetWMProtocols(IntPtr display, IntPtr window, IntPtr[] protocols, int count);
+
+        [DllImport("libX11", EntryPoint = "XGrabPointer")]
+        internal extern static int XGrabPointer(IntPtr display, IntPtr window, bool owner_events, EventMask event_mask, GrabMode pointer_mode, GrabMode keyboard_mode, IntPtr confine_to, IntPtr cursor, IntPtr timestamp);
+
+        [DllImport("libX11", EntryPoint = "XUngrabPointer")]
+        internal extern static int XUngrabPointer(IntPtr display, IntPtr timestamp);
+
+        [DllImport("libX11", EntryPoint = "XQueryPointer")]
+        internal extern static bool XQueryPointer(IntPtr display, IntPtr window, out IntPtr root, out IntPtr child, out int root_x, out int root_y, out int win_x, out int win_y, out int keys_buttons);
+
+        [DllImport("libX11", EntryPoint = "XTranslateCoordinates")]
+        internal extern static bool XTranslateCoordinates(IntPtr display, IntPtr src_w, IntPtr dest_w, int src_x, int src_y, out int intdest_x_return, out int dest_y_return, out IntPtr child_return);
+
+        [DllImport("libX11", EntryPoint = "XGetGeometry")]
+        internal extern static bool XGetGeometry(IntPtr display, IntPtr window, out IntPtr root, out int x, out int y, out int width, out int height, out int border_width, out int depth);
+
+        [DllImport("libX11", EntryPoint = "XGetGeometry")]
+        internal extern static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, out int x, out int y, out int width, out int height, IntPtr border_width, IntPtr depth);
+
+        [DllImport("libX11", EntryPoint = "XGetGeometry")]
+        internal extern static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, out int x, out int y, IntPtr width, IntPtr height, IntPtr border_width, IntPtr depth);
+
+        [DllImport("libX11", EntryPoint = "XGetGeometry")]
+        internal extern static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, IntPtr x, IntPtr y, out int width, out int height, IntPtr border_width, IntPtr depth);
+
+        [DllImport("libX11", EntryPoint = "XWarpPointer")]
+        internal extern static uint XWarpPointer(IntPtr display, IntPtr src_w, IntPtr dest_w, int src_x, int src_y, uint src_width, uint src_height, int dest_x, int dest_y);
+
+        [DllImport("libX11", EntryPoint = "XClearWindow")]
+        internal extern static int XClearWindow(IntPtr display, IntPtr window);
+
+        [DllImport("libX11", EntryPoint = "XClearArea")]
+        internal extern static int XClearArea(IntPtr display, IntPtr window, int x, int y, int width, int height, bool exposures);
+
+        // Colormaps
+        [DllImport("libX11", EntryPoint = "XDefaultScreenOfDisplay")]
+        internal extern static IntPtr XDefaultScreenOfDisplay(IntPtr display);
+
+        [DllImport("libX11", EntryPoint = "XScreenNumberOfScreen")]
+        internal extern static int XScreenNumberOfScreen(IntPtr display, IntPtr Screen);
+
+        [DllImport("libX11", EntryPoint = "XDefaultVisual")]
+        internal extern static IntPtr XDefaultVisual(IntPtr display, int screen_number);
+
+        [DllImport("libX11", EntryPoint = "XDefaultDepth")]
+        internal extern static uint XDefaultDepth(IntPtr display, int screen_number);
+
+        [DllImport("libX11", EntryPoint = "XDefaultScreen")]
+        internal extern static int XDefaultScreen(IntPtr display);
+
+        [DllImport("libX11", EntryPoint = "XDefaultColormap")]
+        internal extern static IntPtr XDefaultColormap(IntPtr display, int screen_number);
+
+        [DllImport("libX11", EntryPoint = "XLookupColor")]
+        internal extern static int XLookupColor(IntPtr display, IntPtr Colormap, string Coloranem, ref XColor exact_def_color, ref XColor screen_def_color);
+
+        [DllImport("libX11", EntryPoint = "XAllocColor")]
+        internal extern static int XAllocColor(IntPtr display, IntPtr Colormap, ref XColor colorcell_def);
+
+        [DllImport("libX11", EntryPoint = "XSetTransientForHint")]
+        internal extern static int XSetTransientForHint(IntPtr display, IntPtr window, IntPtr prop_window);
+
+        [DllImport("libX11", EntryPoint = "XChangeProperty")]
+        internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref MotifWmHints data, int nelements);
+
+        [DllImport("libX11", EntryPoint = "XChangeProperty")]
+        internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref uint value, int nelements);
+
+        [DllImport("libX11", EntryPoint = "XChangeProperty")]
+        internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref IntPtr value, int nelements);
+
+        [DllImport("libX11", EntryPoint = "XChangeProperty")]
+        internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, uint[] data, int nelements);
+
+        [DllImport("libX11", EntryPoint = "XChangeProperty")]
+        internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, int[] data, int nelements);
+
+        [DllImport("libX11", EntryPoint = "XChangeProperty")]
+        internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr[] data, int nelements);
+
+        [DllImport("libX11", EntryPoint = "XChangeProperty")]
+        internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr atoms, int nelements);
+
+        [DllImport("libX11", EntryPoint = "XChangeProperty", CharSet = CharSet.Ansi)]
+        internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, string text, int text_length);
+
+        [DllImport("libX11", EntryPoint = "XDeleteProperty")]
+        internal extern static int XDeleteProperty(IntPtr display, IntPtr window, IntPtr property);
+
+        // Drawing
+        [DllImport("libX11", EntryPoint = "XCreateGC")]
+        internal extern static IntPtr XCreateGC(IntPtr display, IntPtr window, IntPtr valuemask, ref XGCValues values);
+
+        [DllImport("libX11", EntryPoint = "XFreeGC")]
+        internal extern static int XFreeGC(IntPtr display, IntPtr gc);
+
+        [DllImport("libX11", EntryPoint = "XSetFunction")]
+        internal extern static int XSetFunction(IntPtr display, IntPtr gc, GXFunction function);
+
+        [DllImport("libX11", EntryPoint = "XSetLineAttributes")]
+        internal extern static int XSetLineAttributes(IntPtr display, IntPtr gc, int line_width, GCLineStyle line_style, GCCapStyle cap_style, GCJoinStyle join_style);
+
+        [DllImport("libX11", EntryPoint = "XDrawLine")]
+        internal extern static int XDrawLine(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int x2, int y2);
+
+        [DllImport("libX11", EntryPoint = "XDrawRectangle")]
+        internal extern static int XDrawRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
+
+        [DllImport("libX11", EntryPoint = "XFillRectangle")]
+        internal extern static int XFillRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
+
+        [DllImport("libX11", EntryPoint = "XSetWindowBackground")]
+        internal extern static int XSetWindowBackground(IntPtr display, IntPtr window, IntPtr background);
+
+        [DllImport("libX11", EntryPoint = "XCopyArea")]
+        internal extern static int XCopyArea(IntPtr display, IntPtr src, IntPtr dest, IntPtr gc, int src_x, int src_y, int width, int height, int dest_x, int dest_y);
+
+        [DllImport("libX11", EntryPoint = "XGetWindowProperty")]
+        internal extern static int XGetWindowProperty(IntPtr display, IntPtr window, IntPtr atom, IntPtr long_offset, IntPtr long_length, bool delete, IntPtr req_type, out IntPtr actual_type, out int actual_format, out IntPtr nitems, out IntPtr bytes_after, ref IntPtr prop);
+
+        [DllImport("libX11", EntryPoint = "XSetInputFocus")]
+        internal extern static int XSetInputFocus(IntPtr display, IntPtr window, RevertTo revert_to, IntPtr time);
+
+        [DllImport("libX11", EntryPoint = "XIconifyWindow")]
+        internal extern static int XIconifyWindow(IntPtr display, IntPtr window, int screen_number);
+
+        [DllImport("libX11", EntryPoint = "XDefineCursor")]
+        internal extern static int XDefineCursor(IntPtr display, IntPtr window, IntPtr cursor);
+
+        [DllImport("libX11", EntryPoint = "XUndefineCursor")]
+        internal extern static int XUndefineCursor(IntPtr display, IntPtr window);
+
+        [DllImport("libX11", EntryPoint = "XFreeCursor")]
+        internal extern static int XFreeCursor(IntPtr display, IntPtr cursor);
+
+        [DllImport("libX11", EntryPoint = "XCreateFontCursor")]
+        internal extern static IntPtr XCreateFontCursor(IntPtr display, CursorFontShape shape);
+
+        [DllImport("libX11", EntryPoint = "XCreatePixmapCursor")]
+        internal extern static IntPtr XCreatePixmapCursor(IntPtr display, IntPtr source, IntPtr mask, ref XColor foreground_color, ref XColor background_color, int x_hot, int y_hot);
+
+        [DllImport("libX11", EntryPoint = "XCreatePixmapFromBitmapData")]
+        internal extern static IntPtr XCreatePixmapFromBitmapData(IntPtr display, IntPtr drawable, byte[] data, int width, int height, IntPtr fg, IntPtr bg, int depth);
+
+        [DllImport("libX11", EntryPoint = "XCreatePixmap")]
+        internal extern static IntPtr XCreatePixmap(IntPtr display, IntPtr d, int width, int height, int depth);
+
+        [DllImport("libX11", EntryPoint = "XFreePixmap")]
+        internal extern static IntPtr XFreePixmap(IntPtr display, IntPtr pixmap);
+
+        [DllImport("libX11", EntryPoint = "XQueryBestCursor")]
+        internal extern static int XQueryBestCursor(IntPtr display, IntPtr drawable, int width, int height, out int best_width, out int best_height);
+
+        [DllImport("libX11", EntryPoint = "XQueryExtension")]
+        internal extern static int XQueryExtension(IntPtr display, string extension_name, ref int major, ref int first_event, ref int first_error);
+
+        [DllImport("libX11", EntryPoint = "XWhitePixel")]
+        internal extern static IntPtr XWhitePixel(IntPtr display, int screen_no);
+
+        [DllImport("libX11", EntryPoint = "XBlackPixel")]
+        internal extern static IntPtr XBlackPixel(IntPtr display, int screen_no);
+
+        [DllImport("libX11", EntryPoint = "XGrabServer")]
+        internal extern static void XGrabServer(IntPtr display);
+
+        [DllImport("libX11", EntryPoint = "XUngrabServer")]
+        internal extern static void XUngrabServer(IntPtr display);
+
+        [DllImport("libX11", EntryPoint = "XGetWMNormalHints")]
+        internal extern static void XGetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints, out IntPtr supplied_return);
+
+        [DllImport("libX11", EntryPoint = "XSetWMNormalHints")]
+        internal extern static void XSetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints);
+
+        [DllImport("libX11", EntryPoint = "XSetZoomHints")]
+        internal extern static void XSetZoomHints(IntPtr display, IntPtr window, ref XSizeHints hints);
+
+        [DllImport("libX11", EntryPoint = "XSetWMHints")]
+        internal extern static void XSetWMHints(IntPtr display, IntPtr window, ref XWMHints wmhints);
+
+        [DllImport("libX11", EntryPoint = "XGetIconSizes")]
+        internal extern static int XGetIconSizes(IntPtr display, IntPtr window, out IntPtr size_list, out int count);
+
+        [DllImport("libX11", EntryPoint = "XSetErrorHandler")]
+        internal extern static IntPtr XSetErrorHandler(XErrorHandler error_handler);
+
+        [DllImport("libX11", EntryPoint = "XGetErrorText")]
+        internal extern static IntPtr XGetErrorText(IntPtr display, byte code, StringBuilder buffer, int length);
+
+        [DllImport("libX11", EntryPoint = "XInitThreads")]
+        internal extern static int XInitThreads();
+
+        [DllImport("libX11", EntryPoint = "XConvertSelection")]
+        internal extern static int XConvertSelection(IntPtr display, IntPtr selection, IntPtr target, IntPtr property, IntPtr requestor, IntPtr time);
+
+        [DllImport("libX11", EntryPoint = "XGetSelectionOwner")]
+        internal extern static IntPtr XGetSelectionOwner(IntPtr display, IntPtr selection);
+
+        [DllImport("libX11", EntryPoint = "XSetSelectionOwner")]
+        internal extern static int XSetSelectionOwner(IntPtr display, IntPtr selection, IntPtr owner, IntPtr time);
+
+        [DllImport("libX11", EntryPoint = "XSetPlaneMask")]
+        internal extern static int XSetPlaneMask(IntPtr display, IntPtr gc, IntPtr mask);
+
+        [DllImport("libX11", EntryPoint = "XSetForeground")]
+        internal extern static int XSetForeground(IntPtr display, IntPtr gc, UIntPtr foreground);
+
+        [DllImport("libX11", EntryPoint = "XSetBackground")]
+        internal extern static int XSetBackground(IntPtr display, IntPtr gc, UIntPtr background);
+
+        [DllImport("libX11", EntryPoint = "XBell")]
+        internal extern static int XBell(IntPtr display, int percent);
+
+        [DllImport("libX11", EntryPoint = "XChangeActivePointerGrab")]
+        internal extern static int XChangeActivePointerGrab(IntPtr display, EventMask event_mask, IntPtr cursor, IntPtr time);
+
+        [DllImport("libX11", EntryPoint = "XFilterEvent")]
+        internal extern static bool XFilterEvent(ref XEvent xevent, IntPtr window);
+
+        [DllImport("libX11")]
+        internal extern static void XkbSetDetectableAutoRepeat(IntPtr display, bool detectable, IntPtr supported);
+
+        [DllImport("libX11")]
+        internal extern static void XPeekEvent(IntPtr display, ref XEvent xevent);
+    }
+}
diff --git a/src/Tao.Platform.X11/Glx.cs b/src/Tao.Platform.X11/Glx.cs
new file mode 100644
index 0000000..8acc146
--- /dev/null
+++ b/src/Tao.Platform.X11/Glx.cs
@@ -0,0 +1,1509 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace Tao.Platform.X11
+{
+	#region GL Types
+
+	using GLsizeiptrARB = System.IntPtr;
+	using GLintptrARB = System.IntPtr;
+	using GLhandleARB = System.Int32;
+	using GLhalfARB = System.Int16;
+	using GLhalfNV = System.Int16;
+	using GLcharARB = System.Char;
+	using GLsizei = System.Int32;
+	using GLsizeiptr = System.IntPtr;
+	using GLintptr = System.IntPtr;
+	using GLenum = System.Int32;
+	using GLboolean = System.Boolean;
+	using GLbitfield = System.Int32;
+	using GLchar = System.Char;
+	using GLbyte = System.Byte;
+	using GLubyte = System.Byte;
+	using GLshort = System.Int16;
+	using GLushort = System.Int16;
+	using GLint = System.Int32;
+	using GLuint = System.Int32;
+	using GLfloat = System.Single;
+	using GLclampf = System.Single;
+	using GLdouble = System.Double;
+	using GLclampd = System.Double;
+	using GLstring = System.String;
+	using System.Security;
+
+	#endregion GL Types
+
+	#region Class Documentation
+	/// <summary>
+	///     GLX (OpenGL XWindow Extensions) binding for .NET, implementing GLX 1.4.
+	/// </summary>
+	/// <remarks>
+	///     <para>
+	///         Binds functions and definitions in libGL.so.
+	///     </para>
+	///     <para>
+	///         The OpenGL XWindow Extensions (GLX) library contains several groups of functions that
+	///         complement the core OpenGL interface by providing integration with XWindows.
+    /// </para>
+	///     <para>
+	///         These utility functions make use of core OpenGL functions, so any OpenGL
+	///         implementation is guaranteed to support the utility functions.
+	///     </para>
+	/// </remarks>
+	#endregion Class Documentation
+	public class Glx
+	{
+
+		#region Constants and Enumerations
+
+		#region string LIBGL
+		/// <summary>
+		///		Specifies the library the functions are located in.
+		/// </summary>
+		private const string LIBGL = "libGL.so.1";
+		#endregion string LIBGL
+
+		#region CallingConvention CALLING_CONVENTION
+		/// <summary>
+		///     Specifies the calling convention.
+		/// </summary>
+		/// <remarks>
+		///     Specifies <see cref="CallingConvention.Winapi" /> for Windows and
+		///     Linux, to indicate that the default should be used.
+		/// </remarks>
+		private const CallingConvention CALLING_CONVENTION = CallingConvention.Winapi;
+		#endregion CallingConvention CALLING_CONVENTION
+
+        /// <summary>
+        /// 
+        /// </summary>
+		public const bool GLX_VERSION_1_1 = true;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const bool GLX_VERSION_1_2 = true;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const bool GLX_VERSION_1_3 = true;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const bool GLX_VERSION_1_4 = true;
+
+		/*
+		** Visual Config Attributes (glXGetConfig, glXGetFBConfigAttrib)
+		*/
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_USE_GL = 1;	/* support GLX rendering */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_BUFFER_SIZE = 2;	/* depth of the color buffer */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_LEVEL = 3;	/* level in plane stacking */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_RGBA = 4;	/* true if RGBA mode */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_DOUBLEBUFFER = 5;	/* double buffering supported */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_STEREO = 6;	/* stereo buffering supported */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_AUX_BUFFERS = 7;	/* number of aux buffers */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_RED_SIZE = 8;	/* number of red component bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_GREEN_SIZE = 9;	/* number of green component bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_BLUE_SIZE = 10;	/* number of blue component bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_ALPHA_SIZE = 11;	/* number of alpha component bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_DEPTH_SIZE = 12;	/* number of depth bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_STENCIL_SIZE = 13;	/* number of stencil bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_ACCUM_RED_SIZE = 14;	/* number of red accum bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_ACCUM_GREEN_SIZE = 15;	/* number of green accum bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_ACCUM_BLUE_SIZE = 16;	/* number of blue accum bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_ACCUM_ALPHA_SIZE = 17;	/* number of alpha accum bits */
+
+		/*
+		** FBConfig-specific attributes
+		*/
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_X_VISUAL_TYPE = 0x22;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_CONFIG_CAVEAT = 0x20;	/* Like visual_info VISUAL_CAVEAT_EXT */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_TYPE = 0x23;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_INDEX_VALUE = 0x24;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_RED_VALUE = 0x25;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_GREEN_VALUE = 0x26;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_BLUE_VALUE = 0x27;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_ALPHA_VALUE = 0x28;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_DRAWABLE_TYPE = 0x8010;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_RENDER_TYPE = 0x8011;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_X_RENDERABLE = 0x8012;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_FBCONFIG_ID = 0x8013;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_MAX_PBUFFER_WIDTH = 0x8016;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_MAX_PBUFFER_HEIGHT = 0x8017;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_MAX_PBUFFER_PIXELS = 0x8018;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_VISUAL_ID = 0x800B;
+
+		/* FBConfigSGIX Attributes */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_OPTIMAL_PBUFFER_WIDTH_SGIX = 0x8019;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX = 0x801A;
+
+		/*
+		** Error return values from glXGetConfig.  Success is indicated by
+		** a value of 0.
+		*/
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_BAD_SCREEN = 1;	/* screen # is bad */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_BAD_ATTRIBUTE = 2;	/* attribute to get is bad */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_NO_EXTENSION = 3;	/* no glx extension on server */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_BAD_VISUAL = 4;	/* visual # not known by GLX */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_BAD_CONTEXT = 5;	/* returned only by import_context EXT? */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_BAD_VALUE = 6;	/* returned only by glXSwapIntervalSGI? */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_BAD_ENUM = 7;	/* unused? */
+
+		/* FBConfig attribute values */
+
+		/*
+		** Generic "don't care" value for glX ChooseFBConfig attributes (except
+		** GLX_LEVEL)
+		*/
+        /// <summary>
+        /// 
+        /// </summary>
+        [CLSCompliant(false)]
+		public const uint GLX_DONT_CARE = 0xFFFFFFFF;
+
+		/* GLX_RENDER_TYPE bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_RGBA_BIT = 0x00000001;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_COLOR_INDEX_BIT = 0x00000002;
+
+		/* GLX_DRAWABLE_TYPE bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_WINDOW_BIT = 0x00000001;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_PIXMAP_BIT = 0x00000002;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_PBUFFER_BIT = 0x00000004;
+
+		/* GLX_CONFIG_CAVEAT attribute values */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_NONE = 0x8000;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SLOW_CONFIG = 0x8001;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_NON_CONFORMANT_CONFIG = 0x800D;
+
+		/* GLX_X_VISUAL_TYPE attribute values */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRUE_COLOR = 0x8002;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_DIRECT_COLOR = 0x8003;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_PSEUDO_COLOR = 0x8004;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_STATIC_COLOR = 0x8005;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_GRAY_SCALE = 0x8006;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_STATIC_GRAY = 0x8007;
+
+		/* GLX_TRANSPARENT_TYPE attribute values */
+		/* public const int GLX_NONE			   0x8000 */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_RGB = 0x8008;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_INDEX = 0x8009;
+
+		/* glXCreateGLXPbuffer attributes */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_PRESERVED_CONTENTS = 0x801B;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_LARGEST_PBUFFER = 0x801C;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_PBUFFER_HEIGHT = 0x8040;	/* New for GLX 1.3 */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_PBUFFER_WIDTH = 0x8041;	/* New for GLX 1.3 */
+
+		/* glXQueryGLXPBuffer attributes */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_WIDTH = 0x801D;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_HEIGHT = 0x801E;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_EVENT_MASK = 0x801F;
+
+		/* glXCreateNewContext render_type attribute values */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_RGBA_TYPE = 0x8014;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_COLOR_INDEX_TYPE = 0x8015;
+
+		/* glXQueryContext attributes */
+		/* public const int GLX_FBCONFIG_ID		  0x8013 */
+		/* public const int GLX_RENDER_TYPE		  0x8011 */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SCREEN = 0x800C;
+
+		/* glXSelectEvent event mask bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_PBUFFER_CLOBBER_MASK = 0x08000000;
+
+		/* GLXPbufferClobberEvent event_type values */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_DAMAGED = 0x8020;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SAVED = 0x8021;
+
+		/* GLXPbufferClobberEvent draw_type values */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_WINDOW = 0x8022;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_PBUFFER = 0x8023;
+
+		/* GLXPbufferClobberEvent buffer_mask bits */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_FRONT_LEFT_BUFFER_BIT = 0x00000001;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_FRONT_RIGHT_BUFFER_BIT = 0x00000002;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_BACK_LEFT_BUFFER_BIT = 0x00000004;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_BACK_RIGHT_BUFFER_BIT = 0x00000008;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_AUX_BUFFERS_BIT = 0x00000010;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_DEPTH_BUFFER_BIT = 0x00000020;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_STENCIL_BUFFER_BIT = 0x00000040;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_ACCUM_BUFFER_BIT = 0x00000080;
+
+		/*
+		** Extension return values from glXGetConfig.  These are also
+		** accepted as parameter values for glXChooseVisual.
+		*/
+
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_X_VISUAL_TYPE_EXT = 0x22;	/* visual_info extension type */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_TYPE_EXT = 0x23;	/* visual_info extension */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_INDEX_VALUE_EXT = 0x24;	/* visual_info extension */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_RED_VALUE_EXT = 0x25;	/* visual_info extension */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_GREEN_VALUE_EXT = 0x26;	/* visual_info extension */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_BLUE_VALUE_EXT = 0x27;	/* visual_info extension */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_ALPHA_VALUE_EXT = 0x28;	/* visual_info extension */
+
+		/* Property values for visual_type */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRUE_COLOR_EXT = 0x8002;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_DIRECT_COLOR_EXT = 0x8003;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_PSEUDO_COLOR_EXT = 0x8004;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_STATIC_COLOR_EXT = 0x8005;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_GRAY_SCALE_EXT = 0x8006;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_STATIC_GRAY_EXT = 0x8007;
+
+		/* Property values for transparent pixel */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_NONE_EXT = 0x8000;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_RGB_EXT = 0x8008;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_TRANSPARENT_INDEX_EXT = 0x8009;
+
+		/* Property values for visual_rating */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_VISUAL_CAVEAT_EXT = 0x20;  /* visual_rating extension type */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SLOW_VISUAL_EXT = 0x8001;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_NON_CONFORMANT_VISUAL_EXT = 0x800D;
+
+		/* Property values for swap method (GLX_OML_swap_method) */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SWAP_METHOD_OML = 0x8060;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SWAP_EXCHANGE_OML = 0x8061;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SWAP_COPY_OML = 0x8062;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SWAP_UNDEFINED_OML = 0x8063;
+
+		/* Property values for multi-sampling */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_VISUAL_SELECT_GROUP_SGIX = 0x8028;	/* visuals grouped by select priority */
+
+		/*
+		** Names for attributes to glXGetClientString.
+		*/
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_VENDOR = 0x1;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_VERSION = 0x2;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_EXTENSIONS = 0x3;
+
+		/*
+		** Names for attributes to glXQueryContextInfoEXT.
+		*/
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SHARE_CONTEXT_EXT = 0x800A;	/* id of share context */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_VISUAL_ID_EXT = 0x800B;	/* id of context's visual */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SCREEN_EXT = 0x800C;	/* screen number */
+
+		/*
+		 * GLX 1.4 and later:
+		 */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SAMPLE_BUFFERS_SGIS = 100000;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const int GLX_SAMPLES_SGIS = 100001;
+
+		/* GLX extensions */
+        /// <summary>
+        /// 
+        /// </summary>
+		public const bool GLX_EXT_import_context = true;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const bool GLX_EXT_visual_info = true;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const bool GLX_EXT_visual_rating = true;
+        /// <summary>
+        /// 
+        /// </summary>
+		public const bool GLX_ARB_get_proc_address = true;
+
+		#endregion Constants and Enumerations
+
+		#region GLX functions
+
+		#region IntPtr glXChooseVisual( IntPtr dpy, int screen, IntPtr attriblist )
+		//extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList);
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="screen"></param>
+        /// <param name="attriblist"></param>
+        /// <returns></returns>
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXChooseVisual" ), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXChooseVisual( IntPtr dpy, int screen, IntPtr attriblist );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="screen"></param>
+        /// <param name="attrib"></param>
+        /// <returns></returns>
+		public static IntPtr glXChooseVisual( IntPtr dpy, int screen, int attrib )
+		{
+			GCHandle h0 = GCHandle.Alloc( attrib, GCHandleType.Pinned );
+
+			try
+			{
+				return glXChooseVisual( dpy, screen, h0.AddrOfPinnedObject() );
+			}
+			finally
+			{
+				h0.Free();
+			}
+		}
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="screen"></param>
+        /// <param name="attriblist"></param>
+        /// <returns></returns>
+		public static IntPtr glXChooseVisual( IntPtr dpy, int screen, int[] attriblist )
+		{
+			GCHandle h0 = GCHandle.Alloc( attriblist, GCHandleType.Pinned );
+
+			try
+			{
+				return glXChooseVisual( dpy, screen, h0.AddrOfPinnedObject() );
+			}
+			finally
+			{
+				h0.Free();
+			}
+		}
+		#endregion IntPtr glXChooseVisual( IntPtr dpy, int screen, IntPtr attriblist )
+
+		#region void glXCopyContext( IntPtr dpy, IntPtr src, IntPtr dst, ulong mask )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="src"></param>
+		/// <param name="dst"></param>
+		/// <param name="mask"></param>
+		//extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, unsigned long mask);
+        [CLSCompliant(false)]
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXCopyContext" ), SuppressUnmanagedCodeSecurity]
+		public static extern void glXCopyContext( IntPtr dpy, IntPtr src, IntPtr dst, ulong mask );
+		#endregion void glXCopyContext( IntPtr dpy, IntPtr src, IntPtr dst, ulong mask )
+
+		#region IntPtr glXCreateContext( IntPtr dpy, IntPtr vis, IntPtr shareList, bool direct )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="vis"></param>
+		/// <param name="shareList"></param>
+		/// <param name="direct"></param>
+		/// <returns></returns>
+		//extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXCreateContext" ), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXCreateContext( IntPtr dpy, IntPtr vis, IntPtr shareList, bool direct );
+		#endregion IntPtr glXCreateContext( IntPtr dpy, IntPtr vis, IntPtr shareList, bool direct )
+
+		#region IntPtr glXCreateGLXPixmap( IntPtr dpy, IntPtr vis, Pixmap pixmap )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="vis"></param>
+		/// <param name="pixmap"></param>
+		/// <returns></returns>
+		//extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXCreateGLXPixmap" ), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXCreateGLXPixmap( IntPtr dpy, IntPtr vis, IntPtr pixmap );
+		#endregion IntPtr glXCreateGLXPixmap( IntPtr dpy, IntPtr vis, Pixmap pixmap )
+
+		#region void glXDestroyContext( IntPtr dpy, IntPtr context )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="context"></param>
+		//extern void glXDestroyContext (Display *dpy, GLXContext ctx);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXDestroyContext" ), SuppressUnmanagedCodeSecurity]
+		public static extern void glXDestroyContext( IntPtr dpy, IntPtr context );
+		#endregion void glXDestroyContext( IntPtr dpy, IntPtr context )
+
+		#region void glXDestroyGLXPixmap( IntPtr dpy, IntPtr pix )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="pix"></param>
+		//extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXDestroyGLXPixmap" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern void glXDestroyGLXPixmap( IntPtr dpy, IntPtr pix );
+		#endregion void glXDestroyGLXPixmap( IntPtr dpy, IntPtr pix )
+
+		#region int glXGetConfig( IntPtr dpy, IntPtr vis, int attrib, IntPtr value )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="vis"></param>
+		/// <param name="attrib"></param>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		//extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value);		
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetConfig" ), SuppressUnmanagedCodeSecurity]
+		public static extern int glXGetConfig( IntPtr dpy, IntPtr vis, int attrib, IntPtr value );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="vis"></param>
+        /// <param name="attrib"></param>
+        /// <param name="val"></param>
+        /// <returns></returns>
+		public static int glXGetConfig( IntPtr dpy, IntPtr vis, int attrib, int val )
+		{
+			GCHandle h0 = GCHandle.Alloc( val, GCHandleType.Pinned );
+
+			try
+			{
+                XVisualInfo info = (XVisualInfo)Marshal.PtrToStructure(vis, typeof(XVisualInfo));
+				return glXChooseVisual( dpy, info.screen, h0.AddrOfPinnedObject().ToInt32() ).ToInt32();
+			}
+			finally
+			{
+				h0.Free();
+			}
+		}
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="vis"></param>
+        /// <param name="attrib"></param>
+        /// <param name="val"></param>
+        /// <returns></returns>
+		public static int glXGetConfig( IntPtr dpy, IntPtr vis, int attrib, int[] val )
+		{
+			GCHandle h0 = GCHandle.Alloc( val, GCHandleType.Pinned );
+
+			try
+			{
+                XVisualInfo info = (XVisualInfo)Marshal.PtrToStructure(vis, typeof(XVisualInfo));
+                return glXChooseVisual(dpy, info.screen, h0.AddrOfPinnedObject().ToInt32()).ToInt32();
+			}
+			finally
+			{
+				h0.Free();
+			}
+		}
+		#endregion int glXGetConfig( IntPtr dpy, IntPtr vis, int attrib, IntPtr value )
+
+		#region IntPtr glXGetCurrentContext()
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		//extern GLXContext glXGetCurrentContext (void);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetCurrentContext" ), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXGetCurrentContext();
+		#endregion IntPtr glXGetCurrentContext()
+
+		#region IntPtr glXGetCurrentDrawable()
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		//extern GLXDrawable glXGetCurrentDrawable (void);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetCurrentDrawable" ), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXGetCurrentDrawable();
+		#endregion IntPtr glXGetCurrentDrawable()
+
+		#region bool glXIsDirect( IntPtr dpy, IntPtr ctx )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="ctx"></param>
+		/// <returns></returns>
+		//extern Bool glXIsDirect (Display *dpy, GLXContext ctx);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXIsDirect" ), SuppressUnmanagedCodeSecurity]
+		public static extern bool glXIsDirect( IntPtr dpy, IntPtr ctx );
+		#endregion bool glXIsDirect( IntPtr dpy, IntPtr ctx )
+
+		#region bool glXMakeCurrent( IntPtr display, IntPtr drawable, IntPtr context )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="display"></param>
+		/// <param name="drawable"></param>
+		/// <param name="context"></param>
+		/// <returns></returns>
+		//extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXMakeCurrent" ), SuppressUnmanagedCodeSecurity]
+		public static extern bool glXMakeCurrent( IntPtr display, IntPtr drawable, IntPtr context );
+		#endregion bool glXMakeCurrent( IntPtr display, IntPtr drawable, IntPtr context )
+
+		#region bool glXQueryExtension( IntPtr dpy, IntPtr errorBase, IntPtr eventBase )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="errorBase"></param>
+		/// <param name="eventBase"></param>
+		/// <returns></returns>
+		//extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryExtension" ), SuppressUnmanagedCodeSecurity]
+		public static extern bool glXQueryExtension( IntPtr dpy, IntPtr errorBase, IntPtr eventBase );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="errorBase"></param>
+        /// <param name="eventBase"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryExtension"), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern bool glXQueryExtension( IntPtr dpy, int* errorBase, int* eventBase );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="errorBase"></param>
+        /// <param name="eventBase"></param>
+        /// <returns></returns>
+		public static unsafe bool glXQueryExtension( IntPtr dpy, int errorBase, int eventBase )
+		{
+			GCHandle h0 = GCHandle.Alloc( errorBase, GCHandleType.Pinned );
+			GCHandle h1 = GCHandle.Alloc( eventBase, GCHandleType.Pinned );
+
+			try
+			{
+				return glXQueryExtension( dpy, h0.AddrOfPinnedObject(), h1.AddrOfPinnedObject() );
+			}
+			finally
+			{
+				h0.Free();
+				h1.Free();
+			}
+		}
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="errorBase"></param>
+        /// <param name="eventBase"></param>
+        /// <returns></returns>
+		public static unsafe bool glXQueryExtension( IntPtr dpy, int[] errorBase, int[] eventBase )
+		{
+			GCHandle h0 = GCHandle.Alloc( errorBase, GCHandleType.Pinned );
+			GCHandle h1 = GCHandle.Alloc( eventBase, GCHandleType.Pinned );
+
+			try
+			{
+				return glXQueryExtension( dpy, h0.AddrOfPinnedObject(), h1.AddrOfPinnedObject() );
+			}
+			finally
+			{
+				h0.Free();
+				h1.Free();
+			}
+		}
+		#endregion bool glXQueryExtension( IntPtr dpy, IntPtr errorBase, IntPtr eventBase )
+
+		#region bool glXQueryVersion( IntPtr dpy, IntPtr major, IntPtr minor )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="major"></param>
+		/// <param name="minor"></param>
+		/// <returns></returns>
+		//extern Bool glXQueryVersion (Display *dpy, int *major, int *minor);		
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryVersion" ), SuppressUnmanagedCodeSecurity]
+		public static extern bool glXQueryVersion( IntPtr dpy, IntPtr major, IntPtr minor );
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="major"></param>
+        /// <param name="minor"></param>
+        /// <returns></returns>
+        [CLSCompliant(false)]
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryVersion"), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern bool glXQueryVersion( IntPtr dpy, int* major, int* minor );
+		//public static unsafe extern bool glXQueryVersion( IntPtr dpy, out int major, out int minor )
+		//{
+		//	return new NotImplementedException();
+		//}
+		//public static unsafe extern bool glXQueryVersion( IntPtr dpy, out int[] major, out int[] minor )
+		//{
+		//	return new NotImplementedException();
+		//}
+		#endregion bool glXQueryVersion( IntPtr dpy, IntPtr major, IntPtr minor )
+
+		#region void glXSwapBuffers( IntPtr display, IntPtr drawable )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="display"></param>
+		/// <param name="drawable"></param>
+		//extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXSwapBuffers" ), SuppressUnmanagedCodeSecurity]
+		public static extern void glXSwapBuffers( IntPtr display, IntPtr drawable );
+		#endregion void glXSwapBuffers( IntPtr display, IntPtr drawable )
+
+		#region void glXUseXFont( IntPtr font, int first, int count, int listBase )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="font"></param>
+		/// <param name="first"></param>
+		/// <param name="count"></param>
+		/// <param name="listBase"></param>
+		//extern void glXUseXFont (Font font, int first, int count, int listBase);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXUseXFont" ), SuppressUnmanagedCodeSecurity]
+		public static extern void glXUseXFont( IntPtr font, int first, int count, int listBase );
+		#endregion void glXUseXFont( IntPtr font, int first, int count, int listBase )
+
+		#region void glXWaitGL()
+		/// <summary>
+		/// 
+		/// </summary>
+		//extern void glXWaitGL (void);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXWaitGL" ), SuppressUnmanagedCodeSecurity]
+		public static extern void glXWaitGL();
+		#endregion void glXWaitGL()
+
+		#region void glXWaitX()
+		/// <summary>
+		/// 
+		/// </summary>
+		//extern void glXWaitX (void);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXWaitX" ), SuppressUnmanagedCodeSecurity]
+		public static extern void glXWaitX();
+		#endregion void glXWaitX()
+
+		#region IntPtr glXGetClientString( IntPtr dpy, int name )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		//extern const char * glXGetClientString (Display *dpy, int name );
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetClientString" ), SuppressUnmanagedCodeSecurity]
+		public static extern string glXGetClientString( IntPtr dpy, int name );
+		#endregion IntPtr glXGetClientString( IntPtr dpy, int name )
+
+		#region IntPtr glXQueryServerString( IntPtr dpy, int screen, int name )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="screen"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		//extern const char * glXQueryServerString (Display *dpy, int screen, int name );
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryServerString" ), SuppressUnmanagedCodeSecurity]
+		public static extern string glXQueryServerString( IntPtr dpy, int screen, int name );
+		#endregion IntPtr glXQueryServerString( IntPtr dpy, int screen, int name )
+
+		#region IntPtr glXQueryExtensionsString( IntPtr dpy, int screen )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="screen"></param>
+		/// <returns></returns>
+		//extern const char * glXQueryExtensionsString (Display *dpy, int screen );
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryExtensionsString" ), SuppressUnmanagedCodeSecurity]
+		public static extern string glXQueryExtensionsString( IntPtr dpy, int screen );
+		#endregion IntPtr glXQueryExtensionsString( IntPtr dpy, int screen )
+
+		/* New for GLX 1.3 */
+
+		#region IntPtr glXGetFBConfigs( IntPtr dpy, int screen, int* nelements )
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="screen"></param>
+		/// <param name="nelements"></param>
+		/// <returns></returns>
+		//extern GLXFBConfig * glXGetFBConfigs (Display *dpy, int screen, int *nelements);
+        [CLSCompliant(false)]
+        [DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetFBConfigs" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern IntPtr glXGetFBConfigs( IntPtr dpy, int screen, int* nelements );
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="screen"></param>
+        /// <param name="element"></param>
+        /// <returns></returns>
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetFBConfigs"), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXGetFBConfigs( IntPtr dpy, int screen, int element );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="screen"></param>
+        /// <param name="nelements"></param>
+        /// <returns></returns>
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetFBConfigs"), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXGetFBConfigs( IntPtr dpy, int screen, int[] nelements );
+		#endregion IntPtr glXGetFBConfigs( IntPtr dpy, int screen, int* nelements )
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="screen"></param>
+		/// <param name="attrib_list"></param>
+		/// <param name="nelements"></param>
+		/// <returns></returns>
+		//extern GLXFBConfig * glXChooseFBConfig (Display *dpy, int screen, const int *attrib_list, int *nelements);
+        [CLSCompliant(false)]
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXChooseFBConfig" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern IntPtr glXChooseFBConfig( IntPtr dpy, int screen, int* attrib_list, int* nelements );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="screen"></param>
+        /// <param name="attrib_list"></param>
+        /// <param name="nelements"></param>
+        /// <returns></returns>
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXChooseFBConfig"), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXChooseFBConfig( IntPtr dpy, int screen, int attrib_list, int nelements );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="screen"></param>
+        /// <param name="attrib_list"></param>
+        /// <param name="nelements"></param>
+        /// <returns></returns>
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXChooseFBConfig"), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXChooseFBConfig( IntPtr dpy, int screen, int[] attrib_list, int[] nelements );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="config"></param>
+		/// <param name="attribute"></param>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		//extern int glXGetFBConfigAttrib (Display *dpy, GLXFBConfig config, int attribute, int *value);
+        [CLSCompliant(false)]
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetFBConfigAttrib" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern int glXGetFBConfigAttrib( IntPtr dpy, IntPtr config, int attribute, int* value );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="config"></param>
+        /// <param name="attribute"></param>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetFBConfigAttrib"), SuppressUnmanagedCodeSecurity]
+		public static extern int glXGetFBConfigAttrib( IntPtr dpy, IntPtr config, int attribute, int value );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="config"></param>
+        /// <param name="attribute"></param>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetFBConfigAttrib"), SuppressUnmanagedCodeSecurity]
+		public static extern int glXGetFBConfigAttrib( IntPtr dpy, IntPtr config, int attribute, int[] value );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="config"></param>
+		/// <returns></returns>
+		//extern XVisualInfo * glXGetVisualFromFBConfig (Display *dpy, GLXFBConfig config);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetVisualFromFBConfig" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern IntPtr glXGetVisualFromFBConfig(IntPtr dpy, IntPtr config );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="config"></param>
+		/// <param name="win"></param>
+		/// <param name="attrib_list"></param>
+		/// <returns></returns>
+		//extern GLXWindow glXCreateWindow (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list);
+        [CLSCompliant(false)]
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXCreateWindow" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern int glXCreateWindow( IntPtr dpy, IntPtr config, int win, int* attrib_list );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="config"></param>
+        /// <param name="win"></param>
+        /// <param name="attrib_list"></param>
+        /// <returns></returns>
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXCreateWindow"), SuppressUnmanagedCodeSecurity]
+		public static extern int glXCreateWindow( IntPtr dpy, IntPtr config, int win, int[] attrib_list );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="win"></param>
+		//extern void glXDestroyWindow (Display *dpy, GLXWindow win);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXDestroyWindow" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern void glXDestroyWindow( IntPtr dpy, int win );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="config"></param>
+		/// <param name="pixmap"></param>
+		/// <param name="attrib_list"></param>
+		/// <returns></returns>
+		//extern GLXPixmap glXCreatePixmap (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);
+        [CLSCompliant(false)]
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXCreatePixmap" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern int glXCreatePixmap( IntPtr dpy, IntPtr config, IntPtr pixmap, int* attrib_list );
+		
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="config"></param>
+        /// <param name="pixmap"></param>
+        /// <param name="attrib_list"></param>
+        /// <returns></returns>
+        [DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXCreatePixmap" ), SuppressUnmanagedCodeSecurity]
+        public static extern int glXCreatePixmap( IntPtr dpy, IntPtr config, IntPtr pixmap, int[] attrib_list );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="pixmap"></param>
+		//extern void glXDestroyPixmap (Display *dpy, GLXPixmap pixmap);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXDestroyPixmap" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern void glXDestroyPixmap( IntPtr dpy, int pixmap );
+		//public static void glXDestroyPixmap( IntPtr dpy, int pixmap );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="config"></param>
+		/// <param name="attrib_list"></param>
+		/// <returns></returns>
+		//extern GLXPbuffer glXCreatePbuffer (Display *dpy, GLXFBConfig config, const int *attrib_list);
+        [CLSCompliant(false)]
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXCreatePbuffer" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern IntPtr glXCreatePbuffer( IntPtr dpy, IntPtr config, int* attrib_list );
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="config"></param>
+        /// <param name="attrib_list"></param>
+        /// <returns></returns>
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXCreatePbuffer"), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXCreatePbuffer( IntPtr dpy, IntPtr config, int[] attrib_list );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="pbuf"></param>
+		//extern void glXDestroyPbuffer (Display *dpy, GLXPbuffer pbuf);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXDestroyPbuffer" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern void glXDestroyPbuffer( IntPtr dpy, IntPtr pbuf );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="draw"></param>
+		/// <param name="attribute"></param>
+		/// <param name="value"></param>
+		//extern void glXQueryDrawable (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
+        [CLSCompliant(false)]
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryDrawable" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern void glXQueryDrawable( IntPtr dpy, IntPtr draw, int attribute, uint* value );
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="draw"></param>
+        /// <param name="attribute"></param>
+        /// <param name="value"></param>
+        [CLSCompliant(false)]
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryDrawable"), SuppressUnmanagedCodeSecurity]
+		public static extern void glXQueryDrawable( IntPtr dpy, IntPtr draw, int attribute, uint[] value );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="config"></param>
+		/// <param name="render_type"></param>
+		/// <param name="share_list"></param>
+		/// <param name="direct"></param>
+		/// <returns></returns>
+		//extern GLXContext glXCreateNewContext (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXCreateNewContext" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern IntPtr glXCreateNewContext( IntPtr dpy, IntPtr config, int render_type, IntPtr share_list, bool direct );
+
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="display"></param>
+		/// <param name="draw"></param>
+		/// <param name="read"></param>
+		/// <param name="ctx"></param>
+		/// <returns></returns>
+		//extern Bool glXMakeContextCurrent (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXMakeContextCurrent" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern bool glXMakeContextCurrent( IntPtr display, IntPtr draw, IntPtr read, IntPtr ctx );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		//extern GLXDrawable glXGetCurrentReadDrawable (void);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetCurrentReadDrawable" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern IntPtr glXGetCurrentReadDrawable();
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		//extern Display * glXGetCurrentDisplay (void);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetCurrentDisplay" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern IntPtr glXGetCurrentDisplay();
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="ctx"></param>
+		/// <param name="attribute"></param>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		//extern int glXQueryContext (Display *dpy, GLXContext ctx, int attribute, int *value);
+        [CLSCompliant(false)]
+        [DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryContext" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern int glXQueryContext( IntPtr dpy, IntPtr ctx, int attribute, int* value );
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="ctx"></param>
+        /// <param name="attribute"></param>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryContext"), SuppressUnmanagedCodeSecurity]
+		public static extern int glXQueryContext( IntPtr dpy, IntPtr ctx, int attribute, int value );
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="ctx"></param>
+        /// <param name="attribute"></param>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        [DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryContext" ), SuppressUnmanagedCodeSecurity]
+		public static extern int glXQueryContext( IntPtr dpy, IntPtr ctx, int attribute, int[] value );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="draw"></param>
+		/// <param name="event_mask"></param>
+		//extern void glXSelectEvent (Display *dpy, GLXDrawable draw, unsigned long event_mask);		
+        [CLSCompliant(false)]
+        [DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXSelectEvent" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern void glXSelectEvent( IntPtr dpy, IntPtr draw, ulong event_mask );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="draw"></param>
+		/// <param name="event_mask"></param>
+		//extern void glXGetSelectedEvent (Display *dpy, GLXDrawable draw, unsigned long *event_mask);
+        [CLSCompliant(false)]
+        [DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetSelectedEvent" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern void glXGetSelectedEvent( IntPtr dpy, IntPtr draw, ulong* event_mask );
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="draw"></param>
+        /// <param name="event_mask"></param>
+        [CLSCompliant(false)]
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetSelectedEvent"), SuppressUnmanagedCodeSecurity]
+        public static unsafe extern void glXGetSelectedEvent( IntPtr dpy, IntPtr draw, ulong event_mask );
+
+		/* GLX 1.4 and later */
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="procName"></param>
+		/// <returns></returns>
+		//extern void (*glXGetProcAddress(const GLubyte *procname))(void);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetProcAddress" ), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glxGetProcAddress( [MarshalAs( UnmanagedType.LPTStr )] string procName );
+
+
+		/* GLX extensions */
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="ctx"></param>
+		/// <returns></returns>
+		//extern GLXContextID glXGetContextIDEXT (const GLXContext ctx);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetContextIDEXT" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern int glXGetContextIDEXT( IntPtr ctx );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="contextID"></param>
+		/// <returns></returns>
+		//extern GLXContext glXImportContextEXT (Display *dpy, GLXContextID contextID);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXImportContextEXT" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern IntPtr glXImportContextEXT( IntPtr dpy, int contextID );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="ctx"></param>
+		//extern void glXFreeContextEXT (Display *dpy, GLXContext ctx);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXFreeContextEXT" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern void glXFreeContextEXT( IntPtr dpy, IntPtr ctx );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="dpy"></param>
+		/// <param name="ctx"></param>
+		/// <param name="attribute"></param>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		//extern int glXQueryContextInfoEXT (Display *dpy, GLXContext ctx, int attribute, int *value);
+        [CLSCompliant(false)]
+        [DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryContextInfoEXT" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern int glXQueryContextInfoEXT( IntPtr dpy, IntPtr ctx, int attribute, int* value );
+		
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dpy"></param>
+        /// <param name="ctx"></param>
+        /// <param name="attribute"></param>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        [DllImport(LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXQueryContextInfoEXT"), SuppressUnmanagedCodeSecurity]
+        public static unsafe extern int glXQueryContextInfoEXT( IntPtr dpy, IntPtr ctx, int attribute, int value );
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <returns></returns>
+		//extern Display * glXGetCurrentDisplayEXT (void);
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetCurrentDisplayEXT" ), SuppressUnmanagedCodeSecurity]
+		public static unsafe extern IntPtr glXGetCurrentDisplayEXT();
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="procName"></param>
+		/// <returns></returns>
+		//extern void (*glXGetProcAddressARB(const GLubyte *procName))( void );
+		[DllImport( LIBGL, CallingConvention = CALLING_CONVENTION, EntryPoint = "glXGetProcAddressARB" ), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr glXGetProcAddressARB( [MarshalAs( UnmanagedType.LPTStr )] string procName );
+
+		#endregion
+	}
+}
diff --git a/src/Tao.Platform.X11/INSTALL b/src/Tao.Platform.X11/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Platform.X11/Makefile.am b/src/Tao.Platform.X11/Makefile.am
new file mode 100644
index 0000000..8ae6924
--- /dev/null
+++ b/src/Tao.Platform.X11/Makefile.am
@@ -0,0 +1,24 @@
+
+ASSEMBLY = Tao.Platform.X11
+SHORTNAME = tao-platform-x11
+VERSION = @TAOX11_VERSION@
+MAJOR = @TAOX11_MAJOR@
+
+PACKAGES =
+BINARY_LIBS = ../Tao.OpenGl/Tao.OpenGl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Drawing \
+        System.Windows.Forms
+RESOURCES =
+SOURCES = \
+        API.cs \
+        Functions.cs \
+        Glx.cs \
+        Structs.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.Platform.X11/Makefile.in b/src/Tao.Platform.X11/Makefile.in
new file mode 100644
index 0000000..36e4fe5
--- /dev/null
+++ b/src/Tao.Platform.X11/Makefile.in
@@ -0,0 +1,421 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-platform-x11.pc.in $(top_srcdir)/Assembly.am \
+	AUTHORS COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.Platform.X11
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-platform-x11.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOX11_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.Platform.X11
+SHORTNAME = tao-platform-x11
+MAJOR = @TAOX11_MAJOR@
+PACKAGES = 
+BINARY_LIBS = ../Tao.OpenGl/Tao.OpenGl.dll
+SYSTEM_LIBS = \
+        System \
+        System.Drawing \
+        System.Windows.Forms
+
+RESOURCES = 
+SOURCES = \
+        API.cs \
+        Functions.cs \
+        Glx.cs \
+        Structs.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.Platform.X11/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.Platform.X11/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-platform-x11.pc: $(top_builddir)/config.status $(srcdir)/tao-platform-x11.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.Platform.X11/NEWS b/src/Tao.Platform.X11/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Platform.X11/Properties/AssemblyInfo.cs b/src/Tao.Platform.X11/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..ddfd7f9
--- /dev/null
+++ b/src/Tao.Platform.X11/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2006 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.Platform.X11")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework X11 Platform API Binding For .NET")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyInformationalVersion("1.0.0.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.Platform.X11.dll")]
+[assembly: AssemblyTitle("Tao Framework X11 Platform API Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.Platform.X11/README b/src/Tao.Platform.X11/README
new file mode 100644
index 0000000..27fe966
--- /dev/null
+++ b/src/Tao.Platform.X11/README
@@ -0,0 +1,10 @@
+Tao.X11.Windows 1.0.0.0
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.Platform.X11 is a X11 API binding for .NET.
+
+
+Change Log:
+
diff --git a/src/Tao.Platform.X11/Structs.cs b/src/Tao.Platform.X11/Structs.cs
new file mode 100644
index 0000000..f17a056
--- /dev/null
+++ b/src/Tao.Platform.X11/Structs.cs
@@ -0,0 +1,1745 @@
+#region License
+/*
+MIT License
+Copyright (c) 2004 Novell, Inc.
+ Authors: Peter Bartok	pbartok at novell.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.ComponentModel;
+using System.Collections;
+using System.Drawing;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+// X11 Version
+namespace Tao.Platform.X11
+{
+    //
+    // In the structures below, fields of type long are mapped to IntPtr.
+    // This will work on all platforms where sizeof(long)==sizeof(void*), which
+    // is almost all platforms except WIN64.
+    //
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XAnyEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XKeyEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal IntPtr root;
+        internal IntPtr subwindow;
+        internal IntPtr time;
+        internal int x;
+        internal int y;
+        internal int x_root;
+        internal int y_root;
+        internal int state;
+        internal int keycode;
+        internal bool same_screen;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XButtonEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal IntPtr root;
+        internal IntPtr subwindow;
+        internal IntPtr time;
+        internal int x;
+        internal int y;
+        internal int x_root;
+        internal int y_root;
+        internal int state;
+        internal int button;
+        internal bool same_screen;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XMotionEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal IntPtr root;
+        internal IntPtr subwindow;
+        internal IntPtr time;
+        internal int x;
+        internal int y;
+        internal int x_root;
+        internal int y_root;
+        internal int state;
+        internal byte is_hint;
+        internal bool same_screen;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XCrossingEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal IntPtr root;
+        internal IntPtr subwindow;
+        internal IntPtr time;
+        internal int x;
+        internal int y;
+        internal int x_root;
+        internal int y_root;
+        internal NotifyMode mode;
+        internal NotifyDetail detail;
+        internal bool same_screen;
+        internal bool focus;
+        internal int state;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XFocusChangeEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal int mode;
+        internal NotifyDetail detail;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XKeymapEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal byte key_vector0;
+        internal byte key_vector1;
+        internal byte key_vector2;
+        internal byte key_vector3;
+        internal byte key_vector4;
+        internal byte key_vector5;
+        internal byte key_vector6;
+        internal byte key_vector7;
+        internal byte key_vector8;
+        internal byte key_vector9;
+        internal byte key_vector10;
+        internal byte key_vector11;
+        internal byte key_vector12;
+        internal byte key_vector13;
+        internal byte key_vector14;
+        internal byte key_vector15;
+        internal byte key_vector16;
+        internal byte key_vector17;
+        internal byte key_vector18;
+        internal byte key_vector19;
+        internal byte key_vector20;
+        internal byte key_vector21;
+        internal byte key_vector22;
+        internal byte key_vector23;
+        internal byte key_vector24;
+        internal byte key_vector25;
+        internal byte key_vector26;
+        internal byte key_vector27;
+        internal byte key_vector28;
+        internal byte key_vector29;
+        internal byte key_vector30;
+        internal byte key_vector31;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XExposeEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal int x;
+        internal int y;
+        internal int width;
+        internal int height;
+        internal int count;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XGraphicsExposeEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr drawable;
+        internal int x;
+        internal int y;
+        internal int width;
+        internal int height;
+        internal int count;
+        internal int major_code;
+        internal int minor_code;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XNoExposeEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr drawable;
+        internal int major_code;
+        internal int minor_code;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XVisibilityEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal int state;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XCreateWindowEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr parent;
+        internal IntPtr window;
+        internal int x;
+        internal int y;
+        internal int width;
+        internal int height;
+        internal int border_width;
+        internal bool override_redirect;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XDestroyWindowEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr xevent;
+        internal IntPtr window;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XUnmapEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr xevent;
+        internal IntPtr window;
+        internal bool from_configure;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XMapEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr xevent;
+        internal IntPtr window;
+        internal bool override_redirect;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XMapRequestEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr parent;
+        internal IntPtr window;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XReparentEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr xevent;
+        internal IntPtr window;
+        internal IntPtr parent;
+        internal int x;
+        internal int y;
+        internal bool override_redirect;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XConfigureEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr xevent;
+        internal IntPtr window;
+        internal int x;
+        internal int y;
+        internal int width;
+        internal int height;
+        internal int border_width;
+        internal IntPtr above;
+        internal bool override_redirect;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XGravityEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr xevent;
+        internal IntPtr window;
+        internal int x;
+        internal int y;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XResizeRequestEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal int width;
+        internal int height;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XConfigureRequestEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr parent;
+        internal IntPtr window;
+        internal int x;
+        internal int y;
+        internal int width;
+        internal int height;
+        internal int border_width;
+        internal IntPtr above;
+        internal int detail;
+        internal IntPtr value_mask;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XCirculateEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr xevent;
+        internal IntPtr window;
+        internal int place;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XCirculateRequestEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr parent;
+        internal IntPtr window;
+        internal int place;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XPropertyEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal IntPtr atom;
+        internal IntPtr time;
+        internal int state;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XSelectionClearEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal IntPtr selection;
+        internal IntPtr time;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XSelectionRequestEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr owner;
+        internal IntPtr requestor;
+        internal IntPtr selection;
+        internal IntPtr target;
+        internal IntPtr property;
+        internal IntPtr time;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XSelectionEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr requestor;
+        internal IntPtr selection;
+        internal IntPtr target;
+        internal IntPtr property;
+        internal IntPtr time;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XColormapEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal IntPtr colormap;
+        internal bool c_new;
+        internal int state;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XClientMessageEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal IntPtr message_type;
+        internal int format;
+        internal IntPtr ptr1;
+        internal IntPtr ptr2;
+        internal IntPtr ptr3;
+        internal IntPtr ptr4;
+        internal IntPtr ptr5;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XMappingEvent
+    {
+        internal XEventName type;
+        internal IntPtr serial;
+        internal bool send_event;
+        internal IntPtr display;
+        internal IntPtr window;
+        internal int request;
+        internal int first_keycode;
+        internal int count;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XErrorEvent
+    {
+        internal XEventName type;
+        internal IntPtr display;
+        internal IntPtr resourceid;
+        internal IntPtr serial;
+        internal byte error_code;
+        internal XRequest request_code;
+        internal byte minor_code;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XEventPad
+    {
+        internal IntPtr pad0;
+        internal IntPtr pad1;
+        internal IntPtr pad2;
+        internal IntPtr pad3;
+        internal IntPtr pad4;
+        internal IntPtr pad5;
+        internal IntPtr pad6;
+        internal IntPtr pad7;
+        internal IntPtr pad8;
+        internal IntPtr pad9;
+        internal IntPtr pad10;
+        internal IntPtr pad11;
+        internal IntPtr pad12;
+        internal IntPtr pad13;
+        internal IntPtr pad14;
+        internal IntPtr pad15;
+        internal IntPtr pad16;
+        internal IntPtr pad17;
+        internal IntPtr pad18;
+        internal IntPtr pad19;
+        internal IntPtr pad20;
+        internal IntPtr pad21;
+        internal IntPtr pad22;
+        internal IntPtr pad23;
+    }
+
+    [StructLayout(LayoutKind.Explicit)]
+    internal struct XEvent
+    {
+        [FieldOffset(0)]
+        internal XEventName type;
+        [FieldOffset(0)]
+        internal XAnyEvent AnyEvent;
+        [FieldOffset(0)]
+        internal XKeyEvent KeyEvent;
+        [FieldOffset(0)]
+        internal XButtonEvent ButtonEvent;
+        [FieldOffset(0)]
+        internal XMotionEvent MotionEvent;
+        [FieldOffset(0)]
+        internal XCrossingEvent CrossingEvent;
+        [FieldOffset(0)]
+        internal XFocusChangeEvent FocusChangeEvent;
+        [FieldOffset(0)]
+        internal XExposeEvent ExposeEvent;
+        [FieldOffset(0)]
+        internal XGraphicsExposeEvent GraphicsExposeEvent;
+        [FieldOffset(0)]
+        internal XNoExposeEvent NoExposeEvent;
+        [FieldOffset(0)]
+        internal XVisibilityEvent VisibilityEvent;
+        [FieldOffset(0)]
+        internal XCreateWindowEvent CreateWindowEvent;
+        [FieldOffset(0)]
+        internal XDestroyWindowEvent DestroyWindowEvent;
+        [FieldOffset(0)]
+        internal XUnmapEvent UnmapEvent;
+        [FieldOffset(0)]
+        internal XMapEvent MapEvent;
+        [FieldOffset(0)]
+        internal XMapRequestEvent MapRequestEvent;
+        [FieldOffset(0)]
+        internal XReparentEvent ReparentEvent;
+        [FieldOffset(0)]
+        internal XConfigureEvent ConfigureEvent;
+        [FieldOffset(0)]
+        internal XGravityEvent GravityEvent;
+        [FieldOffset(0)]
+        internal XResizeRequestEvent ResizeRequestEvent;
+        [FieldOffset(0)]
+        internal XConfigureRequestEvent ConfigureRequestEvent;
+        [FieldOffset(0)]
+        internal XCirculateEvent CirculateEvent;
+        [FieldOffset(0)]
+        internal XCirculateRequestEvent CirculateRequestEvent;
+        [FieldOffset(0)]
+        internal XPropertyEvent PropertyEvent;
+        [FieldOffset(0)]
+        internal XSelectionClearEvent SelectionClearEvent;
+        [FieldOffset(0)]
+        internal XSelectionRequestEvent SelectionRequestEvent;
+        [FieldOffset(0)]
+        internal XSelectionEvent SelectionEvent;
+        [FieldOffset(0)]
+        internal XColormapEvent ColormapEvent;
+        [FieldOffset(0)]
+        internal XClientMessageEvent ClientMessageEvent;
+        [FieldOffset(0)]
+        internal XMappingEvent MappingEvent;
+        [FieldOffset(0)]
+        internal XErrorEvent ErrorEvent;
+        [FieldOffset(0)]
+        internal XKeymapEvent KeymapEvent;
+
+        //[MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=24)]
+        //[ FieldOffset(0) ] internal int[] pad;
+        [FieldOffset(0)]
+        internal XEventPad Pad;
+        public override string ToString()
+        {
+            switch (type)
+            {
+                case XEventName.PropertyNotify:
+                    return ToString(PropertyEvent);
+                case XEventName.ResizeRequest:
+                    return ToString(ResizeRequestEvent);
+                case XEventName.ConfigureNotify:
+                    return ToString(ConfigureEvent);
+                default:
+                    return type.ToString();
+            }
+        }
+
+        public static string ToString(object ev)
+        {
+            string result = string.Empty;
+            Type type = ev.GetType();
+            System.Reflection.FieldInfo[] fields = type.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Instance);
+            for (int i = 0; i < fields.Length; i++)
+            {
+                if (result != string.Empty)
+                {
+                    result += ", ";
+                }
+                object value = fields[i].GetValue(ev);
+                result += fields[i].Name + "=" + (value == null ? "<null>" : value.ToString());
+            }
+            return type.Name + " (" + result + ")";
+        }
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [StructLayout(LayoutKind.Sequential)]
+    public class XVisualInfo
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr visual;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IntPtr visualid;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int screen;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int depth;
+        /// <summary>
+        /// 
+        /// </summary>
+        public XVisualClass @class;
+        /// <summary>
+        /// 
+        /// </summary>
+        public long redMask;
+        /// <summary>
+        /// 
+        /// </summary>
+        public long greenMask;
+        /// <summary>
+        /// 
+        /// </summary>
+        public long blueMask;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int colormap_size;
+        /// <summary>
+        /// 
+        /// </summary>
+        public int bits_per_rgb;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public override string ToString()
+        {
+            return String.Format("id ({0}), screen ({1}), depth ({2}), class ({3})",
+            visualid, screen, depth, @class);
+        }
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    public enum XVisualClass : int
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        StaticGray = 0,
+        /// <summary>
+        /// 
+        /// </summary>
+        GrayScale = 1,
+        /// <summary>
+        /// 
+        /// </summary>
+        StaticColor = 2,
+        /// <summary>
+        /// 
+        /// </summary>
+        PseudoColor = 3,
+        /// <summary>
+        /// 
+        /// </summary>
+        TrueColor = 4,
+        /// <summary>
+        /// 
+        /// </summary>
+        DirectColor = 5
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XSetWindowAttributes
+    {
+        internal IntPtr background_pixmap;
+        internal IntPtr background_pixel;
+        internal IntPtr border_pixmap;
+        internal IntPtr border_pixel;
+        internal Gravity bit_gravity;
+        internal Gravity win_gravity;
+        internal int backing_store;
+        internal IntPtr backing_planes;
+        internal IntPtr backing_pixel;
+        internal bool save_under;
+        internal IntPtr event_mask;
+        internal IntPtr do_not_propagate_mask;
+        internal bool override_redirect;
+        internal IntPtr colormap;
+        internal IntPtr cursor;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XWindowAttributes
+    {
+        internal int x;
+        internal int y;
+        internal int width;
+        internal int height;
+        internal int border_width;
+        internal int depth;
+        internal IntPtr visual;
+        internal IntPtr root;
+        internal int c_class;
+        internal Gravity bit_gravity;
+        internal Gravity win_gravity;
+        internal int backing_store;
+        internal IntPtr backing_planes;
+        internal IntPtr backing_pixel;
+        internal bool save_under;
+        internal IntPtr colormap;
+        internal bool map_installed;
+        internal MapState map_state;
+        internal IntPtr all_event_masks;
+        internal IntPtr your_event_mask;
+        internal IntPtr do_not_propagate_mask;
+        internal bool override_direct;
+        internal IntPtr screen;
+
+        public override string ToString()
+        {
+            return XEvent.ToString(this);
+        }
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XTextProperty
+    {
+        internal string value;
+        internal IntPtr encoding;
+        internal int format;
+        internal IntPtr nitems;
+    }
+
+    internal enum XWindowClass
+    {
+        InputOutput = 1,
+        InputOnly = 2
+    }
+
+    internal enum XEventName
+    {
+        KeyPress = 2,
+        KeyRelease = 3,
+        ButtonPress = 4,
+        ButtonRelease = 5,
+        MotionNotify = 6,
+        EnterNotify = 7,
+        LeaveNotify = 8,
+        FocusIn = 9,
+        FocusOut = 10,
+        KeymapNotify = 11,
+        Expose = 12,
+        GraphicsExpose = 13,
+        NoExpose = 14,
+        VisibilityNotify = 15,
+        CreateNotify = 16,
+        DestroyNotify = 17,
+        UnmapNotify = 18,
+        MapNotify = 19,
+        MapRequest = 20,
+        ReparentNotify = 21,
+        ConfigureNotify = 22,
+        ConfigureRequest = 23,
+        GravityNotify = 24,
+        ResizeRequest = 25,
+        CirculateNotify = 26,
+        CirculateRequest = 27,
+        PropertyNotify = 28,
+        SelectionClear = 29,
+        SelectionRequest = 30,
+        SelectionNotify = 31,
+        ColormapNotify = 32,
+        ClientMessage = 33,
+        MappingNotify = 34,
+
+        LASTEvent
+    }
+
+    [Flags]
+    internal enum SetWindowValuemask
+    {
+        Nothing = 0,
+        BackPixmap = 1,
+        BackPixel = 2,
+        BorderPixmap = 4,
+        BorderPixel = 8,
+        BitGravity = 16,
+        WinGravity = 32,
+        BackingStore = 64,
+        BackingPlanes = 128,
+        BackingPixel = 256,
+        OverrideRedirect = 512,
+        SaveUnder = 1024,
+        EventMask = 2048,
+        DontPropagate = 4096,
+        ColorMap = 8192,
+        Cursor = 16384
+    }
+
+    internal enum CreateWindowArgs
+    {
+        CopyFromParent = 0,
+        ParentRelative = 1,
+        InputOutput = 1,
+        InputOnly = 2
+    }
+
+    internal enum Gravity
+    {
+        ForgetGravity = 0,
+        NorthWestGravity = 1,
+        NorthGravity = 2,
+        NorthEastGravity = 3,
+        WestGravity = 4,
+        CenterGravity = 5,
+        EastGravity = 6,
+        SouthWestGravity = 7,
+        SouthGravity = 8,
+        SouthEastGravity = 9,
+        StaticGravity = 10
+    }
+
+    internal enum XKeySym : uint
+    {
+        XK_BackSpace = 0xFF08,
+        XK_Tab = 0xFF09,
+        XK_Clear = 0xFF0B,
+        XK_Return = 0xFF0D,
+        XK_Home = 0xFF50,
+        XK_Left = 0xFF51,
+        XK_Up = 0xFF52,
+        XK_Right = 0xFF53,
+        XK_Down = 0xFF54,
+        XK_Page_Up = 0xFF55,
+        XK_Page_Down = 0xFF56,
+        XK_End = 0xFF57,
+        XK_Begin = 0xFF58,
+        XK_Menu = 0xFF67,
+        XK_Shift_L = 0xFFE1,
+        XK_Shift_R = 0xFFE2,
+        XK_Control_L = 0xFFE3,
+        XK_Control_R = 0xFFE4,
+        XK_Caps_Lock = 0xFFE5,
+        XK_Shift_Lock = 0xFFE6,
+        XK_Meta_L = 0xFFE7,
+        XK_Meta_R = 0xFFE8,
+        XK_Alt_L = 0xFFE9,
+        XK_Alt_R = 0xFFEA,
+        XK_Super_L = 0xFFEB,
+        XK_Super_R = 0xFFEC,
+        XK_Hyper_L = 0xFFED,
+        XK_Hyper_R = 0xFFEE,
+    }
+
+    [Flags]
+    internal enum EventMask
+    {
+        NoEventMask = 0,
+        KeyPressMask = 1 << 0,
+        KeyReleaseMask = 1 << 1,
+        ButtonPressMask = 1 << 2,
+        ButtonReleaseMask = 1 << 3,
+        EnterWindowMask = 1 << 4,
+        LeaveWindowMask = 1 << 5,
+        PointerMotionMask = 1 << 6,
+        PointerMotionHintMask = 1 << 7,
+        Button1MotionMask = 1 << 8,
+        Button2MotionMask = 1 << 9,
+        Button3MotionMask = 1 << 10,
+        Button4MotionMask = 1 << 11,
+        Button5MotionMask = 1 << 12,
+        ButtonMotionMask = 1 << 13,
+        KeymapStateMask = 1 << 14,
+        ExposureMask = 1 << 15,
+        VisibilityChangeMask = 1 << 16,
+        StructureNotifyMask = 1 << 17,
+        ResizeRedirectMask = 1 << 18,
+        SubstructureNotifyMask = 1 << 19,
+        SubstructureRedirectMask = 1 << 20,
+        FocusChangeMask = 1 << 21,
+        PropertyChangeMask = 1 << 22,
+        ColormapChangeMask = 1 << 23,
+        OwnerGrabButtonMask = 1 << 24
+    }
+
+    internal enum GrabMode
+    {
+        GrabModeSync = 0,
+        GrabModeAsync = 1
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XStandardColormap
+    {
+        internal IntPtr colormap;
+        internal IntPtr red_max;
+        internal IntPtr red_mult;
+        internal IntPtr green_max;
+        internal IntPtr green_mult;
+        internal IntPtr blue_max;
+        internal IntPtr blue_mult;
+        internal IntPtr base_pixel;
+        internal IntPtr visualid;
+        internal IntPtr killid;
+    }
+
+    [StructLayout(LayoutKind.Sequential, Pack = 2)]
+    internal struct XColor
+    {
+        internal IntPtr pixel;
+        internal ushort red;
+        internal ushort green;
+        internal ushort blue;
+        internal byte flags;
+        internal byte pad;
+    }
+
+    internal enum Atom
+    {
+        AnyPropertyType = 0,
+        XA_PRIMARY = 1,
+        XA_SECONDARY = 2,
+        XA_ARC = 3,
+        XA_ATOM = 4,
+        XA_BITMAP = 5,
+        XA_CARDINAL = 6,
+        XA_COLORMAP = 7,
+        XA_CURSOR = 8,
+        XA_CUT_BUFFER0 = 9,
+        XA_CUT_BUFFER1 = 10,
+        XA_CUT_BUFFER2 = 11,
+        XA_CUT_BUFFER3 = 12,
+        XA_CUT_BUFFER4 = 13,
+        XA_CUT_BUFFER5 = 14,
+        XA_CUT_BUFFER6 = 15,
+        XA_CUT_BUFFER7 = 16,
+        XA_DRAWABLE = 17,
+        XA_FONT = 18,
+        XA_INTEGER = 19,
+        XA_PIXMAP = 20,
+        XA_POINT = 21,
+        XA_RECTANGLE = 22,
+        XA_RESOURCE_MANAGER = 23,
+        XA_RGB_COLOR_MAP = 24,
+        XA_RGB_BEST_MAP = 25,
+        XA_RGB_BLUE_MAP = 26,
+        XA_RGB_DEFAULT_MAP = 27,
+        XA_RGB_GRAY_MAP = 28,
+        XA_RGB_GREEN_MAP = 29,
+        XA_RGB_RED_MAP = 30,
+        XA_STRING = 31,
+        XA_VISUALID = 32,
+        XA_WINDOW = 33,
+        XA_WM_COMMAND = 34,
+        XA_WM_HINTS = 35,
+        XA_WM_CLIENT_MACHINE = 36,
+        XA_WM_ICON_NAME = 37,
+        XA_WM_ICON_SIZE = 38,
+        XA_WM_NAME = 39,
+        XA_WM_NORMAL_HINTS = 40,
+        XA_WM_SIZE_HINTS = 41,
+        XA_WM_ZOOM_HINTS = 42,
+        XA_MIN_SPACE = 43,
+        XA_NORM_SPACE = 44,
+        XA_MAX_SPACE = 45,
+        XA_END_SPACE = 46,
+        XA_SUPERSCRIPT_X = 47,
+        XA_SUPERSCRIPT_Y = 48,
+        XA_SUBSCRIPT_X = 49,
+        XA_SUBSCRIPT_Y = 50,
+        XA_UNDERLINE_POSITION = 51,
+        XA_UNDERLINE_THICKNESS = 52,
+        XA_STRIKEOUT_ASCENT = 53,
+        XA_STRIKEOUT_DESCENT = 54,
+        XA_ITALIC_ANGLE = 55,
+        XA_X_HEIGHT = 56,
+        XA_QUAD_WIDTH = 57,
+        XA_WEIGHT = 58,
+        XA_POINT_SIZE = 59,
+        XA_RESOLUTION = 60,
+        XA_COPYRIGHT = 61,
+        XA_NOTICE = 62,
+        XA_FONT_NAME = 63,
+        XA_FAMILY_NAME = 64,
+        XA_FULL_NAME = 65,
+        XA_CAP_HEIGHT = 66,
+        XA_WM_CLASS = 67,
+        XA_WM_TRANSIENT_FOR = 68,
+
+        XA_LAST_PREDEFINED = 68
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XScreen
+    {
+        internal IntPtr ext_data;
+        internal IntPtr display;
+        internal IntPtr root;
+        internal int width;
+        internal int height;
+        internal int mwidth;
+        internal int mheight;
+        internal int ndepths;
+        internal IntPtr depths;
+        internal int root_depth;
+        internal IntPtr root_visual;
+        internal IntPtr default_gc;
+        internal IntPtr cmap;
+        internal IntPtr white_pixel;
+        internal IntPtr black_pixel;
+        internal int max_maps;
+        internal int min_maps;
+        internal int backing_store;
+        internal bool save_unders;
+        internal IntPtr root_input_mask;
+    }
+
+    [Flags]
+    internal enum ChangeWindowFlags
+    {
+        CWX = 1 << 0,
+        CWY = 1 << 1,
+        CWWidth = 1 << 2,
+        CWHeight = 1 << 3,
+        CWBorderWidth = 1 << 4,
+        CWSibling = 1 << 5,
+        CWStackMode = 1 << 6
+    }
+
+    internal enum StackMode
+    {
+        Above = 0,
+        Below = 1,
+        TopIf = 2,
+        BottomIf = 3,
+        Opposite = 4
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XWindowChanges
+    {
+        internal int x;
+        internal int y;
+        internal int width;
+        internal int height;
+        internal int border_width;
+        internal IntPtr sibling;
+        internal StackMode stack_mode;
+    }
+
+    [Flags]
+    internal enum ColorFlags
+    {
+        DoRed = 1 << 0,
+        DoGreen = 1 << 1,
+        DoBlue = 1 << 2
+    }
+
+    internal enum NotifyMode
+    {
+        NotifyNormal = 0,
+        NotifyGrab = 1,
+        NotifyUngrab = 2
+    }
+
+    internal enum NotifyDetail
+    {
+        NotifyAncestor = 0,
+        NotifyVirtual = 1,
+        NotifyInferior = 2,
+        NotifyNonlinear = 3,
+        NotifyNonlinearVirtual = 4,
+        NotifyPointer = 5,
+        NotifyPointerRoot = 6,
+        NotifyDetailNone = 7
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct MotifWmHints
+    {
+        internal IntPtr flags;
+        internal IntPtr functions;
+        internal IntPtr decorations;
+        internal IntPtr input_mode;
+        internal IntPtr status;
+
+        public override string ToString()
+        {
+            return string.Format("MotifWmHints <flags={0}, functions={1}, decorations={2}, input_mode={3}, status={4}", (MotifFlags)flags.ToInt32(), (MotifFunctions)functions.ToInt32(), (MotifDecorations)decorations.ToInt32(), (MotifInputMode)input_mode.ToInt32(), status.ToInt32());
+        }
+    }
+
+    [Flags]
+    internal enum MotifFlags
+    {
+        Functions = 1,
+        Decorations = 2,
+        InputMode = 4,
+        Status = 8
+    }
+
+    [Flags]
+    internal enum MotifFunctions
+    {
+        All = 0x01,
+        Resize = 0x02,
+        Move = 0x04,
+        Minimize = 0x08,
+        Maximize = 0x10,
+        Close = 0x20
+    }
+
+    [Flags]
+    internal enum MotifDecorations
+    {
+        All = 0x01,
+        Border = 0x02,
+        ResizeH = 0x04,
+        Title = 0x08,
+        Menu = 0x10,
+        Minimize = 0x20,
+        Maximize = 0x40,
+
+    }
+
+    [Flags]
+    internal enum MotifInputMode
+    {
+        Modeless = 0,
+        ApplicationModal = 1,
+        SystemModal = 2,
+        FullApplicationModal = 3
+    }
+
+    [Flags]
+    internal enum KeyMasks
+    {
+        ShiftMask = (1 << 0),
+        LockMask = (1 << 1),
+        ControlMask = (1 << 2),
+        Mod1Mask = (1 << 3),
+        Mod2Mask = (1 << 4),
+        Mod3Mask = (1 << 5),
+        Mod4Mask = (1 << 6),
+        Mod5Mask = (1 << 7),
+
+        ModMasks = Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XModifierKeymap
+    {
+        public int max_keypermod;
+        public IntPtr modifiermap;
+    }
+
+    internal enum PropertyMode
+    {
+        Replace = 0,
+        Prepend = 1,
+        Append = 2
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XKeyBoardState
+    {
+        public int key_click_percent;
+        public int bell_percent;
+        public uint bell_pitch, bell_duration;
+        public IntPtr led_mask;
+        public int global_auto_repeat;
+        public AutoRepeats auto_repeats;
+
+        [StructLayout(LayoutKind.Explicit)]
+        public struct AutoRepeats
+        {
+            [FieldOffset(0)]
+            public byte first;
+
+            [FieldOffset(31)]
+            public byte last;
+        }
+    }
+
+    [Flags]
+    internal enum GCFunction
+    {
+        GCFunction = 1 << 0,
+        GCPlaneMask = 1 << 1,
+        GCForeground = 1 << 2,
+        GCBackground = 1 << 3,
+        GCLineWidth = 1 << 4,
+        GCLineStyle = 1 << 5,
+        GCCapStyle = 1 << 6,
+        GCJoinStyle = 1 << 7,
+        GCFillStyle = 1 << 8,
+        GCFillRule = 1 << 9,
+        GCTile = 1 << 10,
+        GCStipple = 1 << 11,
+        GCTileStipXOrigin = 1 << 12,
+        GCTileStipYOrigin = 1 << 13,
+        GCFont = 1 << 14,
+        GCSubwindowMode = 1 << 15,
+        GCGraphicsExposures = 1 << 16,
+        GCClipXOrigin = 1 << 17,
+        GCClipYOrigin = 1 << 18,
+        GCClipMask = 1 << 19,
+        GCDashOffset = 1 << 20,
+        GCDashList = 1 << 21,
+        GCArcMode = 1 << 22
+    }
+
+    internal enum GCJoinStyle
+    {
+        JoinMiter = 0,
+        JoinRound = 1,
+        JoinBevel = 2
+    }
+
+    internal enum GCLineStyle
+    {
+        LineSolid = 0,
+        LineOnOffDash = 1,
+        LineDoubleDash = 2
+    }
+
+    internal enum GCCapStyle
+    {
+        CapNotLast = 0,
+        CapButt = 1,
+        CapRound = 2,
+        CapProjecting = 3
+    }
+
+    internal enum GCFillStyle
+    {
+        FillSolid = 0,
+        FillTiled = 1,
+        FillStippled = 2,
+        FillOpaqueStppled = 3
+    }
+
+    internal enum GCFillRule
+    {
+        EvenOddRule = 0,
+        WindingRule = 1
+    }
+
+    internal enum GCArcMode
+    {
+        ArcChord = 0,
+        ArcPieSlice = 1
+    }
+
+    internal enum GCSubwindowMode
+    {
+        ClipByChildren = 0,
+        IncludeInferiors = 1
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XGCValues
+    {
+        internal GXFunction function;
+        internal IntPtr plane_mask;
+        internal IntPtr foreground;
+        internal IntPtr background;
+        internal int line_width;
+        internal GCLineStyle line_style;
+        internal GCCapStyle cap_style;
+        internal GCJoinStyle join_style;
+        internal GCFillStyle fill_style;
+        internal GCFillRule fill_rule;
+        internal GCArcMode arc_mode;
+        internal IntPtr tile;
+        internal IntPtr stipple;
+        internal int ts_x_origin;
+        internal int ts_y_origin;
+        internal IntPtr font;
+        internal GCSubwindowMode subwindow_mode;
+        internal bool graphics_exposures;
+        internal int clip_x_origin;
+        internal int clib_y_origin;
+        internal IntPtr clip_mask;
+        internal int dash_offset;
+        internal byte dashes;
+    }
+
+    internal enum GXFunction
+    {
+        GXclear = 0x0,		/* 0 */
+        GXand = 0x1,		/* src AND dst */
+        GXandReverse = 0x2,		/* src AND NOT dst */
+        GXcopy = 0x3,		/* src */
+        GXandInverted = 0x4,		/* NOT src AND dst */
+        GXnoop = 0x5,		/* dst */
+        GXxor = 0x6,		/* src XOR dst */
+        GXor = 0x7,		/* src OR dst */
+        GXnor = 0x8,		/* NOT src AND NOT dst */
+        GXequiv = 0x9,		/* NOT src XOR dst */
+        GXinvert = 0xa,		/* NOT dst */
+        GXorReverse = 0xb,		/* src OR NOT dst */
+        GXcopyInverted = 0xc,		/* NOT src */
+        GXorInverted = 0xd,		/* NOT src OR dst */
+        GXnand = 0xe,		/* NOT src OR NOT dst */
+        GXset = 0xf		/* 1 */
+    }
+
+    internal enum NetWindowManagerState
+    {
+        Remove = 0,
+        Add = 1,
+        Toggle = 2
+    }
+
+    internal enum RevertTo
+    {
+        None = 0,
+        PointerRoot = 1,
+        Parent = 2
+    }
+
+    internal enum MapState
+    {
+        IsUnmapped = 0,
+        IsUnviewable = 1,
+        IsViewable = 2
+    }
+
+    internal enum CursorFontShape
+    {
+        XC_X_cursor = 0,
+        XC_arrow = 2,
+        XC_based_arrow_down = 4,
+        XC_based_arrow_up = 6,
+        XC_boat = 8,
+        XC_bogosity = 10,
+        XC_bottom_left_corner = 12,
+        XC_bottom_right_corner = 14,
+        XC_bottom_side = 16,
+        XC_bottom_tee = 18,
+        XC_box_spiral = 20,
+        XC_center_ptr = 22,
+
+        XC_circle = 24,
+        XC_clock = 26,
+        XC_coffee_mug = 28,
+        XC_cross = 30,
+        XC_cross_reverse = 32,
+        XC_crosshair = 34,
+        XC_diamond_cross = 36,
+        XC_dot = 38,
+        XC_dotbox = 40,
+        XC_double_arrow = 42,
+        XC_draft_large = 44,
+        XC_draft_small = 46,
+
+        XC_draped_box = 48,
+        XC_exchange = 50,
+        XC_fleur = 52,
+        XC_gobbler = 54,
+        XC_gumby = 56,
+        XC_hand1 = 58,
+        XC_hand2 = 60,
+        XC_heart = 62,
+        XC_icon = 64,
+        XC_iron_cross = 66,
+        XC_left_ptr = 68,
+        XC_left_side = 70,
+
+        XC_left_tee = 72,
+        XC_left_button = 74,
+        XC_ll_angle = 76,
+        XC_lr_angle = 78,
+        XC_man = 80,
+        XC_middlebutton = 82,
+        XC_mouse = 84,
+        XC_pencil = 86,
+        XC_pirate = 88,
+        XC_plus = 90,
+        XC_question_arrow = 92,
+        XC_right_ptr = 94,
+
+        XC_right_side = 96,
+        XC_right_tee = 98,
+        XC_rightbutton = 100,
+        XC_rtl_logo = 102,
+        XC_sailboat = 104,
+        XC_sb_down_arrow = 106,
+        XC_sb_h_double_arrow = 108,
+        XC_sb_left_arrow = 110,
+        XC_sb_right_arrow = 112,
+        XC_sb_up_arrow = 114,
+        XC_sb_v_double_arrow = 116,
+        XC_sb_shuttle = 118,
+
+        XC_sizing = 120,
+        XC_spider = 122,
+        XC_spraycan = 124,
+        XC_star = 126,
+        XC_target = 128,
+        XC_tcross = 130,
+        XC_top_left_arrow = 132,
+        XC_top_left_corner = 134,
+        XC_top_right_corner = 136,
+        XC_top_side = 138,
+        XC_top_tee = 140,
+        XC_trek = 142,
+
+        XC_ul_angle = 144,
+        XC_umbrella = 146,
+        XC_ur_angle = 148,
+        XC_watch = 150,
+        XC_xterm = 152,
+        XC_num_glyphs = 154
+    }
+
+    internal enum SystrayRequest
+    {
+        SYSTEM_TRAY_REQUEST_DOCK = 0,
+        SYSTEM_TRAY_BEGIN_MESSAGE = 1,
+        SYSTEM_TRAY_CANCEL_MESSAGE = 2
+    }
+
+    [Flags]
+    internal enum XSizeHintsFlags
+    {
+        USPosition = (1 << 0),
+        USSize = (1 << 1),
+        PPosition = (1 << 2),
+        PSize = (1 << 3),
+        PMinSize = (1 << 4),
+        PMaxSize = (1 << 5),
+        PResizeInc = (1 << 6),
+        PAspect = (1 << 7),
+        PAllHints = (PPosition | PSize | PMinSize | PMaxSize | PResizeInc | PAspect),
+        PBaseSize = (1 << 8),
+        PWinGravity = (1 << 9),
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XSizeHints
+    {
+        internal IntPtr flags;
+        internal int x;
+        internal int y;
+        internal int width;
+        internal int height;
+        internal int min_width;
+        internal int min_height;
+        internal int max_width;
+        internal int max_height;
+        internal int width_inc;
+        internal int height_inc;
+        internal int min_aspect_x;
+        internal int min_aspect_y;
+        internal int max_aspect_x;
+        internal int max_aspect_y;
+        internal int base_width;
+        internal int base_height;
+        internal int win_gravity;
+    }
+
+    [Flags]
+    internal enum XWMHintsFlags
+    {
+        InputHint = (1 << 0),
+        StateHint = (1 << 1),
+        IconPixmapHint = (1 << 2),
+        IconWindowHint = (1 << 3),
+        IconPositionHint = (1 << 4),
+        IconMaskHint = (1 << 5),
+        WindowGroupHint = (1 << 6),
+        AllHints = (InputHint | StateHint | IconPixmapHint | IconWindowHint | IconPositionHint | IconMaskHint | WindowGroupHint)
+    }
+
+    internal enum XInitialState
+    {
+        DontCareState = 0,
+        NormalState = 1,
+        ZoomState = 2,
+        IconicState = 3,
+        InactiveState = 4
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XWMHints
+    {
+        internal IntPtr flags;
+        internal bool input;
+        internal XInitialState initial_state;
+        internal IntPtr icon_pixmap;
+        internal IntPtr icon_window;
+        internal int icon_x;
+        internal int icon_y;
+        internal IntPtr icon_mask;
+        internal IntPtr window_group;
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct XIconSize
+    {
+        internal int min_width;
+        internal int min_height;
+        internal int max_width;
+        internal int max_height;
+        internal int width_inc;
+        internal int height_inc;
+    }
+
+    internal delegate int XErrorHandler(IntPtr DisplayHandle, ref XErrorEvent error_event);
+
+    internal enum XRequest : byte
+    {
+        X_CreateWindow = 1,
+        X_ChangeWindowAttributes = 2,
+        X_GetWindowAttributes = 3,
+        X_DestroyWindow = 4,
+        X_DestroySubwindows = 5,
+        X_ChangeSaveSet = 6,
+        X_ReparentWindow = 7,
+        X_MapWindow = 8,
+        X_MapSubwindows = 9,
+        X_UnmapWindow = 10,
+        X_UnmapSubwindows = 11,
+        X_ConfigureWindow = 12,
+        X_CirculateWindow = 13,
+        X_GetGeometry = 14,
+        X_QueryTree = 15,
+        X_InternAtom = 16,
+        X_GetAtomName = 17,
+        X_ChangeProperty = 18,
+        X_DeleteProperty = 19,
+        X_GetProperty = 20,
+        X_ListProperties = 21,
+        X_SetSelectionOwner = 22,
+        X_GetSelectionOwner = 23,
+        X_ConvertSelection = 24,
+        X_SendEvent = 25,
+        X_GrabPointer = 26,
+        X_UngrabPointer = 27,
+        X_GrabButton = 28,
+        X_UngrabButton = 29,
+        X_ChangeActivePointerGrab = 30,
+        X_GrabKeyboard = 31,
+        X_UngrabKeyboard = 32,
+        X_GrabKey = 33,
+        X_UngrabKey = 34,
+        X_AllowEvents = 35,
+        X_GrabServer = 36,
+        X_UngrabServer = 37,
+        X_QueryPointer = 38,
+        X_GetMotionEvents = 39,
+        X_TranslateCoords = 40,
+        X_WarpPointer = 41,
+        X_SetInputFocus = 42,
+        X_GetInputFocus = 43,
+        X_QueryKeymap = 44,
+        X_OpenFont = 45,
+        X_CloseFont = 46,
+        X_QueryFont = 47,
+        X_QueryTextExtents = 48,
+        X_ListFonts = 49,
+        X_ListFontsWithInfo = 50,
+        X_SetFontPath = 51,
+        X_GetFontPath = 52,
+        X_CreatePixmap = 53,
+        X_FreePixmap = 54,
+        X_CreateGC = 55,
+        X_ChangeGC = 56,
+        X_CopyGC = 57,
+        X_SetDashes = 58,
+        X_SetClipRectangles = 59,
+        X_FreeGC = 60,
+        X_ClearArea = 61,
+        X_CopyArea = 62,
+        X_CopyPlane = 63,
+        X_PolyPoint = 64,
+        X_PolyLine = 65,
+        X_PolySegment = 66,
+        X_PolyRectangle = 67,
+        X_PolyArc = 68,
+        X_FillPoly = 69,
+        X_PolyFillRectangle = 70,
+        X_PolyFillArc = 71,
+        X_PutImage = 72,
+        X_GetImage = 73,
+        X_PolyText8 = 74,
+        X_PolyText16 = 75,
+        X_ImageText8 = 76,
+        X_ImageText16 = 77,
+        X_CreateColormap = 78,
+        X_FreeColormap = 79,
+        X_CopyColormapAndFree = 80,
+        X_InstallColormap = 81,
+        X_UninstallColormap = 82,
+        X_ListInstalledColormaps = 83,
+        X_AllocColor = 84,
+        X_AllocNamedColor = 85,
+        X_AllocColorCells = 86,
+        X_AllocColorPlanes = 87,
+        X_FreeColors = 88,
+        X_StoreColors = 89,
+        X_StoreNamedColor = 90,
+        X_QueryColors = 91,
+        X_LookupColor = 92,
+        X_CreateCursor = 93,
+        X_CreateGlyphCursor = 94,
+        X_FreeCursor = 95,
+        X_RecolorCursor = 96,
+        X_QueryBestSize = 97,
+        X_QueryExtension = 98,
+        X_ListExtensions = 99,
+        X_ChangeKeyboardMapping = 100,
+        X_GetKeyboardMapping = 101,
+        X_ChangeKeyboardControl = 102,
+        X_GetKeyboardControl = 103,
+        X_Bell = 104,
+        X_ChangePointerControl = 105,
+        X_GetPointerControl = 106,
+        X_SetScreenSaver = 107,
+        X_GetScreenSaver = 108,
+        X_ChangeHosts = 109,
+        X_ListHosts = 110,
+        X_SetAccessControl = 111,
+        X_SetCloseDownMode = 112,
+        X_KillClient = 113,
+        X_RotateProperties = 114,
+        X_ForceScreenSaver = 115,
+        X_SetPointerMapping = 116,
+        X_GetPointerMapping = 117,
+        X_SetModifierMapping = 118,
+        X_GetModifierMapping = 119,
+        X_NoOperation = 127
+    }
+
+    [Flags]
+    internal enum XIMProperties
+    {
+        XIMPreeditArea = 0x0001,
+        XIMPreeditCallbacks = 0x0002,
+        XIMPreeditPosition = 0x0004,
+        XIMPreeditNothing = 0x0008,
+        XIMPreeditNone = 0x0010,
+        XIMStatusArea = 0x0100,
+        XIMStatusCallbacks = 0x0200,
+        XIMStatusNothing = 0x0400,
+        XIMStatusNone = 0x0800,
+    }
+
+    [Flags]
+    internal enum WindowType
+    {
+        Client = 1,
+        Whole = 2,
+        Both = 3
+    }
+
+    internal enum XEmbedMessage
+    {
+        EmbeddedNotify = 0,
+        WindowActivate = 1,
+        WindowDeactivate = 2,
+        RequestFocus = 3,
+        FocusIn = 4,
+        FocusOut = 5,
+        FocusNext = 6,
+        FocusPrev = 7,
+        /* 8-9 were used for XEMBED_GRAB_KEY/XEMBED_UNGRAB_KEY */
+        ModalityOn = 10,
+        ModalityOff = 11,
+        RegisterAccelerator = 12,
+        UnregisterAccelerator = 13,
+        ActivateAccelerator = 14
+    }
+}
diff --git a/src/Tao.Platform.X11/Tao.Platform.X11.csproj b/src/Tao.Platform.X11/Tao.Platform.X11.csproj
new file mode 100644
index 0000000..5894274
--- /dev/null
+++ b/src/Tao.Platform.X11/Tao.Platform.X11.csproj
@@ -0,0 +1,120 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{291CD638-964A-4E66-AFC1-BC9AFF9E0D60}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.Platform.X11</AssemblyName>
+    <AssemblyOriginatorKeyFile>../Tao.Platform.X11/Tao.Platform.X11.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.Platform.X11</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Platform.X11.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Platform.X11.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <HintPath>\System.Drawing.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <HintPath>\System.Windows.Forms.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Tao.OpenGl\Tao.OpenGl.csproj">
+      <Name>Tao.OpenGl</Name>
+      <Project>{6292109B-6BB4-4120-AD56-F409C0285AB6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="API.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Functions.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Glx.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Structs.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.Platform.X11.dll.config" />
+    <None Include="Tao.Platform.X11.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.Platform.X11/Tao.Platform.X11.dll.config b/src/Tao.Platform.X11/Tao.Platform.X11.dll.config
new file mode 100644
index 0000000..b437af4
--- /dev/null
+++ b/src/Tao.Platform.X11/Tao.Platform.X11.dll.config
@@ -0,0 +1,2 @@
+<configuration>
+</configuration>
diff --git a/src/Tao.Platform.X11/Tao.Platform.X11.snk b/src/Tao.Platform.X11/Tao.Platform.X11.snk
new file mode 100644
index 0000000..8e4e168
Binary files /dev/null and b/src/Tao.Platform.X11/Tao.Platform.X11.snk differ
diff --git a/src/Tao.Platform.X11/tao-platform-x11.pc.in b/src/Tao.Platform.X11/tao-platform-x11.pc.in
new file mode 100644
index 0000000..746aae8
--- /dev/null
+++ b/src/Tao.Platform.X11/tao-platform-x11.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.Platform.X11
+Description: X11-specific section of the Tao framework
+Version: @TAOX11_VERSION@
+Requires:
+Libs: -r:${libdir}/mono/tao-platform-x11- at TAOX11_MAJOR@/Tao.Platform.X11.dll
+
diff --git a/src/Tao.Sdl/AUTHORS b/src/Tao.Sdl/AUTHORS
new file mode 100644
index 0000000..24341de
--- /dev/null
+++ b/src/Tao.Sdl/AUTHORS
@@ -0,0 +1 @@
+David Hudson (jendave at yahoo.com)
diff --git a/src/Tao.Sdl/COPYING b/src/Tao.Sdl/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/src/Tao.Sdl/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Tao.Sdl/ChangeLog b/src/Tao.Sdl/ChangeLog
new file mode 100644
index 0000000..ac075c7
--- /dev/null
+++ b/src/Tao.Sdl/ChangeLog
@@ -0,0 +1,2 @@
+2008-01-11T17:19  David Hudson  <jendave at yahoo.com>
+	* updated to SDL 1.2.13
diff --git a/src/Tao.Sdl/INSTALL b/src/Tao.Sdl/INSTALL
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Sdl/Makefile.am b/src/Tao.Sdl/Makefile.am
new file mode 100644
index 0000000..c434238
--- /dev/null
+++ b/src/Tao.Sdl/Makefile.am
@@ -0,0 +1,24 @@
+
+ASSEMBLY = Tao.Sdl
+SHORTNAME = tao-sdl
+VERSION = @TAOSDL_VERSION@
+MAJOR = @TAOSDL_MAJOR@
+
+PACKAGES =
+BINARY_LIBS =
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        Sdl.cs \
+        SdlGfx.cs \
+        SdlImage.cs \
+        SdlMixer.cs \
+        SdlNet.cs \
+        SdlTtf.cs \
+        Smpeg.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/src/Tao.Sdl/Makefile.in b/src/Tao.Sdl/Makefile.in
new file mode 100644
index 0000000..142e680
--- /dev/null
+++ b/src/Tao.Sdl/Makefile.in
@@ -0,0 +1,420 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-sdl.pc.in $(top_srcdir)/Assembly.am AUTHORS \
+	COPYING ChangeLog INSTALL NEWS
+subdir = src/Tao.Sdl
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-sdl.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOSDL_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.Sdl
+SHORTNAME = tao-sdl
+MAJOR = @TAOSDL_MAJOR@
+PACKAGES = 
+BINARY_LIBS = 
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        Sdl.cs \
+        SdlGfx.cs \
+        SdlImage.cs \
+        SdlMixer.cs \
+        SdlNet.cs \
+        SdlTtf.cs \
+        Smpeg.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = $(ASSEMBLY).snk
+CONFIGFILE = $(ASSEMBLY).dll.config
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Tao.Sdl/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Tao.Sdl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-sdl.pc: $(top_builddir)/config.status $(srcdir)/tao-sdl.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Tao.Sdl/NEWS b/src/Tao.Sdl/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/src/Tao.Sdl/Properties/AssemblyInfo.cs b/src/Tao.Sdl/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..23a2a9e
--- /dev/null
+++ b/src/Tao.Sdl/Properties/AssemblyInfo.cs
@@ -0,0 +1,53 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+[assembly: AllowPartiallyTrustedCallers]
+[assembly: AssemblyCompany("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyConfiguration("Retail")]
+[assembly: AssemblyCopyright("Copyright �2003-2007 Tao Framework Team.  All rights reserved.")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyDefaultAlias("Tao.Sdl")]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyDescription("Tao Framework SDL Binding For .NET")]
+[assembly: AssemblyFileVersion("1.2.13.0")]
+[assembly: AssemblyInformationalVersion("1.2.13.0")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyProduct("Tao.Sdl.dll")]
+[assembly: AssemblyTitle("Tao Framework SDL Binding For .NET")]
+[assembly: AssemblyTrademark("Tao Framework -- http://www.taoframework.com")]
+[assembly: AssemblyVersion("1.2.13.0")]
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]
diff --git a/src/Tao.Sdl/README b/src/Tao.Sdl/README
new file mode 100644
index 0000000..0ccd1c8
--- /dev/null
+++ b/src/Tao.Sdl/README
@@ -0,0 +1,19 @@
+Tao.Sdl 1.2.12.0
+Copyright �2003-2005 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Tao.Sdl is an SDL API binding for .NET, implementing SDL 1.2.12.
+
+Change Log:
+1.2.13.0 - January 2008:
+	Updated to latest version of SDL.
+1.2.12.0 - August 2007:
+	Updated to latest version of SDL.
+1.2.11 - June 2006:
+    Updated to latest version of SDL.
+1.2.10.0 - June 15, 2006:
+    Updated to latest version of SDL.
+1.2.7.0 - April 20, 2004:
+    Initial release.  Special thanks to Dave Hudson for doing most of this
+    implementation.
diff --git a/src/Tao.Sdl/Sdl.cs b/src/Tao.Sdl/Sdl.cs
new file mode 100644
index 0000000..17ea83a
--- /dev/null
+++ b/src/Tao.Sdl/Sdl.cs
@@ -0,0 +1,13290 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE. 
+*/
+#endregion License
+
+using System;
+using System.IO;
+using System.Collections;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Text;
+
+namespace Tao.Sdl
+{
+    #region Class Documentation
+    /// <summary>
+    ///     Simple DirectMedia Layer binding for .NET, implementing SDL 1.2.13.
+    /// </summary>
+    /// <remarks>
+    /// This library is designed to make it easy to write games that run 
+    /// the .NET runtime using the various native high-performance media 
+    /// interfaces, (for video, audio, etc) and presenting a single
+    ///  source-code level API to your application. This is a fairly 
+    ///  low level API, but using this, completely portable applications 
+    ///  can be written with a great deal of flexibility.
+    /// <p>An introduction to SDL can be found online at: http://www.libsdl.org/intro/ </p>
+    /// <p>Binds to functions and definitions in SDL.dll or libSDL.so.</p>
+    /// </remarks>
+    #endregion Class Documentation
+    [SuppressUnmanagedCodeSecurityAttribute()]
+    public static class Sdl
+    {
+        #region Private Constants
+        #region string SDL_NATIVE_LIBRARY
+        /// <summary>
+        ///     Specifies SDL's native library archive.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies SDL.dll everywhere; will be mapped via .config for mono.
+        /// </remarks>
+        private const string SDL_NATIVE_LIBRARY = "SDL.dll";
+        #endregion string SDL_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        ///     Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        ///     Specifies <see cref="CallingConvention.Cdecl" /> 
+        ///     for Windows and Linux.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION =
+            CallingConvention.Cdecl;
+        #endregion CallingConvention CALLING_CONVENTION
+
+        private const int BYTE_SIZE = 8;
+        #endregion Private Constants
+
+        #region Private Methods
+        // OS X compatibility.
+        [DllImport("/System/Library/Frameworks/Cocoa.framework/Cocoa", EntryPoint = "NSApplicationLoad")]
+        private static extern void NSApplicationLoad();
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        [DllImport("libobjc.dylib", EntryPoint = "objc_getClass")]
+        public static extern int objc_getClass(string name);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        [DllImport("libobjc.dylib", EntryPoint = "sel_registerName")]
+        public static extern int sel_registerName(string name);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="self"></param>
+        /// <param name="cmd"></param>
+        /// <returns></returns>
+        [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")]
+        public static extern int objc_msgSend(int self, int cmd);
+
+        #endregion Private Methods
+
+        #region Public Constants
+        #region SDL.h
+        #region SDL_INIT_TIMER
+        /// <summary>
+        ///     The timer subsystem.
+        /// </summary>
+        // #define SDL_INIT_TIMER 0x00000001
+        public const int SDL_INIT_TIMER = 0x00000001;
+        #endregion SDL_INIT_TIMER
+
+        #region SDL_INIT_AUDIO
+        /// <summary>
+        ///     The audio subsystem.
+        /// </summary>
+        // #define SDL_INIT_AUDIO 0x00000010
+        public const int SDL_INIT_AUDIO = 0x00000010;
+        #endregion SDL_INIT_AUDIO
+
+        #region SDL_INIT_VIDEO
+        /// <summary>
+        ///     The video subsystem.
+        /// </summary>
+        // #define SDL_INIT_VIDEO 0x00000020
+        public const int SDL_INIT_VIDEO = 0x00000020;
+        #endregion SDL_INIT_VIDEO
+
+        #region SDL_INIT_CDROM
+        /// <summary>
+        ///     The CD-ROM subsystem.
+        /// </summary>
+        // #define SDL_INIT_CDROM 0x00000100
+        public const int SDL_INIT_CDROM = 0x00000100;
+        #endregion SDL_INIT_CDROM
+
+        #region SDL_INIT_JOYSTICK
+        /// <summary>
+        ///     The joystick subsystem.
+        /// </summary>
+        // #define SDL_INIT_JOYSTICK 0x00000200
+        public const int SDL_INIT_JOYSTICK = 0x00000200;
+        #endregion SDL_INIT_JOYSTICK
+
+        #region SDL_INIT_NOPARACHUTE
+        /// <summary>
+        ///     Prevents SDL from catching fatal signals.
+        /// </summary>
+        // #define SDL_INIT_NOPARACHUTE 0x00100000
+        public const int SDL_INIT_NOPARACHUTE = 0x00100000;
+        #endregion SDL_INIT_NOPARACHUTE
+
+        #region SDL_INIT_EVENTTHREAD
+        /// <summary>
+        ///     Not supported on all OS's.
+        /// </summary>
+        // #define SDL_INIT_EVENTTHREAD 0x01000000
+        public const int SDL_INIT_EVENTTHREAD = 0x01000000;
+        #endregion SDL_INIT_EVENTTHREAD
+
+        #region SDL_INIT_EVERYTHING
+        /// <summary>
+        ///     All subsystems. 
+        ///     These are the flags which may be passed to SDL_Init()
+        ///     -- you should specify the subsystems which you will be
+        ///     using in your application..
+        /// </summary>
+        // #define SDL_INIT_EVERYTHING 0x0000FFFF
+        public const int SDL_INIT_EVERYTHING = 0x0000FFFF;
+        #endregion SDL_INIT_EVERYTHING
+        #endregion SDL.h
+
+        #region SDL_active.h
+        #region SDL_APPMOUSEFOCUS
+        /// <summary>
+        /// The app has mouse coverage
+        /// </summary>
+        /// <remarks>
+        /// The available application states
+        /// </remarks>
+        public const byte SDL_APPMOUSEFOCUS = 0x01;
+        #endregion SDL_APPMOUSEFOCUS
+
+        #region SDL_APPINPUTFOCUS
+        /// <summary>
+        /// The app has input focus
+        /// </summary>
+        /// <remarks>
+        /// The available application states
+        /// </remarks>
+        public const byte SDL_APPINPUTFOCUS = 0x02;
+        #endregion SDL_APPINPUTFOCUS
+
+        #region SDL_APPACTIVE
+        /// <summary>
+        /// The application is active
+        /// </summary>
+        /// <remarks>
+        /// The available application states
+        /// </remarks>
+        public const byte SDL_APPACTIVE = 0x04;
+        #endregion SDL_APPACTIVE
+        #endregion SDL_active.h
+
+        #region SDL_audio.h
+        #region AUDIO_U8
+        /// <summary>
+        /// Unsigned 8-bit samples.
+        /// </summary>
+        public const short AUDIO_U8 = 0x0008;
+        #endregion AUDIO_U8
+
+        #region AUDIO_S8
+        /// <summary>
+        /// Signed 8-bit samples.
+        /// </summary>
+        public const short AUDIO_S8 = unchecked((short)0x8008);
+        #endregion AUDIO_S8
+
+        #region AUDIO_U16LSB
+        /// <summary>
+        /// Unsigned 16-bit little-endian samples.
+        /// </summary>
+        public const short AUDIO_U16LSB = 0x0010;
+        #endregion AUDIO_U16LSB
+
+        #region AUDIO_S16LSB
+        /// <summary>
+        /// Signed 16-bit little-endian samples
+        /// </summary>
+        public const short AUDIO_S16LSB = unchecked((short)0x8010);
+        #endregion AUDIO_S16LSB
+
+        #region AUDIO_U16MSB
+        /// <summary>
+        /// Unsigned 16-bit big-endian samples
+        /// </summary>
+        public const short AUDIO_U16MSB = 0x1010;
+        #endregion AUDIO_U16MSB
+
+        #region AUDIO_S16MSB
+        /// <summary>
+        /// Signed 16-bit big-endian samples
+        /// </summary>
+        public const short AUDIO_S16MSB = unchecked((short)0x9010);
+        #endregion AUDIO_S16MSB
+
+        #region AUDIO_U16
+        /// <summary>
+        /// Unsigned 16-bit little-endian samples
+        /// </summary>
+        public static readonly short AUDIO_U16 = AUDIO_U16LSB;
+        #endregion AUDIO_U16
+
+        #region AUDIO_S16
+        /// <summary>
+        /// Signed 16-bit little-endian samples
+        /// </summary>
+        public static readonly short AUDIO_S16 = unchecked((short)AUDIO_S16LSB);
+        #endregion AUDIO_S16
+
+        #region SDL_MIX_MAXVOLUME
+        /// <summary>
+        /// Full audio volume
+        /// </summary>
+        public const int SDL_MIX_MAXVOLUME = 128;
+        #endregion SDL_MIX_MAXVOLUME
+        #endregion SDL_audio.h
+
+        // SDL_byteorder.h -- deprecated
+
+        #region SDL_cdrom.h
+        #region SDL_MAX_TRACKS
+        /// <summary>
+        /// The maximum number of CD-ROM tracks on a disk
+        /// </summary>
+        public const int SDL_MAX_TRACKS = 99;
+        #endregion SDL_MAX_TRACKS
+
+        #region SDL_AUDIO_TRACK
+        /// <summary>
+        /// The types of CD-ROM track possible
+        /// </summary>
+        public const int SDL_AUDIO_TRACK = 0x00;
+        #endregion SDL_AUDIO_TRACK
+
+        #region SDL_DATA_TRACK
+        /// <summary>
+        /// The types of CD-ROM track possible
+        /// </summary>
+        public const int SDL_DATA_TRACK = 0x04;
+        #endregion SDL_DATA_TRACK
+
+        #region CD_FPS
+        /// <summary>
+        /// Frames per second.
+        /// </summary>
+        public const int CD_FPS = 75;
+        #endregion CD_FPS
+        #endregion SDL_cdrom.h
+
+        // SDL_config.h -- none
+        // SDL_copying.h -- none
+        // SDL_cpuinfo.h -- none
+
+        #region SDL_endian.h
+        #region SDL_LIL_ENDIAN
+        /// <summary>
+        /// Little Endian
+        /// </summary>
+        /// <remarks>
+        /// e.g. i386 machines</remarks>
+        public const int SDL_LIL_ENDIAN = 1234;
+        #endregion SDL_LIL_ENDIAN
+
+        #region SDL_BIG_ENDIAN
+        /// <summary>
+        /// Big Endian
+        /// </summary>
+        /// <remarks>
+        /// e.g. Macs
+        /// </remarks>
+        public const int SDL_BIG_ENDIAN = 4321;
+        #endregion SDL_BIG_ENDIAN
+        #endregion SDL_endian.h
+
+        // SDL_error.h -- none
+
+        #region SDL_events.h
+        /// <summary>
+        /// Button in pressed state.
+        /// </summary>
+        /// <remarks>
+        /// SDL_events.h defines SDL_PRESSED and <see cref="SDL_RELEASED"/>
+        ///  in a nameless enum. Defining SDL_PRESSED as a const works 
+        ///  better for Tao.SDL purposes</remarks>
+        ///  <seealso cref="SDL_RELEASED"/>
+        public const byte SDL_PRESSED = 0x01;
+        /// <summary>
+        /// Button in released state.
+        /// </summary>
+        /// <remarks>
+        /// SDL_events.h defines <see cref="SDL_PRESSED"/> and SDL_RELEASED
+        ///  in a nameless enum. Defining SDL_RELEASED as a const works 
+        ///  better for Tao.SDL purposes</remarks>
+        ///  <seealso cref="SDL_PRESSED"/>
+        public const byte SDL_RELEASED = 0x00;
+
+        /// <summary>
+        /// This is the mask which refers to all hotkey bindings.
+        /// </summary>
+        public const int SDL_ALLEVENTS = unchecked((int)0xFFFFFFFF);
+
+        /// <summary>
+        /// If 'state' is set to SDL_QUERY, SDL_EventState() 
+        /// will return the 
+        /// current processing state of the specified event.
+        /// </summary>
+        public const int SDL_QUERY = -1;
+        /// <summary>
+        /// If 'state' is set to SDL_IGNORE, that event will be 
+        /// automatically dropped
+        /// from the event queue and will not event be filtered.
+        /// </summary>
+        public const int SDL_IGNORE = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_DISABLE = 0;
+        /// <summary>
+        /// If 'state' is set to SDL_ENABLE, that event will 
+        /// be processed normally.
+        /// </summary>
+        public const int SDL_ENABLE = 1;
+        #endregion SDL_events.h
+
+        // SDL_getenv.h -- deprecated
+
+        #region SDL_joystick.h
+        /// <summary>
+        /// Indicates which position a joystick hat is pressed in
+        /// </summary>
+        public const byte SDL_HAT_CENTERED = 0x00;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_HAT_UP = 0x01;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_HAT_RIGHT = 0x02;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_HAT_DOWN = 0x04;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_HAT_LEFT = 0x08;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_HAT_RIGHTUP = (SDL_HAT_RIGHT | SDL_HAT_UP);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_HAT_RIGHTDOWN = (SDL_HAT_RIGHT | SDL_HAT_DOWN);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_HAT_LEFTUP = (SDL_HAT_LEFT | SDL_HAT_UP);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_HAT_LEFTDOWN = (SDL_HAT_LEFT | SDL_HAT_DOWN);
+        #endregion SDL_joystick.h
+
+        #region SDL_keyboard.h
+        /// <summary>
+        /// This is the mask which refers to all hotkey bindings.
+        /// </summary>
+        public const int SDL_ALL_HOTKEYS = unchecked((int)0xFFFFFFFF);
+
+        /// <summary>
+        /// Enable/Disable keyboard repeat.  Keyboard repeat defaults to off. 
+        /// 'delay' is the initial delay in ms between the time 
+        /// when a key is pressed,
+        /// and keyboard repeat begins.
+        /// </summary>
+        /// <seealso cref="SDL_EnableKeyRepeat"/>
+        public const int SDL_DEFAULT_REPEAT_DELAY = 500;
+
+        /// <summary>
+        /// Enable/Disable keyboard repeat.  Keyboard repeat defaults to off. 
+        /// 'interval' is the time in ms between keyboard repeat events.
+        /// </summary>
+        /// <seealso cref="SDL_EnableKeyRepeat"/>
+        public const int SDL_DEFAULT_REPEAT_INTERVAL = 30;
+        #endregion SDL_keyboard.h
+
+        #region SDL_keysym.h
+        /// <summary>
+        /// Both CTRL keys.
+        /// </summary>
+        public const short KMOD_CTRL =
+            (short)(KMOD_LCTRL | KMOD_RCTRL);
+
+        /// <summary>
+        /// Both SHIFT keys.
+        /// </summary>
+        public const short KMOD_SHIFT =
+            (short)(KMOD_LSHIFT | KMOD_RSHIFT);
+
+        /// <summary>
+        /// Both ALT keys.
+        /// </summary>
+        public const short KMOD_ALT =
+            (short)(KMOD_LALT | KMOD_RALT);
+
+        /// <summary>
+        /// Both META keys.
+        /// </summary>
+        public const short KMOD_META = (
+            short)(KMOD_LMETA | KMOD_RMETA);
+        #endregion SDL_keysym.h
+
+        // SDL_loadso.h -- none
+        // SDL_main.h -- none
+
+        #region SDL_mouse.h
+        /// <summary>
+        /// Used as a mask when testing buttons in buttonstate
+        /// Button 1:	Left mouse button
+        /// </summary>
+        public const byte SDL_BUTTON_LEFT = 1;
+        /// <summary>
+        /// Button 2:	Middle mouse button
+        /// </summary>
+        public const byte SDL_BUTTON_MIDDLE = 2;
+        /// <summary>
+        /// Button 3:	Right mouse button
+        /// </summary>
+        public const byte SDL_BUTTON_RIGHT = 3;
+        /// <summary>
+        /// Button 4:	Mouse wheel up	 (may also be a real button)
+        /// </summary>
+        public const byte SDL_BUTTON_WHEELUP = 4;
+        /// <summary>
+        /// Button 5:	Mouse wheel down (may also be a real button)
+        /// </summary>
+        public const byte SDL_BUTTON_WHEELDOWN = 5;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_BUTTON_X1 = 6;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_BUTTON_X2 = 7;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_BUTTON_LMASK = SDL_PRESSED << ((byte)SDL_BUTTON_LEFT - 1);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_BUTTON_MMASK = SDL_PRESSED << ((byte)SDL_BUTTON_MIDDLE - 1);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_BUTTON_RMASK = SDL_PRESSED << ((byte)SDL_BUTTON_RIGHT - 1);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_BUTTON_X1MASK = SDL_PRESSED << ((byte)SDL_BUTTON_X1 - 1);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const byte SDL_BUTTON_X2MASK = SDL_PRESSED << ((byte)SDL_BUTTON_X2 - 1);
+        #endregion SDL_mouse.h
+
+        #region SDL_mutex.h
+        /// <summary>
+        /// Synchronization functions which can time out return this value
+        /// if they time out.
+        /// </summary>
+        public const int SDL_MUTEX_TIMEDOUT = 1;
+        /// <summary>
+        /// This is the timeout value which corresponds to never time out
+        /// </summary>
+        public const int SDL_MUTEX_MAXWAIT = (~(int)0);
+        #endregion SDL_mutex.h
+
+        // SDL_name.h -- none
+        // SDL_opengl.h -- TODO superceded by Tao.OpenGL?
+        // SDL_platform.h -- none
+        // SDL_quit.h -- none
+
+        #region SDL_rwops.h
+        /// <summary>
+        /// Seek from the beginning of data
+        /// </summary>
+        public const int RW_SEEK_SET = 0;
+        /// <summary>
+        /// Seek relative to current read point
+        /// </summary>
+        public const int RW_SEEK_CUR = 1;
+        /// <summary>
+        /// Seek relative to the end of data
+        /// </summary>
+        public const int RW_SEEK_END = 2;
+        #endregion SDL_rwops.h
+
+        // SDL_stdinc.h -- TODO skipped for now
+        // SDL_syswm.h -- none
+        // SDL_thread.h -- none
+
+        #region SDL_timer.h
+        #region SDL_TIMESLICE
+        /// <summary>
+        ///     The OS scheduler timeslice, in milliseconds.
+        /// </summary>
+        public const int SDL_TIMESLICE = 10;
+        #endregion SDL_TIMESLICE
+
+        #region TIMER_RESOLUTION
+        /// <summary>
+        ///     The maximum resolution of the SDL timer on all platforms.
+        /// </summary>
+        /// <remarks>
+        ///     Experimentally determined.
+        /// </remarks>
+        public const int TIMER_RESOLUTION = 10;
+        #endregion TIMER_RESOLUTION
+        #endregion SDL_timer.h
+
+        // SDL_types.h - deprecated
+
+        #region SDL_version.h
+        /// <summary>
+        /// Major Version
+        /// </summary>
+        public const int SDL_MAJOR_VERSION = 1;
+        /// <summary>
+        /// Minor Version
+        /// </summary>
+        public const int SDL_MINOR_VERSION = 2;
+        /// <summary>
+        /// Patch Version
+        /// </summary>
+        public const int SDL_PATCHLEVEL = 11;
+        #endregion SDL_version.h
+
+        #region SDL_video.h
+        #region SDL_ALPHA_OPAQUE
+        /// <summary>
+        /// Transparency definition of Opaque
+        /// </summary>
+        /// <remarks>
+        /// Define alpha as the opacity of a surface
+        /// </remarks>
+        public const int SDL_ALPHA_OPAQUE = 255;
+        #endregion SDL_ALPHA_OPAQUE
+
+        #region SDL_ALPHA_TRANSPARENT
+        /// <summary>
+        /// Transparency definition of Transparent
+        /// </summary>
+        /// <remarks>
+        /// Define alpha as the opacity of a surface
+        /// </remarks>
+        public const int SDL_ALPHA_TRANSPARENT = 0;
+        #endregion SDL_ALPHA_TRANSPARENT
+
+        #region SDL_SWSURFACE
+        /// <summary>
+        /// Surface is in system memory
+        /// </summary>
+        public const int SDL_SWSURFACE = 0x00000000;
+        #endregion SDL_SWSURFACE
+
+        #region SDL_HWSURFACE
+        /// <summary>
+        /// Surface is in video memory
+        /// </summary>
+        public const int SDL_HWSURFACE = 0x00000001;
+        #endregion SDL_HWSURFACE
+
+        #region SDL_ASYNCBLIT
+        /// <summary>
+        /// Use asynchronous blits if possible
+        /// </summary>
+        public const int SDL_ASYNCBLIT = 0X00000004;
+        #endregion SDL_ASYNCBLIT
+
+        #region SDL_ANYFORMAT
+        /// <summary>
+        /// Allow any video depth/pixel-format
+        /// </summary>
+        public const int SDL_ANYFORMAT = 0X10000000;
+        #endregion SDL_ANYFORMAT
+
+        #region SDL_HWPALETTE
+        /// <summary>
+        /// Surface has exclusive palette
+        /// </summary>
+        public const int SDL_HWPALETTE = 0x20000000;
+        #endregion SDL_HWPALETTE
+
+        #region SDL_DOUBLEBUF
+        /// <summary>
+        /// Set up double-buffered video mode
+        /// </summary>
+        public const int SDL_DOUBLEBUF = 0X40000000;
+        #endregion SDL_DOUBLEBUF
+
+        #region SDL_FULLSCREEN
+        /// <summary>
+        /// Full screen display surface.
+        /// </summary>
+        // #define SDL_FULLSCREEN 0x80000000
+        public const int SDL_FULLSCREEN = unchecked((int)0x80000000);
+        #endregion SDL_FULLSCREEN
+
+        #region SDL_OPENGL
+        /// <summary>
+        /// Create an OpenGL rendering context
+        /// </summary>
+        public const int SDL_OPENGL = 0x00000002;
+        #endregion SDL_OPENGL
+
+        #region SDL_OPENGLBLIT
+        /// <summary>
+        /// Create an OpenGL rendering context and use it for blitting
+        /// </summary>	
+        public const int SDL_OPENGLBLIT = 0X0000000A;
+        #endregion SDL_OPENGLBLIT
+
+        #region SDL_RESIZABLE
+        /// <summary>
+        /// This video mode may be resized
+        /// </summary>
+        public const int SDL_RESIZABLE = 0x00000010;
+        #endregion SDL_RESIZABLE
+
+        #region SDL_NOFRAME
+        /// <summary>
+        /// No window caption or edge frame
+        /// </summary>
+        public const int SDL_NOFRAME = 0X00000020;
+        #endregion SDL_NOFRAME
+
+        #region SDL_HWACCEL
+        /// <summary>
+        /// Blit uses hardware acceleration
+        /// </summary>
+        public const int SDL_HWACCEL = 0x00000100;
+        #endregion SDL_HWACCEL
+
+        #region SDL_SRCCOLORKEY
+        /// <summary>
+        /// Blit uses a source color key
+        /// </summary>
+        public const int SDL_SRCCOLORKEY = 0x00001000;
+        #endregion SDL_SRCCOLORKEY
+
+        #region SDL_RLEACCELOK
+        /// <summary>
+        /// Private flag
+        /// </summary>
+        public const int SDL_RLEACCELOK = 0x00002000;
+        #endregion SDL_RLEACCELOK
+
+        #region SDL_RLEACCEL
+        /// <summary>
+        /// Surface is RLE encoded
+        /// </summary>
+        public const int SDL_RLEACCEL = 0X00004000;
+        #endregion SDL_RLEACCEL
+
+        #region SDL_SRCALPHA
+        /// <summary>
+        /// Blit uses source alpha blending
+        /// </summary>
+        public const int SDL_SRCALPHA = 0x00010000;
+        #endregion SDL_SRCALPHA
+
+        #region SDL_PREALLOC
+        /// <summary>
+        /// Surface uses preallocated memory
+        /// </summary>
+        public const int SDL_PREALLOC = 0x01000000;
+        #endregion SDL_PREALLOC
+
+        #region SDL_YV12_OVERLAY
+        /// <summary>
+        ///One of the most common video overlay formats.
+        ///For an explanation of these pixel formats, see:
+        ///http://www.webartz.com/fourcc/indexyuv.htm
+        ///
+        ///For information on the relationship between color spaces, see:
+        ///http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html
+        ///
+        /// Planar mode: Y + V + U  (3 planes)
+        /// </summary>
+        public const int SDL_YV12_OVERLAY = 0x32315659;
+        #endregion SDL_YV12_OVERLAY
+
+        #region SDL_IYUV_OVERLAY
+        /// <summary>
+        ///One of the most common video overlay formats.
+        ///For an explanation of these pixel formats, see:
+        ///http://www.webartz.com/fourcc/indexyuv.htm
+        ///
+        ///For information on the relationship between color spaces, see:
+        ///http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html
+        ///
+        /// Planar mode: Y + U + V  (3 planes)
+        /// </summary>
+        public const int SDL_IYUV_OVERLAY = 0x56555949;
+        #endregion SDL_IYUV_OVERLAY
+
+        #region SDL_YUY2_OVERLAY
+        /// <summary>
+        ///One of the most common video overlay formats.
+        ///For an explanation of these pixel formats, see:
+        ///http://www.webartz.com/fourcc/indexyuv.htm
+        ///
+        ///For information on the relationship between color spaces, see:
+        ///http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html
+        ///
+        /// Packed mode: Y0+U0+Y1+V0 (1 plane)
+        /// </summary>
+        public const int SDL_YUY2_OVERLAY = 0x32595559;
+        #endregion SDL_YUY2_OVERLAY
+
+        #region SDL_UYVY_OVERLAY
+        /// <summary>
+        ///One of the most common video overlay formats.
+        ///For an explanation of these pixel formats, see:
+        ///http://www.webartz.com/fourcc/indexyuv.htm
+        ///
+        ///For information on the relationship between color spaces, see:
+        ///http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html
+        ///
+        /// Packed mode: U0+Y0+V0+Y1 (1 plane)
+        /// </summary>
+        public const int SDL_UYVY_OVERLAY = 0x59565955;
+        #endregion SDL_UYVY_OVERLAY
+
+        #region SDL_YVYU_OVERLAY
+        /// <summary>
+        ///One of the most common video overlay formats.
+        ///For an explanation of these pixel formats, see:
+        ///http://www.webartz.com/fourcc/indexyuv.htm
+        ///
+        ///For information on the relationship between color spaces, see:
+        ///http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html
+        ///
+        /// Packed mode: Y0+V0+Y1+U0 (1 plane)
+        /// </summary>
+        public const int SDL_YVYU_OVERLAY = 0x55595659;
+        #endregion SDL_YVYU_OVERLAY
+
+        #region SDL_LOGPAL
+        /// <summary>
+        /// Flag for SDL_SetPalette() which represents a logical palette, which controls how blits 
+        /// are mapped to/from the surface.
+        /// </summary>
+        public const byte SDL_LOGPAL = 0x01;
+        #endregion SDL_LOGPAL
+
+        #region SDL_PHYSPAL
+        /// <summary>
+        /// Flag for SDL_SetPalette() which represents a physical palette, which controls how pixels 
+        /// look on the screen.
+        /// </summary>
+        public const byte SDL_PHYSPAL = 0x02;
+        #endregion SDL_PHYSPAL
+
+        //Where did this come from?? SDL_GL_DOUBLEBUFFER is in SDL_GLattr
+        //		#region SDL_GL_DOUBLEBUFFER
+        //		/// <summary>
+        //		/// 
+        //		/// </summary>
+        //		public const int SDL_GL_DOUBLEBUFFER = 5;
+        //		#endregion SDL_GL_DOUBLEBUFFER
+
+        #endregion SDL_video.h
+        #endregion Public Constants
+
+        #region Public Enums
+        // SDL.h -- none
+        // SDL_active.h -- none
+
+        #region SDL_audio.h
+        #region SDL_audiostatus
+        /// <summary>
+        /// SDL_audiostatus. Get the current audio state
+        /// </summary>
+        public const int SDL_AUDIO_STOPPED = 0;
+        /// <summary>
+        /// SDL_audiostatus. Get the current audio state
+        /// </summary>
+        public const int SDL_AUDIO_PLAYING = 1;
+        /// <summary>
+        /// SDL_audiostatus. Get the current audio state
+        /// </summary>
+        public const int SDL_AUDIO_PAUSED = 2;
+        #endregion SDL_audiostatus
+        #endregion SDL_audio.h
+
+        // SDL_byteorder.h -- deprecated
+
+        #region SDL_cdrom.h
+        #region CDstatus
+        /// <summary>
+        /// The CD tray is empty.
+        /// </summary>
+        /// <remarks>
+        /// CDstatus enum.
+        /// The possible states which a CD-ROM drive can be in.
+        /// </remarks>
+        public const int CD_TRAYEMPTY = 0;
+        /// <summary>
+        /// The CD has stopped playing.
+        /// </summary>
+        /// <remarks>
+        /// CDstatus enum.
+        /// The possible states which a CD-ROM drive can be in.
+        /// </remarks>
+        public const int CD_STOPPED = 1;
+        /// <summary>
+        /// The CD is playing.
+        /// </summary>
+        /// <remarks>
+        /// CDstatus enum.
+        /// The possible states which a CD-ROM drive can be in.
+        /// </remarks>
+        public const int CD_PLAYING = 2;
+        /// <summary>
+        /// The CD has been paused.
+        /// </summary>
+        /// <remarks>
+        /// CDstatus enum.
+        /// The possible states which a CD-ROM drive can be in.
+        /// </remarks>
+        public const int CD_PAUSED = 3;
+        /// <summary>
+        /// An error occured while getting the status.
+        /// </summary>
+        /// <remarks>
+        /// CDstatus enum.
+        /// The possible states which a CD-ROM drive can be in.
+        /// </remarks>
+        public const int CD_ERROR = -1;
+        #endregion CDstatus
+        #endregion SDL_cdrom.h
+
+        // SDL_config.h -- none
+        // SDL_copying.h -- none
+        // SDL_cpuinfo.h -- none
+        // SDL_endian.h - none
+        // SDL_error.h -- none
+
+        #region SDL_events.h
+        #region SDL_EventType
+        //The nameless enum from SDL_events.h was moved into a set of const
+        //instead of a C# enum. This makes it work more like the C Code.
+        /// <summary>
+        /// Unused (do not remove)
+        /// </summary>
+        public const int SDL_NOEVENT = 0;
+        /// <summary>
+        /// Application loses/gains visibility
+        /// </summary>
+        [CLSCompliant(false)]
+        public const int SDL_ACTIVEEVENT = 1;
+        /// <summary>
+        /// Keys pressed
+        /// </summary>
+        public const int SDL_KEYDOWN = 2;
+        /// <summary>
+        /// Keys released
+        /// </summary>
+        public const int SDL_KEYUP = 3;
+        /// <summary>
+        /// Mouse moved
+        /// </summary>
+        public const int SDL_MOUSEMOTION = 4;
+        /// <summary>
+        /// Mouse button pressed
+        /// </summary>
+        public const int SDL_MOUSEBUTTONDOWN = 5;
+        /// <summary>
+        /// Mouse button released
+        /// </summary>
+        public const int SDL_MOUSEBUTTONUP = 6;
+        /// <summary>
+        /// Joystick axis motion
+        /// </summary>
+        public const int SDL_JOYAXISMOTION = 7;
+        /// <summary>
+        /// Joystick trackball motion
+        /// </summary>
+        public const int SDL_JOYBALLMOTION = 8;
+        /// <summary>
+        /// Joystick hat position change
+        /// </summary>
+        public const int SDL_JOYHATMOTION = 9;
+        /// <summary>
+        /// Joystick button pressed
+        /// </summary>
+        public const int SDL_JOYBUTTONDOWN = 10;
+        /// <summary>
+        /// Joystick button released
+        /// </summary>
+        public const int SDL_JOYBUTTONUP = 11;
+        /// <summary>
+        /// User-requested quit
+        /// </summary>
+        [CLSCompliant(false)]
+        public const int SDL_QUIT = 12;
+        /// <summary>
+        /// System specific event
+        /// </summary>
+        [CLSCompliant(false)]
+        public const int SDL_SYSWMEVENT = 13;
+        /// <summary>
+        /// Reserved for future use..
+        /// </summary>
+        public const int SDL_EVENT_RESERVEDA = 14;
+        /// <summary>
+        /// Reserved for future use..
+        /// </summary>
+        public const int SDL_EVENT_RESERVEDB = 15;
+        /// <summary>
+        /// User resized video mode
+        /// </summary>
+        public const int SDL_VIDEORESIZE = 16;
+        /// <summary>
+        /// Screen needs to be redrawn
+        /// </summary>
+        public const int SDL_VIDEOEXPOSE = 17;
+        /// <summary>
+        /// Reserved for future use..
+        /// </summary>
+        public const int SDL_EVENT_RESERVED2 = 18;
+        /// <summary>
+        /// Reserved for future use..
+        /// </summary>
+        public const int SDL_EVENT_RESERVED3 = 19;
+        /// <summary>
+        /// Reserved for future use..
+        /// </summary>
+        public const int SDL_EVENT_RESERVED4 = 20;
+        /// <summary>
+        /// Reserved for future use..
+        /// </summary>
+        public const int SDL_EVENT_RESERVED5 = 21;
+        /// <summary>
+        /// Reserved for future use..
+        /// </summary>
+        public const int SDL_EVENT_RESERVED6 = 22;
+        /// <summary>
+        /// Reserved for future use..
+        /// </summary>
+        public const int SDL_EVENT_RESERVED7 = 23;
+        /// <summary>
+        /// Events SDL_USEREVENT through SDL_MAXEVENTS-1 are 
+        /// for your use.
+        /// </summary>
+        [CLSCompliant(false)]
+        public const int SDL_USEREVENT = 24;
+
+        /// <summary>
+        /// This last event is only for bounding internal arrays
+        /// It is the number of bits in the event mask datatype -- Uint32
+        /// </summary>
+        public const int SDL_NUMEVENTS = 32;
+        #endregion SDL_EventType
+
+        #region SDL_EventMask
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_ACTIVEEVENTMASK = 1 << SDL_ACTIVEEVENT;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_KEYDOWNMASK = 1 << SDL_KEYDOWN;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_KEYUPMASK = 1 << SDL_KEYUP;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_KEYEVENTMASK = (1 << SDL_KEYUP | 1 << SDL_KEYDOWN);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_MOUSEMOTIONMASK = 1 << SDL_MOUSEMOTION;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_MOUSEBUTTONDOWNMASK = 1 << SDL_MOUSEBUTTONDOWN;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_MOUSEBUTTONUPMASK = 1 << SDL_MOUSEBUTTONUP;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_MOUSEEVENTMASK = (1 << SDL_MOUSEMOTION) | (1 << SDL_MOUSEBUTTONDOWN) | (1 << SDL_MOUSEBUTTONUP);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_JOYAXISMOTIONMASK = 1 << SDL_JOYAXISMOTION;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_JOYBALLMOTIONMASK = 1 << SDL_JOYBALLMOTION;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_JOYHATMOTIONMASK = 1 << SDL_JOYHATMOTION;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_JOYBUTTONDOWNMASK = 1 << SDL_JOYBUTTONDOWN;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_JOYBUTTONUPMASK = 1 << SDL_JOYBUTTONUP;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_JOYEVENTMASK = (1 << SDL_JOYAXISMOTION) | (1 << SDL_JOYBALLMOTION) | (1 << SDL_JOYHATMOTION) | (1 << SDL_JOYBUTTONDOWN) | (1 << SDL_JOYBUTTONUP);
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_VIDEORESIZEMASK = 1 << SDL_VIDEORESIZE;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_VIDEOEXPOSEMASK = 1 << SDL_VIDEOEXPOSE;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_QUITMASK = 1 << SDL_QUIT;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_SYSWMEVENTMASK = 1 << SDL_SYSWMEVENT;
+        #endregion SDL_EventMask
+
+        #region SDL_eventaction
+        /// <summary>
+        /// If 'action' is SDL_ADDEVENT, up to 'numevents' events will 
+        /// be added to the back of the event queue.
+        /// </summary>
+        /// <remarks>
+        /// enum SDL_eventaction. 
+        /// Various event types.
+        /// </remarks>
+        /// <seealso cref="SDL_PeepEvents(SDL_Event[], int, int, int)"/>
+        public const int SDL_ADDEVENT = 0;
+        /// <summary>
+        /// If 'action' is SDL_PEEKEVENT, up to 'numevents' events at 
+        /// the front of the event queue, matching 'mask', will be 
+        /// returned and will not be removed from the queue.
+        /// </summary>
+        /// <remarks>
+        /// enum SDL_eventaction. 
+        /// Various event types.
+        /// </remarks>
+        /// <seealso cref="SDL_PeepEvents(SDL_Event[], int, int, int)"/>
+        public const int SDL_PEEKEVENT = 1;
+        /// <summary>
+        /// If 'action' is SDL_GETEVENT, up to 'numevents' events at 
+        /// the front of the event queue, matching 'mask', will be 
+        /// returned and will be removed from the queue.
+        /// </summary>
+        /// <remarks>
+        /// enum SDL_eventaction. 
+        /// Various event types.
+        /// </remarks>
+        /// <seealso cref="SDL_PeepEvents(SDL_Event[], int, int, int)"/>
+        public const int SDL_GETEVENT = 2;
+        #endregion SDL_eventaction
+        #endregion SDL_events.h
+
+        // SDL_getenv.h -- deprecated
+        // SDL_joystick.h -- none
+        // SDL_keyboard.h -- none
+
+        #region SDL_keysym.h
+        #region SDLKey
+        //		/// <summary>
+        //		/// What we really want is a mapping of every raw key on the keyboard.
+        //		/// To support international keyboards, we use the range 0xA1 - 0xFF
+        //		/// as international virtual keycodes.  
+        //		/// We'll follow in the footsteps of X11...
+        //		/// The keyboard syms have been cleverly chosen to map to ASCII
+        //		/// </summary>
+        //		//public enum SDLKey 
+        //		//{
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_UNKNOWN = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_FIRST = 0;
+        /// <summary>
+        /// backspace. '\b'
+        /// </summary>
+        public const int SDLK_BACKSPACE = 8;
+        /// <summary>
+        /// tab. '\t'
+        /// </summary>
+        public const int SDLK_TAB = 9;
+        /// <summary>
+        /// clear
+        /// </summary>
+        public const int SDLK_CLEAR = 12;
+        /// <summary>
+        /// return. '\r' 
+        /// </summary>
+        public const int SDLK_RETURN = 13;
+        /// <summary>
+        /// pause
+        /// </summary>
+        public const int SDLK_PAUSE = 19;
+        /// <summary>
+        /// escape. '^['
+        /// </summary>
+        public const int SDLK_ESCAPE = 27;
+        /// <summary>
+        /// space. ' '
+        /// </summary>
+        public const int SDLK_SPACE = 32;
+        /// <summary>
+        /// exclaim. '!'
+        /// </summary>
+        public const int SDLK_EXCLAIM = 33;
+        /// <summary>
+        /// quotedbl. '"'
+        /// </summary>
+        public const int SDLK_QUOTEDBL = 34;
+        /// <summary>
+        /// hash. '#'
+        /// </summary>
+        public const int SDLK_HASH = 35;
+        /// <summary>
+        /// dollar. '$'
+        /// </summary>
+        public const int SDLK_DOLLAR = 36;
+        /// <summary>
+        /// ampersand. '&'
+        /// </summary>
+        public const int SDLK_AMPERSAND = 38;
+        /// <summary>
+        /// quote. '''
+        /// </summary>
+        public const int SDLK_QUOTE = 39;
+        /// <summary>
+        /// left parenthesis. '('
+        /// </summary>
+        public const int SDLK_LEFTPAREN = 40;
+        /// <summary>
+        /// right parenthesis. ')'
+        /// </summary>
+        public const int SDLK_RIGHTPAREN = 41;
+        /// <summary>
+        /// asterisk. '*'
+        /// </summary>
+        public const int SDLK_ASTERISK = 42;
+        /// <summary>
+        /// plus sign. '+'
+        /// </summary>
+        public const int SDLK_PLUS = 43;
+        /// <summary>
+        /// comma. ';'
+        /// </summary>
+        public const int SDLK_COMMA = 44;
+        /// <summary>
+        /// minus sign. '-'
+        /// </summary>
+        public const int SDLK_MINUS = 45;
+        /// <summary>
+        /// period. '.'
+        /// </summary>
+        public const int SDLK_PERIOD = 46;
+        /// <summary>
+        /// forward slash. '/'
+        /// </summary>
+        public const int SDLK_SLASH = 47;
+        /// <summary>
+        /// 0
+        /// </summary>
+        public const int SDLK_0 = 48;
+        /// <summary>
+        /// 1
+        /// </summary>
+        public const int SDLK_1 = 49;
+        /// <summary>
+        /// 2
+        /// </summary>
+        public const int SDLK_2 = 50;
+        /// <summary>
+        /// 3
+        /// </summary>
+        public const int SDLK_3 = 51;
+        /// <summary>
+        /// 4
+        /// </summary>
+        public const int SDLK_4 = 52;
+        /// <summary>
+        /// 5
+        /// </summary>
+        public const int SDLK_5 = 53;
+        /// <summary>
+        /// 6
+        /// </summary>
+        public const int SDLK_6 = 54;
+        /// <summary>
+        /// 7
+        /// </summary>
+        public const int SDLK_7 = 55;
+        /// <summary>
+        /// 8
+        /// </summary>
+        public const int SDLK_8 = 56;
+        /// <summary>
+        /// 9
+        /// </summary>
+        public const int SDLK_9 = 57;
+        /// <summary>
+        /// colon. ':'
+        /// </summary>
+        public const int SDLK_COLON = 58;
+        /// <summary>
+        /// semicolon. ';'
+        /// </summary>
+        public const int SDLK_SEMICOLON = 59;
+        /// <summary>
+        /// less-than sign. '<'
+        /// </summary>
+        public const int SDLK_LESS = 60;
+        /// <summary>
+        /// equals sign. '='
+        /// </summary>
+        public const int SDLK_EQUALS = 61;
+        /// <summary>
+        /// greater-than sign. '>'
+        /// </summary>
+        public const int SDLK_GREATER = 62;
+        /// <summary>
+        /// question mark. '?'
+        /// </summary>
+        public const int SDLK_QUESTION = 63;
+        /// <summary>
+        /// at. '@'
+        /// </summary>
+        public const int SDLK_AT = 64;
+        /* 
+               Skip uppercase letters
+             */
+        /// <summary>
+        /// left bracket. '['
+        /// </summary>
+        public const int SDLK_LEFTBRACKET = 91;
+        /// <summary>
+        /// backslash. '\'
+        /// </summary>
+        public const int SDLK_BACKSLASH = 92;
+        /// <summary>
+        /// right bracket. ']'
+        /// </summary>
+        public const int SDLK_RIGHTBRACKET = 93;
+        /// <summary>
+        /// caret. '^'
+        /// </summary>
+        public const int SDLK_CARET = 94;
+        /// <summary>
+        /// underscore.'_'
+        /// </summary>
+        public const int SDLK_UNDERSCORE = 95;
+        /// <summary>
+        /// grave. '`'
+        /// </summary>
+        public const int SDLK_BACKQUOTE = 96;
+        /// <summary>
+        /// a
+        /// </summary>
+        public const int SDLK_a = 97;
+        /// <summary>
+        /// b
+        /// </summary>
+        public const int SDLK_b = 98;
+        /// <summary>
+        /// c
+        /// </summary>
+        public const int SDLK_c = 99;
+        /// <summary>
+        /// d
+        /// </summary>
+        public const int SDLK_d = 100;
+        /// <summary>
+        /// e
+        /// </summary>
+        public const int SDLK_e = 101;
+        /// <summary>
+        /// f
+        /// </summary>
+        public const int SDLK_f = 102;
+        /// <summary>
+        /// g
+        /// </summary>
+        public const int SDLK_g = 103;
+        /// <summary>
+        /// h
+        /// </summary>
+        public const int SDLK_h = 104;
+        /// <summary>
+        /// i
+        /// </summary>
+        public const int SDLK_i = 105;
+        /// <summary>
+        /// j
+        /// </summary>
+        public const int SDLK_j = 106;
+        /// <summary>
+        /// k
+        /// </summary>
+        public const int SDLK_k = 107;
+        /// <summary>
+        /// l
+        /// </summary>
+        public const int SDLK_l = 108;
+        /// <summary>
+        /// m
+        /// </summary>
+        public const int SDLK_m = 109;
+        /// <summary>
+        /// n
+        /// </summary>
+        public const int SDLK_n = 110;
+        /// <summary>
+        /// o
+        /// </summary>
+        public const int SDLK_o = 111;
+        /// <summary>
+        /// p
+        /// </summary>
+        public const int SDLK_p = 112;
+        /// <summary>
+        /// q
+        /// </summary>
+        public const int SDLK_q = 113;
+        /// <summary>
+        /// r
+        /// </summary>
+        public const int SDLK_r = 114;
+        /// <summary>
+        /// s
+        /// </summary>
+        public const int SDLK_s = 115;
+        /// <summary>
+        /// t
+        /// </summary>
+        public const int SDLK_t = 116;
+        /// <summary>
+        /// u
+        /// </summary>
+        public const int SDLK_u = 117;
+        /// <summary>
+        /// v
+        /// </summary>
+        public const int SDLK_v = 118;
+        /// <summary>
+        /// w
+        /// </summary>
+        public const int SDLK_w = 119;
+        /// <summary>
+        /// x
+        /// </summary>
+        public const int SDLK_x = 120;
+        /// <summary>
+        /// y
+        /// </summary>
+        public const int SDLK_y = 121;
+        /// <summary>
+        /// z
+        /// </summary>
+        public const int SDLK_z = 122;
+        /// <summary>
+        /// delete. '^?'
+        /// </summary>
+        public const int SDLK_DELETE = 127;
+        /* End of ASCII mapped keysyms */
+
+        /* International keyboard syms */
+        /// <summary>
+        /// 0xA0
+        /// </summary>
+        public const int SDLK_WORLD_0 = 160;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_1 = 161;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_2 = 162;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_3 = 163;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_4 = 164;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_5 = 165;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_6 = 166;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_7 = 167;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_8 = 168;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_9 = 169;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_10 = 170;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_11 = 171;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_12 = 172;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_13 = 173;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_14 = 174;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_15 = 175;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_16 = 176;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_17 = 177;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_18 = 178;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_19 = 179;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_20 = 180;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_21 = 181;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_22 = 182;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_23 = 183;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_24 = 184;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_25 = 185;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_26 = 186;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_27 = 187;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_28 = 188;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_29 = 189;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_30 = 190;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_31 = 191;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_32 = 192;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_33 = 193;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_34 = 194;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_35 = 195;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_36 = 196;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_37 = 197;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_38 = 198;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_39 = 199;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_40 = 200;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_41 = 201;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_42 = 202;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_43 = 203;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_44 = 204;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_45 = 205;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_46 = 206;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_47 = 207;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_48 = 208;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_49 = 209;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_50 = 210;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_51 = 211;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_52 = 212;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_53 = 213;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_54 = 214;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_55 = 215;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_56 = 216;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_57 = 217;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_58 = 218;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_59 = 219;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_60 = 220;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_61 = 221;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_62 = 222;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_63 = 223;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_64 = 224;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_65 = 225;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_66 = 226;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_67 = 227;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_68 = 228;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_69 = 229;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_70 = 230;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_71 = 231;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_72 = 232;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_73 = 233;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_74 = 234;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_75 = 235;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_76 = 236;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_77 = 237;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_78 = 238;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_79 = 239;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_80 = 240;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_81 = 241;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_82 = 242;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_83 = 243;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_84 = 244;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_85 = 245;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_86 = 246;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_87 = 247;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_88 = 248;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_89 = 249;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_90 = 250;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_91 = 251;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_92 = 252;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_93 = 253;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_WORLD_94 = 254;
+        /// <summary>
+        /// 0xFF
+        /// </summary>
+        public const int SDLK_WORLD_95 = 255;
+
+        /* Numeric keypad */
+        /// <summary>
+        /// keypad 0
+        /// </summary>
+        public const int SDLK_KP0 = 256;
+        /// <summary>
+        /// keypad 1
+        /// </summary>
+        public const int SDLK_KP1 = 257;
+        /// <summary>
+        /// keypad 2
+        /// </summary>
+        public const int SDLK_KP2 = 258;
+        /// <summary>
+        /// keypad 3
+        /// </summary>
+        public const int SDLK_KP3 = 259;
+        /// <summary>
+        /// keypad 4
+        /// </summary>
+        public const int SDLK_KP4 = 260;
+        /// <summary>
+        /// keypad 5
+        /// </summary>
+        public const int SDLK_KP5 = 261;
+        /// <summary>
+        /// keypad 6
+        /// </summary>
+        public const int SDLK_KP6 = 262;
+        /// <summary>
+        /// keypad 7
+        /// </summary>
+        public const int SDLK_KP7 = 263;
+        /// <summary>
+        /// keypad 8
+        /// </summary>
+        public const int SDLK_KP8 = 264;
+        /// <summary>
+        /// keypad 9
+        /// </summary>
+        public const int SDLK_KP9 = 265;
+        /// <summary>
+        /// keypad period. '.'
+        /// </summary>
+        public const int SDLK_KP_PERIOD = 266;
+        /// <summary>
+        /// keypad divide. '/'
+        /// </summary>
+        public const int SDLK_KP_DIVIDE = 267;
+        /// <summary>
+        /// keypad multiply. '*'
+        /// </summary>
+        public const int SDLK_KP_MULTIPLY = 268;
+        /// <summary>
+        /// keypad minus. '-'
+        /// </summary>
+        public const int SDLK_KP_MINUS = 269;
+        /// <summary>
+        /// keypad plus. '+'
+        /// </summary>
+        public const int SDLK_KP_PLUS = 270;
+        /// <summary>
+        /// keypad enter. '\r'
+        /// </summary>
+        public const int SDLK_KP_ENTER = 271;
+        /// <summary>
+        /// keypad equals. '='
+        /// </summary>
+        public const int SDLK_KP_EQUALS = 272;
+
+        /* Arrows + Home/End pad */
+        /// <summary>
+        /// up arrow
+        /// </summary>
+        public const int SDLK_UP = 273;
+        /// <summary>
+        /// down arrow
+        /// </summary>
+        public const int SDLK_DOWN = 274;
+        /// <summary>
+        /// right arrow
+        /// </summary>
+        public const int SDLK_RIGHT = 275;
+        /// <summary>
+        /// left arrow
+        /// </summary>
+        public const int SDLK_LEFT = 276;
+        /// <summary>
+        /// insert
+        /// </summary>
+        public const int SDLK_INSERT = 277;
+        /// <summary>
+        /// home
+        /// </summary>
+        public const int SDLK_HOME = 278;
+        /// <summary>
+        /// end
+        /// </summary>
+        public const int SDLK_END = 279;
+        /// <summary>
+        /// page up
+        /// </summary>
+        public const int SDLK_PAGEUP = 280;
+        /// <summary>
+        /// page down
+        /// </summary>
+        public const int SDLK_PAGEDOWN = 281;
+
+        /* Function keys */
+        /// <summary>
+        /// F1
+        /// </summary>
+        public const int SDLK_F1 = 282;
+        /// <summary>
+        /// F2
+        /// </summary>
+        public const int SDLK_F2 = 283;
+        /// <summary>
+        /// F3
+        /// </summary>
+        public const int SDLK_F3 = 284;
+        /// <summary>
+        /// F4
+        /// </summary>
+        public const int SDLK_F4 = 285;
+        /// <summary>
+        /// F5
+        /// </summary>
+        public const int SDLK_F5 = 286;
+        /// <summary>
+        /// F6
+        /// </summary>
+        public const int SDLK_F6 = 287;
+        /// <summary>
+        /// F7
+        /// </summary>
+        public const int SDLK_F7 = 288;
+        /// <summary>
+        /// F8
+        /// </summary>
+        public const int SDLK_F8 = 289;
+        /// <summary>
+        /// F9
+        /// </summary>
+        public const int SDLK_F9 = 290;
+        /// <summary>
+        /// F10
+        /// </summary>
+        public const int SDLK_F10 = 291;
+        /// <summary>
+        /// F11
+        /// </summary>
+        public const int SDLK_F11 = 292;
+        /// <summary>
+        /// F12
+        /// </summary>
+        public const int SDLK_F12 = 293;
+        /// <summary>
+        /// F13
+        /// </summary>
+        public const int SDLK_F13 = 294;
+        /// <summary>
+        /// F14
+        /// </summary>
+        public const int SDLK_F14 = 295;
+        /// <summary>
+        /// F15
+        /// </summary>
+        public const int SDLK_F15 = 296;
+
+        /* Key state modifier keys */
+        /// <summary>
+        /// numlock
+        /// </summary>
+        public const int SDLK_NUMLOCK = 300;
+        /// <summary>
+        /// capslock
+        /// </summary>
+        public const int SDLK_CAPSLOCK = 301;
+        /// <summary>
+        /// scrollock
+        /// </summary>
+        public const int SDLK_SCROLLOCK = 302;
+        /// <summary>
+        /// right shift
+        /// </summary>
+        public const int SDLK_RSHIFT = 303;
+        /// <summary>
+        /// left shift
+        /// </summary>
+        public const int SDLK_LSHIFT = 304;
+        /// <summary>
+        /// right ctrl
+        /// </summary>
+        public const int SDLK_RCTRL = 305;
+        /// <summary>
+        /// left ctrl
+        /// </summary>
+        public const int SDLK_LCTRL = 306;
+        /// <summary>
+        /// right alt
+        /// </summary>
+        public const int SDLK_RALT = 307;
+        /// <summary>
+        /// left alt
+        /// </summary>
+        public const int SDLK_LALT = 308;
+        /// <summary>
+        /// right meta
+        /// </summary>
+        public const int SDLK_RMETA = 309;
+        /// <summary>
+        /// left meta
+        /// </summary>
+        public const int SDLK_LMETA = 310;
+        /// <summary>
+        /// Left "Windows" key
+        /// </summary>
+        public const int SDLK_LSUPER = 311;
+        /// <summary>
+        /// Right "Windows" key
+        /// </summary>
+        public const int SDLK_RSUPER = 312;
+        /// <summary>
+        /// "Alt Gr" key. Mode key
+        /// </summary>
+        public const int SDLK_MODE = 313;
+        /// <summary>
+        /// Multi-key compose key
+        /// </summary>
+        public const int SDLK_COMPOSE = 314;
+
+        // Miscellaneous function keys
+        /// <summary>
+        /// help
+        /// </summary>
+        public const int SDLK_HELP = 315;
+        /// <summary>
+        /// print-screen
+        /// </summary>
+        public const int SDLK_PRINT = 316;
+        /// <summary>
+        /// SysRq
+        /// </summary>
+        public const int SDLK_SYSREQ = 317;
+        /// <summary>
+        /// break
+        /// </summary>
+        public const int SDLK_BREAK = 318;
+        /// <summary>
+        /// menu
+        /// </summary>
+        public const int SDLK_MENU = 319;
+        /// <summary>
+        /// Power Macintosh power key
+        /// </summary>
+        public const int SDLK_POWER = 320;
+        /// <summary>
+        /// Some european keyboards
+        /// </summary>
+        public const int SDLK_EURO = 321;
+        /// <summary>
+        /// Atari keyboard has Undo
+        /// </summary>
+        public const int SDLK_UNDO = 322;
+
+        // Add any other keys here
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDLK_LAST = 323;
+        //	}
+        #endregion SDLKey
+
+        #region SDLMod
+        /// <summary>
+        /// No modifiers applicable
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_NONE = 0x0000;
+        /// <summary>
+        /// Left Shift is down
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_LSHIFT = 0x0001;
+        /// <summary>
+        /// Right Shift is down
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_RSHIFT = 0x0002;
+        /// <summary>
+        /// Left Control is down
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_LCTRL = 0x0040;
+        /// <summary>
+        /// Right Control is down
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_RCTRL = 0x0080;
+        /// <summary>
+        /// Left Alt is down
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_LALT = 0x0100;
+        /// <summary>
+        /// Right Alt is down
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_RALT = 0x0200;
+        /// <summary>
+        /// Left Meta is down
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_LMETA = 0x0400;
+        /// <summary>
+        /// Right Meta is down
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_RMETA = 0x0800;
+        /// <summary>
+        /// Numlock is down
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_NUM = 0x1000;
+        /// <summary>
+        /// Capslock is down
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_CAPS = 0x2000;
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_MODE = 0x4000;
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <remarks>
+        /// Enumeration of valid key mods (possibly OR'd together) 
+        /// </remarks>
+        public const int KMOD_RESERVED = 0x8000;
+        #endregion SDLMod
+        #endregion SDL_keysym.h
+
+        // SDL_loadso.h -- none
+        // SDL_main.h -- none
+        // SDL_mouse.h -- none
+        // SDL_mutex.h -- none
+        // SDL_name.h -- none
+        // SDL_opengl.h -- TODO superceded by Tao.OpenGL?
+        // SDL_platform.h -- none
+        // SDL_quit.h -- none
+        // SDL_rwops -- none
+
+        #region SDL_stdinc.h
+        #region SDL_bool
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_FALSE = 0;
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_TRUE = 1;
+        #endregion SDL_bool
+        #endregion SDL_stdinc.h
+
+        #region SDL_syswm.h
+        /// <summary>
+        /// 
+        /// </summary>
+        public const int SDL_SYSWM_X11 = 0;
+        #endregion SDL_syswm.h
+
+        // SDL_thread.h -- none
+        // SDL_timer.h -- none
+        // SDL_types.h - deprecated
+        // SDL_version.h -- none
+
+        #region SDL_video.h
+        #region SDL_GLattr
+        /// <summary>
+        /// Size of the framebuffer red component, in bits
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_RED_SIZE = 0;
+        /// <summary>
+        /// Size of the framebuffer green component, in bits
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_GREEN_SIZE = 1;
+        /// <summary>
+        /// Size of the framebuffer blue component, in bits
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_BLUE_SIZE = 2;
+        /// <summary>
+        /// Size of the framebuffer alpha component, in bits
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_ALPHA_SIZE = 3;
+        /// <summary>
+        /// Size of the framebuffer, in bits
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_BUFFER_SIZE = 4;
+        /// <summary>
+        /// 0 or 1, enable or disable double buffering
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_DOUBLEBUFFER = 5;
+        /// <summary>
+        /// Size of the depth buffer, in bits
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_DEPTH_SIZE = 6;
+        /// <summary>
+        /// Size of the stencil buffer, in bits.
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_STENCIL_SIZE = 7;
+        /// <summary>
+        /// Size of the accumulation buffer red component, in bits.
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_ACCUM_RED_SIZE = 8;
+        /// <summary>
+        /// Size of the accumulation buffer green component, in bits.
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_ACCUM_GREEN_SIZE = 9;
+        /// <summary>
+        /// Size of the accumulation buffer blue component, in bits.
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_ACCUM_BLUE_SIZE = 10;
+        /// <summary>
+        /// Size of the accumulation buffer alpha component, in bits.
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_ACCUM_ALPHA_SIZE = 11;
+        /// <summary>
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_STEREO = 12;
+        /// <summary>
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_MULTISAMPLEBUFFERS = 13;
+        /// <summary>
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_MULTISAMPLESAMPLES = 14;
+        /// <summary>
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_ACCELERATED_VISUAL = 15;
+        /// <summary>
+        /// Public enumeration for setting the OpenGL window Attributes
+        /// </summary>
+        /// <remarks>
+        /// While you can set most OpenGL attributes normally, 
+        /// the attributes list above must be known before SDL 
+        /// sets the video mode. These attributes a set and read 
+        /// with <see cref="SDL_GL_SetAttribute"/> and 
+        /// <see cref="SDL_GL_GetAttribute"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        public const int SDL_GL_SWAP_CONTROL = 16;
+        #endregion SDL_GLattr
+
+        #region SDL_GrabMode
+        /// <summary>
+        /// Input grab state.
+        /// </summary>
+        /// <remarks>
+        /// enum SDL_GrabMode. 
+        /// </remarks>
+        /// <see cref="SDL_WM_GrabInput"/>
+        public const int SDL_GRAB_QUERY = -1;
+        /// <summary>
+        /// Input grab state.
+        /// </summary>
+        /// <remarks>
+        /// enum SDL_GrabMode. 
+        /// </remarks>
+        /// <see cref="SDL_WM_GrabInput"/>
+        public const int SDL_GRAB_OFF = 0;
+        /// <summary>
+        /// Input grab state.
+        /// </summary>
+        /// <remarks>
+        /// enum SDL_GrabMode. 
+        /// </remarks>
+        /// <see cref="SDL_WM_GrabInput"/>
+        public const int SDL_GRAB_ON = 1;
+        /// <summary>
+        /// Input grab state.
+        /// </summary>
+        /// <remarks>
+        /// enum SDL_GrabMode. 
+        /// </remarks>
+        /// <see cref="SDL_WM_GrabInput"/>
+        public const int SDL_GRAB_FULLSCREEN = 2;
+        #endregion SDL_GrabMode
+        #endregion SDL_video.h
+        #endregion Public Enums
+
+        #region Public Structs
+        // SDL.h -- none
+        // SDL_active.h -- none
+
+        #region SDL_audio.h
+        #region SDL_AudioSpec
+        /// <summary>
+        /// Audio Specification Structure
+        /// </summary>
+        /// <remarks>The calculated values in this structure are 
+        /// calculated by SDL_OpenAudio()
+        /// The SDL_AudioSpec structure is used to describe the format of some 
+        /// audio data. This structure is used by SDL_OpenAudio and SDL_LoadWAV.
+        ///  While all fields are used by <see cref="SDL_OpenAudio"/> only 
+        ///  freq, format, samples
+        ///   and channels are used by <see cref="SDL_LoadWAV(string, out IntPtr, out IntPtr, out int)"/>. 
+        ///   We will detail these common members here.
+        ///   <p>Marshals C-struct in SDL_audio.h:
+        ///   <code>
+        ///   typedef struct{
+        ///		int freq;
+        ///		Uint16 format;
+        ///		Uint8 channels;
+        ///		Uint8 silence;
+        ///		Uint16 samples;
+        ///		Uint32 size;
+        ///		void (*callback)(void *userdata, Uint8 *stream, int len);
+        ///		void *userdata;
+        ///	} SDL_AudioSpec;
+        ///   </code></p>
+        /// </remarks>
+        /// <seealso cref="SDL_OpenAudio"/>
+        /// <seealso cref="SDL_LoadWAV(string, out IntPtr, out IntPtr, out int)"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_AudioSpec
+        {
+            /// <summary>
+            /// Audio frequency in samples per second
+            /// </summary>
+            /// <remarks>
+            /// The number of samples sent to the sound device every second.
+            ///  Common values are 11025, 22050 and 44100. The higher the better.
+            /// </remarks>
+            public int freq;
+            /// <summary>
+            /// Audio data format.
+            /// </summary>
+            /// <remarks>
+            /// Specifies the size and type of each sample element.
+            /// <list type="table">
+            ///             <item>
+            ///                 <term><see cref="AUDIO_U8" /></term>
+            ///                 <description>Unsigned 8-bit samples</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term><see cref="AUDIO_S8" /></term>
+            ///                 <description>Signed 8-bit samples</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term><see cref="AUDIO_U16"/> <see cref="AUDIO_U16LSB" /></term>
+            ///                 <description>Unsigned 16-bit little-endian samples</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term><see cref="AUDIO_S16"/> <see cref="AUDIO_S16LSB" /></term>
+            ///                 <description>Signed 16-bit little-endian samples</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term><see cref="AUDIO_U16MSB" /></term>
+            ///                 <description>Unsigned 16-bit big-endian samples</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term><see cref="AUDIO_S16MSB" /></term>
+            ///                 <description>Signed 16-bit big-endian samples</description>
+            ///             </item>
+            ///             <item>
+            ///                 <term><see cref="AUDIO_U16SYS" /></term>
+            ///                 <description>Either AUDIO_U16LSB or 
+            ///                 AUDIO_U16MSB depending on you systems endianness
+            ///                 </description>
+            ///             </item>
+            ///             <item>
+            ///                 <term><see cref="AUDIO_S16SYS" /></term>
+            ///                 <description>Either AUDIO_S16LSB or 
+            ///                 AUDIO_S16MSB depending on you systems endianness
+            ///					</description>
+            ///             </item>
+            ///         </list>
+            /// </remarks>
+            public short format;
+            /// <summary>
+            /// Number of channels: 1 mono, 2 stereo.
+            /// </summary>
+            /// <remarks>
+            /// The number of seperate sound channels. 
+            /// 1 is mono (single channel), 2 is stereo (dual channel).
+            /// </remarks>
+            public byte channels;
+            /// <summary>
+            /// Audio buffer silence value (calculated).
+            /// </summary>
+            public byte silence;
+            /// <summary>
+            /// Audio buffer size in samples.
+            /// </summary>
+            /// <remarks>
+            /// When used with <see cref="SDL_OpenAudio"/> this refers 
+            /// to the size of the 
+            /// audio buffer in samples. A sample a chunk of audio data
+            ///  of the size specified in format mulitplied by the number
+            ///   of channels. When the SDL_AudioSpec is used with 
+            ///   <see cref="SDL_LoadWAV(string, out IntPtr, out IntPtr, out int)"/> samples is set to 4096.
+            /// </remarks>
+            public short samples;
+            /// <summary>
+            /// Necessary for some compile environments. Should not be used
+            /// </summary>
+            public short padding;
+            /// <summary>
+            /// Audio buffer size in bytes (calculated)
+            /// </summary>
+            public int size;
+            /// <summary>
+            /// Callback function for filling the audio buffer
+            /// This function is called when the audio device needs more data.
+            /// 'stream' is a pointer to the audio data buffer
+            /// 'len' is the length of that buffer in bytes.
+            /// Once the callback returns, the buffer will no longer be valid.
+            /// Stereo samples are stored in a LRLRLR ordering.
+            /// </summary>
+            public IntPtr callback;
+            /// <summary>
+            /// Pointer the user data which is passed to the callback function
+            /// </summary>
+            public object userdata;
+        }
+        #endregion SDL_AudioSpec
+
+        #region SDL_AudioCVT
+        /// <summary>
+        /// Audio Conversion Structure
+        /// </summary>
+        /// <remarks>
+        /// The SDL_AudioCVT is used to convert audio data between different 
+        /// formats. A SDL_AudioCVT structure is created with the 
+        /// <see cref="SDL_BuildAudioCVT(IntPtr, short, byte, int, short, byte, int)"/> function, while the actual
+        ///  conversion is done by the SDL_ConvertAudio function.
+        /// <p>Many of the fields in the <see cref="SDL_AudioCVT"/> 
+        /// structure should be considered private and their function
+        ///  will not be discussed here.</p>
+        ///  <p>
+        ///  <code>
+        ///  typedef struct{
+        ///		int needed;
+        ///		Uint16 src_format;
+        ///		Uint16 dest_format;
+        ///		double rate_incr;
+        ///		Uint8 *buf;
+        ///		int len;
+        ///		int len_cvt;
+        ///		int len_mult;
+        ///		double len_ratio;
+        ///		void (*filters[10])(struct SDL_AudioCVT *cvt, Uint16 format);
+        ///								int filter_index;
+        ///							} SDL_AudioCVT;
+        ///  </code></p>
+        /// </remarks>
+        /// <seealso cref="SDL_BuildAudioCVT(IntPtr, short, byte, int, short, byte, int)"/>
+        /// <seealso cref="SDL_ConvertAudio"/>
+        /// <seealso cref="SDL_AudioSpec"/>
+        public struct SDL_AudioCVT
+        {
+            /// <summary>
+            /// Set to 1 if conversion possible
+            /// </summary>
+            public int needed;
+            /// <summary>
+            /// Audio format of the source
+            /// </summary>
+            public short src_format;
+            /// <summary>
+            /// Audio format of the destination
+            /// </summary>
+            public short dst_format;
+            /// <summary>
+            /// Rate conversion increment
+            /// </summary>
+            public double rate_incr;
+            /// <summary>
+            /// Buffer to hold entire audio data
+            /// </summary>
+            /// <remarks>
+            /// This points to the audio data that will be used in the 
+            /// conversion. It is both the source and the destination, 
+            /// which means the converted audio data overwrites the original
+            ///  data. It also means that the converted data may be larger 
+            ///  than the original data (if you were converting from 8-bit
+            ///   to 16-bit, for instance), so you must ensure buf is large
+            ///    enough. See below.
+            /// <p>IntPtr to byte</p>
+            /// </remarks>
+            public IntPtr buf;
+            /// <summary>
+            /// Length of original audio buffer in bytes
+            /// </summary>
+            public int len;
+            /// <summary>
+            /// Length of converted audio buffer in bytes (calculated)
+            /// </summary>
+            /// <remarks>
+            /// This is the length of the original audio data in bytes.
+            /// </remarks>
+            public int len_cvt;
+            /// <summary>
+            /// buf must be len*len_mult bytes in size(calculated)
+            /// </summary>
+            /// <remarks>
+            /// As explained above, the audio buffer needs to be big enough 
+            /// to store the converted data, which may be bigger than the 
+            /// original audio data. The length of buf should be len*len_mult.
+            /// </remarks>
+            public int len_mult;
+            /// <summary>
+            /// Final audio size is len*len_ratio
+            /// </summary>
+            /// <remarks>
+            /// When you have finished converting your audio data, you need 
+            /// to know how much of your audio buffer is valid. len*len_ratio
+            ///  is the size of the converted audio data in bytes. This is 
+            ///  very similar to len_mult, however when the convert audio 
+            ///  data is shorter than the original len_mult would be 1. 
+            ///  len_ratio, on the other hand, would be a fractional 
+            ///  number between 0 and 1.
+            /// </remarks>
+            public double len_ratio;
+
+            //Pointers to functions needed for this conversion
+            //public void (*filters[10])(IntPtr cvt, short format);
+
+            /// <summary>
+            /// Current audio conversion function
+            /// </summary>
+            public int filter_index;
+        }
+        #endregion SDL_AudioCVT
+        #endregion SDL_audio.h
+
+        // SDL_byteorder.h -- deprecated
+
+        #region SDL_cdrom.h
+        #region SDL_CDtrack
+        /// <summary>
+        /// CD Track Information Structure
+        /// </summary>
+        /// <remarks>
+        /// SDL_CDtrack stores data on each track on a CD, 
+        /// its fields should be pretty self explainatory.
+        /// It is a member a the <see cref="SDL_CD"/> structure.
+        /// <p>Note: Frames can be converted to standard timings.
+        /// There are CD_FPS frames per second, 
+        /// so SDL_CDtrack.length/CD_FPS=length_in_seconds.</p>
+        /// <p>Struct in SDL_cdrom.h
+        /// <code>
+        /// typedef struct{
+        /// Uint8 id;
+        /// Uint8 type;
+        /// Uint32 length;
+        /// Uint32 offset;
+        /// } SDL_CDtrack;
+        /// </code></p>
+        /// </remarks>
+        /// <seealso cref="SDL_CD"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_CDtrack
+        {
+            /// <summary>
+            /// Track number(0-99)
+            /// </summary>
+            public byte id;
+            /// <summary>
+            /// Data or audio track
+            /// </summary>
+            /// <remarks>
+            /// SDL_AUDIO_TRACK or SDL_DATA_TRACK
+            /// </remarks>
+            public byte type;
+            /// <summary>
+            /// Unused
+            /// </summary>
+            public short unused;
+            /// <summary>
+            /// Length, in frames, of this track
+            /// </summary>
+            public int length;
+            /// <summary>
+            /// Offset, in frames, from start of disk
+            /// </summary>
+            public int offset;
+        }
+        #endregion SDL_CDtrack
+
+        #region SDL_CD
+        /// <summary>
+        /// CDROM Drive Information.
+        /// </summary>
+        /// <remarks>
+        /// An SDL_CD structure is returned by <see cref="SDL_CDOpen"/>.
+        ///  It represents an
+        ///  opened CDROM device and stores information on the layout of the
+        ///   tracks on the disc.
+        /// <p>A frame is the base data unit of a CD. CD_FPS frames is equal
+        ///  to 1 second of music. SDL provides two macros for converting
+        ///   between time and frames: FRAMES_TO_MSF(f, M,S,F) and 
+        ///   MSF_TO_FRAMES.</p>
+        /// <p>Struct from SDL_cdrom.h
+        /// <code>
+        /// typedef struct{
+        /// int id;
+        /// CDstatus status;
+        /// int numtracks;
+        /// int cur_track;
+        /// int cur_frame;
+        /// SDL_CDtrack track[SDL_MAX_TRACKS+1];
+        /// } SDL_CD;
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        /// int min, sec, frame;
+        ///		int frame_offset;
+        ///
+        ///		FRAMES_TO_MSF(cdrom->cur_frame, &min, &sec, &frame);
+        ///		printf("Current Position: %d minutes, %d seconds, %d frames\n", min, sec, frame);
+        ///
+        ///		frame_offset=MSF_TO_FRAMES(min, sec, frame);
+        /// </code>
+        /// </example>
+        /// <seealso cref="SDL_CDOpen"/>
+        /// <seealso cref="SDL_CDtrack"/>
+        [StructLayout(LayoutKind.Sequential)]
+        public class SDL_CD
+        {
+            /// <summary>
+            /// Private drive identifier
+            /// </summary>
+            public int id;
+            /// <summary>
+            /// Current drive status
+            /// </summary>
+            /// <remarks>
+            /// SDL_CDStatus enum
+            /// </remarks>
+            public int status;
+            /// <summary>
+            /// Number of tracks on the CD
+            /// </summary>
+            public int numtracks;
+            /// <summary>
+            /// Current track
+            /// </summary>
+            public int cur_track;
+            /// <summary>
+            /// Current frame offset within current track
+            /// </summary>
+            public int cur_frame;
+            /// <summary>
+            /// Array of track descriptions. (see <see cref="SDL_CDtrack"/>)
+            /// </summary>
+            public SDL_CDTrackData track;
+            /// <summary>
+            /// 
+            /// </summary>
+            public SDL_CD()
+            {
+                track = new SDL_CDTrackData();
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential)]
+        public class SDL_CDTrackData
+        {
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = Sdl.SDL_MAX_TRACKS * Sdl.BYTE_SIZE)]
+            private byte[] trackData;
+            /// <summary>
+            /// 
+            /// </summary>
+            public Sdl.SDL_CDtrack this[int index]
+            {
+                get
+                {
+                    if ((index < 0) | (index >= Sdl.SDL_MAX_TRACKS))
+                    {
+                        throw new IndexOutOfRangeException();
+                    }
+
+                    Sdl.SDL_CDtrack track;
+                    GCHandle trackDataHandle =
+                        GCHandle.Alloc(trackData, GCHandleType.Pinned);
+
+                    try
+                    {
+                        IntPtr trackDataBuffer =
+                            trackDataHandle.AddrOfPinnedObject();
+                        trackDataBuffer = (IntPtr)(trackDataBuffer.ToInt32() +
+                            (index * Marshal.SizeOf(typeof(Sdl.SDL_CDtrack))));
+                        track = (Sdl.SDL_CDtrack)Marshal.PtrToStructure(
+                            trackDataBuffer, typeof(Sdl.SDL_CDtrack));
+                    }
+                    finally
+                    {
+                        trackDataHandle.Free();
+                    }
+                    return track;
+                }
+            }
+            /// <summary>
+            /// 
+            /// </summary>
+            public SDL_CDTrackData()
+            {
+                trackData = new byte[Sdl.SDL_MAX_TRACKS * Marshal.SizeOf(typeof(Sdl.SDL_CDtrack))];
+            }
+        }
+
+
+
+        #endregion SDL_CD
+        #endregion SDL_cdrom.h
+
+        // SDL_config.h -- none
+        // SDL_copying.h -- none
+        // SDL_cpuinfo.h -- none
+        // SDL_endian.h - TODO skipped for now
+        // SDL_error.h -- none
+
+        #region SDL_events.h
+        #region SDL_ActiveEvent
+        /// <summary>
+        /// Application visibility event structure.
+        /// </summary>
+        /// <remarks>
+        /// SDL_ActiveEvent is a member of the <see cref="SDL_Event"/>
+        ///  union and is used when an event of type SDL_ACTIVEEVENT 
+        ///  is reported.
+        /// <p>When the mouse leaves or enters the window area a 
+        /// SDL_APPMOUSEFOCUS type activation event occurs, if the 
+        /// mouse entered the window then gain will be 1, otherwise
+        ///  gain will be 0. A SDL_APPINPUTFOCUS type activation event
+        ///   occurs when the application loses or gains keyboard focus. 
+        ///   This usually occurs when another application is made active.
+        ///    Finally, a SDL_APPACTIVE type event occurs when the application
+        ///     is either minimised/iconified (gain=0) or restored.</p>
+        /// <p>Note: This event does not occur when an application window is
+        ///  first created.</p>
+        /// <p>Struct in SDL_events.h
+        /// <code>
+        /// typedef struct{
+        /// Uint8 type;
+        /// Uint8 gain;
+        /// Uint8 state;
+        /// } SDL_ActiveEvent;
+        /// </code></p>
+        /// </remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_GetAppState"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_ActiveEvent
+        {
+            /// <summary>
+            /// SDL_ACTIVEEVENT
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// 0 if the event is a loss or 1 if it is a gain.
+            /// </summary>
+            public byte gain;
+            /// <summary>
+            /// SDL_APPMOUSEFOCUS if mouse focus was gained or lost, 
+            /// SDL_APPINPUTFOCUS if input focus was gained or lost, 
+            /// or SDL_APPACTIVE if the application was iconified 
+            /// (gain=0) or restored(gain=1).
+            /// </summary>
+            public byte state;
+        }
+        #endregion SDL_ActiveEvent
+
+        #region SDL_KeyboardEvent
+        /// <summary>
+        /// Keyboard event structure
+        /// </summary>
+        /// <remarks>
+        /// SDL_KeyboardEvent is a member of the <see cref="SDL_Event"/> union 
+        /// and is used when an event of type SDL_KEYDOWN or SDL_KEYUP is 
+        /// reported.
+        /// <p>The type and state actually report the same information, 
+        /// they just use different values to do it! A keyboard event occurs
+        ///  when a key is released (type=SDK_KEYUP or state=SDL_RELEASED) 
+        ///  and when a key is pressed (type=SDL_KEYDOWN or state=SDL_PRESSED).
+        ///   The information on what key was pressed or released is in the 
+        ///   <see cref="SDL_keysym"/> structure.</p>
+        /// <p>Note: Repeating SDL_KEYDOWN events will occur if key repeat 
+        /// is enabled (see <see cref="SDL_EnableKeyRepeat"/>).</p>
+        /// <p>Struct in SDL_events.h
+        /// <code>
+        /// typedef struct{
+        ///		Uint8 type;
+        ///		Uint8 state;
+        ///		SDL_keysym keysym;
+        ///	} SDL_KeyboardEvent;
+        /// </code></p>
+        /// </remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_keysym"/>
+        /// <seealso cref="SDL_EnableKeyRepeat"/>
+        /// <seealso cref="SDL_EnableUNICODE"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_KeyboardEvent
+        {
+            /// <summary>
+            /// SDL_KEYDOWN or SDL_KEYUP
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// The keyboard device index
+            /// </summary>
+            public byte which;
+            /// <summary>
+            /// SDL_PRESSED or SDL_RELEASED
+            /// </summary>
+            public byte state;
+            /// <summary>
+            /// Contains key press information
+            /// </summary>
+            public SDL_keysym keysym;
+        }
+        #endregion SDL_KeyboardEvent
+
+        #region SDL_MouseMotionEvent
+        /// <summary>
+        /// Mouse motion event structure
+        /// </summary>
+        /// <remarks>
+        /// SDL_MouseMotionEvent is a member of the <see cref="SDL_Event"/>
+        ///  union and is 
+        /// used when an event of type SDL_MOUSEMOTION is reported.
+        /// <p>Simply put, a SDL_MOUSEMOTION type event occurs when a user
+        /// moves the mouse within the application window or when 
+        /// <see cref="SDL_WarpMouse(short, short)"/>
+        ///  is called. Both the absolute (x and y) and relative (xrel and yrel
+        ///  ) coordinates are reported along with the current button states 
+        ///  (state). The button state can be interpreted using the SDL_BUTTON 
+        ///  macro (see <see cref="SDL_GetMouseState"/>).</p>
+        /// <p>If the cursor is hidden (<see cref="SDL_ShowCursor"/>(0))
+        ///  and the input is 
+        /// grabbed (<see cref="SDL_WM_GrabInput"/>(SDL_GRAB_ON)), 
+        /// then the mouse will give
+        ///  relative motion events even when the cursor reaches the edge fo 
+        ///  the screen. This is currently only implemented on Windows and 
+        ///  Linux/Unix-a-likes.</p>
+        /// <p>Struct in SDL_events.h
+        /// <code>
+        /// typedef struct{
+        ///		Uint8 type;
+        ///		Uint8 which;
+        ///		Uint8 state;
+        ///		Uint16 x, y;
+        ///		Sint16 xrel, yrel;
+        ///	} SDL_MouseMotionEvent;
+        /// </code></p>
+        /// </remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_MouseButtonEvent"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_MouseMotionEvent
+        {
+            /// <summary>
+            /// SDL_MOUSEMOTION
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// The mouse device index
+            /// </summary>
+            public byte which;
+            /// <summary>
+            /// The current button state
+            /// </summary>
+            public byte state;
+            /// <summary>
+            /// The X coordinate of the mouse
+            /// </summary>
+            public short x;
+            /// <summary>
+            /// The Y coordinate of the mouse
+            /// </summary>
+            public short y;
+            /// <summary>
+            /// The relative motion in the X direction
+            /// </summary>
+            public short xrel;
+            /// <summary>
+            /// The relative motion in the Y direction
+            /// </summary>
+            public short yrel;
+        }
+        #endregion SDL_MouseMotionEvent
+
+        #region SDL_MouseButtonEvent
+        /// <summary>
+        /// Mouse button event structure
+        /// </summary>
+        /// <remarks>
+        /// SDL_MouseButtonEvent is a member of the <see cref="SDL_Event"/>
+        ///  union and is used when an event of type SDL_MOUSEBUTTONDOWN or
+        ///   SDL_MOUSEBUTTONUP is reported.
+        /// <p>When a mouse button press or release is detected then number
+        ///  of the button pressed (from 1 to 255, with 1 usually being the
+        ///   left button and 2 the right) is placed into button, the position
+        ///    of the mouse when this event occured is stored in the x and the
+        ///     y fields. Like <see cref="SDL_KeyboardEvent"/>, information on
+        ///      whether the event was a press or a release event is stored in
+        ///       both the type and state fields, but this should be obvious.
+        ///       </p>
+        ///       <p>Struct in SDL_events.h
+        /// <code>
+        /// typedef struct{
+        ///		Uint8 type;
+        ///		Uint8 button;
+        ///		Uint8 state;
+        ///		Uint16 x, y;
+        ///	} SDL_MouseButtonEvent;
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_MouseMotionEvent"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_MouseButtonEvent
+        {
+            /// <summary>
+            /// SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// The mouse device index 
+            /// </summary>
+            public byte which;
+            /// <summary>
+            /// The mouse button index (SDL_BUTTON_LEFT, 
+            /// SDL_BUTTON_MIDDLE, SDL_BUTTON_RIGHT)
+            /// </summary>
+            public byte button;
+            /// <summary>
+            /// SDL_PRESSED or SDL_RELEASED 
+            /// </summary>
+            public byte state;
+            /// <summary>
+            /// The X coordinate of the mouse at press/release time
+            /// </summary>
+            public short x;
+            /// <summary>
+            /// The Y coordinate of the mouse at press/release time
+            /// </summary>
+            public short y;
+        }
+        #endregion SDL_MouseButtonEvent
+
+        #region SDL_JoyAxisEvent
+        /// <summary>
+        /// Joystick axis motion event structure
+        /// </summary>
+        /// <remarks>
+        /// SDL_JoyAxisEvent is a member of the <see cref="SDL_Event"/> union
+        ///  and is used when an event of type SDL_JOYAXISMOTION is reported.
+        /// <p>A SDL_JOYAXISMOTION event occurs when ever a user moves an 
+        /// axis on the joystick. The field which is the index of the 
+        /// joystick that reported the event and axis is the index of the 
+        /// axis (for a more detailed explaination see the Joystick section).
+        ///  value is the current position of the axis.</p>
+        /// <p>
+        /// <code>Struct in SDL_cdrom.h
+        /// typedef struct{
+        ///		Uint8 type;
+        ///		Uint8 which;
+        ///		Uint8 axis;
+        ///		Sint16 value;
+        ///	} SDL_JoyAxisEvent;
+        /// </code></p>
+        /// </remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_JoystickEventState"/>
+        /// <seealso cref="SDL_JoystickGetAxis"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_JoyAxisEvent
+        {
+            /// <summary>
+            /// SDL_JOYAXISMOTION
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// The joystick device index
+            /// </summary>
+            public byte which;
+            /// <summary>
+            /// Joystick axis index
+            /// </summary>
+            public byte axis;
+            /// <summary>
+            /// Axis value (range: -32768 to 32767)
+            /// </summary>
+            public short val;
+        }
+        #endregion SDL_JoyAxisEvent
+
+        #region SDL_JoyBallEvent
+        /// <summary>
+        /// Joystick trackball motion event structure
+        /// </summary>
+        /// <remarks>
+        /// SDL_JoyBallEvent is a member of the <see cref="SDL_Event"/> union 
+        /// and is used when an event of type SDL_JOYBALLMOTION is reported.
+        /// <p>A SDL_JOYBALLMOTION event occurs when a user moves a trackball
+        ///  on the joystick. The field which is the index of the joystick 
+        ///  that reported the event and ball is the index of the trackball
+        ///   (for a more detailed explaination see the Joystick section). 
+        ///   Trackballs only return relative motion, this is the change 
+        ///   in position on the ball since it was last polled (last cycle 
+        ///   of the event loop) and it is stored in xrel and yrel.</p>
+        /// <p>Struct in SDL_events.h
+        /// <code>
+        /// typedef struct{
+        ///		Uint8 type;
+        ///		Uint8 which;
+        ///		Uint8 ball;
+        ///		Sint16 xrel, yrel;
+        ///	} SDL_JoyBallEvent;
+        /// </code></p></remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_JoystickEventState"/>
+        /// <seealso cref="SDL_JoystickGetBall"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_JoyBallEvent
+        {
+            /// <summary>
+            /// SDL_JOYBALLMOTION
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// The joystick device index
+            /// </summary>
+            public byte which;
+            /// <summary>
+            /// The joystick trackball index
+            /// </summary>
+            public byte ball;
+            /// <summary>
+            /// The relative motion in the X direction
+            /// </summary>
+            public short xrel;
+            /// <summary>
+            /// The relative motion in the Y direction
+            /// </summary>
+            public short yrel;
+        }
+        #endregion SDL_JoyBallEvent
+
+        #region SDL_JoyHatEvent
+        /// <summary>
+        /// Joystick hat position change event structure
+        /// </summary>
+        /// <remarks>
+        /// SDL_JoyHatEvent is a member of the <see cref="SDL_Event"/> union 
+        /// and is used when an event of type SDL_JOYHATMOTION is reported.
+        /// <p>A SDL_JOYHATMOTION event occurs when ever a user moves a hat 
+        /// on the joystick. The field which is the index of the joystick that
+        ///  reported the event and hat is the index of the hat (for a more 
+        ///  detailed exlaination see the Joystick section). value is the 
+        ///  current position of the hat. It is a logically OR'd combination 
+        ///  of the following values (whose meanings should be pretty 
+        ///  obvious:) :</p>
+        /// <p>SDL_HAT_CENTERED</p> 
+        /// <p>SDL_HAT_UP</p> 
+        ///	<p>SDL_HAT_RIGHT</p>
+        ///	<p>SDL_HAT_DOWN</p> 
+        ///	<p>SDL_HAT_LEFT</p> 
+        ///	<p>The following defines are also provided:</p>
+        ///	<p>SDL_HAT_RIGHTUP</p>
+        ///	<p>SDL_HAT_RIGHTDOWN</p>
+        ///	<p>SDL_HAT_LEFTUP</p> 
+        ///	<p>SDL_HAT_LEFTDOWN</p>
+        /// <p>Struct from SDL_events.h
+        /// <code>
+        /// typedef struct{
+        ///		Uint8 type;
+        ///		Uint8 which;
+        ///		Uint8 hat;
+        ///		Uint8 value;
+        ///	} SDL_JoyHatEvent;
+        /// </code></p></remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_JoystickEventState"/>
+        /// <seealso cref="SDL_JoystickGetHat"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_JoyHatEvent
+        {
+            /// <summary>
+            /// SDL_JOYHATMOTION
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// The joystick device index
+            /// </summary>
+            public byte which;
+            /// <summary>
+            /// The joystick hat index
+            /// </summary>
+            public byte hat;
+            /// <summary>
+            /// The hat position value:
+            ///  <p><code>SDL_HAT_LEFTUP   SDL_HAT_UP       SDL_HAT_RIGHTUP
+            ///  SDL_HAT_LEFT     SDL_HAT_CENTERED SDL_HAT_RIGHT
+            ///  SDL_HAT_LEFTDOWN SDL_HAT_DOWN     SDL_HAT_RIGHTDOWN</code></p>
+            /// Note that zero means the POV is centered.
+            /// </summary>
+            public byte val;
+        }
+        #endregion SDL_JoyHatEvent
+
+        #region SDL_JoyButtonEvent
+        /// <summary>
+        /// Joystick button event structure
+        /// </summary>
+        /// <remarks>
+        /// SDL_JoyButtonEvent is a member of the <see cref="SDL_Event"/> 
+        /// union and is used when an event of type SDL_JOYBUTTONDOWN or 
+        /// SDL_JOYBUTTONUP is reported.
+        /// <p>A SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP event occurs when ever 
+        /// a user presses or releases a button on a joystick. The field which
+        ///  is the index of the joystick that reported the event and button 
+        ///  is the index of the button (for a more detailed explaination see
+        ///   the Joystick section). state is the current state or the button
+        ///    which is either SDL_PRESSED or SDL_RELEASED.</p>
+        /// <p>Struct from SDL_events.h
+        /// <code>
+        /// typedef struct{
+        ///		Uint8 type;
+        ///		Uint8 which;
+        ///		Uint8 button;
+        ///		Uint8 state;
+        ///	} SDL_JoyButtonEvent;
+        /// </code></p></remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_JoystickEventState"/>
+        /// <seealso cref="SDL_JoystickGetButton"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_JoyButtonEvent
+        {
+            /// <summary>
+            /// SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// The joystick device index 
+            /// </summary>
+            public byte which;
+            /// <summary>
+            /// The joystick button index
+            /// </summary>
+            public byte button;
+            /// <summary>
+            /// SDL_PRESSED or SDL_RELEASED
+            /// </summary>
+            public byte state;
+        }
+        #endregion SDL_JoyButtonEvent
+
+        #region SDL_ResizeEvent
+        /// <summary>
+        /// Window resized event
+        /// </summary>
+        /// <remarks>
+        /// SDL_ResizeEvent is a member of the <see cref="SDL_Event"/> union 
+        /// and is used when an event of type SDL_VIDEORESIZE is reported.
+        /// <p>When SDL_RESIZABLE is passed as a flag to 
+        /// <see cref="SDL_SetVideoMode(int, int, int, int)"/> the user is allowed to resize the
+        ///  applications window. When the window is resized an 
+        ///  SDL_VIDEORESIZE is report, with the new window width and height
+        ///   values stored in w and h, respectively. When an SDL_VIDEORESIZE
+        ///    is recieved the window should be resized to the new dimensions
+        ///     using <see cref="SDL_SetVideoMode(int, int, int, int)"/>.</p>
+        /// <p>Struct in SDL_events.h
+        /// <code>
+        /// typedef struct{
+        ///		Uint8 type;
+        ///		int w, h;
+        ///	} SDL_ResizeEvent;
+        /// </code></p></remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_SetVideoMode(int, int, int, int)"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_ResizeEvent
+        {
+            /// <summary>
+            /// SDL_VIDEORESIZE
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// New width of the window
+            /// </summary>
+            public int w;
+            /// <summary>
+            /// New height of the window
+            /// </summary>
+            public int h;
+        }
+        #endregion SDL_ResizeEvent
+
+        #region SDL_ExposeEvent
+        /// <summary>
+        /// Screen redraw event
+        /// </summary>
+        /// <remarks>
+        /// SDL_ExposeEvent is a member of the <see cref="SDL_Event"/> union 
+        /// and is used whan an event of type SDL_VIDEOEXPOSE is reported.
+        /// <p>A VIDEOEXPOSE event is triggered when the screen has been 
+        /// modified outside of the application, usually by the window 
+        /// manager and needs to be redrawn.</p>
+        /// <p>Struct in SDL_events.h
+        /// <code>
+        /// typedef struct{
+        ///		Uint8 type
+        ///		} SDL_ExposeEvent;
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_SetEventFilter"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_ExposeEvent
+        {
+            /// <summary>
+            /// SDL_VIDEOEXPOSE
+            /// </summary>
+            public byte type;
+        }
+        #endregion SDL_ExposeEvent
+
+        #region SDL_QuitEvent
+        /// <summary>
+        /// Quit requested event
+        /// </summary>
+        /// <remarks>
+        /// SDL_QuitEvent is a member of the <see cref="SDL_Event"/> union 
+        /// and is used whan an event of type SDL_QUIT is reported.
+        /// <p>As can be seen, the SDL_QuitEvent structure serves no useful 
+        /// purpose. The event itself, on the other hand, is very important.
+        ///  If you filter out or ignore a quit event then it is impossible 
+        ///  for the user to close the window. On the other hand, if you do 
+        ///  accept a quit event then the application window will be closed,
+        ///   and screen updates will still report success event though the 
+        ///   application will no longer be visible.</p>
+        /// <p>Note: The macro SDL_QuitRequested will return non-zero if a 
+        /// quit event is pending</p>
+        /// <p>Struct in SDL_events.h
+        /// <code>
+        /// typedef struct{
+        ///		Uint8 type
+        ///		} SDL_QuitEvent;
+        /// </code></p></remarks>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_SetEventFilter"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_QuitEvent
+        {
+            /// <summary>
+            /// SDL_QUIT
+            /// </summary>
+            public byte type;
+        }
+        #endregion SDL_QuitEvent
+
+        #region SDL_UserEvent
+        /// <summary>
+        /// A user-defined event type
+        /// </summary>
+        /// <remarks>
+        /// SDL_UserEvent is in the user member of the structure 
+        /// <see cref="SDL_Event"/>. This event is unique, it is never created
+        ///  by SDL but only by the user. The event can be pushed onto the 
+        ///  event queue using <see cref="SDL_PushEvent"/>. 
+        ///  The contents of the structure 
+        ///  members or completely up to the programmer, the only requirement
+        ///   is that type is a value from SDL_USEREVENT to SDL_NUMEVENTS-1 
+        ///   (inclusive).
+        /// <p>Struct in SDL_events.h
+        /// <code>
+        /// typedef struct{
+        ///		Uint8 type;
+        ///		int code;
+        ///		void *data1;
+        ///		void *data2;
+        ///	} SDL_UserEvent;
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        /// SDL_Event event;
+        ///
+        ///		event.type = SDL_USEREVENT;
+        ///		event.user.code = my_event_code;
+        ///		event.user.data1 = significant_data;
+        ///		event.user.data2 = 0;
+        ///		SDL_PushEvent(&event);
+        /// </code>
+        /// 
+        /// </example>
+        /// <seealso cref="SDL_Event"/>
+        /// <seealso cref="SDL_PushEvent"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_UserEvent
+        {
+            /// <summary>
+            /// SDL_USEREVENT through SDL_NUMEVENTS-1
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// User defined event code
+            /// </summary>
+            public int code;
+            /// <summary>
+            /// User defined data pointer
+            /// </summary>
+            public IntPtr data1;
+            /// <summary>
+            /// User defined data pointer
+            /// </summary>
+            public IntPtr data2;
+        }
+        #endregion SDL_UserEvent
+
+        #region SDL_SysWMEvent
+        /// <summary>
+        /// Platform-dependent window manager event.
+        /// </summary>
+        /// <remarks>
+        /// The system window manager event contains a pointer to 
+        /// system-specific information about unknown window manager events.
+        ///  If you enable this event using <see cref="SDL_EventState"/>, 
+        ///  it will be generated whenever unhandled events are received from
+        ///   the window manager. This can be used, for example, to implement
+        ///    cut-and-paste in your application.
+        ///    <p>
+        ///    If you want to obtain system-specific information about the 
+        ///    window manager, you can fill the version member of a 
+        ///    SDL_SysWMinfo structure (details can be found in SDL_syswm.h,
+        ///     which must be included) using the SDL_VERSION() macro found
+        ///      in SDL_version.h, and pass it to the function:
+        ///    </p>
+        ///    <p><code>int SDL_GetWMInfo(SDL_SysWMinfo *info);</code></p>
+        /// <p>Struct from SDL_events.h
+        /// <code>
+        /// typedef struct {
+        ///		Uint8 type;   /* Always SDL_SYSWMEVENT */
+        ///		SDL_SysWMmsg *msg;
+        /// } SDL_SysWMEvent;
+        /// </code>
+        /// </p></remarks>
+        /// <seealso cref="SDL_EventState"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_SysWMEvent
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte type;
+            /// <summary>
+            /// IntPtr to SDL_SysWMmsg
+            /// </summary>
+            public IntPtr msg;
+        }
+        #endregion SDL_SysWMEvent
+
+        #region SDL_Event
+        /// <summary>
+        /// General event structure
+        /// </summary>
+        /// <remarks>
+        /// The SDL_Event union is the core to all event handling is SDL,
+        ///  its probably the most important structure after SDL_Surface.
+        ///   SDL_Event is a union of all event structures used in SDL, 
+        ///   using it is a simple matter of knowing which union member
+        ///    relates to which event type.
+        /// <list type="table">
+        ///             <listheader>
+        ///                 <term>Event type</term>
+        ///                 <description>Event Structure</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term>SDL_ACTIVEEVENT</term>
+        ///                 <description><see cref="SDL_ActiveEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_KEYDOWN</term>
+        ///                 <description><see cref="SDL_KeyboardEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_KEYUP</term>
+        ///                 <description><see cref="SDL_KeyboardEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_MOUSEMOTION</term>
+        ///                 <description><see cref="SDL_MouseMotionEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_MOUSEBUTTONDOWN</term>
+        ///                 <description><see cref="SDL_MouseButtonEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_MOUSEBUTTONUP</term>
+        ///                 <description><see cref="SDL_MouseButtonEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_JOYAXISMOTION</term>
+        ///                 <description><see cref="SDL_JoyAxisEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_JOYBALLMOTION</term>
+        ///                 <description><see cref="SDL_JoyBallEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_JOYHATMOTION</term>
+        ///                 <description><see cref="SDL_JoyHatEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_JOYBUTTONDOWN</term>
+        ///                 <description><see cref="SDL_JoyButtonEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_JOYBUTTONUP</term>
+        ///                 <description><see cref="SDL_JoyButtonEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_QUIT</term>
+        ///                 <description><see cref="SDL_QuitEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_SYSWMEVENT</term>
+        ///                 <description><see cref="SDL_SysWMEvent"/></description>
+        ///             </item> 
+        ///             <item>
+        ///                 <term>SDL_VIDEORESIZE</term>
+        ///                 <description><see cref="SDL_ResizeEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_VIDEOEXPOSE</term>
+        ///                 <description><see cref="SDL_ExposeEvent"/></description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>SDL_USEREVENT</term>
+        ///                 <description><see cref="SDL_UserEvent"/></description>
+        ///             </item>
+        ///         </list>	
+        /// <p>
+        /// The SDL_Event structure has two uses
+        /// <p>Reading events on the event queue</p>
+        /// <p>Placing events on the event queue</p>
+        /// <p>Reading events from the event queue is done with either
+        ///  <see cref="SDL_PollEvent"/> or <see cref="SDL_PeepEvents(SDL_Event[], int, int, int)"/>.
+        ///   We'll use SDL_PollEvent and step through an example.</p>
+        /// <p>First off, we create an empty SDL_Event structure.</p> 
+        /// <p><code>SDL_Event test_event;</code></p>
+        /// <p>SDL_PollEvent removes the next event from the event queue, if 
+        /// there are no events on the queue it returns 0 otherwise it returns 
+        /// 1. We use a while loop to process each event in turn.</p>
+        /// <p><code>while(SDL_PollEvent(&test_event)) { </code></p>
+        /// <p>The SDL_PollEvent function take a pointer to an SDL_Event 
+        /// structure that is to be filled with event information. We know
+        ///  that if SDL_PollEvent removes an event from the queue then the
+        ///   event information will be placed in our test_event structure, 
+        ///   but we also know that the type of event will be placed in the 
+        ///   type member of test_event. So to handle each event type 
+        ///   seperately we use a switch statement.</p>
+        /// <p><code> switch(test_event.type) { </code></p>
+        /// <p>We need to know what kind of events we're looking for and the
+        ///  event type's of those events. So lets assume we want to detect 
+        ///  where the user is moving the mouse pointer within our application.
+        ///   We look through our event types and notice that SDL_MOUSEMOTION 
+        ///   is, more than likely, the event we're looking for. A little more
+        ///    research tells use that SDL_MOUSEMOTION events are handled 
+        ///    within the <see cref="SDL_MouseMotionEvent"/> 
+        ///    structure which is the motion
+        ///     member of SDL_Event. We can check for the SDL_MOUSEMOTION 
+        ///     event type within our switch statement like so: </p>
+        /// <p><code>case SDL_MOUSEMOTION:</code></p>
+        /// <p>All we need do now is read the information out of the 
+        /// motion member of test_event.</p> 
+        /// <code>
+        ///		printf("We got a motion event.\n");
+        ///		printf("Current mouse position is: (%d, %d)\n", test_event.motion.x, test_event.motion.y);
+        ///		break;
+        ///		default:
+        ///		printf("Unhandled Event!\n");
+        ///		break;
+        ///	}
+        /// }
+        /// printf("Event queue empty.\n");</code>
+        /// <p>It is also possible to push events onto the event queue 
+        /// and so use it as a two-way communication path. Both 
+        /// <see cref="SDL_PushEvent"/> and <see cref="SDL_PeepEvents(SDL_Event[], int, int, int)"/>
+        ///  allow you to place events onto the event queue. This is 
+        ///  usually used to place a SDL_USEREVENT on the event queue,
+        ///   however you could use it to post fake input events if you 
+        ///   wished. Creating your own events is a simple matter of 
+        ///   choosing the event type you want, setting the type member 
+        ///   and filling the appropriate member structure with information.
+        ///   </p><p>
+        /// <code>
+        ///SDL_Event user_event;
+        ///
+        ///user_event.type=SDL_USEREVENT;
+        ///user_event.user.code=2;
+        ///user_event.user.data1=NULL;
+        ///user_event.user.data2=NULL;
+        ///SDL_PushEvent(&user_event);
+        ///</code>
+        /// </p>	   
+        /// <p>Union from SDL_events.h
+        /// <code>
+        /// typedef union{
+        ///		Uint8 type;
+        ///		SDL_ActiveEvent active;
+        ///		SDL_KeyboardEvent key;
+        ///		SDL_MouseMotionEvent motion;
+        ///		SDL_MouseButtonEvent button;
+        ///		SDL_JoyAxisEvent jaxis;
+        ///		SDL_JoyBallEvent jball;
+        ///		SDL_JoyHatEvent jhat;
+        ///		SDL_JoyButtonEvent jbutton;
+        ///		SDL_ResizeEvent resize;
+        ///		SDL_ExposeEvent expose;
+        ///		SDL_QuitEvent quit;
+        ///		SDL_UserEvent user;
+        ///		SDL_SywWMEvent syswm;
+        ///	} SDL_Event;
+        /// </code></p></p></remarks>
+        /// <seealso cref="SDL_PollEvent"/>
+        /// <seealso cref="SDL_PushEvent"/>
+        /// <seealso cref="SDL_PeepEvents(SDL_Event[], int, int, int)"/>
+        [StructLayout(LayoutKind.Explicit)]
+        public struct SDL_Event
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            [FieldOffset(0)]
+            public byte type;
+            /// <summary>
+            /// Activation event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_ActiveEvent active;
+            /// <summary>
+            /// Keyboard event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_KeyboardEvent key;
+            /// <summary>
+            /// Mouse motion event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_MouseMotionEvent motion;
+            /// <summary>
+            /// Mouse button event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_MouseButtonEvent button;
+            /// <summary>
+            /// Joystick axis event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_JoyAxisEvent jaxis;
+            /// <summary>
+            /// Joystick trackbell event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_JoyBallEvent jball;
+            /// <summary>
+            /// Joystick hat motion event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_JoyHatEvent jhat;
+            /// <summary>
+            /// Joystick button event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_JoyButtonEvent jbutton;
+            /// <summary>
+            /// Application window resize event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_ResizeEvent resize;
+            /// <summary>
+            /// Application window expose event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_ExposeEvent expose;
+            /// <summary>
+            /// Quit request event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_QuitEvent quit;
+            /// <summary>
+            /// User defined event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_UserEvent user;
+            /// <summary>
+            /// Undefined window manager event
+            /// </summary>
+            [FieldOffset(0)]
+            public SDL_SysWMEvent syswm;
+        }
+        #endregion SDL_Event
+
+        #endregion SDL_events.h
+
+        // SDL_getenv.h -- deprecated
+
+        #region SDL_joystick.h
+        // These structs are not public structs.
+
+        //		#region SDL_Joystick
+        //		///<summary>
+        //		/// TODO. This needs work.
+        //		///</summary>
+        //		///<remarks>
+        //		///<p>
+        //		///		<code>
+        //		///		struct _SDL_Joystick 
+        //		///		{
+        //		///			Uint8 index;		/* Device index */
+        //		///			const char *name;	/* Joystick name - system dependent */
+        //		///			int naxes;		/* Number of axis controls on the joystick */
+        //		///			Sint16 *axes;		/* Current axis states */
+        //		///			int nhats;		/* Number of hats on the joystick */
+        //		///			Uint8 *hats;		/* Current hat states */
+        //		///			int nballs;		/* Number of trackballs on the joystick */
+        //		///			struct balldelta 
+        //		///			{
+        //		///				int dx;
+        //		///				int dy;
+        //		///			} *balls;		/* Current ball motion deltas */
+        //		///			int nbuttons;		/* Number of buttons on the joystick */
+        //		///			Uint8 *buttons;		/* Current button states */
+        //		///			struct joystick_hwdata *hwdata;	/* Driver dependent information */
+        //		///				int ref_count;		/* Reference count for multiple opens */
+        //		///			}
+        //		///			</code>
+        //		///			</p>
+        //		///			</remarks>
+        //		[StructLayout(LayoutKind.Sequential, Pack=4)]
+        //			public struct SDL_Joystick
+        //		{
+        //			/// <summary>
+        //			/// Device index
+        //			/// </summary>
+        //			public byte index;
+        //			/// <summary>
+        //			/// Joystick name - system dependent
+        //			/// </summary>
+        //			public string name;
+        //			/// <summary>
+        //			/// Number of axis controls on the joystick
+        //			/// </summary>
+        //			public int naxes;
+        //			/// <summary>
+        //			/// Current axis states
+        //			/// </summary>
+        //			public IntPtr axes;
+        //			/// <summary>
+        //			/// Number of hats on the joystick
+        //			/// </summary>
+        //			/// <remarks>
+        //			/// IntPtr to short
+        //			/// </remarks>
+        //			public int nhats;
+        //			/// <summary>
+        //			/// Current hat states
+        //			/// </summary>
+        //			public IntPtr hats;
+        //			/// <summary>
+        //			/// Number of trackballs on the joystick
+        //			/// </summary>
+        //			/// <remarks>
+        //			/// IntPtr to byte
+        //			/// </remarks>
+        //			public int nballs;
+        //			/// <summary>
+        //			/// Current ball motion deltas
+        //			/// </summary>
+        //			/// <remarks>
+        //			/// IntPtr to balldelta
+        //			/// </remarks>
+        //			public IntPtr balls;
+        //			/// <summary>
+        //			/// Number of buttons on the joystick
+        //			/// </summary>
+        //			public int nbuttons;
+        //			/// <summary>
+        //			/// Current button states
+        //			/// </summary>
+        //			/// <remarks>
+        //			/// IntPtr to byte
+        //			/// </remarks>
+        //			public IntPtr buttons;
+        //			/// <summary>
+        //			/// Reference count for multiple opens
+        //			/// </summary>
+        //			/// <remarks>
+        //			/// IntPtr to joystick_hwdata
+        //			/// </remarks>
+        //			public IntPtr hwdata;
+        //		}
+        //		#endregion SDL_Joystick
+
+        //		#region balldelta
+        //		/// <summary>
+        //		/// 
+        //		/// </summary>
+        //		[StructLayout(LayoutKind.Sequential, Pack=4)]
+        //			public struct balldelta
+        //		{
+        //			/// <summary>
+        //			/// 
+        //			/// </summary>
+        //			public int dx;
+        //			/// <summary>
+        //			/// 
+        //			/// </summary>
+        //			public int dy;
+        //		}
+        //		#endregion balldelta
+        //
+        //		#region joystick_hwdata
+        //		/// <summary>
+        //		/// 
+        //		/// </summary>
+        //		[StructLayout(LayoutKind.Sequential, Pack=4)]
+        //			public struct joystick_hwdata
+        //		{
+        //			/// <summary>
+        //			/// 
+        //			/// </summary>
+        //			public int ref_count;
+        //		}
+        //		#endregion joystick_hwdata
+        #endregion SDL_joystick.h
+
+        #region SDL_keyboard.h
+        #region SDL_keysym
+        /// <summary>
+        /// The SDL_keysym structure describes a key press or a key release.
+        /// </summary>
+        /// <remarks>
+        /// The SDL_keysym structure describes a key press or a key release. 
+        /// The scancode field is hardware specific and should be ignored 
+        /// unless you know what your doing. The sym field is the SDLKey 
+        /// value of the key being pressed or released. The mod field 
+        /// describes the state of the keyboard modifiers at the time the 
+        /// key press or release occurred. So a value of KMOD_NUM | KMOD_CAPS
+        ///  | KMOD_LSHIFT would mean that Numlock, Capslock and the left shift
+        ///   key were all press (or enabled in the case of the lock keys). 
+        ///   Finally, the unicode field stores the 16-bit unicode value of 
+        ///   the key.
+        ///   <p>Note: It should be noted and understood that this field is
+        ///    only valid when the SDL_keysym is describing a key press, 
+        ///    not a key release. Unicode values only make sense on a key 
+        ///    press because the unicode value describes an international 
+        ///    character and only key presses produce characters. More 
+        ///    information on Unicode can be found at www.unicode.org</p>
+        ///   <p>Note: Unicode translation must be enabled using the 
+        ///   <see cref="SDL_EnableUNICODE"/> function.
+        ///   </p>
+        ///	<p>Struct in SDL_keyboard.h
+        ///	<code>
+        ///	typedef struct{
+        ///		Uint8 scancode;
+        ///		SDLKey sym;
+        ///		SDLMod mod;
+        ///		Uint16 unicode;
+        ///	} SDL_keysym;
+        ///	</code></p>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_keysym
+        {
+            /// <summary>
+            /// Hardware specific scancode.
+            /// </summary>
+            /// <remarks>
+            /// The scancode is hardware dependent, 
+            /// and should not be used by general
+            /// applications.  
+            /// If no hardware scancode is available, it will be 0.
+            /// </remarks>
+            public byte scancode;
+            /// <summary>
+            /// SDL virtual keysym.
+            /// </summary>
+            public int sym;
+            /// <summary>
+            /// Current key modifiers.
+            /// </summary>
+            public int mod;
+            /// <summary>
+            /// Translated character.
+            /// </summary>
+            /// <remarks>
+            /// The 'unicode' translated character is only available 
+            /// when character
+            /// translation is enabled by the SDL_EnableUNICODE() API.  
+            /// If non-zero,
+            /// this is a UNICODE character corresponding to the keypress.  
+            /// If the
+            /// high 9 bits of the character are 0, 
+            /// then this maps to the equivalent
+            /// ASCII character:
+            /// <p><code>
+            /// 	char ch;
+            ///	if ( (keysym.unicode and 0xFF80) == 0 ) {
+            ///		ch = keysym.unicode and 0x7F;
+            ///	} else {
+            ///		An international character..
+            ///	}</code></p>
+            /// </remarks>
+            public short unicode;
+        }
+        #endregion SDL_keysym
+        #endregion SDL_keyboard.h
+
+        // SDL_keysym.h -- none
+        // SDL_loadso.h -- none
+        // SDL_main.h -- none
+
+        #region SDL_mouse.h
+        //		#region WMcursor
+        //		/// <summary>
+        //		/// Implementation dependent.
+        //		/// TODO. Fix this.
+        //		/// </summary>
+        //		/// <remarks>
+        //		/// <p>Struct in SDL_mouse.h
+        //		/// <code>
+        //		/// struct WMcursor WMcursor
+        //		/// </code>
+        //		/// </p>
+        //		/// </remarks>
+        //		[StructLayout(LayoutKind.Sequential, Pack=4)]
+        //			public struct WMcursor 
+        //		{
+        //		}
+        //		#endregion WMcursor
+
+        #region SDL_Cursor
+        /// <summary>
+        /// Structure to hold cursor
+        /// </summary>
+        /// <remarks>
+        /// <p>Struct in SDL_mouse.h
+        /// <code>
+        /// struct {
+        ///		SDL_Rect area;			/* The area of the mouse cursor */
+        ///		Sint16 hot_x, hot_y;		/* The "tip" of the cursor */
+        ///		Uint8 *data;			/* B/W cursor data */
+        ///		Uint8 *mask;			/* B/W cursor mask */
+        ///		Uint8 *save[2];			/* Place to save cursor area */
+        ///		WMcursor *wm_cursor;		/* Window-manager cursor */
+        ///	} SDL_Cursor
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_Cursor
+        {
+            /// <summary>
+            /// The area of the mouse cursor
+            /// </summary>
+            public SDL_Rect area;
+            /// <summary>
+            /// The "tip" of the cursor
+            /// </summary>
+            public short hot_x;
+            /// <summary>
+            /// The "tip" of the cursor
+            /// </summary>
+            public short hot_y;
+            /// <summary>
+            /// B/W cursor data
+            /// </summary>
+            /// <remarks>
+            /// IntPtr to byte
+            /// </remarks>
+            public IntPtr data;
+            /// <summary>
+            /// B/W cursor mask
+            /// </summary>
+            /// <remarks>
+            /// IntPtr to byte
+            /// </remarks>
+            public IntPtr mask;
+            /// <summary>
+            /// Place to save cursor area
+            /// </summary>
+            /// <remarks>
+            /// IntPtr to byte[2]
+            /// </remarks>
+            public IntPtr[] save;
+            /// <summary>
+            /// Window-manager cursor
+            /// </summary>
+            /// <remarks>
+            /// IntPtr to WMcursor
+            /// </remarks>
+            public IntPtr wm_cursor;
+        }
+        #endregion SDL_Cursor
+        #endregion SDL_mouse.h
+
+        // SDL_mutex.h -- none
+        // SDL_name.h -- none
+        // SDL_opengl.h -- TODO superceded by Tao.OpenGL?
+        // SDL_platform.h -- none
+        // SDL_quit.h -- none
+
+        #region SDL_rwops.h
+        // TODO
+        /* This is the read/write operation structure -- very basic */
+
+        // typedef struct SDL_RWops
+        // {
+        // /* Seek to 'offset' relative to whence, one of stdio's whence values:
+        // SEEK_SET, SEEK_CUR, SEEK_END
+        // Returns the final offset in the data source.
+        // */
+        // int (SDLCALL *seek)(struct SDL_RWops *context, int offset, int whence);
+        //
+        // /* Read up to 'num' objects each of size 'objsize' from the data
+        // source to the area pointed at by 'ptr'.
+        // Returns the number of objects read, or -1 if the read failed.
+        // */
+        // int (SDLCALL *read)(struct SDL_RWops *context, void *ptr, int size, int maxnum);
+        //
+        // /* Write exactly 'num' objects each of size 'objsize' from the area
+        // pointed at by 'ptr' to data source.
+        // Returns 'num', or -1 if the write failed.
+        // */
+        // int (SDLCALL *write)(struct SDL_RWops *context, const void *ptr, int size, int num);
+        //
+        // /* Close and free an allocated SDL_FSops structure */
+        // int (SDLCALL *close)(struct SDL_RWops *context);
+        //
+        // Uint32 type;
+        // union
+        // {
+        //#ifdef __WIN32__
+        // struct
+        // {
+        // int append;
+        // void* h;
+        // } win32io;
+        //#endif
+        //#ifdef HAVE_STDIO_H
+        // struct
+        // {
+        // int autoclose;
+        // FILE *fp;
+        // } stdio;
+        //#endif
+        // struct
+        // {
+        // Uint8 *base;
+        // Uint8 *here;
+        // Uint8 *stop;
+        // } mem;
+        // struct
+        // {
+        // void *data1;
+        // } unknown;
+        // } hidden;
+        //
+        // } SDL_RWops;
+        #endregion SDL_rwops.h
+
+        #region SDL_syswm.h
+        // TODO
+        #region SDL_SysWMmsg_Unix
+        /// <summary>
+        /// The UNIX custom event structure. TODO
+        /// </summary>
+        /// <remarks>
+        /// <p>Struct in SDL_syswm.h
+        /// <code>
+        /// struct SDL_SysWMmsg {
+        ///		SDL_version version;
+        ///		SDL_SYSWM_TYPE subsystem;
+        ///		union 
+        ///		{
+        ///		XEvent xevent;
+        /// 	} event;
+        /// };		
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_SysWMmsg_Unix
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public SDL_version version;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int subsystem;
+            //TODO
+        }
+        #endregion SDL_SysWMmsg_Unix
+
+        #region SDL_SysWMinfo_Unix
+        /// <summary>
+        /// The UNIX custom window manager information structure. TODO
+        /// </summary>
+        /// <remarks>
+        /// When this structure is returned, it holds information about which
+        /// low level system it is using, and will be one of SDL_SYSWM_TYPE.
+        /// <p>Struct in SDL_syswm.h
+        /// <code>
+        /// struct SDL_SysWMinfo {
+        ///		SDL_version version;
+        ///		SDL_SYSWM_TYPE subsystem;
+        ///		union 
+        ///		{
+        ///		struct 
+        ///		{
+        ///			Display *display;	/* The X11 display */
+        ///			Window window;		/* The X11 display window */
+        ///			/* These locking functions should be called around
+        ///					   any X11 functions using the display variable.
+        ///					   They lock the event thread, so should not be
+        ///			   called around event functions or from event filters.
+        ///			 */
+        ///			void (*lock_func)(void);
+        ///			void (*unlock_func)(void);
+        ///
+        ///			/* Introduced in SDL 1.0.2 */
+        ///			Window fswindow;	/* The X11 fullscreen window */
+        ///			Window wmwindow;	/* The X11 managed input window */
+        ///		} x11;
+        ///	 } info;
+        /// } SDL_SysWMinfo;		
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_SysWMinfo_Unix
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public SDL_version version;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int subsystem;
+        }
+        #endregion SDL_SysWMinfo_Unix
+
+        #region SDL_SysWMmsg_Windows
+        /// <summary>
+        /// The Windows custom event structure. TODO
+        /// </summary>
+        /// <remarks>
+        /// <p>Struct in SDL_syswm.h
+        /// <code>
+        /// struct SDL_SysWMmsg {
+        ///	SDL_version version;
+        ///	HWND hwnd;
+        ///	UINT msg;
+        ///	WPARAM wParam;
+        ///	LPARAM lParam;
+        /// };		
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_SysWMmsg_Windows
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public SDL_version version;
+            /// <summary>
+            /// The window for the message
+            /// </summary>
+            public int hwnd;
+            /// <summary>
+            /// The type of message
+            /// </summary>
+            public int msg;
+            /// <summary>
+            /// WORD message parameter
+            /// </summary>
+            public int wParam;
+            /// <summary>
+            /// LONG message parameter
+            /// </summary>
+            public IntPtr lParam;
+        }
+        #endregion SDL_SysWMmsg_Windows
+
+        #region SDL_SysWMinfo_Windows
+        /// <summary>
+        /// The Windows custom window manager information structure. TODO
+        /// </summary>
+        /// <remarks>
+        /// <p>Struct in SDL_syswm.h
+        /// <code>
+        /// struct SDL_SysWMinfo {
+        ///	SDL_version version;
+        ///	HWND window;
+        ///	HGLRC hglrc;
+        /// } SDL_SysWMinfo;		
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_SysWMinfo_Windows
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public Sdl.SDL_version version;
+            /// <summary>
+            /// The Win32 display window
+            /// </summary>
+            public int window;
+            /// <summary>
+            /// The OpenGL context, if any
+            /// </summary>
+            public int hglrc;
+        }
+        #endregion SDL_SysWMinfo_Windows
+
+        #region SDL_SysWMmsg_RiscOS
+        /// <summary>
+        /// RISC OS custom event structure
+        /// </summary>
+        /// <remarks>
+        /// <p>Struct in SDL_syswm.h
+        /// <code>
+        /// struct SDL_SysWMmsg {
+        ///	SDL_version version;
+        ///	int eventCode;
+        /// int pollBlock[64];
+        /// };		
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_SysWMmsg_RiscOS
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public SDL_version version;
+            /// <summary>
+            /// The window for the message
+            /// </summary>
+            public int eventCode;
+            /// <summary>
+            /// The window for the message
+            /// </summary>
+            public int[] pollBlock;
+        }
+        #endregion SDL_SysWMmsg_RiscOS
+
+        #region SDL_SysWMinfo_RiscOS
+        /// <summary>
+        /// The RISCOS custom window manager information structure 
+        /// </summary>
+        /// <remarks>
+        /// <p>Struct in SDL_syswm.h
+        /// <code>
+        /// struct SDL_SysWMinfo {
+        ///	SDL_version version;
+        ///	int wimpVersion;
+        /// int taskHandle;
+        /// int window;
+        /// };		
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_SysWMinfo_RiscOS
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public SDL_version version;
+            /// <summary>
+            /// Wimp version running under
+            /// </summary>
+            public int wimpVersion;
+            /// <summary>
+            /// The RISCOS task handle
+            /// </summary>
+            public int taskHandle;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int window;
+        }
+        #endregion SDL_SysWMinfo_RiscOS
+
+        #region SDL_SysWMmsg
+        /// <summary>
+        /// The generic custom event structure
+        /// </summary>
+        /// <remarks>
+        /// <p>Struct in SDL_syswm.h
+        /// <code>
+        /// struct SDL_SysWMmsg {
+        ///	SDL_version version;
+        ///	int data;
+        /// };		
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_SysWMmsg
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public SDL_version version;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int data;
+        }
+        #endregion SDL_SysWMmsg
+
+        #region SDL_SysWMinfo
+        /// <summary>
+        /// The generic custom window manager information structure 
+        /// </summary>
+        /// <remarks>
+        /// <p>Struct in SDL_syswm.h
+        /// <code>
+        /// struct SDL_SysWMinfo {
+        ///	SDL_version version;
+        ///	int data;
+        /// };		
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_SysWMinfo
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public SDL_version version;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int data;
+        }
+        #endregion SDL_SysWMinfo
+        #endregion SDL_syswm.h
+
+        // SDL_thread.h -- none
+
+        #region SDL_timer.h
+        #region SDL_TimerID
+        //typedef struct _SDL_TimerID *SDL_TimerID;
+        /// <summary>
+        ///     
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_TimerID
+        {
+        }
+        #endregion SDL_TimerID
+        #endregion SDL_timer.h
+
+        // SDL_types.h -- deprecated
+
+        #region SDL_version.h
+        #region SDL_version
+        /// <summary>
+        /// Structure to hold version number of the SDL library
+        /// </summary>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_version
+        {
+            /// <summary>
+            /// Major version
+            /// </summary>
+            public byte major;
+            /// <summary>
+            /// Minor version
+            /// </summary>
+            public byte minor;
+            /// <summary>
+            /// Patch version
+            /// </summary>
+            public byte patch;
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public override string ToString()
+            {
+                return (this.major + "." + this.minor + "." + this.patch);
+            }
+        }
+        #endregion SDL_version
+        #endregion SDL_version.h
+
+        #region SDL_video.h
+        #region SDL_Rect
+        /// <summary>
+        /// Defines a rectangular area.
+        /// </summary>
+        /// <remarks>
+        /// A SDL_Rect defines a rectangular area of pixels. 
+        /// It is used by <see cref="SDL_BlitSurface"/> to define blitting 
+        /// regions and by several other video functions.
+        /// </remarks>
+        /// <see cref="SDL_BlitSurface"/>
+        /// <see cref="SDL_UpdateRect(System.IntPtr, int, int, int, int)"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_Rect
+        {
+            /// <summary>
+            /// x position of the upper-left corner of the rectangle.
+            /// </summary>
+            public short x;
+            /// <summary>
+            /// y position of the upper-left corner of the rectangle. 
+            /// </summary>
+            public short y;
+            /// <summary>
+            /// The width of the rectangle.
+            /// </summary>
+            public short w;
+            /// <summary>
+            /// The height of the rectangle.
+            /// </summary>
+            public short h;
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="x"></param>
+            /// <param name="y"></param>
+            /// <param name="w"></param>
+            /// <param name="h"></param>
+            public SDL_Rect(short x, short y, short w, short h)
+            {
+                this.x = x;
+                this.y = y;
+                this.w = w;
+                this.h = h;
+            }
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <returns></returns>
+            public override string ToString()
+            {
+                return "x: " + x + ", y: " + y + ", w: " + w + ", h: " + h;
+            }
+        }
+        #endregion SDL_Rect
+
+        #region SDL_Color
+        /// <summary>
+        /// Format independent color description
+        /// </summary>
+        /// <remarks>
+        /// SDL_Color describes a color in a format independent way. 
+        /// You can convert a SDL_Color to a pixel value for a certain 
+        /// pixel format using <see cref="SDL_MapRGB"/>.
+        /// </remarks>
+        /// <seealso cref="SDL_PixelFormat" />
+        /// <seealso cref="SDL_SetColors" />
+        /// <seealso cref="SDL_Palette" />
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_Color
+        {
+            /// <summary>
+            /// Red Intensity
+            /// </summary>
+            public byte r;
+            /// <summary>
+            /// Green Intensity
+            /// </summary>
+            public byte g;
+            /// <summary>
+            /// Blue Intensity
+            /// </summary>
+            public byte b;
+            /// <summary>
+            /// Alpha Channel
+            /// Currently unused
+            /// </summary>
+            public byte unused;
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="r"></param>
+            /// <param name="g"></param>
+            /// <param name="b"></param>
+            public SDL_Color(byte r, byte g, byte b)
+            {
+                this.r = r;
+                this.g = g;
+                this.b = b;
+                this.unused = 0;
+            }
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="r"></param>
+            /// <param name="g"></param>
+            /// <param name="b"></param>
+            /// <param name="a"></param>
+            public SDL_Color(byte r, byte g, byte b, byte a)
+            {
+                this.r = r;
+                this.g = g;
+                this.b = b;
+                this.unused = a;
+            }
+        }
+        #endregion SDL_Color
+
+        #region SDL_Palette
+        /// <summary>
+        /// Color palette for 8-bit pixel formats
+        /// </summary>
+        /// <remarks>
+        /// Each pixel in an 8-bit surface is an index into 
+        /// the colors field of the SDL_Palette structure store 
+        /// in <see cref="SDL_PixelFormat"/>. A SDL_Palette should never need 
+        /// to be created manually. It is automatically created 
+        /// when SDL allocates a <see cref="SDL_PixelFormat"/> for a surface. 
+        /// The colors values of a <see cref="SDL_Surface"/> 
+        /// palette can be set with the <see cref="SDL_SetColors"/>.
+        /// </remarks>
+        /// <see cref="SDL_Color"/>
+        /// <see cref="SDL_Surface"/>
+        /// <see cref="SDL_SetColors"/>
+        /// <see cref="SDL_SetPalette"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_Palette
+        {
+            /// <summary>
+            /// Number of colors used in this palette
+            /// </summary>
+            public int ncolors;
+            /// <summary>
+            /// Array of <see cref="SDL_Color"/> 
+            /// structures that make up the palette.
+            /// </summary>
+            public SDL_Color[] colors;
+        }
+        #endregion SDL_Palette
+
+        #region SDL_PixelFormat
+        /// <summary>
+        /// Stores surface format information
+        /// </summary>
+        /// <remarks>
+        /// A SDL_PixelFormat describes the format of the pixel data stored at the 
+        /// pixels field of a SDL_Surface. Every surface stores a SDL_PixelFormat 
+        /// in the format field.
+        /// <p>
+        /// If you wish to do pixel level modifications on a surface, then 
+        ///	understanding how SDL stores its color information is essential.
+        /// </p>
+        /// <p>							
+        /// 8-bit pixel formats are the easiest to understand. 
+        /// Since its an 8-bit format, we have 8 BitsPerPixel and 1 BytesPerPixel.
+        /// Since BytesPerPixel is 1, all pixels are represented by a Uint8 which
+        /// contains an index into palette.colors. So, to determine the color 
+        /// of a pixel in a 8-bit surface: we read the color index from 
+        /// surface.pixels and we use that index to read the SDL_Color 
+        /// structure from surface.format.palette.colors. Like so: 
+        /// </p>	
+        /// <p>
+        /// <code>
+        ///		SDL_Surface *surface;
+        ///		SDL_PixelFormat *fmt;
+        ///		SDL_Color *color;
+        ///		Uint8 index;
+        ///
+        ///		.
+        ///		.
+        ///
+        ///		/* Create surface */
+        ///		.
+        ///		.
+        ///		fmt=surface.format;
+        ///
+        ///		/* Check the bitdepth of the surface */
+        ///		if(fmt.BitsPerPixel!=8)
+        ///	{
+        ///		fprintf(stderr, "Not an 8-bit surface.\n");
+        ///		return(-1);
+        ///	}
+        ///
+        ///	/* Lock the surface */
+        ///	SDL_LockSurface(surface);
+        ///
+        ///	/* Get the topleft pixel */
+        ///	index=*(Uint8 *)surface.pixels;
+        ///	color=fmt.palette.colors[index];
+        ///
+        ///	/* Unlock the surface */
+        ///	SDL_UnlockSurface(surface);
+        ///	printf("Pixel Color- Red: %d, Green: %d, Blue: %d. Index: %d\n",
+        ///	color.r, color.g, color.b, index);
+        ///	.
+        ///	.
+        ///	</code>
+        /// </p>
+        /// <P>
+        ///	Pixel formats above 8-bit are an entirely different experience. 
+        ///	They are considered to be "TrueColor" formats and the color 
+        ///	information is stored in the pixels themselves, not in a palette. 
+        ///	The mask, shift and loss fields tell us how the color information
+        ///	is encoded. The mask fields allow us to isolate each color 
+        ///	component, the shift fields tell us the number of bits to the 
+        ///	right of each component in the pixel value and the loss fields
+        ///	tell us the number of bits lost from each component when 
+        ///	packing 8-bit color component in a pixel. 
+        ///	</P>
+        ///
+        ///<code>
+        ///	/* Extracting color components from a 32-bit color value */
+        ///	SDL_PixelFormat *fmt;
+        ///	SDL_Surface *surface;
+        ///	Uint32 temp, pixel;
+        ///	Uint8 red, green, blue, alpha;
+        ///	.
+        ///	.
+        ///	.
+        ///	fmt=surface.format;
+        ///	SDL_LockSurface(surface);
+        ///	pixel=*((Uint32*)surface.pixels);
+        ///	SDL_UnlockSurface(surface);
+        ///
+        ///	/* Get Red component */
+        ///	temp=pixel&fmt.Rmask; /* Isolate red component */
+        ///	temp=temp>>fmt.Rshift;/* Shift it down to 8-bit */
+        ///	temp=temp<<fmt.Rloss; /* Expand to a full 8-bit number */
+        ///	red=(Uint8)temp;
+        ///
+        ///	/* Get Green component */
+        ///	temp=pixel&fmt.Gmask; /* Isolate green component */
+        ///	temp=temp>>fmt.Gshift;/* Shift it down to 8-bit */
+        ///	temp=temp<<fmt.Gloss; /* Expand to a full 8-bit number */
+        ///	green=(Uint8)temp;
+        ///
+        ///	/* Get Blue component */
+        ///	temp=pixel&fmt.Bmask; /* Isolate blue component */
+        ///	temp=temp>>fmt.Bshift;/* Shift it down to 8-bit */
+        ///	temp=temp<<fmt.Bloss; /* Expand to a full 8-bit number */
+        ///	blue=(Uint8)temp;
+        ///
+        ///	/* Get Alpha component */
+        ///	temp=pixel&fmt.Amask; /* Isolate alpha component */
+        ///	temp=temp>>fmt.Ashift;/* Shift it down to 8-bit */
+        ///	temp=temp<<fmt.Aloss; /* Expand to a full 8-bit number */
+        ///	alpha=(Uint8)temp;
+        ///
+        ///	printf("Pixel Color - R: %d,  G: %d,  B: %d,  A: %d\n", red, green, blue, alpha);
+        ///	.
+        ///	.
+        ///	.
+        ///	</code>
+        /// </remarks>
+        /// <see cref="SDL_Surface"/>
+        /// <see cref="SDL_MapRGB"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_PixelFormat
+        {
+            /// <summary>
+            /// Pointer to the palette, or NULL if the BitsPerPixel>8
+            /// Pointer to <see cref="SDL_Palette"/>
+            /// </summary>
+            public IntPtr palette;
+            /// <summary>
+            /// The number of bits used to represent each pixel in a surface. 
+            /// Usually 8, 16, 24 or 32.
+            /// </summary>
+            public byte BitsPerPixel;
+            /// <summary>
+            /// The number of bytes used to represent each pixel in a surface. 
+            /// Usually one to four.
+            /// </summary>
+            public byte BytesPerPixel;
+            /// <summary>
+            /// Precision loss of each color component (2[RGBA]loss)
+            /// </summary>
+            public byte Rloss;
+            /// <summary>
+            /// Precision loss of each color component (2[RGBA]loss)
+            /// </summary>
+            public byte Gloss;
+            /// <summary>
+            /// Precision loss of each color component (2[RGBA]loss)
+            /// </summary>
+            public byte Bloss;
+            /// <summary>
+            /// Precision loss of each color component (2[RGBA]loss)
+            /// </summary>
+            public byte Aloss;
+            /// <summary>
+            /// Binary left shift of each color component in the pixel value
+            /// </summary>
+            public byte Rshift;
+            /// <summary>
+            /// Binary left shift of each color component in the pixel value
+            /// </summary>
+            public byte Gshift;
+            /// <summary>
+            /// Binary left shift of each color component in the pixel value
+            /// </summary>
+            public byte Bshift;
+            /// <summary>
+            /// Binary left shift of each color component in the pixel value
+            /// </summary>
+            public byte Ashift;
+            /// <summary>
+            /// Binary mask used to retrieve individual color values
+            /// </summary>
+            public int Rmask;
+            /// <summary>
+            /// Binary mask used to retrieve individual color values
+            /// </summary>
+            public int Gmask;
+            /// <summary>
+            /// Binary mask used to retrieve individual color values
+            /// </summary>
+            public int Bmask;
+            /// <summary>
+            /// Binary mask used to retrieve individual color values
+            /// </summary>
+            public int Amask;
+            /// <summary>
+            /// Pixel value of transparent pixels
+            /// </summary>
+            public int colorkey;
+            /// <summary>
+            /// Overall surface alpha value
+            /// </summary>
+            public byte alpha;
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="palette"></param>
+            /// <param name="BitsPerPixel"></param>
+            /// <param name="BytesPerPixel"></param>
+            /// <param name="Rloss"></param>
+            /// <param name="Gloss"></param>
+            /// <param name="Bloss"></param>
+            /// <param name="Aloss"></param>
+            /// <param name="Rshift"></param>
+            /// <param name="Gshift"></param>
+            /// <param name="Bshift"></param>
+            /// <param name="Ashift"></param>
+            /// <param name="Rmask"></param>
+            /// <param name="Gmask"></param>
+            /// <param name="Bmask"></param>
+            /// <param name="Amask"></param>
+            /// <param name="colorkey"></param>
+            /// <param name="alpha"></param>
+            public SDL_PixelFormat(IntPtr palette, byte BitsPerPixel,
+                byte BytesPerPixel, byte Rloss, byte Gloss,
+                byte Bloss, byte Aloss, byte Rshift, byte Gshift,
+                byte Bshift, byte Ashift, int Rmask, int Gmask,
+                int Bmask, int Amask, int colorkey, byte alpha
+                )
+            {
+                if (BitsPerPixel > 8)
+                {
+                    this.palette = IntPtr.Zero;
+                }
+                else
+                {
+                    this.palette = palette;
+                }
+                this.BitsPerPixel = BitsPerPixel;
+                this.BytesPerPixel = BytesPerPixel;
+                this.Rloss = Rloss;
+                this.Gloss = Gloss;
+                this.Bloss = Bloss;
+                this.Aloss = Aloss;
+                this.Rshift = Rshift;
+                this.Gshift = Gshift;
+                this.Bshift = Bshift;
+                this.Ashift = Ashift;
+                this.Rmask = Rmask;
+                this.Gmask = Gmask;
+                this.Bmask = Bmask;
+                this.Amask = Amask;
+                this.colorkey = colorkey;
+                this.alpha = alpha;
+            }
+        }
+        #endregion SDL_PixelFormat
+
+        #region SDL_Surface
+        /// <summary>
+        /// Graphical Surface Structure.
+        /// </summary>
+        /// <remarks>
+        /// This structure should be treated as read-only, except for 'pixels',
+        /// which, if not NULL, contains the raw pixel data for the surface.
+        /// SDL_Surface's represent areas of "graphical" memory, memory 
+        /// that can be drawn to. The video framebuffer is returned as a 
+        /// SDL_Surface by SDL_SetVideoMode and SDL_GetVideoSurface. 
+        /// Most of the fields should be pretty obvious. w and h are the 
+        /// width and height of the surface in pixels. pixels is a pointer 
+        /// to the actual pixel data, the surface should be locked before 
+        /// accessing this field. The clip_rect field is the clipping rectangle
+        /// as set by SDL_SetClipRect.
+        ///
+        /// <p>The following are supported in the flags field.</p>
+        ///<code>
+        /// SDL_SWSURFACE Surface is stored in system memory
+        /// SDL_HWSURFACE Surface is stored in video memory
+        /// SDL_ASYNCBLIT Surface uses asynchronous blits if possible
+        /// SDL_ANYFORMAT Allows any pixel-format (Display surface)
+        /// SDL_HWPALETTE Surface has exclusive palette
+        /// SDL_DOUBLEBUF Surface is double buffered (Display surface)
+        /// SDL_FULLSCREEN Surface is full screen (Display Surface)
+        /// SDL_OPENGL Surface has an OpenGL context (Display Surface)
+        /// SDL_OPENGLBLIT Surface supports OpenGL blitting (Display Surface)
+        /// SDL_RESIZABLE Surface is resizable (Display Surface)
+        /// SDL_HWACCEL Surface blit uses hardware acceleration
+        /// SDL_SRCCOLORKEY Surface use colorkey blitting
+        /// SDL_RLEACCEL Colorkey blitting is accelerated with RLE
+        /// SDL_SRCALPHA Surface blit uses alpha blending
+        /// SDL_PREALLOC Surface uses preallocated memory</code>
+        /// </remarks>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_Surface
+        {
+            /// <summary>
+            /// Surface flags
+            /// </summary>
+            public int flags;
+            /// <summary>
+            /// Pixel format
+            /// Pointer to SDL_PixelFormat
+            /// </summary>
+            public IntPtr format;
+            /// <summary>
+            /// Width of the surface
+            /// </summary>
+            public int w;
+            /// <summary>
+            /// Height of the surface
+            /// </summary>
+            public int h;
+            /// <summary>
+            /// Length of a surface scanline in bytes
+            /// </summary>
+            public short pitch;
+            /// <summary>
+            /// Pointer to the actual pixel data
+            /// Void pointer.
+            /// </summary>
+            public IntPtr pixels;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int offset;
+            /// <summary>
+            /// Hardware-specific surface info
+            /// </summary>
+            public IntPtr hwdata;
+            /// <summary>
+            /// surface clip rectangle
+            /// </summary>
+            public SDL_Rect clip_rect;
+            /// <summary>
+            /// 
+            /// </summary>
+            public int unused1;
+            /// <summary>
+            /// Allow recursive locks
+            /// </summary>
+            public int locked;
+            /// <summary>
+            /// info for fast blit mapping to other surfaces
+            /// </summary>
+            public IntPtr map;
+            /// <summary>
+            /// format version, bumped at every change to invalidate blit maps
+            /// </summary>
+            public int format_version;
+            /// <summary>
+            /// Reference count -- used when freeing surface
+            /// </summary>
+            public int refcount;
+        }
+        #endregion SDL_Surface
+
+        #region SDL_VideoInfo
+        /// <summary>
+        /// Video Target information.
+        /// Useful for determining the video hardware capabilities.
+        /// Not finished. The C struct uses a set of bit-fields that need to be marshalled.
+        /// The vfmt IntPtr works and provided useful information.
+        /// </summary>
+        /// <remarks>
+        /// This (read-only) structure is returned by <see cref="SDL_GetVideoInfo"/>. 
+        /// It contains information on either the 'best' available mode 
+        /// (if called before <see cref="SDL_SetVideoMode(int, int, int, int)"/>) or the current video mode.
+        /// </remarks>
+        /// <see cref="SDL_GetVideoInfo"/>
+        /// <see cref="SDL_PixelFormat"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_VideoInfo
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte field1;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte field2;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public short unused;
+
+            /// <summary>
+            /// Total amount of video memory in Kilobytes.
+            /// </summary>
+            public int video_mem;
+
+
+            /// <summary>
+            /// Pixel format of the video device. Pointer to SDL_PixelFormat.
+            /// </summary>
+            public IntPtr vfmt;
+
+            /// <summary>
+            ///  The current video mode width
+            /// </summary>
+            public int current_w;
+
+            /// <summary>
+            ///  The current video mode height
+            /// </summary>
+            public int current_h;
+
+            /// <summary>
+            /// Is it possible to create hardware surfaces?
+            /// </summary>
+            public int hw_available
+            {
+                get
+                {
+                    return (field1 & 1);
+                }
+            }
+
+            /// <summary>
+            /// Is there a window manager available
+            /// </summary>
+            public int wm_available
+            {
+                get
+                {
+                    return (field1 >> 1 & 1);
+                }
+            }
+            /// <summary>
+            /// Are hardware to hardware blits accelerated?
+            /// </summary>
+            public int blit_hw
+            {
+                get
+                {
+                    return (field2 >> 1 & 1);
+                }
+            }
+            /// <summary>
+            /// Are hardware to hardware colorkey blits accelerated?
+            /// </summary>
+            public int blit_hw_CC
+            {
+                get
+                {
+                    return (field2 >> 2 & 1);
+                }
+            }
+
+            /// <summary>
+            /// Are hardware to hardware alpha blits accelerated?
+            /// </summary>
+            public int blit_hw_A
+            {
+                get
+                {
+                    return (field2 >> 3 & 1);
+                }
+            }
+            /// <summary>
+            /// Are software to hardware blits accelerated?
+            /// </summary>
+            public int blit_sw
+            {
+                get
+                {
+                    return (field2 >> 4 & 1);
+                }
+            }
+            /// <summary>
+            /// Are software to hardware colorkey blits accelerated?
+            /// </summary>
+            public int blit_sw_CC
+            {
+                get
+                {
+                    return (field2 >> 5 & 1);
+                }
+            }
+            /// <summary>
+            /// Are software to hardware alpha blits accelerated?
+            /// </summary>
+            public int blit_sw_A
+            {
+                get
+                {
+                    return (field2 >> 6 & 1);
+                }
+            }
+            /// <summary>
+            /// Are color fills accelerated?
+            /// </summary>
+            public int blit_fill
+            {
+                get
+                {
+                    return (field2 >> 7 & 1);
+                }
+            }
+        }
+        #endregion SDL_VideoInfo
+
+        #region SDL_Overlay
+        /// <summary>
+        /// The YUV hardware video overlay
+        /// </summary>
+        /// <remarks>
+        /// A SDL_Overlay is similar to a SDL_Surface except 
+        /// it stores a YUV overlay. All the fields are read only, 
+        /// except for pixels which should be locked before use. 
+        /// The format field stores the format of the overlay 
+        /// which is one of the following: 
+        /// <code>
+        /// SDL_YV12_OVERLAY  0x32315659  /* Planar mode: Y + V + U */
+        /// SDL_IYUV_OVERLAY  0x56555949  /* Planar mode: Y + U + V */
+        /// SDL_YUY2_OVERLAY  0x32595559  /* Packed mode: Y0+U0+Y1+V0 */
+        /// SDL_UYVY_OVERLAY  0x59565955  /* Packed mode: U0+Y0+V0+Y1 */
+        /// SDL_YVYU_OVERLAY  0x55595659  /* Packed mode: Y0+V0+Y1+U0 */</code>
+        /// 
+        /// More information on YUV formats can be found at 
+        /// http://www.webartz.com/fourcc/indexyuv.htm.
+        /// </remarks>
+        /// <see cref="SDL_CreateYUVOverlay(int, int, int, IntPtr)"/>
+        /// <see cref="SDL_LockYUVOverlay"/>
+        /// <see cref="SDL_UnlockYUVOverlay"/>
+        /// <see cref="SDL_FreeYUVOverlay"/>
+        [StructLayout(LayoutKind.Sequential, Pack = 4)]
+        public struct SDL_Overlay
+        {
+            /// <summary>
+            /// Overlay format (see below)
+            /// </summary>
+            public int format;
+            /// <summary>
+            /// Width of overlay
+            /// </summary>
+            public int w;
+            /// <summary>
+            /// Height of overlay
+            /// </summary>
+            public int h;
+            /// <summary>
+            /// Number of planes in the overlay. Usually either 1 or 3.
+            /// </summary>
+            public int planes;
+            /// <summary>
+            /// An array of pitches, one for each plane. 
+            /// Pitch is the length of a row in bytes.
+            /// </summary>
+            public IntPtr pitches;
+            /// <summary>
+            /// An array of pointers to the data of each plane. 
+            /// The overlay should be locked before these pointers are used.
+            /// </summary>
+            public IntPtr pixels;//TODO double pointer to bytes
+            /// <summary>
+            /// Hardware-specific surface info
+            /// </summary>
+            public IntPtr hwfuncs;
+            /// <summary>
+            /// 
+            /// </summary>
+            public IntPtr hwdata;
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int field1;
+            ///// <summary>
+            ///// 
+            ///// </summary>
+            //public int UnusedBits;
+
+            /// <summary>
+            /// This will be set to 1 if the overlay is hardware accelerated.
+            /// </summary>
+            public int hw_overlay
+            {
+                get
+                {
+                    return (field1 & 1);
+                }
+            }
+        }
+        #endregion SDL_Overlay
+        #endregion SDL_video.h
+        #endregion Public Structs
+
+        #region Private Static Fields
+
+        /// <summary>
+        ///		Private byte array holding the internal keyboard state.
+        /// </summary>
+        /// <remarks>
+        ///		Used for <see cref="SDL_GetKeyState"/>.
+        ///		Array is sized to fit all the known Key enums.
+        /// </remarks>
+        private static byte[] keyboardState = new byte[(int)Sdl.SDLK_LAST];
+
+        #endregion Private Static Fields
+
+        #region Public Delegates
+
+        #region SDL_audio.h
+        #region AudioSpecCallbackDelegate(IntPtr userdata, IntPtr stream, int len)
+        /// <summary>
+        /// Used in the SDL_AudioSpec struct
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate void AudioSpecCallbackDelegate(IntPtr userdata, IntPtr stream, int len);
+        #endregion AudioSpecCallbackDelegate(IntPtr userdata, IntPtr stream, int len)
+        #endregion SDL_audio.h
+
+        #region SDL_events.h
+        #region int SDL_EventFilter([Out] SDL_Event evt)
+        /// <summary>
+        /// This function sets up a filter to process all events before they
+        /// change internal state and are posted to the internal event queue.
+        /// </summary>
+        /// <param name="evt">
+        ///     Event.
+        /// </param>
+        /// <returns>
+        ///     If the filter returns 1, then the event will be added 
+        ///     to the internal queue. If it returns 0, then the event
+        ///      will be dropped from the queue. This allows selective
+        ///       filtering of dynamically.
+        /// </returns>
+        /// <remarks>
+        /// <p>
+        ///     Binds to C callback in SDL_events.h:
+        ///     <code>typedef Uint32 (SDLCALL *SDL_EventFilter)(const SDL_Event *event)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_SetEventFilter" />
+        /// <seealso cref="SDL_GetEventFilter" />
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int SDL_EventFilter([Out] SDL_Event evt);
+        #endregion int SDL_EventFilter([Out] SDL_Event evt)
+        #endregion SDL_events.h
+
+        #region SDL_thread.h
+        #region int ThreadDelegate()
+        /// <summary>
+        /// int (SDLCALL *fn)(void *)
+        /// </summary>
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int ThreadDelegate();
+        #endregion int ThreadDelegate()
+        #endregion SDL_thread.h
+
+        #region SDL_timer.h
+        #region int SDL_TimerCallback(int interval)
+        /// <summary>
+        ///     Prototype for the timer callback.
+        /// </summary>
+        /// <param name="interval">
+        ///     The current timer interval.
+        /// </param>
+        /// <returns>
+        ///     The next timer interval.
+        /// </returns>
+        /// <remarks>
+        /// <p>
+        ///     Binds to C callback in SDL_timer.h:
+        ///     <code>typedef Uint32 (SDLCALL *SDL_TimerCallback)(Uint32 interval, void *param)</code>
+        ///     </p>
+        /// </remarks>
+        // FIXME: <seealso cref="SDL_SetTimer(int, SDL_TimerCallback)" />
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int SDL_TimerCallback(int interval);
+        #endregion int SDL_TimerCallback(int interval)
+
+        #region int SDL_NewTimerCallback(int interval)
+        // TODO: Goddamn void* double whammy since it's a delegate
+        /// <summary>
+        ///     Prototype for the new timer callback.
+        /// </summary>
+        /// <param name="interval">
+        ///     The current timer interval.
+        /// </param>
+        /// <returns>
+        ///     The next timer interval.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// The callback function is passed the current timer interval 
+        /// and returns the next timer interval.  If the returned 
+        /// value is the same as the one passed in, the periodic alarm
+        ///  continues, otherwise a new alarm is scheduled.  
+        ///  If the callback returns 0, the periodic alarm is cancelled.
+        /// </para>
+        /// <p>
+        ///     Binds to C callback in SDL_timer.h:
+        ///     <code>typedef Uint32 (SDLCALL *SDL_NewTimerCallback)(Uint32 interval, void *param)</code>
+        ///     </p>
+        /// </remarks>
+        // FIXME: <seealso cref="SDL_AddTimer(int, SDL_NewTimerCallback)" />
+        /// <seealso cref="SDL_RemoveTimer" />
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        public delegate int SDL_NewTimerCallback(int interval);
+        #endregion int SDL_NewTimerCallback(int interval)
+
+        #endregion SDL_timer.h
+        #endregion Public Delegates
+
+        #region Sdl Methods
+        #region SDL.h
+        #region int SDL_Init(int flags)
+        // Called from SDL_Init
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_Init"), SuppressUnmanagedCodeSecurity]
+        private static extern int __SDL_Init(int flags);
+
+        /// <summary>
+        ///     Initializes SDL and the specified subsystems.
+        /// </summary>
+        /// <param name="flags">
+        ///     <para>
+        ///         Specifies what part(s) of SDL to initialize:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Flag</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_TIMER" /></term>
+        ///                 <description>Initializes the timer subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_AUDIO" /></term>
+        ///                 <description>Initializes the audio subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_VIDEO" /></term>
+        ///                 <description>Initializes the video subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_CDROM" /></term>
+        ///                 <description>Initializes the CD-ROM subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_JOYSTICK" /></term>
+        ///                 <description>Initializes the joystick subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVERYTHING" /></term>
+        ///                 <description>Initializes all subsystems.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_NOPARACHUTE" /></term>
+        ///                 <description>Prevents SDL from catching fatal signals.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVENTTHREAD" /></term>
+        ///                 <description>Not supported on all OS's.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns -1 on an error or 0 on success.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         Unless the <see cref="SDL_INIT_NOPARACHUTE" /> flag is set, it will install
+        ///         cleanup signal handlers for some commonly ignored fatal signals (like
+        ///         SIGSEGV).
+        ///     </para>
+        ///     <p>
+        ///			Binds to C-function call in SDL.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_InitSubSystem(int)" />
+        /// <seealso cref="SDL_Quit" />
+        public static int SDL_Init(int flags)
+        {
+            try
+            {
+                ////Mac OSX code
+                if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa"))
+                {
+                    int NSAutoreleasePool = objc_getClass("NSAutoreleasePool");
+                    objc_msgSend(NSAutoreleasePool, sel_registerName("new"));
+                    NSApplicationLoad();
+                }
+            }
+            catch
+            {
+            }
+
+            return __SDL_Init(flags);
+        }
+        #endregion int SDL_Init(int flags)
+
+        #region int SDL_Init(uint flags)
+        // Called from SDL_Init
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_Init"), SuppressUnmanagedCodeSecurity]
+        private static extern int __SDL_Init(uint flags);
+
+        /// <summary>
+        ///     Initializes SDL and the specified subsystems.
+        /// </summary>
+        /// <param name="flags">
+        ///     <para>
+        ///         Specifies what part(s) of SDL to initialize:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Flag</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_TIMER" /></term>
+        ///                 <description>Initializes the timer subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_AUDIO" /></term>
+        ///                 <description>Initializes the audio subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_VIDEO" /></term>
+        ///                 <description>Initializes the video subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_CDROM" /></term>
+        ///                 <description>Initializes the CD-ROM subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_JOYSTICK" /></term>
+        ///                 <description>Initializes the joystick subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVERYTHING" /></term>
+        ///                 <description>Initializes all subsystems.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_NOPARACHUTE" /></term>
+        ///                 <description>Prevents SDL from catching fatal signals.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVENTTHREAD" /></term>
+        ///                 <description>Not supported on all OS's.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns -1 on an error or 0 on success.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         Unless the <see cref="SDL_INIT_NOPARACHUTE" /> flag is set, it will install
+        ///         cleanup signal handlers for some commonly ignored fatal signals (like
+        ///         SIGSEGV).
+        ///     </para>
+        ///     <p>
+        ///			Binds to C-function call in SDL.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_InitSubSystem(int)" />
+        /// <seealso cref="SDL_Quit" />
+        [CLSCompliant(false)]
+        public static int SDL_Init(uint flags)
+        {
+            try
+            {
+                ////Mac OSX code
+                if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa"))
+                {
+                    int NSAutoreleasePool = objc_getClass("NSAutoreleasePool");
+                    objc_msgSend(NSAutoreleasePool, sel_registerName("new"));
+                    NSApplicationLoad();
+                }
+            }
+            catch
+            {
+            }
+
+            return __SDL_Init(flags);
+        }
+        #endregion int SDL_Init(uint flags)
+
+        #region int SDL_InitSubSystem(int flags)
+        // Called from SDL_InitSubSystem
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_InitSubSystem"), SuppressUnmanagedCodeSecurity]
+        private static extern int __SDL_InitSubSystem(int flags);
+
+        /// <summary>
+        ///     Initializes specified subsystems.
+        /// </summary>
+        /// <param name="flags">
+        ///     <para>
+        ///         Specifies what part(s) of SDL to initialize:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Flag</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_TIMER" /></term>
+        ///                 <description>Initializes the timer subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_AUDIO" /></term>
+        ///                 <description>Initializes the audio subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_VIDEO" /></term>
+        ///                 <description>Initializes the video subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_CDROM" /></term>
+        ///                 <description>Initializes the CD-ROM subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_JOYSTICK" /></term>
+        ///                 <description>Initializes the joystick subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVERYTHING" /></term>
+        ///                 <description>Initializes all subsystems.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_NOPARACHUTE" /></term>
+        ///                 <description>Prevents SDL from catching fatal signals.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVENTTHREAD" /></term>
+        ///                 <description>Not supported on all OS's.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns -1 on an error or 0 on success.
+        /// </returns>
+        /// <remarks>
+        ///     After SDL has been initialized with <see cref="SDL_Init(int)" /> you may initialize
+        ///     any uninitialized subsystems with <b>SDL_InitSubSystem</b>.
+        ///      <p>
+        ///     Binds to C-function call in SDL.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_Init(int)" />
+        /// <seealso cref="SDL_Quit" />
+        /// <seealso cref="SDL_QuitSubSystem(int)" />
+        /// 
+        public static int SDL_InitSubSystem(int flags)
+        {
+            try
+            {
+                if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa"))
+                {
+                    ////Mac OSX code
+                    int NSAutoreleasePool = objc_getClass("NSAutoreleasePool");
+                    objc_msgSend(NSAutoreleasePool, sel_registerName("new"));
+                    NSApplicationLoad();
+                }
+            }
+            catch
+            {
+            }
+
+            return __SDL_InitSubSystem(flags);
+        }
+        #endregion int SDL_InitSubSystem(int flags)
+
+        #region int SDL_InitSubSystem(uint flags)
+        // Called from SDL_InitSubSystem
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_InitSubSystem"), SuppressUnmanagedCodeSecurity]
+        private static extern int __SDL_InitSubSystem(uint flags);
+
+        /// <summary>
+        ///     Initializes specified subsystems.
+        /// </summary>
+        /// <param name="flags">
+        ///     <para>
+        ///         Specifies what part(s) of SDL to initialize:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Flag</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_TIMER" /></term>
+        ///                 <description>Initializes the timer subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_AUDIO" /></term>
+        ///                 <description>Initializes the audio subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_VIDEO" /></term>
+        ///                 <description>Initializes the video subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_CDROM" /></term>
+        ///                 <description>Initializes the CD-ROM subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_JOYSTICK" /></term>
+        ///                 <description>Initializes the joystick subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVERYTHING" /></term>
+        ///                 <description>Initializes all subsystems.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_NOPARACHUTE" /></term>
+        ///                 <description>Prevents SDL from catching fatal signals.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVENTTHREAD" /></term>
+        ///                 <description>Not supported on all OS's.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     Returns -1 on an error or 0 on success.
+        /// </returns>
+        /// <remarks>
+        ///     After SDL has been initialized with <see cref="SDL_Init(int)" /> you may initialize
+        ///     any uninitialized subsystems with <b>SDL_InitSubSystem</b>.
+        ///      <p>
+        ///     Binds to C-function call in SDL.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_Init(int)" />
+        /// <seealso cref="SDL_Quit" />
+        /// <seealso cref="SDL_QuitSubSystem(int)" />
+        /// 
+        [CLSCompliant(false)]
+        public static int SDL_InitSubSystem(uint flags)
+        {
+            try
+            {
+                if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa"))
+                {
+                    ////Mac OSX code
+                    int NSAutoreleasePool = objc_getClass("NSAutoreleasePool");
+                    objc_msgSend(NSAutoreleasePool, sel_registerName("new"));
+                    NSApplicationLoad();
+                }
+            }
+            catch
+            {
+            }
+
+            return __SDL_InitSubSystem(flags);
+        }
+        #endregion int SDL_InitSubSystem(uint flags)
+
+        #region SDL_QuitSubSystem(int flags)
+        /// <summary>
+        ///     Shuts down specified subsystems.
+        /// </summary>
+        /// <param name="flags">
+        ///     <para>
+        ///         Specifies what part(s) of SDL to shut down:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Flag</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_TIMER" /></term>
+        ///                 <description>Shuts down the timer subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_AUDIO" /></term>
+        ///                 <description>Shuts down the audio subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_VIDEO" /></term>
+        ///                 <description>Shuts down the video subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_CDROM" /></term>
+        ///                 <description>Shuts down the CD-ROM subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_JOYSTICK" /></term>
+        ///                 <description>Shuts down the joystick subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVERYTHING" /></term>
+        ///                 <description>Shuts down all subsystems.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_NOPARACHUTE" /></term>
+        ///                 <description>Prevents SDL from catching fatal signals.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVENTTHREAD" /></term>
+        ///                 <description>Not supported on all OS's.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <b>SDL_QuitSubSystem</b> allows you to shut down a subsystem that has been
+        ///     previously initialized by <see cref="SDL_Init(int)" /> or
+        ///     <see cref="SDL_InitSubSystem(int)" />.
+        ///     <p>
+        ///     Binds to C-function call in SDL.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_Init(int)" />
+        /// <seealso cref="SDL_InitSubSystem(int)" />
+        /// <seealso cref="SDL_Quit" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_QuitSubSystem(int flags);
+        #endregion SDL_QuitSubSystem(int flags)
+
+        #region SDL_QuitSubSystem(uint flags)
+        /// <summary>
+        ///     Shuts down specified subsystems.
+        /// </summary>
+        /// <param name="flags">
+        ///     <para>
+        ///         Specifies what part(s) of SDL to shut down:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Flag</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_TIMER" /></term>
+        ///                 <description>Shuts down the timer subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_AUDIO" /></term>
+        ///                 <description>Shuts down the audio subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_VIDEO" /></term>
+        ///                 <description>Shuts down the video subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_CDROM" /></term>
+        ///                 <description>Shuts down the CD-ROM subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_JOYSTICK" /></term>
+        ///                 <description>Shuts down the joystick subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVERYTHING" /></term>
+        ///                 <description>Shuts down all subsystems.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_NOPARACHUTE" /></term>
+        ///                 <description>Prevents SDL from catching fatal signals.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVENTTHREAD" /></term>
+        ///                 <description>Not supported on all OS's.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <remarks>
+        ///     <b>SDL_QuitSubSystem</b> allows you to shut down a subsystem that has been
+        ///     previously initialized by <see cref="SDL_Init(int)" /> or
+        ///     <see cref="SDL_InitSubSystem(int)" />.
+        ///     <p>
+        ///     Binds to C-function call in SDL.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_Init(int)" />
+        /// <seealso cref="SDL_InitSubSystem(int)" />
+        /// <seealso cref="SDL_Quit" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern void SDL_QuitSubSystem(uint flags);
+        #endregion SDL_QuitSubSystem(uint flags)
+
+        #region int SDL_WasInit(int flags)
+        /// <summary>
+        ///     Checks which SDL subsystems are initialized.
+        /// </summary>
+        /// <param name="flags">
+        ///     <para>
+        ///         Specifies the subsystems you wish to check:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Flag</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_TIMER" /></term>
+        ///                 <description>The timer subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_AUDIO" /></term>
+        ///                 <description>The audio subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_VIDEO" /></term>
+        ///                 <description>The video subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_CDROM" /></term>
+        ///                 <description>The CD-ROM subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_JOYSTICK" /></term>
+        ///                 <description>The joystick subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVERYTHING" /></term>
+        ///                 <description>All subsystems.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_NOPARACHUTE" /></term>
+        ///                 <description>Prevents SDL from catching fatal signals.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVENTTHREAD" /></term>
+        ///                 <description>Not supported on all OS's.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     A bitwised OR'd combination of the initialized subsystems.
+        /// </returns>
+        /// <remarks>
+        ///     <b>SDL_WasInit</b> allows you to see which SDL subsytems have been initialized.
+        ///     <p>
+        ///     Binds to C-function call in SDL.h:
+        ///     <code>extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_Init(int)" />
+        /// <seealso cref="SDL_InitSubSystem(int)" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WasInit(int flags);
+        #endregion int SDL_WasInit(int flags)
+
+        #region uint SDL_WasInit(uint flags)
+        /// <summary>
+        ///     Checks which SDL subsystems are initialized.
+        /// </summary>
+        /// <param name="flags">
+        ///     <para>
+        ///         Specifies the subsystems you wish to check:
+        ///     </para>
+        ///     <para>
+        ///         <list type="table">
+        ///             <listheader>
+        ///                 <term>Flag</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_TIMER" /></term>
+        ///                 <description>The timer subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_AUDIO" /></term>
+        ///                 <description>The audio subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_VIDEO" /></term>
+        ///                 <description>The video subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_CDROM" /></term>
+        ///                 <description>The CD-ROM subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_JOYSTICK" /></term>
+        ///                 <description>The joystick subsystem.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVERYTHING" /></term>
+        ///                 <description>All subsystems.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_NOPARACHUTE" /></term>
+        ///                 <description>Prevents SDL from catching fatal signals.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_INIT_EVENTTHREAD" /></term>
+        ///                 <description>Not supported on all OS's.</description>
+        ///             </item>
+        ///         </list>
+        ///     </para>
+        /// </param>
+        /// <returns>
+        ///     A bitwised OR'd combination of the initialized subsystems.
+        /// </returns>
+        /// <remarks>
+        ///     <b>SDL_WasInit</b> allows you to see which SDL subsytems have been initialized.
+        ///     <p>
+        ///     Binds to C-function call in SDL.h:
+        ///     <code>extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_Init(int)" />
+        /// <seealso cref="SDL_InitSubSystem(int)" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern uint SDL_WasInit(uint flags);
+        #endregion uint SDL_WasInit(uint flags)
+
+        #region SDL_Quit()
+        /// <summary>
+        ///     Shuts down SDL.
+        /// </summary>
+        /// <remarks>
+        ///     <b>SDL_Quit</b> shuts down all SDL subsystems and frees the resources allocated
+        ///     to them.  This should always be called before you exit.
+        ///     <p>
+        ///     Binds to C-function call in SDL.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_Quit(void)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_Init(int)" />
+        /// <seealso cref="SDL_QuitSubSystem(int)" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_Quit();
+        #endregion SDL_Quit()
+        #endregion SDL.h
+
+        #region SDL_active.h
+        #region byte SDL_GetAppState
+        /// <summary>
+        /// This function returns the current state of the application, 
+        /// which is a bitwise combination of SDL_APPMOUSEFOCUS, 
+        /// SDL_APPINPUTFOCUS, and SDL_APPACTIVE.  
+        /// </summary>
+        /// <remarks>
+        /// If SDL_APPACTIVE is set, then the user is able to see 
+        /// your application, 
+        /// otherwise it has been iconified or disabled.
+        /// </remarks>
+        /// <returns>Returns the current state of the application, 
+        /// which is a bitwise combination of SDL_APPMOUSEFOCUS, 
+        /// SDL_APPINPUTFOCUS, and SDL_APPACTIVE
+        /// </returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern byte SDL_GetAppState();
+        #endregion byte SDL_GetAppState
+        #endregion SDL_active.h
+
+        #region SDL_audio.h
+        #region int AUDIO_U16SYS
+        /// <summary>
+        /// Native audio byte ordering
+        /// </summary>
+        /// <remarks>
+        /// <p>Based on code from SDL_audio.h
+        /// <code>
+        /// #if SDL_BYTEORDER == SDL_LIL_ENDIAN
+        /// #define AUDIO_U16SYS	AUDIO_U16LSB
+        /// #define AUDIO_S16SYS	AUDIO_S16LSB
+        /// #else
+        /// #define AUDIO_U16SYS	AUDIO_U16MSB
+        /// #define AUDIO_S16SYS	AUDIO_S16MSB
+        /// #endif
+        /// </code>
+        /// </p>
+        /// </remarks>
+        public static int AUDIO_U16SYS
+        {
+            get
+            {
+                if (SDL_BYTEORDER == SDL_LIL_ENDIAN)
+                {
+                    return AUDIO_U16LSB;
+                }
+                else
+                {
+                    return AUDIO_U16MSB;
+                }
+            }
+        }
+        #endregion int AUDIO_U16SYS
+
+        #region int AUDIO_S16SYS
+        /// <summary>
+        /// Native audio byte ordering
+        /// </summary>
+        /// <remarks>
+        /// <p>Based on code from SDL_audio.h
+        /// <code>
+        /// #if SDL_BYTEORDER == SDL_LIL_ENDIAN
+        /// #define AUDIO_U16SYS	AUDIO_U16LSB
+        /// #define AUDIO_S16SYS	AUDIO_S16LSB
+        /// #else
+        /// #define AUDIO_U16SYS	AUDIO_U16MSB
+        /// #define AUDIO_S16SYS	AUDIO_S16MSB
+        /// #endif
+        /// </code>
+        /// </p>
+        /// </remarks>
+        public static int AUDIO_S16SYS
+        {
+            get
+            {
+                if (SDL_BYTEORDER == SDL_LIL_ENDIAN)
+                {
+                    return AUDIO_S16LSB;
+                }
+                else
+                {
+                    return AUDIO_S16MSB;
+                }
+            }
+        }
+        #endregion int AUDIO_S16SYS
+
+        #region int SDL_AudioInit(string driver_name)
+        /// <summary>
+        /// This function is used internally, 
+        /// and should not be used unless you
+        /// have a specific need to specify the audio driver you want to use.
+        /// You should normally use 
+        /// <see cref="SDL_Init(int)"/> or <see cref="SDL_InitSubSystem(int)"/>.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_audio.h:
+        /// <code>int SDL_AudioInit(const char *driver_name)
+        /// </code></remarks>
+        /// <param name="driver_name">
+        /// </param>
+        /// <returns></returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_AudioInit(string driver_name);
+        #endregion int SDL_AudioInit(string driver_name)
+
+        #region void SDL_AudioQuit()
+        /// <summary>
+        /// This function is used internally, 
+        /// and should not be used unless you
+        /// have a specific need to specify the audio driver you want to use.
+        /// You should normally use SDL_Init() or SDL_InitSubSystem().
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_audio.h:
+        /// <code>void SDL_AudioQuit()
+        /// </code></remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_AudioQuit();
+        #endregion void SDL_AudioQuit()
+
+        #region string SDL_AudioDriverName(string namebuf, int maxlen)
+        /// <summary>
+        /// This function fills the given character buffer with the name of the
+        /// current audio driver, and returns a pointer to it if the audio
+        ///  driver has	been initialized.  
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_audio.h:
+        /// <code>char * SDL_AudioDriverName(char *namebuf, int maxlen)
+        /// </code>
+        /// </remarks>
+        /// <returns>It returns NULL if no driver has been initialized.
+        /// </returns>
+        /// <param name="namebuf"></param>
+        /// <param name="maxlen"></param>
+        public static string SDL_AudioDriverName(string namebuf, int maxlen)
+        {
+            StringBuilder stringBuilder = new StringBuilder(namebuf);
+            __SDL_AudioDriverName(stringBuilder, maxlen);
+            return stringBuilder.ToString();
+        }
+
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_AudioDriverName"),
+        SuppressUnmanagedCodeSecurity]
+        private static extern void __SDL_AudioDriverName(StringBuilder namebuf, int maxlen);
+        #endregion string SDL_AudioDriverName(string namebuf, int maxlen)
+
+        #region int SDL_OpenAudio(IntPtr desired, IntPtr obtained)
+        /// <summary>
+        /// Opens the audio device with the desired parameters.
+        /// </summary>
+        /// <remarks>
+        /// This function opens the audio device with the desired parameters, 
+        /// and returns 0 if successful, placing the actual hardware 
+        /// parameters in the structure pointed to by obtained. If obtained
+        ///  is NULL, the audio data passed to the callback function will 
+        ///  be guaranteed to be in the requested format, and will be 
+        ///  automatically converted to the hardware audio format if 
+        ///  necessary. This function returns -1 if it failed to open
+        ///   the audio device, or couldn't set up the audio thread.
+        ///   <p>To open the audio device a desired 
+        ///   <see cref="SDL_AudioSpec"/> must be created.</p>
+        ///   <code>
+        /// SDL_AudioSpec *desired;
+        /// .
+        /// .
+        /// desired = malloc(sizeof(SDL_AudioSpec)); </code>
+        /// <p>You must then fill this structure with 
+        /// your desired audio specifications.</p>
+        /// <p>desired->freq</p>
+        /// The desired audio frequency in samples-per-second.
+        /// <p>desired->format</p>
+        /// The desired audio format (see <see cref="SDL_AudioSpec"/>)
+        /// <p>desired->samples</p>
+        /// The desired size of the audio buffer in samples. 
+        /// This number should be a power of two, and may be adjusted by the
+        ///  audio driver to a value more suitable for the hardware. Good
+        ///   values seem to range between 512 and 8192 inclusive, depending
+        ///    on the application and CPU speed. Smaller values yield faster
+        ///     response time, but can lead to underflow if the application
+        ///      is doing heavy processing and cannot fill the audio buffer
+        ///       in time. A stereo sample consists of both right and left
+        ///        channels in LR ordering. Note that the number of samples
+        ///         is directly related to time by the following formula: 
+        ///         ms = (samples*1000)/freq
+        /// <p>desired->callback</p>
+        /// This should be set to a function that will be called when the
+        ///  audio device is ready for more data. It is passed a pointer 
+        ///  to the audio buffer, and the length in bytes of the audio 
+        ///  buffer. This function usually runs in a separate thread, and 
+        ///  so you should protect data structures that it accesses by 
+        ///  calling <see cref="SDL_LockAudio"/> and 
+        ///  <see cref="SDL_UnlockAudio"/> in your code. The callback 
+        ///  prototype is: 
+        /// <code>
+        /// void callback(void *userdata, Uint8 *stream, int len);
+        /// </code>
+        /// <p>userdata is the pointer stored in userdata field of the
+        ///  SDL_AudioSpec. stream is a pointer to the audio buffer you
+        ///   want to fill with information and len is the length of the
+        ///    audio buffer in bytes.</p>
+        /// <p> desired->userdata</p>
+        ///<p> This pointer is passed as the first parameter to the 
+        ///callback function.</p>
+        ///<p> SDL_OpenAudio reads these fields from the desired 
+        ///SDL_AudioSpec structure pass to the function and attempts to find 
+        ///an audio configuration matching your desired. As mentioned above, 
+        ///if the obtained parameter is NULL then SDL with convert from your
+        /// desired audio settings to the hardware settings as it plays.</p>
+        ///<p>If obtained is NULL then the desired SDL_AudioSpec is your
+        /// working specification, otherwise the obtained SDL_AudioSpec 
+        /// becomes the working specification and the desirec specification
+        ///  can be deleted. The data in the working specification is used 
+        ///  when building SDL_AudioCVT's for converting loaded data to the
+        ///   hardware format.</p>
+        ///<p>SDL_OpenAudio calculates the size and silence fields for both 
+        ///the desired and obtained specifications. The size field stores 
+        ///the total size of the audio buffer in bytes, while the silence
+        /// stores the value used to represent silence in the audio buffer.
+        /// </p>									
+        /// <p>The audio device starts out playing silence when it's opened,
+        /// and should be enabled for playing by calling 
+        /// <see cref="SDL_PauseAudio"/>(0) when you are ready for your 
+        /// audio callback function to be called. Since the audio driver 
+        /// may modify the requested size of the audio buffer, you should
+        ///  allocate any local mixing buffers after you open the audio 
+        ///  device.</p>
+        ///  <p>Binds to C-function call in SDL_audio.h:
+        ///  <code>int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained);
+        ///  </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        ///
+        /// /* Prototype of our callback function */
+        ///		void my_audio_callback(void *userdata, Uint8 *stream, int len);
+        ///
+        ///		/* Open the audio device */
+        ///		SDL_AudioSpec *desired, *obtained;
+        ///		SDL_AudioSpec *hardware_spec;
+        ///
+        ///		/* Allocate a desired SDL_AudioSpec */
+        ///		desired = malloc(sizeof(SDL_AudioSpec));
+        ///
+        ///		/* Allocate space for the obtained SDL_AudioSpec */
+        ///		obtained = malloc(sizeof(SDL_AudioSpec));
+        ///
+        ///		/* 22050Hz - FM Radio quality */
+        ///		desired->freq=22050;
+        ///
+        ///		/* 16-bit signed audio */
+        ///		desired->format=AUDIO_S16LSB;
+        ///
+        ///		/* Mono */
+        ///		desired->channels=0;
+        ///
+        ///	/* Large audio buffer reduces risk of dropouts but 
+        ///	increases response time */
+        ///		desired->samples=8192;
+        ///
+        ///		/* Our callback function */
+        ///		desired->callback=my_audio_callback;
+        ///
+        ///		desired->userdata=NULL;
+        ///
+        ///		/* Open the audio device */
+        ///		if ( SDL_OpenAudio(desired, obtained) < 0 )
+        ///	{
+        ///		fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
+        ///		exit(-1);
+        ///	}
+        ///	/* desired spec is no longer needed */
+        ///	free(desired);
+        ///	hardware_spec=obtained;
+        ///	.
+        ///	.
+        ///	/* Prepare callback for playing */
+        ///	.
+        ///	.
+        ///	.
+        ///	/* Start playing */
+        ///	SDL_PauseAudio(0);</code>
+        ///</example>
+        /// <param name="desired">IntPtr to SDL_AudioSpec</param>
+        /// <param name="obtained">IntPtr to SDL_AudioSpec</param>
+        /// <seealso cref="SDL_AudioSpec"/>
+        /// <seealso cref="SDL_LockAudio"/>
+        /// <seealso cref="SDL_UnlockAudio"/>
+        /// <seealso cref="SDL_PauseAudio"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_OpenAudio(
+            IntPtr desired, IntPtr obtained);
+        #endregion int SDL_OpenAudio(IntPtr desired, IntPtr obtained)
+
+        #region SDL_audiostatus SDL_GetAudioStatus()
+        /// <summary>
+        /// Get the current audio state.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_audio.h:
+        /// <code>SDL_audiostatus SDL_GetAudioStatus(void)
+        /// </code></p>
+        /// </remarks>
+        /// <returns>Returns either SDL_AUDIO_STOPPED, 
+        /// SDL_AUDIO_PAUSED or SDL_AUDIO_PLAYING (SDLaudiostatus enum)
+        /// depending on the current audio state.</returns>
+        /// <seealso cref="SDL_PauseAudio"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GetAudioStatus();
+        #endregion SDL_audiostatus SDL_GetAudioStatus()
+
+        #region void SDL_PauseAudio(int pause_on)
+        /// <summary>
+        /// Pauses and unpauses the audio callback processing.
+        /// </summary>
+        /// <remarks>
+        /// This function pauses and unpauses the audio callback processing. 
+        /// It should be called with pause_on=0 after opening the audio device 
+        /// to start playing sound. This is so you can safely initialize data 
+        /// for your callback function after opening the audio device. 
+        /// Silence will be written to the audio device during the pause.
+        /// <p>Binds to C-function call in SDL_audio.h:
+        /// <code>void SDL_PauseAudio(int pause_on)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="pause_on"></param>
+        /// <seealso cref="SDL_GetAudioStatus"/>
+        /// <seealso cref="SDL_OpenAudio"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_PauseAudio(int pause_on);
+        #endregion void SDL_PauseAudio(int pause_on)
+
+        #region IntPtr SDL_LoadWAV_RW(...)
+        /// <summary>
+        /// This function loads a WAVE from the data source, 
+        /// automatically freeing
+        /// that source if 'freesrc' is non-zero.  
+        /// For example, to load a WAVE file,
+        /// you could do:
+        ///	SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...);
+        ///	</summary>
+        ///	<remarks>If this function succeeds, it returns the given SDL_AudioSpec,
+        /// filled with the audio data format of the wave data, and sets
+        /// 'audio_buf' to a malloc()'d buffer containing the audio data,
+        /// and sets 'audio_len' to the length of that audio buffer, in bytes.
+        /// You need to free the audio buffer with SDL_FreeWAV() when you are 
+        /// done with it.
+        /// <p>This function returns NULL and sets the SDL error message if the 
+        /// wave file cannot be opened, uses an unknown data format, or is 
+        /// corrupt.  Currently raw and MS-ADPCM WAVE files are supported.</p>
+        /// <p>Binds to C-function call in SDL_audio.h:
+        /// <code>SDL_AudioSpec * SDL_LoadWAV_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len)
+        /// </code>
+        /// </p></remarks>
+        /// <param name="audio_buf"></param>
+        /// <param name="audio_len"></param>
+        /// <param name="freesrc"></param>
+        /// <param name="spec"></param>
+        /// <param name="src"></param>
+        /// <returns></returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_LoadWAV_RW(
+            IntPtr src, int freesrc, out IntPtr spec,
+            out IntPtr audio_buf, out int audio_len);
+        #endregion IntPtr SDL_LoadWAV_RW(...)
+
+        #region IntPtr SDL_LoadWAV_RW(...)
+        /// <summary>
+        /// This function loads a WAVE from the data source, 
+        /// automatically freeing
+        /// that source if 'freesrc' is non-zero.  
+        /// For example, to load a WAVE file,
+        /// you could do:
+        ///	SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...);
+        ///	</summary>
+        ///	<remarks>If this function succeeds, it returns the given SDL_AudioSpec,
+        /// filled with the audio data format of the wave data, and sets
+        /// 'audio_buf' to a malloc()'d buffer containing the audio data,
+        /// and sets 'audio_len' to the length of that audio buffer, in bytes.
+        /// You need to free the audio buffer with SDL_FreeWAV() when you are 
+        /// done with it.
+        /// <p>This function returns NULL and sets the SDL error message if the 
+        /// wave file cannot be opened, uses an unknown data format, or is 
+        /// corrupt.  Currently raw and MS-ADPCM WAVE files are supported.</p>
+        /// <p>Binds to C-function call in SDL_audio.h:
+        /// <code>SDL_AudioSpec * SDL_LoadWAV_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len)
+        /// </code>
+        /// </p></remarks>
+        /// <param name="audio_buf"></param>
+        /// <param name="audio_len"></param>
+        /// <param name="freesrc"></param>
+        /// <param name="spec"></param>
+        /// <param name="src"></param>
+        /// <returns></returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern IntPtr SDL_LoadWAV_RW(
+            IntPtr src, int freesrc, out IntPtr spec,
+            out IntPtr audio_buf, out uint audio_len);
+        #endregion IntPtr SDL_LoadWAV_RW(...)
+
+        #region IntPtr SDL_LoadWAV(string file, out IntPtr spec, out byte[] audio_buf, out int audio_len)
+        /// <summary>
+        /// Load a WAVE file.
+        /// </summary>
+        /// <remarks>
+        /// SDL_LoadWAV This function loads a WAVE file into memory.
+        /// <p>If this function succeeds, it returns the given 
+        /// <see cref="SDL_AudioSpec"/>,
+        ///  filled with the audio data format of the wave data, and sets 
+        ///  audio_buf to a malloc'd buffer containing the audio data, and
+        ///   sets audio_len to the length of that audio buffer, in bytes.
+        ///    You need to free the audio buffer with 
+        ///    <see cref="SDL_FreeWAV"/> when you are done with it.</p>
+        /// <p>This function returns NULL and sets the SDL error message if the
+        ///  wave file cannot be opened, uses an unknown data format, or is 
+        ///  corrupt. Currently raw, MS-ADPCM and IMA-ADPCM WAVE files are 
+        ///  supported.</p>
+        /// <p>Binds to C-function call in SDL_audio.h:
+        /// <code>
+        /// #define SDL_LoadWAV(file, spec, audio_buf, audio_len) 
+        /// SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len)
+        /// 
+        /// SDL_AudioSpec *SDL_LoadWAV(const char *file, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len);
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        /// SDL_AudioSpec wav_spec;
+        ///		Uint32 wav_length;
+        ///		Uint8 *wav_buffer;
+        ///
+        ///		/* Load the WAV */
+        ///		if( SDL_LoadWAV("test.wav", wav_spec, wav_buffer, wav_length) == NULL )
+        ///																			{
+        ///		fprintf(stderr, "Could not open test.wav: %s\n", SDL_GetError());
+        ///		exit(-1);
+        ///	}
+        ///	.
+        ///	.
+        ///	.
+        ///	/* Do stuff with the WAV */
+        ///	.
+        ///	.
+        ///	/* Free It */
+        ///	SDL_FreeWAV(wav_buffer);
+        ///	</code>
+        /// </example>
+        /// <param name="file"></param>
+        /// <param name="spec"></param>
+        /// <param name="audio_buf"></param>
+        /// <param name="audio_len"></param>
+        /// <returns>IntPtr to SDL_AudioApec</returns>
+        /// <seealso cref="SDL_AudioSpec"/>
+        /// <seealso cref="SDL_OpenAudio"/>
+        /// <seealso cref="SDL_FreeWAV"/>
+        public static IntPtr SDL_LoadWAV(string file, out IntPtr spec, out IntPtr audio_buf, out int audio_len)
+        {
+            IntPtr result = SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1, out spec, out audio_buf, out audio_len);
+            Console.WriteLine("audio_len: " + audio_len.ToString());
+            return result;
+
+        }
+        #endregion IntPtr SDL_LoadWAV(string file, out  spec, out byte[] audio_buf, out int audio_len)
+
+        #region IntPtr SDL_LoadWAV(string file, out IntPtr spec, out byte[] audio_buf, out uint audio_len)
+        /// <summary>
+        /// Load a WAVE file.
+        /// </summary>
+        /// <remarks>
+        /// SDL_LoadWAV This function loads a WAVE file into memory.
+        /// <p>If this function succeeds, it returns the given 
+        /// <see cref="SDL_AudioSpec"/>,
+        ///  filled with the audio data format of the wave data, and sets 
+        ///  audio_buf to a malloc'd buffer containing the audio data, and
+        ///   sets audio_len to the length of that audio buffer, in bytes.
+        ///    You need to free the audio buffer with 
+        ///    <see cref="SDL_FreeWAV"/> when you are done with it.</p>
+        /// <p>This function returns NULL and sets the SDL error message if the
+        ///  wave file cannot be opened, uses an unknown data format, or is 
+        ///  corrupt. Currently raw, MS-ADPCM and IMA-ADPCM WAVE files are 
+        ///  supported.</p>
+        /// <p>Binds to C-function call in SDL_audio.h:
+        /// <code>
+        /// #define SDL_LoadWAV(file, spec, audio_buf, audio_len) 
+        /// SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len)
+        /// 
+        /// SDL_AudioSpec *SDL_LoadWAV(const char *file, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len);
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        /// SDL_AudioSpec wav_spec;
+        ///		Uint32 wav_length;
+        ///		Uint8 *wav_buffer;
+        ///
+        ///		/* Load the WAV */
+        ///		if( SDL_LoadWAV("test.wav", wav_spec, wav_buffer, wav_length) == NULL )
+        ///																			{
+        ///		fprintf(stderr, "Could not open test.wav: %s\n", SDL_GetError());
+        ///		exit(-1);
+        ///	}
+        ///	.
+        ///	.
+        ///	.
+        ///	/* Do stuff with the WAV */
+        ///	.
+        ///	.
+        ///	/* Free It */
+        ///	SDL_FreeWAV(wav_buffer);
+        ///	</code>
+        /// </example>
+        /// <param name="file"></param>
+        /// <param name="spec"></param>
+        /// <param name="audio_buf"></param>
+        /// <param name="audio_len"></param>
+        /// <returns>IntPtr to SDL_AudioApec</returns>
+        /// <seealso cref="SDL_AudioSpec"/>
+        /// <seealso cref="SDL_OpenAudio"/>
+        /// <seealso cref="SDL_FreeWAV"/>
+        [CLSCompliant(false)]
+        public static IntPtr SDL_LoadWAV(string file, out IntPtr spec, out IntPtr audio_buf, out uint audio_len)
+        {
+            IntPtr result = SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1, out spec, out audio_buf, out audio_len);
+            Console.WriteLine("audio_len: " + audio_len.ToString());
+            return result;
+
+        }
+        #endregion IntPtr SDL_LoadWAV(string file, out  spec, out byte[] audio_buf, out uint audio_len)
+
+        #region void SDL_FreeWAV(ref IntPtr audio_buf)
+        /// <summary>
+        /// Frees previously opened WAV data.
+        /// </summary>
+        /// <remarks>
+        /// After a WAVE file has been opened with <see cref="SDL_LoadWAV(string, out IntPtr, out IntPtr, out int)"/>
+        ///  its data can eventually be freed with SDL_FreeWAV. audio_buf is 
+        ///  a pointer to the buffer created by SDL_LoadWAV.
+        ///  <p>
+        /// <code>
+        /// void SDL_FreeWAV(Uint8 *audio_buf)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="audio_buf"></param>
+        /// <seealso cref="SDL_LoadWAV(string, out IntPtr, out IntPtr, out int)"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_FreeWAV(ref IntPtr audio_buf);
+        #endregion void SDL_FreeWAV(ref IntPtr audio_buf)
+
+        #region int SDL_BuildAudioCVT(...)
+        /// <summary>
+        /// Initializes a SDL_AudioCVT structure for conversion
+        /// </summary>
+        /// <remarks>
+        /// Before an <see cref="SDL_AudioCVT"/> structure can be used to 
+        /// convert audio data it must be initialized with source and 
+        /// destination information. 
+        /// <p>src_format and dst_format are the source and destination 
+        /// format of the conversion. (For information on audio formats 
+        /// see <see cref="SDL_AudioSpec"/>). src_channels and dst_channels
+        ///  are the number of channels in the source and destination formats.
+        ///   Finally, src_rate and dst_rate are the frequency or 
+        ///   samples-per-second of the source and destination formats.
+        ///    Once again, see <see cref="SDL_AudioSpec"/>.</p>
+        ///    <p>
+        /// <code>
+        /// int SDL_BuildAudioCVT(SDL_AudioCVT *cvt, Uint16 src_format, Uint8 src_channels, int src_rate, Uint16 dst_format, Uint8 dst_channels, int dst_rate)
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// See <see cref="SDL_ConvertAudio"/>.
+        /// </example>
+        /// <param name="cvt"></param>
+        /// <param name="src_format"></param>
+        /// <param name="src_channels"></param>
+        /// <param name="src_rate"></param>
+        /// <param name="dst_format"></param>
+        /// <param name="dst_channels"></param>
+        /// <param name="dst_rate"></param>
+        /// <returns>
+        /// Returns -1 if the filter could not be built or 1 if it could.
+        /// </returns>
+        /// <seealso cref="SDL_ConvertAudio"/>
+        /// <seealso cref="SDL_AudioCVT"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_BuildAudioCVT(IntPtr cvt,
+            short src_format, byte src_channels, int src_rate,
+            short dst_format, byte dst_channels, int dst_rate);
+        #endregion int SDL_BuildAudioCVT(...)
+
+        #region int SDL_BuildAudioCVT(...)
+        /// <summary>
+        /// Initializes a SDL_AudioCVT structure for conversion
+        /// </summary>
+        /// <remarks>
+        /// Before an <see cref="SDL_AudioCVT"/> structure can be used to 
+        /// convert audio data it must be initialized with source and 
+        /// destination information. 
+        /// <p>src_format and dst_format are the source and destination 
+        /// format of the conversion. (For information on audio formats 
+        /// see <see cref="SDL_AudioSpec"/>). src_channels and dst_channels
+        ///  are the number of channels in the source and destination formats.
+        ///   Finally, src_rate and dst_rate are the frequency or 
+        ///   samples-per-second of the source and destination formats.
+        ///    Once again, see <see cref="SDL_AudioSpec"/>.</p>
+        ///    <p>
+        /// <code>
+        /// int SDL_BuildAudioCVT(SDL_AudioCVT *cvt, Uint16 src_format, Uint8 src_channels, int src_rate, Uint16 dst_format, Uint8 dst_channels, int dst_rate)
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// See <see cref="SDL_ConvertAudio"/>.
+        /// </example>
+        /// <param name="cvt"></param>
+        /// <param name="src_format"></param>
+        /// <param name="src_channels"></param>
+        /// <param name="src_rate"></param>
+        /// <param name="dst_format"></param>
+        /// <param name="dst_channels"></param>
+        /// <param name="dst_rate"></param>
+        /// <returns>
+        /// Returns -1 if the filter could not be built or 1 if it could.
+        /// </returns>
+        /// <seealso cref="SDL_ConvertAudio"/>
+        /// <seealso cref="SDL_AudioCVT"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_BuildAudioCVT(IntPtr cvt,
+            ushort src_format, byte src_channels, int src_rate,
+            ushort dst_format, byte dst_channels, int dst_rate);
+        #endregion int SDL_BuildAudioCVT(...)
+
+        #region int SDL_ConvertAudio(IntPtr cvt)
+        /// <summary>
+        /// Convert audio data to a desired audio format.
+        /// </summary>
+        /// <remarks>
+        /// SDL_ConvertAudio takes one parameter, cvt, which was previously 
+        /// initialized. Initilizing a <see cref="SDL_AudioCVT"/> is a two 
+        /// step process. First of all, the structure must be passed to 
+        /// <see cref="SDL_BuildAudioCVT(IntPtr, short, byte, int, short, byte, int)"/> along with source and destination 
+        /// format parameters. Secondly, the cvt->buf and cvt->len fields must
+        ///  be setup. cvt->buf should point to the audio data and cvt->len 
+        ///  should be set to the length of the audio data in bytes. 
+        ///  Remember, the length of the buffer pointed to by buf show be 
+        ///  len*len_mult bytes in length.
+        /// <p>Once the SDL_AudioCVTstructure is initilized then we can pass 
+        /// it to SDL_ConvertAudio, which will convert the audio data pointer
+        ///  to by cvt->buf. If SDL_ConvertAudio returned 0 then the conversion
+        ///   was completed successfully, otherwise -1 is returned.</p>
+        /// <p>If the conversion completed successfully then the converted
+        ///  audio data can be read from cvt->buf. The amount of valid, 
+        ///  converted, audio data in the buffer is equal to 
+        ///  cvt->len*cvt->len_ratio.</p>
+        /// <p>
+        /// <code>
+        /// int SDL_ConvertAudio(SDL_AudioCVT *cvt)
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        /// /* Converting some WAV data to hardware format */
+        ///		void my_audio_callback(void *userdata, Uint8 *stream, int len);
+        ///
+        ///		SDL_AudioSpec *desired, *obtained;
+        ///		SDL_AudioSpec wav_spec;
+        ///		SDL_AudioCVT  wav_cvt;
+        ///		Uint32 wav_len;
+        ///		Uint8 *wav_buf;
+        ///		int ret;
+        ///
+        ///		/* Allocated audio specs */
+        ///		desired = malloc(sizeof(SDL_AudioSpec));
+        ///		obtained = malloc(sizeof(SDL_AudioSpec));
+        ///
+        ///		/* Set desired format */
+        ///		desired->freq=22050;
+        ///		desired->format=AUDIO_S16LSB;
+        ///		desired->samples=8192;
+        ///		desired->callback=my_audio_callback;
+        ///		desired->userdata=NULL;
+        ///
+        ///		/* Open the audio device */
+        ///		if ( SDL_OpenAudio(desired, obtained) < 0 )
+        ///	{
+        ///		fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
+        ///		exit(-1);
+        ///	}
+        ///       
+        ///	free(desired);
+        ///
+        ///	/* Load the test.wav */
+        ///	if( SDL_LoadWAV("test.wav", &wav_spec, &wav_buf, &wav_len) == NULL )
+        ///{
+        ///	fprintf(stderr, "Could not open test.wav: %s\n", SDL_GetError());
+        ///	SDL_CloseAudio();
+        ///	free(obtained);
+        ///	exit(-1);
+        ///                                           
+        ///	/* Build AudioCVT */
+        ///	ret = SDL_BuildAudioCVT(&wav_cvt,
+        ///	wav_spec.format, wav_spec.channels, wav_spec.freq,
+        ///	obtained->format, obtained->channels, obtained->freq);
+        ///
+        ///	/* Check that the convert was built */
+        ///	if(ret==-1)
+        ///{
+        ///	fprintf(stderr, "Couldn't build converter!\n");
+        ///	SDL_CloseAudio();
+        ///	free(obtained);
+        ///	SDL_FreeWAV(wav_buf);
+        ///}
+        ///
+        ///	/* Setup for conversion */
+        ///	wav_cvt.buf = malloc(wav_len * wav_cvt.len_mult);
+        ///	wav_cvt.len = wav_len;
+        ///	memcpy(wav_cvt.buf, wav_buf, wav_len);
+        ///
+        ///	/* We can delete to original WAV data now */
+        ///	SDL_FreeWAV(wav_buf);
+        ///
+        ///	/* And now we're ready to convert */
+        ///	SDL_ConvertAudio(&wav_cvt);
+        ///
+        ///	/* do whatever */
+        ///	.
+        ///	.
+        ///	.
+        ///	.
+        /// </code>
+        /// </example>
+        /// <param name="cvt">
+        /// IntPtr to <see cref="SDL_AudioCVT"/> struct.
+        /// </param>
+        /// <returns>
+        /// If SDL_ConvertAudio returned 0 then the conversion 
+        /// was completed successfully, otherwise -1 is returned.
+        /// </returns>
+        /// <seealso cref="SDL_AudioCVT"/>
+        /// <seealso cref="SDL_BuildAudioCVT(IntPtr, short, byte, int, short, byte, int)"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_ConvertAudio(IntPtr cvt);
+        #endregion int SDL_ConvertAudio(IntPtr cvt)
+
+        #region void SDL_MixAudio(IntPtr dst, IntPtr src, int len, int volume)
+        /// <summary>
+        /// Mix audio data.
+        /// </summary>	
+        /// <remarks>
+        /// This function takes two audio buffers of len bytes each of the 
+        /// playing audio format and mixes them, performing addition, 
+        /// volume adjustment, and overflow clipping. The volume ranges
+        ///  from 0 to SDL_MIX_MAXVOLUME and should be set to the maximum
+        ///   value for full audio volume. Note this does not change hardware
+        ///    volume. This is provided for convenience -- you can mix your 
+        ///    own audio data.
+        /// <p>Note: Do not use this function for mixing together more than two
+        ///  streams of sample data. The output from repeated application of 
+        ///  this function may be distorted by clipping, because there is no 
+        ///  accumulator with greater range than the input (not to mention this
+        ///   being an inefficient way of doing it). Use mixing functions from 
+        ///   SDL_mixer, OpenAL, or write your own mixer instead.</p>
+        /// <p>
+        /// <code>
+        /// void SDL_MixAudio(Uint8 *dst, Uint8 *src, Uint32 len, int volume)
+        /// </code></p>
+        /// </remarks>	
+        /// <param name="dst"></param>
+        /// <param name="src"></param>
+        /// <param name="len"></param>
+        /// <param name="volume"></param>
+        /// <seealso cref="SDL_OpenAudio"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_MixAudio(
+            IntPtr dst, IntPtr src, int len, int volume);
+        #endregion void SDL_MixAudio(IntPtr dst, IntPtr src, int len, int volume)
+
+        #region void SDL_MixAudio(IntPtr dst, IntPtr src, uint len, int volume)
+        /// <summary>
+        /// Mix audio data.
+        /// </summary>	
+        /// <remarks>
+        /// This function takes two audio buffers of len bytes each of the 
+        /// playing audio format and mixes them, performing addition, 
+        /// volume adjustment, and overflow clipping. The volume ranges
+        ///  from 0 to SDL_MIX_MAXVOLUME and should be set to the maximum
+        ///   value for full audio volume. Note this does not change hardware
+        ///    volume. This is provided for convenience -- you can mix your 
+        ///    own audio data.
+        /// <p>Note: Do not use this function for mixing together more than two
+        ///  streams of sample data. The output from repeated application of 
+        ///  this function may be distorted by clipping, because there is no 
+        ///  accumulator with greater range than the input (not to mention this
+        ///   being an inefficient way of doing it). Use mixing functions from 
+        ///   SDL_mixer, OpenAL, or write your own mixer instead.</p>
+        /// <p>
+        /// <code>
+        /// void SDL_MixAudio(Uint8 *dst, Uint8 *src, Uint32 len, int volume)
+        /// </code></p>
+        /// </remarks>	
+        /// <param name="dst"></param>
+        /// <param name="src"></param>
+        /// <param name="len"></param>
+        /// <param name="volume"></param>
+        /// <seealso cref="SDL_OpenAudio"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern void SDL_MixAudio(
+            IntPtr dst, IntPtr src, uint len, int volume);
+        #endregion void SDL_MixAudio(IntPtr dst, IntPtr src, uint len, int volume)
+
+        #region void SDL_LockAudio()
+        /// <summary>
+        /// Lock out the callback function.
+        /// </summary>
+        /// <remarks>
+        /// The lock manipulated by these functions protects the callback 
+        /// function. During a LockAudio period, you can be guaranteed 
+        /// that the callback function is not running. Do not call these 
+        /// from the callback function or you will cause deadlock.
+        /// <p>Binds to C-function call in SDL_audio.h:
+        /// <code>
+        /// void SDL_LockAudio(void);
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <seealso cref="SDL_OpenAudio"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_LockAudio();
+        #endregion void SDL_LockAudio()
+
+        #region void SDL_UnlockAudio()
+        /// <summary>
+        /// Unlock the callback function
+        /// </summary>
+        /// <remarks>
+        /// Unlocks a previous <see cref="SDL_LockAudio"/> call.
+        /// <p>Binds to C-function call in SDL_audio.h:
+        /// <code>
+        /// void SDL_UnlockAudio(void)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <seealso cref="SDL_OpenAudio"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_UnlockAudio();
+        #endregion void SDL_UnlockAudio()
+
+        #region void SDL_CloseAudio()
+        /// <summary>
+        /// Shuts down audio processing and closes the audio device.
+        /// </summary>
+        /// <remarks>
+        /// This function shuts down audio processing and closes the audio 
+        /// device.
+        /// <p>Binds to C-function call in SDL_audio.h:
+        /// <code>
+        /// void SDL_CloseAudio(void)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <seealso cref="SDL_OpenAudio"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_CloseAudio();
+        #endregion void SDL_CloseAudio()
+        #endregion SDL_audio.h
+
+        // SDL_byteorder.h -- deprecated
+
+        #region SDL_cdrom.h
+        #region int CD_INDRIVE(CDstatus status)
+        /// <summary>
+        /// Given a status, returns true if there's a disk in the drive.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-macro call in SDL_cdrom.h:
+        /// <code>#define CD_INDRIVE(status)	((int)status > 0)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="status">CDstatus enum</param>
+        /// <returns>Returns 1 if true and 0 if false</returns>
+        public static int CD_INDRIVE(int status)
+        {
+            if ((int)status > 0)
+            {
+                return 1;
+            }
+            else
+            {
+                return 0;
+            }
+        }
+        #endregion int CD_INDRIVE(CDstatus status)
+
+        #region void FRAMES_TO_MSF(int frames, int M, int S, int F)
+        /// <summary>
+        /// Conversion function from frames to Minute/Second/Frames.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-macro call in SDL_cdrom.h:
+        /// <code>#define FRAMES_TO_MSF(f, M,S,F)	{
+        /// int value = f;							
+        ///		*(F) = value%CD_FPS;						
+        ///		value /= CD_FPS;						
+        ///		*(S) = value%60;						
+        ///		value /= 60;							
+        ///		*(M) = value;							
+        ///	}
+        /// </code></p>
+        /// </remarks>
+        /// <param name="frames">Frames</param>
+        /// <param name="M">Minutes</param>
+        /// <param name="S">Seconds</param>
+        /// <param name="F">Frames (remainder)</param>
+        /// <seealso cref="CD_FPS"/>
+        public static void FRAMES_TO_MSF(int frames, out int M, out int S, out int F)
+        {
+            F = 0;
+            S = 0;
+            M = 0;
+            if (frames != 0)
+            {
+                F = frames % CD_FPS;
+                frames /= CD_FPS;
+                S = frames % 60;
+                frames /= 60;
+                M = frames;
+            }
+        }
+        #endregion void FRAMES_TO_MSF(int frames, int M, int S, int F)
+
+        #region int MSF_TO_FRAMES(int M, int S, int F)
+        /// <summary>
+        /// Conversion function from Minute/Second/Frames to frames.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-macro call in SDL_cdrom.h:
+        /// <code>#define MSF_TO_FRAMES(M, S, F)	((M)*60*CD_FPS+(S)*CD_FPS+(F))
+        /// </code></p>
+        /// </remarks>
+        /// <param name="M">Minutes</param>
+        /// <param name="S">Seconds</param>
+        /// <param name="F">Frames</param>
+        /// <seealso cref="CD_FPS"/>
+        public static int MSF_TO_FRAMES(int M, int S, int F)
+        {
+            return (M * 60 * CD_FPS) + (S * CD_FPS) + F;
+        }
+        #endregion int MSF_TO_FRAMES(int M, int S, int F)
+
+        #region int SDL_CDNumDrives()
+        /// <summary>
+        /// Returns the number of CD-ROM drives on the 
+        /// system.
+        /// </summary>
+        /// <remarks>
+        /// Returns the number of CD-ROM drives on the system, 
+        /// or -1 if SDL_Init() has not been called with the SDL_INIT_CDROM 
+        /// flag.
+        /// <p>Binds to C-function call in SDL_cdrom.h:
+        /// <code>int SDL_CDNumDrives(void)
+        /// </code></p>
+        /// </remarks>
+        /// <returns>Returns the number of CD-ROM drives on the system, 
+        /// or -1 if SDL_Init() has not been called with the SDL_INIT_CDROM 
+        /// flag.
+        /// </returns>
+        /// <seealso cref="SDL_CDOpen"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CDNumDrives();
+        #endregion int SDL_CDNumDrives()
+
+        #region string SDL_CDName(int drive)
+        /// <summary>
+        /// Returns a human-readable, system-dependent identifier for the 
+        /// CD-ROM.
+        /// </summary>
+        /// <remarks>
+        /// Drive is the index of the drive. Drive indices start to 0 and end 
+        /// at SDL_CDNumDrives()-1.
+        /// <p>Binds to C-function in SDL_cdrom.h
+        /// <code>const char *SDL_CDName(int drive);
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// Example:
+        /// "/dev/cdrom"
+        /// "E:"
+        /// "/dev/disk/ide/1/master"
+        /// </example>
+        /// <param name="drive"></param>
+        /// <returns>
+        /// Returns a human-readable, system-dependent identifier for the 
+        /// CD-ROM.
+        /// </returns>
+        /// <seealso cref="SDL_CDNumDrives"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern string SDL_CDName(int drive);
+        #endregion string SDL_CDName(int drive)
+
+        #region IntPtr SDL_CDOpen(int drive)
+        /// <summary>
+        /// Opens a CD-ROM drive for access.
+        /// </summary>
+        /// <remarks>
+        /// Opens a CD-ROM drive for access. It returns a 
+        /// <see cref="SDL_CD"/> structure
+        ///  on success, or NULL if the drive was invalid or busy. This 
+        ///  newly opened CD-ROM becomes the default CD used when other 
+        ///  CD functions are passed a NULL CD-ROM handle. 
+        /// <p>Drives are numbered starting with 0. Drive 0 is the system
+        ///  default CD-ROM.</p>
+        ///  <p>Binds to C-function in SDL_cdrom.h
+        ///  <code>SDL_CD *SDL_CDOpen(int drive)
+        ///  </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        /// SDL_CD *cdrom;
+        ///		int cur_track;
+        ///		int min, sec, frame;
+        ///		SDL_Init(SDL_INIT_CDROM);
+        ///		atexit(SDL_Quit);
+        ///
+        ///		/* Check for CD drives */
+        ///		if(!SDL_CDNumDrives())
+        ///			{
+        ///		/* None found */
+        ///		fprintf(stderr, "No CDROM devices available\n");
+        ///		exit(-1);
+        ///	}
+        ///
+        ///	/* Open the default drive */
+        ///	cdrom=SDL_CDOpen(0);
+        ///
+        ///	/* Did if open? Check if cdrom is NULL */
+        ///	if(!cdrom)
+        ///{
+        ///	fprintf(stderr, "Couldn't open drive: %s\n", SDL_GetError());
+        ///	exit(-1);
+        ///}
+        ///
+        ///	/* Print Volume info */
+        ///	printf("Name: %s\n", SDL_CDName(0));
+        ///	printf("Tracks: %d\n", cdrom->numtracks);
+        ///	for(cur_track=0;cur_track < cdrom->numtracks; cur_track++)
+        ///{
+        ///	FRAMES_TO_MSF(cdrom->track[cur_track].length, &min, &sec, &frame);
+        ///	printf("\tTrack %d: Length %d:%d\n", cur_track, min, sec);
+        ///}
+        ///
+        ///SDL_CDClose(cdrom);
+        ///</code>
+        /// </example>
+        /// <param name="drive"></param>
+        /// <returns>It returns a SDL_CD structure
+        ///  on success, or NULL if the drive was invalid or busy.
+        ///  </returns>
+        ///  <seealso cref="SDL_CD"/>
+        ///  <seealso cref="SDL_CDtrack"/>
+        ///  <seealso cref="SDL_CDClose"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_CDOpen(int drive);
+        #endregion IntPtr SDL_CDOpen(int drive)
+
+        #region CDstatus SDL_CDStatus(IntPtr cdrom)
+        /// <summary>
+        /// This function returns the current status of the given drive.
+        /// </summary>
+        /// <remarks>
+        /// If the drive has a CD in it, 
+        /// the table of contents of the CD and current play position 
+        /// of the CD will be stored in the SDL_CD structure.
+        /// <p>
+        /// The macro CD_INDRIVE is provided for convenience, 
+        /// and given a status returns true if there's a disk 
+        /// in the drive.</p>
+        /// <p>Note: SDL_CDStatus also updates the <see cref="SDL_CD"/> 
+        /// structure passed to it.</p>
+        /// <p>Binds to C-function in SDL_cdrom.h
+        /// <code>CDstatus SDL_CDStatus(SDL_CD *cdrom);
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        /// int playTrack(int track)
+        ///	{
+        ///		int playing = 0;
+        ///
+        ///		if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) 
+        ///	{
+        ///		/* clamp to the actual number of tracks on the CD */
+        ///		if (track >= cdrom->numtracks) 
+        ///	{
+        ///		track = cdrom->numtracks-1;
+        ///	}
+        ///
+        ///	if ( SDL_CDPlayTracks(cdrom, track, 0, 1, 0) == 0 ) 
+        ///{
+        ///	playing = 1;
+        ///}
+        ///}
+        ///return playing;
+        ///}
+        ///</code>
+        /// </example>
+        /// <param name="cdrom"></param>
+        /// <returns>CDstatus enum</returns>
+        /// <seealso cref="SDL_CD"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CDStatus(IntPtr cdrom);
+        #endregion CDstatus SDL_CDStatus(IntPtr cdrom)
+
+        #region int SDL_CDPlay(IntPtr cdrom, int start, int length)
+        /// <summary>
+        /// Play a CD. 
+        /// </summary>
+        /// <remarks>
+        /// Plays the given cdrom, starting a frame start for length frames.
+        /// <p>Binds to C-function in SDL_cdrom.h
+        /// <code>int SDL_CDPlay(SDL_CD *cdrom, int start, int length)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="cdrom"></param>
+        /// <param name="start"></param>
+        /// <param name="length"></param>
+        /// <returns>It returns 0, or -1 if there was an error.</returns>
+        /// <seealso cref="SDL_CDPlayTracks"/>
+        /// <seealso cref="SDL_CDStop"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CDPlay(IntPtr cdrom, int start,
+            int length);
+        #endregion int SDL_CDPlay(IntPtr cdrom, int start, int length)
+
+        #region int SDL_CDPlayTracks(...)
+        /// <summary>
+        /// Play the given CD track(s).
+        /// </summary>
+        /// <remarks>
+        /// SDL_CDPlayTracks plays the given CD starting at track start_track,
+        ///  for ntracks tracks. 
+        /// <p>start_frame is the frame offset, from the beginning of the 
+        /// start_track, at which to start. nframes is the frame offset, 
+        /// from the beginning of the last track (start_track+ntracks), at
+        ///  which to end playing.</p>
+        /// <p>SDL_CDPlayTracks should only be called after calling 
+        /// <see cref="SDL_CDStatus"/> to get track information about 
+        /// the CD.</p>
+        /// <p>Note: Data tracks are ignored.</p>
+        /// <p>Binds to C-function in SDL_cdrom.h
+        /// <code>int SDL_CDPlayTracks(SDL_CD *cdrom, int start_track, int start_frame, int ntracks, int nframes))
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        ///		/* assuming cdrom is a previously opened device */
+        ///		/* Play the entire CD */
+        ///		if(CD_INDRIVE(SDL_CDStatus(cdrom)))
+        ///		SDL_CDPlayTracks(cdrom, 0, 0, 0, 0);
+        ///
+        ///		/* Play the first track */
+        ///		if(CD_INDRIVE(SDL_CDStatus(cdrom)))
+        ///		SDL_CDPlayTracks(cdrom, 0, 0, 1, 0);
+        ///
+        ///		/* Play first 15 seconds of the 2nd track */
+        ///		if(CD_INDRIVE(SDL_CDStatus(cdrom)))
+        ///		SDL_CDPlayTracks(cdrom, 1, 0, 0, CD_FPS*15);
+        ///	</code>
+        /// </example>
+        /// <param name="cdrom"></param>
+        /// <param name="start_track"></param>
+        /// <param name="start_frame"></param>
+        /// <param name="ntracks"></param>
+        /// <param name="nframes"></param>
+        /// <returns>Returns 0, or -1 if there was an error.</returns>
+        /// <seealso cref="SDL_CDPlay"/>
+        /// <seealso cref="SDL_CDStatus"/>
+        /// <seealso cref="SDL_CD"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CDPlayTracks(IntPtr cdrom,
+            int start_track, int start_frame, int ntracks,
+            int nframes);
+        #endregion int SDL_CDPlayTracks(...)
+
+        #region int SDL_CDPause(IntPtr cdrom)
+        /// <summary>
+        /// Pauses a CDROM.
+        /// </summary>
+        /// <remarks>
+        /// Pauses play on the given cdrom.
+        /// <p>Binds to C-function in SDL_cdrom.h
+        /// <code>int SDL_CDPause(SDL_CD *cdrom)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="cdrom"></param>
+        /// <returns>Returns 0, or -1 on error.</returns>
+        /// <seealso cref="SDL_CDPlay"/>
+        /// <seealso cref="SDL_CDResume"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CDPause(IntPtr cdrom);
+        #endregion int SDL_CDPause(IntPtr cdrom)
+
+        #region int SDL_CDResume(IntPtr cdrom)
+        /// <summary>
+        /// Resumes a CDROM.
+        /// </summary>
+        /// <remarks>
+        /// Resumes play on the given cdrom.
+        /// <p>Binds to C-function in SDL_cdrom.h
+        /// <code>int SDL_CDResume(SDL_CD *cdrom)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="cdrom"></param>
+        /// <seealso cref="SDL_CDPlay"/>
+        /// <seealso cref="SDL_CDPause"/>
+        /// <returns>Returns 0, or -1 on error.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CDResume(IntPtr cdrom);
+        #endregion int SDL_CDResume(IntPtr cdrom)
+
+        #region int SDL_CDStop(IntPtr cdrom)
+        /// <summary>
+        /// Stops a CDROM.
+        /// </summary>
+        /// <remarks>
+        /// Stops play on the given cdrom.
+        /// <p>Binds to C-function in SDL_cdrom.h
+        /// <code>int SDL_CDStop(SDL_CD *cdrom)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="cdrom"></param>
+        /// <returns>Returns 0, or -1 on error.</returns>
+        /// <seealso cref="SDL_CDPlay"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CDStop(IntPtr cdrom);
+        #endregion int SDL_CDStop(IntPtr cdrom)
+
+        #region int SDL_CDEject(IntPtr cdrom)
+        /// <summary>
+        /// Ejects a CDROM.
+        /// </summary>
+        /// <remarks>
+        /// Ejects the given cdrom.
+        /// <p>Binds to C-function in SDL_cdrom.h
+        /// <code>int SDL_CDEject(SDL_CD *cdrom)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="cdrom"></param>
+        /// <returns>Returns 0, or -1 on error.</returns>
+        /// <seealso cref="SDL_CD"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CDEject(IntPtr cdrom);
+        #endregion int SDL_CDEject(IntPtr cdrom)
+
+        #region void SDL_CDClose(IntPtr cdrom)
+        /// <summary>
+        /// Closes a SDL_CD handle.
+        /// </summary>
+        /// <remarks>
+        /// Closes the given cdrom handle.
+        /// <p>Binds to C-function in SDL_cdrom.h
+        /// <code>void SDL_CDClose(SDL_CD *cdrom);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="cdrom"></param>
+        /// <seealso cref="SDL_CDOpen"/>
+        /// <seealso cref="SDL_CD"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_CDClose(IntPtr cdrom);
+        #endregion void SDL_CDClose(IntPtr cdrom)
+        #endregion SDL_cdrom.h
+
+        // SDL_config.h -- skipped for now
+        // SDL_copying.h -- none
+
+        #region SDL_cpuinfo.h
+        #region SDL_bool SDL_HasRDTSC()
+        /// <summary>
+        ///     This function returns true if the CPU has the RDTSC instruction.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_cpuinfo.h:
+        ///     <code>extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void)</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>Returns SDL_TRUE if the CPU has the RDTSC instruction.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_HasRDTSC();
+        #endregion SDL_bool SDL_HasRDTSC()
+
+        #region SDL_bool SDL_HasMMX()
+        /// <summary>
+        ///     This function returns true if the CPU has MMX features.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_cpuinfo.h:
+        ///     <code>extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void)</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>Returns SDL_TRUE if the CPU has MMX features.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_HasMMX();
+        #endregion SDL_bool SDL_HasMMX()
+
+        #region SDL_bool SDL_HasMMXExt()
+        /// <summary>
+        ///     This function returns true if the CPU has MMX Ext. features.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_cpuinfo.h:
+        ///     <code>extern DECLSPEC SDL_bool SDLCALL SDL_HasMMXExt(void)</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>Returns SDL_TRUE if the CPU has MMX Ext. features.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_HasMMXExt();
+        #endregion SDL_bool SDL_HasMMXExt()
+
+        #region SDL_bool SDL_Has3DNow()
+        /// <summary>
+        ///     This function returns true if the CPU has 3DNow features
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_cpuinfo.h:
+        ///     <code>extern DECLSPEC SDL_bool SDLCALL SDL_SDL_Has3DNow(void)</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>Returns SDL_TRUE if the CPU has 3DNow features.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_Has3DNow();
+        #endregion SDL_bool SDL_Has3DNow()
+
+        #region SDL_bool SDL_HasSSE()
+        /// <summary>
+        ///     This function returns true if the CPU has SSE features
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_cpuinfo.h:
+        ///     <code>extern DECLSPEC SDL_bool SDLCALL SDL_SDL_HasSSE(void)</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>Returns SDL_TRUE if the CPU has SSE features.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_HasSSE();
+        #endregion SDL_bool SDL_HasSSE()
+
+        #region SDL_bool SDL_HasSSE2()
+        /// <summary>
+        ///     This function returns true if the CPU has SSE2 features
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_cpuinfo.h:
+        ///     <code>extern DECLSPEC SDL_bool SDLCALL SDL_SDL_HasSSE2void()</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>Returns SDL_TRUE if the CPU has SSE2 features.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_HasSSE2();
+        #endregion SDL_bool SDL_HasSSE2()
+
+        #region SDL_bool SDL_HasAltiVec()
+        /// <summary>
+        ///     This function returns true if the CPU has AltiVec features
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_cpuinfo.h:
+        ///     <code>extern DECLSPEC SDL_bool SDLCALL SDL_SDL_HasAltiVec(void)</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>Returns SDL_TRUE if the CPU has AltiVec features.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_HasAltiVec();
+        #endregion SDL_bool SDL_HasAltiVec()
+
+        #endregion SDL_cpuinfo.h
+
+        #region SDL_endian.h
+        // TODO: A lot more to do for this header file
+
+        #region int SDL_BYTEORDER
+        /// <summary>
+        /// Returns the endianness of the host system. 
+        /// </summary>
+        /// <remarks>
+        /// </remarks>
+        /// <returns>Returns the endianness of the host system.</returns>
+        public static int SDL_BYTEORDER
+        {
+            get
+            {
+                if (BitConverter.IsLittleEndian)
+                {
+                    return SDL_LIL_ENDIAN;
+                }
+                else
+                {
+                    return SDL_BIG_ENDIAN;
+                }
+            }
+        }
+        #endregion int SDL_BYTEORDER
+        #endregion SDL_endian.h
+
+        #region SDL_error.h
+        #region SDL_SetError(string message)
+        /// <summary>
+        ///     Sets an SDL error string.
+        /// </summary>
+        /// <param name="message">
+        ///     The error message to set.
+        /// </param>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_error.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_SetError(const char *fmt, ...)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_SetError(string message);
+        #endregion SDL_SetError(string message)
+
+        #region string SDL_GetError()
+        /// <summary>
+        ///     Gets an SDL error string.
+        /// </summary>
+        /// <returns>
+        ///     A string containing information about the last internal SDL error.
+        /// </returns>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_error.h:
+        ///     <code>extern DECLSPEC char * SDLCALL SDL_GetError(void)</code>
+        ///     </p>
+        /// </remarks>
+        public static string SDL_GetError()
+        {
+            return Marshal.PtrToStringAnsi(__SDL_GetError());
+        }
+
+        // Called from SDL_GetError()
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_GetError"), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr __SDL_GetError();
+        #endregion string SDL_GetError()
+
+        #region SDL_ClearError()
+        /// <summary>
+        ///     Clears the SDL error.
+        /// </summary>
+        /// <remarks>
+        /// <p>
+        /// Binds to C-function call in SDL_error.h:
+        /// <code>extern DECLSPEC void SDLCALL SDL_ClearError(void)</code>
+        /// </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_ClearError();
+        #endregion SDL_ClearError()
+        #endregion SDL_error.h
+
+        #region SDL_events.h
+        #region void SDL_PumpEvents()
+        /// <summary>
+        /// Pumps the event loop, gathering events from the input devices.
+        /// </summary>
+        /// <remarks>
+        /// Pumps the event loop, gathering events from the input devices.
+        /// <p>SDL_PumpEvents gathers all the pending input information from
+        ///  devices and places it on the event queue. Without calls to 
+        ///  SDL_PumpEvents no events would ever be placed on the queue. 
+        ///  Often calls the need for SDL_PumpEvents is hidden from the user 
+        ///  since <see cref="SDL_PollEvent"/> and <see cref="SDL_WaitEvent"/> 
+        ///  implicitly call SDL_PumpEvents. However, if you are not polling or
+        ///   waiting for events (e.g. you are filtering them), then you must 
+        ///   call SDL_PumpEvents to force an event queue update.
+        /// </p>
+        /// <p>Note: You can only call this function in the thread that set the video mode.</p>
+        /// <p>Binds to C-function in SDL_events.h
+        /// <code>
+        /// void SDL_PumpEvents(void);
+        /// </code></p>
+        /// </remarks>
+        /// <seealso cref="SDL_PollEvent"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_PumpEvents();
+        #endregion void SDL_PumpEvents()
+
+        #region int SDL_PeepEvents(...)
+        /// <summary>
+        /// Checks the event queue for messages and optionally returns them.
+        /// </summary>
+        /// <remarks>
+        /// Checks the event queue for messages and optionally returns them.
+        /// <p>If action is SDL_ADDEVENT, up to numevents events will be added
+        ///  to the back of the event queue.</p>
+        /// <p>If action is SDL_PEEKEVENT, up to numevents events at the front
+        ///  of the event queue, matching mask, will be returned and 			
+        /// will not be removed from the queue.</p>
+        /// <p>If action is SDL_GETEVENT, up to numevents events at the front
+        ///  of the event queue, matching mask, will be returned and 			
+        /// will be removed from the queue.</p>
+        /// <p>
+        /// The mask parameter is an bitwise OR of SDL_EVENTMASK(event_type),
+        ///  for all event types you are interested in.
+        /// </p>
+        /// <p>This function is thread-safe.</p>
+        /// <p>Binds to C-function in SDL_events.h
+        /// <code>
+        /// int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 mask);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="events"></param>
+        /// <param name="numevents"></param>
+        /// <param name="action">SDL_eventaction enum</param>
+        /// <param name="mask"></param>
+        /// <returns>
+        /// This function returns the number of events actually stored,
+        ///  or -1 if there was an error.
+        ///  </returns>
+        ///  <seealso cref="SDL_PollEvent"/>
+        ///  <seealso cref="SDL_Event"/>
+        ///  <seealso cref="SDL_PushEvent"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_PeepEvents([In, Out]SDL_Event[] events, int numevents,
+            int action, int mask);
+        #endregion int SDL_PeepEvents(...)
+
+        #region int SDL_PeepEvents(...)
+        /// <summary>
+        /// Checks the event queue for messages and optionally returns them.
+        /// </summary>
+        /// <remarks>
+        /// Checks the event queue for messages and optionally returns them.
+        /// <p>If action is SDL_ADDEVENT, up to numevents events will be added
+        ///  to the back of the event queue.</p>
+        /// <p>If action is SDL_PEEKEVENT, up to numevents events at the front
+        ///  of the event queue, matching mask, will be returned and 			
+        /// will not be removed from the queue.</p>
+        /// <p>If action is SDL_GETEVENT, up to numevents events at the front
+        ///  of the event queue, matching mask, will be returned and 			
+        /// will be removed from the queue.</p>
+        /// <p>
+        /// The mask parameter is an bitwise OR of SDL_EVENTMASK(event_type),
+        ///  for all event types you are interested in.
+        /// </p>
+        /// <p>This function is thread-safe.</p>
+        /// <p>Binds to C-function in SDL_events.h
+        /// <code>
+        /// int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 mask);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="events"></param>
+        /// <param name="numevents"></param>
+        /// <param name="action">SDL_eventaction enum</param>
+        /// <param name="mask"></param>
+        /// <returns>
+        /// This function returns the number of events actually stored,
+        ///  or -1 if there was an error.
+        ///  </returns>
+        ///  <seealso cref="SDL_PollEvent"/>
+        ///  <seealso cref="SDL_Event"/>
+        ///  <seealso cref="SDL_PushEvent"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_PeepEvents([In, Out]SDL_Event[] events, int numevents,
+            int action, uint mask);
+        #endregion int SDL_PeepEvents(...)
+
+        #region int SDL_PollEvent(out SDL_Event sdlEvent)
+        /// <summary>
+        /// Polls for currently pending events.
+        /// </summary>
+        /// <remarks>
+        /// Polls for currently pending events, 
+        /// and returns 1 if there are any pending events, or 0 if there 
+        /// are none available. 
+        /// <p>If event is not NULL, the next event is removed from the 
+        /// queue and stored in that area.</p>
+        /// <p>Binds to C-function in SDL_events.h
+        /// <code>int SDL_PollEvent(SDL_Event *event);
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        /// SDL_Event event; /* Event structure */
+        ///
+        ///		.
+        ///		.
+        ///		.
+        ///		/* Check for events */
+        ///		while(SDL_PollEvent(&event))
+        ///	{  /* Loop until there are no events left on the queue */
+        ///		switch(event.type)
+        ///					 {  /* Process the appropiate event type */
+        ///		case SDL_KEYDOWN:  /* Handle a KEYDOWN event */         
+        ///		printf("Oh! Key press\n");
+        ///		break;
+        ///		case SDL_MOUSEMOTION:
+        ///		.
+        ///		.
+        ///		.
+        ///		default: /* Report an unhandled event */
+        ///		printf("I don't know what this event is!\n");
+        ///	}
+        ///}
+        /// </code>
+        /// </example>
+        /// <param name="sdlEvent"></param>
+        /// <returns>Returns 1 if there are any pending events, 
+        /// or 0 if there 
+        /// are none available</returns>
+        /// <seealso cref="SDL_WaitEvent"/>
+        ///  <seealso cref="SDL_Event"/>
+        ///  <seealso cref="SDL_PeepEvents(SDL_Event[], int, int, int)"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_PollEvent(out SDL_Event sdlEvent);
+        #endregion int SDL_PollEvent(out SDL_Event sdlEvent)
+
+        #region int SDL_WaitEvent(out SDL_Event evt)
+        /// <summary>
+        /// Waits indefinitely for the next available event.
+        /// </summary>
+        /// <remarks>
+        /// Waits indefinitely for the next available event, returning 1,
+        ///  or 0 if there
+        /// was an error while waiting for events.  
+        /// <p>If 'event' is not NULL, 
+        /// the next
+        /// event is removed from the queue and stored in that area.</p>
+        /// <p>Binds to C-function in SDL_events.h
+        /// <code>int SDL_WaitEvent(SDL_Event *event);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="evt"></param>
+        /// <returns>Returns 1, or 0 if there was an 
+        /// error while waiting for events</returns>
+        /// <seealso cref="SDL_Event"/>
+        ///  <seealso cref="SDL_PollEvent"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WaitEvent(out SDL_Event evt);
+        #endregion int SDL_WaitEvent(out SDL_Event evt)
+
+        #region int SDL_PushEvent(out SDL_Event evt)
+        /// <summary>
+        /// Pushes an event onto the event queue.
+        /// </summary>
+        /// <remarks>
+        /// The event queue can actually be used as a two way communication 
+        /// channel. Not only can events be read from the queue, but the user
+        ///  can also push their own events onto it. event is a pointer to the
+        ///   event structure you wish to push onto the queue.
+        /// <p>Note: Pushing device input events onto the queue doesn't modify
+        ///  the state of the device within SDL.</p>
+        /// <p>Binds to C-function in SDL_events.h
+        /// <code>int SDL_PushEvent(SDL_Event *event)
+        /// </code></p></remarks>
+        /// <param name="evt"></param>
+        /// <returns>
+        /// Returns 0 on success or -1 if the event couldn't be pushed.
+        /// </returns>
+        /// <seealso cref="SDL_Event"/>
+        ///  <seealso cref="SDL_PollEvent"/>
+        ///  <seealso cref="SDL_PeepEvents(SDL_Event[], int, int, int)"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_PushEvent(out SDL_Event evt);
+        #endregion int SDL_PushEvent(out SDL_Event evt)
+
+        #region void SDL_SetEventFilter(SDL_EventFilter filter)
+        /// <summary>
+        /// Sets up a filter to process all events before 
+        /// they are posted to the event queue.
+        /// </summary>
+        /// <remarks>
+        /// This function sets up a filter to process all events 
+        /// before they are posted to the event queue. This is a very powerful
+        ///  and flexible feature. The filter is prototyped as: 
+        /// <p><code>typedef int (*SDL_EventFilter)(const SDL_Event *event);
+        /// </code></p>
+        /// <p>If the filter returns 1, then the event will be added to the 
+        /// internal queue. If it returns 0, then the event will be dropped 
+        /// from the queue. This allows selective filtering of dynamically.
+        /// </p>
+        /// <p>There is one caveat when dealing with the SDL_QUITEVENT event 
+        /// type. The event filter is only called when the window manager 
+        /// desires to close the application window. If the event filter returns
+        ///  1, then the window will be closed, otherwise the window will remain
+        ///   open if possible. If the quit event is generated by an interrupt 
+        ///   signal, it will bypass the internal queue and be delivered to the
+        ///    application at the next event poll.</p>
+        /// <p>Note: Events pushed onto the queue with 
+        /// <see cref="SDL_PushEvent"/> or <see cref="SDL_PeepEvents(SDL_Event[], int, int, int)"/> 
+        /// do not get passed through the event filter.</p>
+        /// <p>Note: Be Careful! The event filter function may run in a 
+        /// different thread so be careful what you do within it.</p>
+        /// <p>Binds to C-function in SDL_events.h
+        /// <code>void SDL_SetEventFilter(SDL_EventFilter filter);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="filter"></param>
+        /// <seealso cref="SDL_Event"/>
+        ///  <seealso cref="SDL_GetEventFilter"/>
+        ///  <seealso cref="SDL_PushEvent"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_SetEventFilter(SDL_EventFilter filter);
+        #endregion void SDL_SetEventFilter(SDL_EventFilter filter)
+
+        #region SDL_EventFilter SDL_GetEventFilter()
+        /// <summary>
+        /// Retrieves a pointer to the event filter
+        /// </summary>
+        /// <remarks>
+        /// This function retrieces a pointer to the event filter that was 
+        /// previously set using <see cref="SDL_SetEventFilter"/>.
+        ///  An SDL_EventFilter function is defined as:
+        ///  <p>
+        ///  <code>
+        ///  typedef int (*SDL_EventFilter)(const SDL_Event *event);
+        ///  </code></p>
+        /// <p>Binds to C-function in SDL_events.h
+        /// <code>SDL_EventFilter SDL_GetEventFilter(void);
+        /// </code></p></remarks>
+        /// <returns>
+        /// Returns a pointer to the event filter or 
+        /// NULL if no filter has been set.
+        /// </returns>
+        /// <seealso cref="SDL_Event"/>
+        ///  <seealso cref="SDL_SetEventFilter"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern SDL_EventFilter SDL_GetEventFilter();
+        #endregion SDL_EventFilter SDL_GetEventFilter()
+
+        #region int SDL_EventState(byte type, int state)
+        /// <summary>
+        /// This function allows you to set the state of processing certain 
+        /// events.
+        /// </summary>
+        /// <remarks>
+        /// This function allows you to set the state of 
+        /// processing certain event type's.
+        /// <p>If 'state' is set to SDL_IGNORE, that event will be 
+        /// automatically
+        ///  dropped
+        /// from the event queue and will not be filtered.</p>
+        /// <p>
+        /// If 'state' is set to SDL_ENABLE, that event will be processed 
+        /// normally.</p>
+        /// <p>If 'state' is set to SDL_QUERY, SDL_EventState will return the 
+        /// current processing state of the specified event type.</p>
+        /// <p>A list of event type's can be found in the 
+        /// <see cref="SDL_Event"/>
+        ///  section.</p>
+        /// </remarks>
+        /// <param name="type"></param>
+        /// <param name="state"></param>
+        /// <returns>
+        /// Returns 0 on success or -1 if the event couldn't be pushed.
+        /// </returns>
+        /// <seealso cref="SDL_Event"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_EventState(byte type, int state);
+        #endregion int SDL_EventState(byte type, int state)
+        #endregion SDL_events.h
+
+        // SDL_getenv.h -- deprecated
+
+        #region SDL_joystick.h
+        #region int SDL_NumJoysticks()
+        /// <summary>
+        /// Count the number of joysticks attached to the system.
+        /// </summary>
+        /// <remarks>
+        /// Counts the number of joysticks attached to the system.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>int SDL_NumJoysticks(void)
+        /// </code></p>
+        /// </remarks>
+        /// <returns>
+        /// Returns the number of attached joysticks
+        /// </returns>
+        /// <seealso cref="SDL_JoystickName"/>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_NumJoysticks();
+        #endregion int SDL_NumJoysticks()
+
+        #region string SDL_JoystickName(int device_index)
+        /// <summary>
+        /// Get joystick name.
+        /// </summary>
+        /// <remarks>
+        /// Get the implementation dependent name of joystick. 
+        /// The index parameter refers to the N'th joystick on the system.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>const char *SDL_JoystickName(int index)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="device_index"></param>
+        /// <returns>
+        /// Returns a string containing the joystick name.
+        /// </returns>
+        /// <example>
+        /// <code>
+        /// /* Print the names of all attached joysticks */
+        ///		int num_joy, i;
+        ///		num_joy=SDL_NumJoysticks();
+        ///		printf("%d joysticks found\n", num_joy);
+        ///		for(i=0;i<num_joy;i++)
+        ///		printf("%s\n", SDL_JoystickName(i));
+        /// </code>
+        /// </example>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        public static string SDL_JoystickName(int device_index)
+        {
+            return Marshal.PtrToStringAuto(__SDL_JoystickName(device_index));
+        }
+
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_JoystickName"),
+        SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr __SDL_JoystickName(int device_index);
+        #endregion string SDL_JoystickName(int device_index)
+
+        #region IntPtr SDL_JoystickOpen(int device_index)
+        /// <summary>
+        /// Open a joystick for use.
+        /// </summary>
+        /// <remarks>
+        /// Opens a joystick for use within SDL. 
+        /// The index refers to the N'th joystick in the system. 
+        /// A joystick must be opened before it game be used.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>
+        /// </code></p>
+        /// </remarks>
+        /// <param name="device_index"></param>
+        /// <returns>
+        /// Returns a IntPtr to a SDL_Joystick structure on success. 
+        /// NULL on failure.
+        /// </returns>
+        /// <example>
+        /// <code>
+        /// SDL_Joystick *joy;
+        /// Check for joystick
+        ///		if(SDL_NumJoysticks()>0)
+        ///	{
+        ///		// Open joystick
+        ///		joy=SDL_JoystickOpen(0);
+        ///  
+        ///		if(joy)
+        ///	{
+        ///		printf("Opened Joystick 0\n");
+        ///		printf("Name: %s\n", SDL_JoystickName(0));
+        ///		printf("Number of Axes: %d\n", SDL_JoystickNumAxes(joy));
+        ///		printf("Number of Buttons: %d\n", SDL_JoystickNumButtons(joy));
+        ///		printf("Number of Balls: %d\n", SDL_JoystickNumBalls(joy));
+        ///	}
+        ///	else
+        ///	printf("Couldn't open Joystick 0\n");
+        ///  
+        ///	// Close if opened
+        ///	if(SDL_JoystickOpened(0))
+        ///	SDL_JoystickClose(joy);
+        ///}
+        /// </code>
+        /// </example>
+        /// <seealso cref="SDL_JoystickClose"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_JoystickOpen(int device_index);
+        #endregion IntPtr SDL_JoystickOpen(int device_index)
+
+        #region int SDL_JoystickOpened(int device_index)
+        /// <summary>
+        /// Determine if a joystick has been opened.
+        /// </summary>
+        /// <remarks>
+        /// Determines whether a joystick has already been opened 
+        /// within the application. index refers to the N'th joystick
+        ///  on the system.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>int SDL_JoystickOpened(int index)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="device_index"></param>
+        /// <returns>
+        /// Returns 1 if the joystick has been opened, or 0 if it has not.
+        /// </returns>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        /// <seealso cref="SDL_JoystickClose"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_JoystickOpened(int device_index);
+        #endregion int SDL_JoystickOpened(int device_index)
+
+        #region int SDL_JoystickIndex(IntPtr joystick)
+        /// <summary>
+        /// Get the index of an SDL_Joystick.
+        /// </summary>
+        /// <remarks>
+        /// Returns the index of a given SDL_Joystick structure.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>int SDL_JoystickIndex(SDL_Joystick *joystick)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="joystick"></param>
+        /// <returns>
+        /// Index number of the joystick.
+        /// </returns>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_JoystickIndex(IntPtr joystick);
+        #endregion int SDL_JoystickIndex(IntPtr joystick)
+
+        #region int SDL_JoystickNumAxes(IntPtr joystick)
+        /// <summary>
+        /// Get the number of joystick axes
+        /// </summary>
+        /// <remarks>
+        /// Return the number of axes available from a 
+        /// previously opened SDL_Joystick.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>int SDL_JoystickNumAxes(SDL_Joystick *joystick)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="joystick"></param>
+        /// <returns>
+        /// Number of axes.
+        /// </returns>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        /// <seealso cref="SDL_JoystickGetAxis"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_JoystickNumAxes(IntPtr joystick);
+        #endregion int SDL_JoystickNumAxes(IntPtr joystick)
+
+        #region int SDL_JoystickNumBalls(IntPtr joystick)
+        /// <summary>
+        /// Get the number of joystick trackballs
+        /// </summary>
+        /// <remarks>
+        /// Return the number of trackballs available from a 
+        /// previously opened SDL_Joystick.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>int SDL_JoystickNumBalls(SDL_Joystick *joystick)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="joystick"></param>
+        /// <returns>
+        /// Number of trackballs.
+        /// </returns>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        /// <seealso cref="SDL_JoystickGetBall"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_JoystickNumBalls(IntPtr joystick);
+        #endregion int SDL_JoystickNumBalls(IntPtr joystick)
+
+        #region int SDL_JoystickNumHats(IntPtr joystick)
+        /// <summary>
+        /// Get the number of joystick hats.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>int SDL_JoystickNumHats(SDL_Joystick *joystick);
+        /// </code></p>
+        /// </remarks>
+        /// Return the number of hats available from a previously 
+        /// opened SDL_Joystick.
+        /// <param name="joystick"></param>
+        /// <returns>
+        /// Number of hats.
+        /// </returns>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        /// <seealso cref="SDL_JoystickGetHat"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_JoystickNumHats(IntPtr joystick);
+        #endregion int SDL_JoystickNumHats(IntPtr joystick)
+
+        #region int SDL_JoystickNumButtons(IntPtr joystick)
+        /// <summary>
+        /// Get the number of joystick buttons.
+        /// </summary>
+        /// <remarks>
+        /// Return the number of buttons available from a 
+        /// previously opened SDL_Joystick.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>int SDL_JoystickNumButtons(SDL_Joystick *joystick)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="joystick"></param>
+        /// <returns>
+        /// Number of buttons.
+        /// </returns>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        /// <seealso cref="SDL_JoystickGetButton"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_JoystickNumButtons(IntPtr joystick);
+        #endregion int SDL_JoystickNumButtons(IntPtr joystick)
+
+        #region void SDL_JoystickUpdate()
+        /// <summary>
+        /// Updates the state of all joysticks.
+        /// </summary>
+        /// <remarks>
+        /// Updates the state(position, buttons, etc.) of all open joysticks.
+        ///  If joystick events have been enabled with 
+        ///  <see cref="SDL_JoystickEventState"/>
+        ///   then this is called automatically in the event loop.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>void SDL_JoystickUpdate(void)
+        /// </code></p>
+        /// </remarks>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        /// <seealso cref="SDL_JoystickGetButton"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_JoystickUpdate();
+        #endregion void SDL_JoystickUpdate()
+
+        #region int SDL_JoystickEventState(int state)
+        /// <summary>
+        /// Enable/disable joystick event polling
+        /// </summary>
+        /// <remarks>
+        /// This function is used to enable or disable joystick event 
+        /// processing. With joystick event processing disabled you will
+        ///  have to update joystick states with SDL_JoystickUpdate and 
+        ///  read the joystick information manually. state is either 
+        ///  SDL_QUERY, SDL_ENABLE or SDL_IGNORE.
+        ///  <p>
+        ///  Note: Joystick event handling is preferred
+        ///  </p>
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>int SDL_JoystickEventState(int state)
+        /// </code></p>
+        /// </remarks>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        /// <seealso cref="SDL_JoystickGetButton"/>
+        /// <returns>
+        /// If state is SDL_QUERY then the current state is returned,
+        ///  otherwise the new processing state is returned.
+        /// </returns>
+        /// <seealso cref="SDL_JoystickUpdate"/>
+        /// <seealso cref="SDL_JoyAxisEvent"/>
+        /// <seealso cref="SDL_JoyBallEvent"/>
+        /// <seealso cref="SDL_JoyButtonEvent"/>
+        /// <seealso cref="SDL_JoyHatEvent"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_JoystickEventState(int state);
+        #endregion int SDL_JoystickEventState(int state)
+
+        #region short SDL_JoystickGetAxis(IntPtr joystick, int axis)
+        /// <summary>
+        /// Get the current state of an axis.
+        /// </summary>
+        /// <remarks>
+        /// SDL_JoystickGetAxis returns the current state of the 
+        /// given axis on the given joystick.
+        /// <p>On most modern joysticks the X axis is usually represented 
+        /// by axis 0 and the Y axis by axis 1. The value returned by 
+        /// SDL_JoystickGetAxis is a signed integer (-32768 to 32768) 
+        /// representing the current position of the axis, it maybe necessary
+        ///  to impose certain tolerances on these values to account for 
+        ///  jitter. It is worth noting that some joysticks use axes 2 and
+        ///   3 for extra buttons.</p>
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>Sint16 SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="joystick"></param>
+        /// <param name="axis"></param>
+        /// <returns>
+        /// Returns a short representing the current position of the axis.
+        /// </returns>
+        /// <example>
+        /// <code>
+        /// Sint16 x_move, y_move;
+        ///		SDL_Joystick *joy1;
+        ///		.
+        ///		.
+        ///		x_move=SDL_JoystickGetAxis(joy1, 0);
+        ///		y_move=SDL_JoystickGetAxis(joy1, 1);
+        /// </code>
+        /// </example>
+        /// <seealso cref="SDL_JoystickNumAxes"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern short SDL_JoystickGetAxis(IntPtr joystick,
+            int axis);
+        #endregion short SDL_JoystickGetAxis(IntPtr joystick, int axis)
+
+        #region byte SDL_JoystickGetHat(IntPtr joystick, int hat)
+        /// <summary>
+        /// Get the current state of a joystick hat
+        /// </summary>
+        /// <remarks>
+        /// SDL_JoystickGetHat returns the current 
+        /// state of the given hat on the given joystick.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>Uint8 SDL_JoystickGetHat(SDL_Joystick *joystick, int hat)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="joystick"></param>
+        /// <param name="hat"></param>
+        /// <returns>
+        /// The current state is returned as a byte which 
+        /// is defined as an OR'd combination of one or more of the following:
+        /// <code>
+        /// SDL_HAT_CENTERED 
+        ///	SDL_HAT_UP 
+        ///	SDL_HAT_RIGHT 
+        ///	SDL_HAT_DOWN 
+        ///	SDL_HAT_LEFT 
+        ///	SDL_HAT_RIGHTUP 
+        ///	SDL_HAT_RIGHTDOWN 
+        ///	SDL_HAT_LEFTUP 
+        /// SDL_HAT_LEFTDOWN 
+        /// </code>
+        /// </returns>
+        /// <seealso cref="SDL_JoystickNumHats"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern byte SDL_JoystickGetHat(IntPtr joystick,
+            int hat);
+        #endregion byte SDL_JoystickGetHat(IntPtr joystick, int hat)
+
+        #region int SDL_JoystickGetBall(...)
+        /// <summary>
+        /// Get relative trackball motion. 
+        /// </summary>
+        /// <remarks>
+        /// Get the ball axis change.
+        /// <p>Trackballs can only return relative motion since 
+        /// the last call to SDL_JoystickGetBall, these motion 
+        /// deltas a placed into dx and dy.
+        /// </p>
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>int SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="joystick"></param>
+        /// <param name="ball"></param>
+        /// <param name="dx"></param>
+        /// <param name="dy"></param>
+        /// <returns>
+        /// Returns 0 on success or -1 on failure
+        /// </returns>
+        /// <example>
+        /// <code>
+        /// int delta_x, delta_y;
+        ///		SDL_Joystick *joy;
+        ///		.
+        ///		.
+        ///		.
+        ///		SDL_JoystickUpdate();
+        ///		if(SDL_JoystickGetBall(joy, 0, &delta_x, &delta_y)==-1)
+        ///		printf("TrackBall Read Error!\n");
+        ///		printf("Trackball Delta- X:%d, Y:%d\n", delta_x, delta_y);
+        /// </code>
+        /// </example>
+        /// <seealso cref="SDL_JoystickNumBalls"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_JoystickGetBall(IntPtr joystick,
+            int ball, out int dx, out int dy);
+        #endregion int SDL_JoystickGetBall(...)
+
+        #region byte SDL_JoystickGetButton(IntPtr joystick, int button)
+        /// <summary>
+        /// Get the current state of a given button on a given joystick.
+        /// </summary>
+        /// <remarks>
+        /// SDL_JoystickGetButton returns the current 
+        /// state of the given button on the given joystick.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>Uint8 SDL_JoystickGetButton(SDL_Joystick *joystick, int button);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="joystick"></param>		
+        /// <param name="button"></param>
+        /// <returns>
+        /// 1 if the button is pressed. Otherwise, 0.
+        /// </returns>
+        /// <seealso cref="SDL_JoystickNumButtons"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern byte SDL_JoystickGetButton(IntPtr joystick,
+            int button);
+        #endregion byte SDL_JoystickGetButton(IntPtr joystick, int button)
+
+        #region void SDL_JoystickClose(IntPtr joystick)
+        /// <summary>
+        /// Closes a previously opened joystick.
+        /// </summary>
+        /// <remarks>
+        /// Close a joystick that was previously opened with 
+        /// <see cref="SDL_JoystickOpen"/>.
+        /// <p>Binds to C-function in SDL_joystick.h
+        /// <code>void SDL_JoystickClose(SDL_Joystick *joystick);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="joystick"></param>
+        /// <seealso cref="SDL_JoystickOpen"/>
+        /// <seealso cref="SDL_JoystickOpened"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_JoystickClose(IntPtr joystick);
+        #endregion void SDL_JoystickClose(IntPtr joystick)
+        #endregion SDL_joystick.h
+
+        #region SDL_keyboard.h
+        #region int SDL_EnableUNICODE(int enable)
+        /// <summary>
+        /// Enable UNICODE translation
+        /// </summary>
+        /// <remarks>
+        /// Enables/Disables Unicode keyboard translation.
+        /// <p>To obtain the character codes corresponding to received 
+        /// keyboard events, Unicode translation must first be turned 
+        /// on using this function. The translation incurs a slight overhead
+        ///  for each keyboard event and is therefore disabled by default. 
+        ///  For each subsequently received key down event, the unicode member
+        ///   of the SDL_keysym structure will then contain the corresponding 
+        ///   character code, or zero for keysyms that do not correspond to 
+        ///   any character code.</p>
+        /// <p>A value of 1 for enable enables Unicode translation; 0 disables
+        ///  it, and -1 leaves it unchanged (useful for querying the current 
+        ///  translation mode).</p>
+        /// <p>Note that only key press events will be translated, not 
+        /// release events.</p>
+        /// <p>Binds to C-function in SDL_keyboard.h
+        /// <code>int SDL_EnableUNICODE(int enable);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="enable"></param>
+        /// <returns>
+        /// Returns the previous translation mode (0 or 1).
+        /// </returns>
+        /// <seealso cref="SDL_keysym"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_EnableUNICODE(int enable);
+        #endregion int SDL_EnableUNICODE(int enable)
+
+        #region int SDL_EnableKeyRepeat(int rate, int delay)
+        /// <summary>
+        /// Set keyboard repeat rate. 
+        /// </summary>
+        /// <remarks>
+        /// Enables or disables the keyboard repeat rate. 
+        /// delay specifies how long the key must be pressed before it 
+        /// begins repeating, it then repeats at the speed specified by 
+        /// interval. Both delay and interval are expressed in milliseconds.
+        /// <p>Setting delay to 0 disables key repeating completely. Good 
+        /// default values are SDL_DEFAULT_REPEAT_DELAY and 
+        /// SDL_DEFAULT_REPEAT_INTERVAL.</p>
+        ///<p>Binds to C-function in SDL_keyboard.h
+        ///<code>int SDL_EnableKeyRepeat(int delay, int interval);
+        ///</code></p>
+        /// </remarks>
+        /// <param name="rate"></param>
+        /// <param name="delay"></param>
+        /// <returns>Returns 0 on success and -1 on failure.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_EnableKeyRepeat(int rate,
+            int delay);
+        #endregion int SDL_EnableKeyRepeat(int rate, int delay)
+
+        #region int SDL_GetKeyRepeat(out int rate, out int delay)
+        /// <summary>
+        /// Get keyboard repeat rate. 
+        /// </summary>
+        /// <remarks>
+        /// Gets the keyboard repeat rate. 
+        /// delay specifies how long the key must be pressed before it 
+        /// begins repeating, it then repeats at the speed specified by 
+        /// interval. Both delay and interval are expressed in milliseconds.
+        /// <p>Setting delay to 0 disables key repeating completely. Good 
+        /// default values are SDL_DEFAULT_REPEAT_DELAY and 
+        /// SDL_DEFAULT_REPEAT_INTERVAL.</p>
+        ///<p>Binds to C-function in SDL_keyboard.h
+        ///<code>int SDL_GetKeyRepeat(int delay, int interval);
+        ///</code></p>
+        /// </remarks>
+        /// <param name="rate"></param>
+        /// <param name="delay"></param>
+        /// <returns>Returns 0 on success and -1 on failure.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GetKeyRepeat(out int rate,
+            out int delay);
+        #endregion int SDL_GetKeyRepeat(out int rate, out int delay)
+
+        #region IntPtr SDL_GetKeyStateInternal(out int numkeys)
+        /// <summary>
+        /// Get a snapshot of the current keyboard state. 
+        /// </summary>
+        /// <remarks>
+        /// Returns an array of keystates, indexed by the SDLK_* syms.
+        /// Used:
+        ///	Uint8 *keystate = SDL_GetKeyState(NULL);
+        ///	if ( keystate[SDLK_RETURN] ) ...  _RETURN_ is pressed.
+        ///	<p>Binds to C-function in SDL_keyboard.h
+        ///	<code>Uint8 *SDL_GetKeyState(int *numkeys);
+        ///	</code></p>
+        /// </remarks>
+        /// <param name="numkeys"></param>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_GetKeyState"),
+        SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr SDL_GetKeyStateInternal(out int numkeys);
+        #endregion IntPtr SDL_GetKeyStateInternal(out int numkeys)
+
+        #region byte[] SDL_GetKeyState(out int numkeys)
+        /// <summary>
+        /// Get a snapshot of the current keyboard state. 
+        /// </summary>
+        /// <remarks>
+        /// Gets a snapshot of the current keyboard state. The current state 
+        /// is return as a pointer to an array, the size of this array is 
+        /// stored in numkeys. The array is indexed by the SDLK_* symbols. 
+        /// A value of 1 means the key is pressed and a value of 0 means its 
+        /// not. The pointer returned is a pointer to an internal SDL array 
+        /// and should not be freed by the caller.
+        /// <p>Note: Use <see cref="SDL_PumpEvents"/> to update the state 
+        /// array.</p>
+        ///	<p>Binds to C-function in SDL_keyboard.h
+        ///	<code>Uint8 *SDL_GetKeyState(int *numkeys);
+        ///	</code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        /// Uint8 *keystate = SDL_GetKeyState(NULL);
+        /// if ( keystate[SDLK_RETURN] ) printf("Return Key Pressed.\n");
+        /// </code>
+        /// </example>
+        /// <param name="numkeys"></param>
+        /// <seealso cref="SDL_PumpEvents"/> 
+        public static byte[] SDL_GetKeyState(out int numkeys)
+        {
+            IntPtr state = SDL_GetKeyStateInternal(out numkeys);
+
+            // update the cached keyboard state
+            Marshal.Copy(state, keyboardState, 0, numkeys);
+
+            return keyboardState;
+        }
+        #endregion byte[] SDL_GetKeyState(out int numkeys)
+
+        #region int SDL_GetModState()
+        /// <summary>
+        /// Get the state of modifier keys. 
+        /// </summary>
+        /// <remarks>
+        /// Returns the current state of the modifier keys (CTRL, ALT, etc.).
+        /// <p>Binds to C-function in SDL_keyboard.h
+        /// <code>SDLMod SDL_GetModState(void)
+        /// </code></p>
+        /// </remarks>
+        /// <returns>The return value can be an OR'd combination of the 
+        /// SDLMod enum.
+        /// </returns>
+        /// <seealso cref="SDL_GetKeyState"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GetModState();
+        #endregion int SDL_GetModState()
+
+        #region void SDL_SetModState(int modstate)
+        /// <summary>
+        /// Set the current key modifier state. 
+        /// </summary>
+        /// <remarks>
+        /// The inverse of SDL_GetModState, SDL_SetModState allows you to 
+        /// impose modifier key states on your application.
+        /// <p>Simply pass your desired modifier states into modstate. 
+        /// This value my be a logical OR'd combination of 
+        /// SDLMod.</p>
+        ///  <p>Binds to C-function in SDL_keyboard.h
+        ///  <code>void SDL_SetModState(SDLMod modstate)
+        ///  </code></p>
+        /// </remarks>
+        /// <param name="modstate"></param>
+        /// <seealso cref="SDL_GetModState"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_SetModState(int modstate);
+        #endregion void SDL_SetModState(int modstate)
+
+        #region string SDL_GetKeyName(SDLKey key)
+        /// <summary>
+        /// Get the name of an SDL virtual keysym
+        /// </summary>
+        /// <remarks>
+        /// Returns the SDL-defined name of the SDLKey key.
+        /// <p>Binds to C-function in SDL_keyboard.h
+        /// <code>char *SDL_GetKeyName(SDLKey key);
+        /// </code></p>
+        /// </remarks>
+        /// <returns>
+        /// Returns the SDL-defined name of the SDLKey key.
+        /// </returns>
+        public static string SDL_GetKeyName(int key)
+        {
+            return Marshal.PtrToStringAnsi(__SDL_GetKeyName(key));
+        }
+
+        // Called from SDL_GetKeyName()
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_GetKeyName"), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr __SDL_GetKeyName(int key);
+        #endregion string SDL_GetKeyName(int key)
+        #endregion SDL_keyboard.h
+
+        // SDL_keysym.h -- none
+
+        #region SDL_loadso.h
+        #region IntPtr SDL_LoadObject(string sofile)
+        /// <summary>
+        /// This function dynamically loads a shared object and returns a pointer
+        /// to the object handle (or NULL if there was an error).
+        /// </summary>
+        /// <remarks>
+        ///  <p>Binds to C-function in SDL_loadso.h
+        ///  <code>extern DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile)
+        ///  </code></p>
+        /// </remarks>
+        /// <param name="sofile">System dependent name of the object file.</param>
+        /// <seealso cref="SDL_LoadFunction"/>
+        /// <seealso cref="SDL_UnloadObject"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_LoadObject(string sofile);
+        #endregion IntPtr SDL_LoadObject(string sofile)
+
+        #region IntPtr SDL_LoadFunction(IntPtr handle, string name)
+        /// <summary>
+        /// Given an object handle, this function looks up the address of the
+        /// named function in the shared object and returns it.  This address
+        /// is no longer valid after calling SDL_UnloadObject().
+        /// </summary>
+        /// <remarks>
+        ///  <p>Binds to C-function in SDL_loadso.h
+        ///  <code>extern DECLSPEC void * SDLCALL SDL_LoadFunction(void *handle, const char *name)
+        ///  </code></p>
+        /// </remarks>
+        /// <param name="handle">Object handle</param>
+        /// <param name="name">Name of function in the shared object.</param>
+        /// <seealso cref="SDL_LoadObject"/>
+        /// <seealso cref="SDL_UnloadObject"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_LoadFunction(IntPtr handle, string name);
+        #endregion IntPtr SDL_LoadFunction(IntPtr handle, string name)
+
+        #region void SDL_UnloadObject(IntPtr handle)
+        /// <summary>
+        /// Unload a shared object from memory
+        /// </summary>
+        /// <remarks>
+        ///  <p>Binds to C-function in SDL_loadso.h
+        ///  <code>extern DECLSPEC void * SDLCALL SDL_UnloadObject(void *handle)
+        ///  </code></p>
+        /// </remarks>
+        /// <param name="handle">Object handle</param>
+        /// <seealso cref="SDL_LoadFunction"/>
+        /// <seealso cref="SDL_LoadObject"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_UnloadObject(IntPtr handle);
+        #endregion void SDL_UnloadObject(IntPtr handle)
+        #endregion SDL_loadso.h
+
+        // SDL_main.h -- TODO: apparently some private functions? Not sure.
+
+        #region SDL_mouse.h
+        #region byte SDL_GetMouseState(out int x, out int y)
+        /// <summary>
+        /// Retrieve the current state of the mouse.
+        /// </summary>
+        /// <remarks>
+        /// The current button state is returned as a button bitmask, w
+        /// hich can be tested using the SDL_BUTTON(X) macros, 
+        /// and x and y are set to the current mouse cursor position. 
+        /// You can pass NULL for either x or y.
+        /// <p>Binds to C-function call in SDL_mouse.h:
+        /// <code>
+        /// Uint8 SDL_GetMouseState(int *x, int *y)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns></returns>
+        /// <example>
+        /// <code>
+        /// SDL_PumpEvents();
+        ///		if(SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1))
+        ///		printf("Mouse Button 1(left) is pressed.\n");
+        /// </code>
+        /// </example>
+        /// <seealso cref="SDL_GetRelativeMouseState"/>
+        /// <seealso cref="SDL_PumpEvents"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern byte SDL_GetMouseState(out int x, out int y);
+        #endregion byte SDL_GetMouseState(out int x, out int y)
+
+        #region byte SDL_GetRelativeMouseState(out int x, out int y)
+        /// <summary>
+        /// Retrieve the current state of the mouse.
+        /// </summary>
+        /// <remarks>
+        /// The current button state is returned as a button bitmask, 
+        /// which can be tested using the SDL_BUTTON(X) macros, 
+        /// and x and y are set to the change in the mouse position 
+        /// since the last call to SDL_GetRelativeMouseState or 
+        /// since event initialization. You can pass NULL for either x or y.
+        ///  <p>Binds to C-function call in SDL_mouse.h:
+        /// <code>
+        /// Uint8 SDL_GetRelativeMouseState(int *x, int *y);
+        /// </code>
+        /// </p> 
+        /// </remarks>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns>
+        /// The current button state is returned as a button bitmask
+        /// </returns>
+        /// <seealso cref="SDL_GetMouseState"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern byte SDL_GetRelativeMouseState(out int x, out int y);
+        #endregion byte SDL_GetRelativeMouseState(out int x, out int y)
+
+        #region void SDL_WarpMouse(short x, short y)
+        /// <summary>
+        /// Set the position of the mouse cursor.
+        /// </summary>
+        /// <remarks>
+        /// Set the position of the mouse cursor (generates a mouse 
+        /// motion event).
+        /// <p>Binds to C-function call in SDL_mouse.h:
+        /// <code>
+        /// void SDL_WarpMouse(Uint16 x, Uint16 y);
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <seealso cref="SDL_MouseMotionEvent"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_WarpMouse(short x, short y);
+        #endregion void SDL_WarpMouse(short x, short y)
+
+        #region void SDL_WarpMouse(ushort x, ushort y)
+        /// <summary>
+        /// Set the position of the mouse cursor.
+        /// </summary>
+        /// <remarks>
+        /// Set the position of the mouse cursor (generates a mouse 
+        /// motion event).
+        /// <p>Binds to C-function call in SDL_mouse.h:
+        /// <code>
+        /// void SDL_WarpMouse(Uint16 x, Uint16 y);
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <seealso cref="SDL_MouseMotionEvent"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern void SDL_WarpMouse(ushort x, ushort y);
+        #endregion void SDL_WarpMouse(ushort x, ushort y)
+
+        #region int SDL_CreateCursor(...)
+        /// <summary>
+        /// Creates a new mouse cursor.
+        /// </summary>
+        /// <remarks>
+        /// Create a cursor using the specified data and mask (in MSB format). 
+        /// The cursor width must be a multiple of 8 bits.
+        /// <p>The cursor is created in black and white according to the following:</p>
+        /// <code>
+        /// data  mask    resulting pixel on screen
+        ///  0     1       White
+        ///  1     1       Black
+        ///  0     0       Transparent
+        ///  1     0       Inverted color if possible, black if not.
+        ///  </code>
+        /// Cursors created with this function must be freed with 
+        /// <see cref="SDL_FreeCursor"/>.
+        /// <p>Binds to C-function call in SDL_mouse.h:
+        /// <code>
+        /// SDL_Cursor *SDL_CreateCursor(Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y);
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        /// /* Stolen from the mailing list */
+        ///* Creates a new mouse cursor from an XPM */
+        ///
+        ///
+        /// /* XPM */
+        ///static const char *arrow[] = {
+        ///  /* width height num_colors chars_per_pixel */
+        ///  "    32    32        3            1",
+        ///  /* colors */
+        /// "X c #000000",
+        ///  ". c #ffffff",
+        ///  "  c None",
+        ///  /* pixels */
+        ///  "X                               ",
+        ///  "XX                              ",
+        ///  "X.X                             ",
+        ///  "X..X                            ",
+        ///  "X...X                           ",
+        ///  "X....X                          ",
+        ///  "X.....X                         ",
+        ///  "X......X                        ",
+        ///  "X.......X                       ",
+        ///  "X........X                      ",
+        ///  "X.....XXXXX                     ",
+        ///  "X..X..X                         ",
+        ///  "X.X X..X                        ",
+        ///  "XX  X..X                        ",
+        ///  "X    X..X                       ",
+        ///  "     X..X                       ",
+        ///  "      X..X                      ",
+        ///  "      X..X                      ",
+        ///  "       XX                       ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "                                ",
+        ///  "0,0"
+        ///};
+        ///
+        ///static SDL_Cursor *init_system_cursor(const char *image[])
+        ///{
+        ///  int i, row, col;
+        ///  Uint8 data[4*32];
+        ///  Uint8 mask[4*32];
+        ///  int hot_x, hot_y;
+        ///
+        ///  i = -1;
+        ///  for ( row=0; row<32; ++row ) {
+        ///    for ( col=0; col<32; ++col ) {
+        ///      if ( col % 8 ) {
+        ///        data[i] <<= 1;
+        ///        mask[i] <<= 1;
+        ///      } else {
+        ///        ++i;
+        ///        data[i] = mask[i] = 0;
+        ///      }
+        ///      switch (image[4+row][col]) {
+        ///        case 'X':
+        ///          data[i] |= 0x01;
+        ///          mask[i] |= 0x01;
+        ///          break;
+        ///        case '.':
+        ///          mask[i] |= 0x01;
+        ///          break;
+        ///        case ' ':
+        ///          break;
+        ///      }
+        ///    }
+        ///  }
+        ///  sscanf(image[4+row], "%d,%d", &hot_x, &hot_y);
+        ///  return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
+        ///}
+        /// </code>
+        /// </example>
+        /// <param name="data"></param>
+        /// <param name="h"></param>
+        /// <param name="hot_x"></param>
+        /// <param name="hot_y"></param>
+        /// <param name="mask"></param>
+        /// <param name="w"></param>
+        /// <returns></returns>
+        /// <seealso cref="SDL_FreeCursor"/>
+        /// <seealso cref="SDL_SetCursor"/>
+        /// <seealso cref="SDL_ShowCursor"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CreateCursor(ref byte data, ref byte mask,
+            int w, int h, int hot_x, int hot_y);
+        #endregion int SDL_CreateCursor(...)
+
+        #region IntPtr SDL_SetCursor(ref SDL_Cursor cursor)
+        /// <summary>
+        /// Set the currently active cursor to the specified one. 
+        /// </summary>
+        /// <remarks>
+        /// Sets the currently active cursor to the specified one. 
+        /// If the cursor is currently visible, the change will 
+        /// be immediately represented on the display.
+        /// <p>Binds to C-function call in SDL_mouse.h:
+        /// <code>
+        /// void *SDL_SetCursor(SDL_Cursor *cursor);
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="cursor"></param>
+        /// <returns></returns>
+        /// <seealso cref="SDL_GetCursor"/>
+        /// <seealso cref="SDL_CreateCursor"/>
+        /// <seealso cref="SDL_ShowCursor"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_SetCursor(ref SDL_Cursor cursor);
+        #endregion IntPtr SDL_SetCursor(ref SDL_Cursor cursor)
+
+        #region IntPtr SDL_GetCursor()
+        /// <summary>
+        /// Returns the currently active cursor. 
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_mouse.h:
+        /// <code>
+        /// SDL_Cursor *SDL_GetCursor(void);
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <returns>IntPtr to <see cref="SDL_Cursor"/></returns>
+        /// <seealso cref="SDL_CreateCursor"/>
+        /// <seealso cref="SDL_SetCursor"/>
+        /// <seealso cref="SDL_ShowCursor"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_GetCursor();
+        #endregion IntPtr SDL_GetCursor()
+
+        #region void SDL_FreeCursor(ref SDL_Cursor cursor)
+        /// <summary>
+        /// Frees a cursor created with SDL_CreateCursor. 
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_mouse.h:
+        /// <code>
+        /// void SDL_FreeCursor(SDL_Cursor *cursor)
+        /// </code>
+        /// </p>
+        /// Frees a SDL_Cursor that was created using 
+        /// <see cref="SDL_CreateCursor"/>.
+        /// </remarks>
+        /// <param name="cursor"></param>
+        /// <returns></returns>
+        /// <seealso cref="SDL_CreateCursor"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_FreeCursor(ref SDL_Cursor cursor);
+        #endregion void SDL_FreeCursor(ref SDL_Cursor cursor)
+
+        #region int SDL_ShowCursor(int toggle)
+        /// <summary>
+        /// Toggle whether or not the cursor is shown on the screen.
+        /// </summary>
+        /// <remarks>
+        /// Toggle whether or not the cursor is shown on the screen. 
+        /// Passing SDL_ENABLE displays the cursor and passing 
+        /// SDL_DISABLE hides it. The current state of the mouse 
+        /// cursor can be queried by passing SDL_QUERY, either 
+        /// SDL_DISABLE or SDL_ENABLE will be returned.
+        /// <p>
+        /// The cursor starts off displayed, but can be turned off.
+        /// </p>
+        /// <p>Binds to C-function call in SDL_mouse.h:
+        /// <code>
+        /// int SDL_ShowCursor(int toggle);
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="toggle"></param>
+        /// <returns></returns>
+        /// <seealso cref="SDL_CreateCursor"/>
+        /// <seealso cref="SDL_SetCursor"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_ShowCursor(int toggle);
+        #endregion int SDL_ShowCursor(int toggle)
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="x"></param>
+        /// <returns></returns>
+        public static byte SDL_BUTTON(byte x)
+        {
+            return (byte)(1 << (x - 1));
+        }
+        #endregion SDL_mouse.h
+
+        #region SDL_mutex.h
+        #region IntPtr SDL_CreateMutex()
+        /// <summary>
+        ///     Create a mutex, initialized unlocked
+        /// </summary>
+        /// <returns>
+        ///     IntPtr to mutex
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC SDL_mutex * SDLCALL SDL_CreateMutex(void)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_CreateMutex();
+        #endregion IntPtr SDL_CreateMutex()
+
+        #region int SDL_mutexP(IntPtr mutex)
+        /// <summary>
+        ///     Lock the mutex  (Returns 0, or -1 on error)
+        /// </summary>
+        /// <returns>
+        ///     Lock the mutex  (Returns 0, or -1 on error)
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_mutexP(SDL_mutex *mutex)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_mutexP(IntPtr mutex);
+        #endregion int SDL_mutexP(IntPtr mutex)
+
+        #region int SDL_LockMutex(IntPtr m)
+        /// <summary>
+        ///     Lock the mutex  (Returns 0, or -1 on error)
+        /// </summary>
+        /// <returns>
+        ///     Lock the mutex  (Returns 0, or -1 on error)
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>#define SDL_LockMutex(m)	SDL_mutexP(m)</code>
+        ///     </p>
+        /// </remarks>
+        public static int SDL_LockMutex(IntPtr m)
+        {
+            return SDL_mutexP(m);
+        }
+        #endregion int SDL_LockMutex(IntPtr m)
+
+        #region int SDL_mutexV(IntPtr mutex)
+        /// <summary>
+        ///     Unlock the mutex  (Returns 0, or -1 on error)
+        /// </summary>
+        /// <returns>
+        ///     Unlock the mutex  (Returns 0, or -1 on error)
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_mutexV(SDL_mutex *mutex)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_mutexV(IntPtr mutex);
+        #endregion int SDL_mutexV(IntPtr mutex)
+
+        #region int SDL_UnlockMutex(IntPtr m)
+        /// <summary>
+        ///     Unlock the mutex  (Returns 0, or -1 on error)
+        /// </summary>
+        /// <returns>
+        ///     unlock the mutex  (Returns 0, or -1 on error)
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>#define SDL_UnlockMutex(m)	SDL_mutexP(m)</code>
+        ///     </p>
+        /// </remarks>
+        public static int SDL_UnlockMutex(IntPtr m)
+        {
+            return SDL_mutexV(m);
+        }
+        #endregion int SDL_UnlockMutex(IntPtr m)
+
+        #region void SDL_DestroyMutex(IntPtr mutex)
+        /// <summary>
+        ///     Destroy a mutex
+        /// </summary>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex *mutex)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_DestroyMutex(IntPtr mutex);
+        #endregion void SDL_DestroyMutex(IntPtr mutex)
+
+        #region IntPtr SDL_CreateSemaphore(int initial_value)
+        /// <summary>
+        ///     Create a semaphore, initialized with value, returns NULL on failure.
+        /// </summary>
+        /// <returns>
+        /// Create a semaphore, initialized with value, returns NULL on failure.
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC SDL_sem * SDLCALL SDL_CreateSemaphore(Uint32 initial_value)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_CreateSemaphore(int initial_value);
+        #endregion IntPtr SDL_CreateSemaphore(int initial_value)
+
+        #region IntPtr SDL_CreateSemaphore(uint initial_value)
+        /// <summary>
+        ///     Create a semaphore, initialized with value, returns NULL on failure.
+        /// </summary>
+        /// <returns>
+        /// Create a semaphore, initialized with value, returns NULL on failure.
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC SDL_sem * SDLCALL SDL_CreateSemaphore(Uint32 initial_value)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern IntPtr SDL_CreateSemaphore(uint initial_value);
+        #endregion IntPtr SDL_CreateSemaphore(uint initial_value)
+
+        #region void SDL_DestroySemaphore(IntPtr sem)
+        /// <summary>
+        /// Destroy a semaphore
+        /// </summary>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem *sem)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_DestroySemaphore(IntPtr sem);
+        #endregion void SDL_DestroySemaphore(IntPtr sem)
+
+        #region int SDL_SemWait(IntPtr sem)
+        /// <summary>
+        /// This function suspends the calling thread until the semaphore pointed 
+        /// to by sem has a positive count. 
+        /// It then atomically decreases the semaphore count.
+        /// </summary>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem *sem)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SemWait(IntPtr sem);
+        #endregion int SDL_SemWait(IntPtr sem)
+
+        #region int SDL_SemTryWait(IntPtr sem)
+        /// <summary>
+        /// Non-blocking variant of SDL_SemWait(), 
+        /// returns 0 if the wait succeeds, 
+        /// SDL_MUTEX_TIMEDOUT if the wait would block, and -1 on error.
+        /// </summary>
+        /// <returns>
+        /// Non-blocking variant of SDL_SemWait(), 
+        /// returns 0 if the wait succeeds,
+        /// SDL_MUTEX_TIMEDOUT if the wait would block, and -1 on error.
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem *sem)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SemtryWait(IntPtr sem);
+        #endregion int SDL_SemTryWait(IntPtr sem)
+
+        #region int SDL_SemWaitTimeout(IntPtr sem, int ms)
+        /// <summary>
+        /// Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if
+        /// the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in
+        /// the allotted time, and -1 on error.
+        /// On some platforms this function is implemented by looping with a delay
+        /// of 1 ms, and so should be avoided if possible.
+        /// </summary>
+        /// <returns>
+        /// Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if
+        /// the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in
+        /// the allotted time, and -1 on error.
+        /// On some platforms this function is implemented by looping with a delay
+        /// of 1 ms, and so should be avoided if possible.
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem *sem, Uint32 ms)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SemWaitTimeout(IntPtr sem, int ms);
+        #endregion int SDL_SemWaitTimeout(IntPtr sem, int ms)
+
+        #region int SDL_SemWaitTimeout(IntPtr sem, uint ms)
+        /// <summary>
+        /// Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if
+        /// the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in
+        /// the allotted time, and -1 on error.
+        /// On some platforms this function is implemented by looping with a delay
+        /// of 1 ms, and so should be avoided if possible.
+        /// </summary>
+        /// <returns>
+        /// Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if
+        /// the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in
+        /// the allotted time, and -1 on error.
+        /// On some platforms this function is implemented by looping with a delay
+        /// of 1 ms, and so should be avoided if possible.
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem *sem, Uint32 ms)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_SemWaitTimeout(IntPtr sem, uint ms);
+        #endregion int SDL_SemWaitTimeout(IntPtr sem, uint ms)
+
+        #region int SDL_SemPost(IntPtr sem)
+        /// <summary>
+        /// Atomically increases the semaphore's count (not blocking), 
+        /// returns 0, or -1 on error.
+        /// </summary>
+        /// <returns>
+        /// Atomically increases the semaphore's count (not blocking), 
+        /// returns 0, or -1 on error.
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem *sem)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SemPost(IntPtr sem);
+        #endregion int SDL_SemPost(IntPtr sem)
+
+        #region int SDL_SemValue(IntPtr sem)
+        /// <summary>
+        /// Returns the current count of the semaphore
+        /// </summary>
+        /// <returns>
+        /// Returns the current count of the semaphore
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem *sem)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SemValue(IntPtr sem);
+        #endregion int SDL_SemValue(IntPtr sem)
+
+        #region IntPtr SDL_CreateCond()
+        /// <summary>
+        /// Create a condition variable
+        /// </summary>
+        /// <returns>
+        /// intPtr to variable
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC SDL_cond * SDLCALL SDL_CreateCond(void)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_CreateCond();
+        #endregion IntPtr SDL_CreateCond()
+
+        #region void SDL_DestroyCond(IntPtr cond)
+        /// <summary>
+        /// Destroy a condition variable
+        /// </summary>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond *cond)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_DestroyCond(IntPtr cond);
+        #endregion void SDL_DestroyCond(IntPtr cond)
+
+        #region int SDL_CondSignal(IntPtr cond)
+        /// <summary>
+        /// Restart one of the threads that are waiting on the condition variable,
+        /// returns 0 or -1 on error.
+        /// </summary>
+        /// <returns>
+        /// Restart one of the threads that are waiting on the condition variable,
+        /// returns 0 or -1 on error.
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond *cond)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CondSignal(IntPtr cond);
+        #endregion int SDL_CondSignal(IntPtr cond)
+
+        #region int SDL_CondBroadcast(IntPtr cond)
+        /// <summary>
+        /// Restart all threads that are waiting on the condition variable, 
+        /// returns 0 or -1 on error.
+        /// </summary>
+        /// <returns>
+        /// Restart all threads that are waiting on the condition variable,
+        /// returns 0 or -1 on error.
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond *cond)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CondBroadcast(IntPtr cond);
+        #endregion int SDL_CondBroadcast(IntPtr cond)
+
+        #region int SDL_CondWait(IntPtr cond, IntPtr mut)
+        /// <summary>
+        /// Wait on the condition variable, unlocking the provided mutex.
+        /// The mutex must be locked before entering this function!
+        /// Returns 0 when it is signaled, or -1 on error.
+        /// </summary>
+        /// <returns>
+        /// Wait on the condition variable, unlocking the provided mutex.
+        /// The mutex must be locked before entering this function!
+        /// Returns 0 when it is signaled, or -1 on error.
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond *cond, SDL_mutex *mut)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CondWait(IntPtr cond, IntPtr mut);
+        #endregion int SDL_CondWait(IntPtr cond, IntPtr mut)
+
+        #region int SDL_CondWaitTimeout(IntPtr cond, IntPtr mutex, int ms)
+        /// <summary>
+        /// Waits for at most 'ms' milliseconds, and returns 0 if the condition 
+        /// variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not
+        /// signaled in the allotted time, and -1 on error.
+        /// On some platforms this function is implemented by looping with a delay
+        /// of 1 ms, and so should be avoided if possible.
+        /// </summary>
+        /// <returns>
+        /// returns 0 if the condition 
+        /// variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not
+        /// signaled in the allotted time, and -1 on error
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, Uint32 ms)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_CondWaitTimeout(IntPtr cond, IntPtr mutex, int ms);
+        #endregion int SDL_CondWaitTimeout(IntPtr cond, IntPtr mutex, int ms)
+
+        #region int SDL_CondWaitTimeout(IntPtr cond, IntPtr mutex, uint ms)
+        /// <summary>
+        /// Waits for at most 'ms' milliseconds, and returns 0 if the condition 
+        /// variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not
+        /// signaled in the allotted time, and -1 on error.
+        /// On some platforms this function is implemented by looping with a delay
+        /// of 1 ms, and so should be avoided if possible.
+        /// </summary>
+        /// <returns>
+        /// returns 0 if the condition 
+        /// variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not
+        /// signaled in the allotted time, and -1 on error
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_mutex.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, Uint32 ms)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_CondWaitTimeout(IntPtr cond, IntPtr mutex, uint ms);
+        #endregion int SDL_CondWaitTimeout(IntPtr cond, IntPtr mutex, uint ms)
+
+        #endregion SDL_mutex.h
+
+        #region SDL_name.h
+        #region string SDL_NAME(string x)
+        /// <summary>
+        ///     Returns SDL name
+        /// </summary>
+        /// <param name="x">input name</param>
+        /// <returns>Returns SDL name</returns>
+        public static string SDL_NAME(string x)
+        {
+            return "SDL_" + x;
+        }
+        #endregion string SDL_NAME(string x)
+        #endregion SDL_name.h
+
+        // SDL_opengl.h -- TODO: superceded by Tao.OpenGL?
+        // SDL_platform.h -- none
+        // SDL_quit.h -- none
+
+        #region SDL_quit.h
+        #region int SDL_QuitRequested()
+        /// <summary>
+        ///     Checks if SDL_Quit event has been requested
+        /// </summary>
+        /// <returns>
+        /// Returns 1 if a SDL_Quit Event has been requested. 
+        /// Returns 0 if no SDL_Quit event has been requeted.
+        /// </returns>
+        public static int SDL_QuitRequested()
+        {
+            Sdl.SDL_PumpEvents();
+            return Sdl.SDL_PeepEvents(null, 0, Sdl.SDL_PEEKEVENT, Sdl.SDL_QUITMASK);
+        }
+        #endregion int SDL_QuitRequested()
+        #endregion SDL_quit.h
+
+        #region SDL_rwops.h
+        // This a is bare-minimum implementation. 
+        // More bindings may be needed in the future
+        #region IntPtr SDL_RWFromFile(string file, string mode)
+        /// <summary>
+        /// Create SDL_RWops structures from file.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_rwops.h:
+        /// <code>
+        /// SDL_RWops * SDLCALL SDL_RWFromFile(const char *file, const char *mode)
+        /// </code></p></remarks>
+        /// <param name="file"></param>
+        /// <param name="mode">"rb"</param>
+        /// <returns>IntPtr to SDL_RWops</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_RWFromFile(string file, string mode);
+        #endregion IntPtr SDL_RWFromFile(string file, string mode)
+
+        #region IntPtr SDL_RWFromMem(IntPtr mem, int size)
+        /// <summary>
+        /// Create SDL_RWops structures from memory.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_rwops.h:
+        /// <code>
+        /// SDL_RWops * SDLCALL SDL_RWFromMem(void *mem, int size)
+        /// </code></p></remarks>
+        /// <param name="mem"></param>
+        /// <param name="size"></param>
+        /// <returns>IntPtr to SDL_RWops</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_RWFromMem(IntPtr mem, int size);
+        #endregion IntPtr SDL_RWFromMem(IntPtr mem, int size)
+
+        #region IntPtr SDL_RWFromMem(byte[] mem, int size)
+        /// <summary>
+        /// Create SDL_RWops structures from memory.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_rwops.h:
+        /// <code>
+        /// SDL_RWops * SDLCALL SDL_RWFromMem(void *mem, int size)
+        /// </code></p></remarks>
+        /// <param name="mem"></param>
+        /// <param name="size"></param>
+        /// <returns>IntPtr to SDL_RWops</returns>
+        public static IntPtr SDL_RWFromMem(byte[] mem, int size)
+        {
+            // Wraps SDL_RWFromMem to allow simpler access
+            IntPtr i = Marshal.AllocHGlobal(mem.Length);
+            Marshal.Copy(mem, 0, i, mem.Length);
+            IntPtr r = SDL_RWFromMem(i, size);
+
+            // If the IntPtr to the memory is freed here, some things will fail later (ie, SdlTtf.TTF_OpenFontRW)
+            //Marshal.FreeHGlobal(i);
+            return r;
+        }
+        #endregion IntPtr SDL_RWFromMem(byte[] mem, int size)
+
+        #region IntPtr SDL_RWFromFP(IntPtr fp, int autoclose)
+        /// <summary>
+        /// SDL_RWFromFP creates a new SDL_RWops structure from a file pointer, opened with stdio. If autoclose is nonzero, the file will be automatically closed when the RWops structure is closed.
+        /// </summary>
+        /// <remarks>This is not available under Win32, since files opened in an application on that platform cannot be used by a dynamically linked library.</remarks>
+        /// <param name="fp"></param>
+        /// <param name="autoclose"></param>
+        /// <returns>Returns pointer to a new RWops structure, or NULL if it fails.</returns>
+        /// <example>
+        /// <code>
+        /// FILE *fp;
+        /// SDL_RWops *rw;
+        /// 
+        /// fp = fopen("myfile.dat", "rb");
+        /// rw = SDL_RWFromFP(fp, 1);
+        /// 
+        /// // Do things with rw...
+        /// SDL_RWclose(rw); // Automatically does an fclose(fp)
+        /// </code></example>
+        /// <seealso cref="SDL_RWFromFile"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_RWFromFP(IntPtr fp, int autoclose);
+        #endregion IntPtr SDL_RWFromFP(IntPtr fp, int autoclose)
+
+        #region IntPtr SDL_RWFromConstMem(IntPtr mem, int size)
+        /// <summary>
+        /// Prepares a constant memory area for use with RWops.
+        /// </summary>
+        /// <remarks><see cref="SDL_RWFromConstMem"/> sets up a RWops struct based on a memory area of a certain size. It assumes the memory area is not writable.</remarks>
+        /// <param name="mem"></param>
+        /// <param name="size"></param>
+        /// <returns>Returns a pointer to a new RWops struct, or NULL if it fails.</returns>
+        /// <example>
+        /// <code>
+        /// char bitmap[] = {
+        ///		66, 77, 86, 2, 0, 0, 0, 0 ...
+        ///	}
+        ///	 SDL_RWops *rw;
+        ///	 SDL_Surface *img;
+        ///	 
+        ///	 rw = SDL_RWFromConstMem(bitmap, sizeof(bitmap));
+        ///	 img = SDL_LoadBMP_RW(rw, 1); // Automatically frees the RWops struct for us
+        ///	 
+        ///	 //Do something with img...
+        /// </code></example>
+        /// <seealso cref="SDL_RWFromMem(IntPtr, int)"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_RWFromConstMem(IntPtr mem, int size);
+        #endregion IntPtr SDL_RWFromConstMem(IntPtr mem, int size)
+
+        #region IntPtr SDL_AllocRW()
+        /// <summary>
+        /// Allocates an empty, unpopulated SDL_RWops structure.
+        /// </summary>
+        /// <remarks>SDL_AllocRW allocates an empty, unpopulated SDL_RWops structure. You must fill out the fields yourself.</remarks>
+        /// <returns>Returns a pointer to the allocated memory on success, or NULL on error.
+        /// <p>You must free any memory allocated with <see cref="SDL_AllocRW"/> with <see cref="SDL_FreeRW"/>. Depending on your operating system and compiler, there may be a difference between the malloc() and free() your program uses and the versions SDL calls internally. Trying to mix the two can cause crashing such as segmentation faults.</p></returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_AllocRW();
+        #endregion IntPtr SDL_AllocRW()
+
+        #region void SDL_FreeRW(IntPtr context)
+        /// <summary>
+        /// Frees an SDL_RWops structure allocated by <see cref="SDL_AllocRW"/>.
+        /// </summary>
+        /// <remarks><see cref="SDL_FreeRW"/> frees an SDL_RWops structure previously allocated by <see cref="SDL_AllocRW"/>. Only use it on memory allocated by <see cref="SDL_AllocRW"/>. Any extra memory allocated during creation of the RWops is not freed by <see cref="SDL_FreeRW"/>; the programmer must be responsible for it.</remarks>
+        /// <param name="context"></param>
+        /// <example>
+        /// <code>
+        /// #include "SDL_rwops.h"
+        /// void dumb_example()
+        /// {
+        ///     SDL_RWops *rw=SDL_AllocRW();
+        ///     if(rw==NULL) return;
+        ///     SDL_FreeRW(rw);
+        /// }
+        /// </code></example>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_FreeRW(IntPtr context);
+        #endregion void SDL_FreeRW(IntPtr context);
+
+        #region short SDL_ReadLE16(IntPtr src)
+        /// <summary>
+        /// Read an item of the specified endianness and return in native format.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops *src)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="src"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern short SDL_ReadLE16(IntPtr src);
+        #endregion short SDL_ReadLE16(IntPtr src)
+
+        #region short SDL_ReadBE16(IntPtr src)
+        /// <summary>
+        /// Read an item of the specified endianness and return in native format.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops *src)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="src"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern short SDL_ReadBE16(IntPtr src);
+        #endregion short SDL_ReadBE16(IntPtr src)
+
+        #region int SDL_ReadLE32(IntPtr src)
+        /// <summary>
+        /// Read an item of the specified endianness and return in native format.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops *src)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="src"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_ReadLE32(IntPtr src);
+        #endregion int SDL_ReadLE32(IntPtr src)
+
+        #region int SDL_ReadBE32(IntPtr src)
+        /// <summary>
+        /// Read an item of the specified endianness and return in native format.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops *src)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="src"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_ReadBE32(IntPtr src);
+        #endregion int SDL_ReadBE32(IntPtr src)
+
+        #region long SDL_ReadLE64(IntPtr src)
+        /// <summary>
+        /// Read an item of the specified endianness and return in native format.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops *src)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="src"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern long SDL_ReadLE64(IntPtr src);
+        #endregion long SDL_ReadLE64(IntPtr src)
+
+        #region long SDL_ReadBE64(IntPtr src)
+        /// <summary>
+        /// Read an item of the specified endianness and return in native format.
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops *src)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="src"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern long SDL_ReadBE64(IntPtr src);
+        #endregion long SDL_ReadBE64(IntPtr src)
+
+        #region int SDL_WriteLE16(IntPtr dst, short val)
+        /// <summary>
+        /// Write an item of native format to the specified endianness
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC int SDLCALL SDL_WriteLE16(SDL_RWops *dst, Uint16 value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="dst"></param>
+        /// <param name="val"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WriteLE16(IntPtr dst, short val);
+        #endregion int SDL_WriteLE16(IntPtr dst, short val)
+
+        #region int SDL_WriteLE16(IntPtr dst, ushort val)
+        /// <summary>
+        /// Write an item of native format to the specified endianness
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC int SDLCALL SDL_WriteLE16(SDL_RWops *dst, Uint16 value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="dst"></param>
+        /// <param name="val"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_WriteLE16(IntPtr dst, ushort val);
+        #endregion int SDL_WriteLE16(IntPtr dst, ushort val)
+
+        #region int SDL_WriteBE16(IntPtr dst, short val)
+        /// <summary>
+        /// Write an item of native format to the specified endianness
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC int SDLCALL SDL_WriteBE16(SDL_RWops *dst, Uint16 value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="dst"></param>
+        /// <param name="val"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WriteBE16(IntPtr dst, short val);
+        #endregion int SDL_WriteBE16(IntPtr dst, short val)
+
+        #region int SDL_WriteBE16(IntPtr dst, ushort val)
+        /// <summary>
+        /// Write an item of native format to the specified endianness
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC int SDLCALL SDL_WriteBE16(SDL_RWops *dst, Uint16 value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="dst"></param>
+        /// <param name="val"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_WriteBE16(IntPtr dst, ushort val);
+        #endregion int SDL_WriteBE16(IntPtr dst, ushort val)
+
+        #region int SDL_WriteLE32(IntPtr dst, int val)
+        /// <summary>
+        /// Write an item of native format to the specified endianness
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC int SDLCALL SDL_WriteLE32(SDL_RWops *dst, Uint32 value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="dst"></param>
+        /// <param name="val"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WriteLE32(IntPtr dst, int val);
+        #endregion int SDL_WriteLE32(IntPtr dst, int val)
+
+        #region int SDL_WriteLE32(IntPtr dst, uint val)
+        /// <summary>
+        /// Write an item of native format to the specified endianness
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC int SDLCALL SDL_WriteLE32(SDL_RWops *dst, Uint32 value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="dst"></param>
+        /// <param name="val"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_WriteLE32(IntPtr dst, uint val);
+        #endregion int SDL_WriteLE32(IntPtr dst, uint val)
+
+        #region int SDL_WriteBE32(IntPtr dst, int val)
+        /// <summary>
+        /// Write an item of native format to the specified endianness
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC int SDLCALL SDL_WriteBE32(SDL_RWops *dst, Uint32 value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="dst"></param>
+        /// <param name="val"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WriteBE32(IntPtr dst, int val);
+        #endregion int SDL_WriteBE32(IntPtr dst, int val)
+
+        #region int SDL_WriteBE32(IntPtr dst, uint val)
+        /// <summary>
+        /// Write an item of native format to the specified endianness
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC int SDLCALL SDL_WriteBE32(SDL_RWops *dst, Uint32 value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="dst"></param>
+        /// <param name="val"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_WriteBE32(IntPtr dst, uint val);
+        #endregion int SDL_WriteBE32(IntPtr dst, uint val)
+
+        #region int SDL_WriteLE64(IntPtr dst, long val)
+        /// <summary>
+        /// Write an item of native format to the specified endianness
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC int SDLCALL SDL_WriteLE64(SDL_RWops *dst, Uint64 value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="dst"></param>
+        /// <param name="val"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WriteLE64(IntPtr dst, long val);
+        #endregion int SDL_WriteLE64(IntPtr dst, long val)
+
+        #region int SDL_WriteBE64(IntPtr dst, long val)
+        /// <summary>
+        /// Write an item of native format to the specified endianness
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function in SDL_rwops.h
+        /// <code>
+        /// extern DECLSPEC int SDLCALL SDL_WriteBE64(SDL_RWops *dst, Uint64 value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="dst"></param>
+        /// <param name="val"></param>
+        /// <seealso cref="SDL_AllocRW"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WriteBE64(IntPtr dst, long val);
+        #endregion int SDL_WriteBE64(IntPtr dst, long val)
+
+        //TODO
+        //		/* Macros to easily read and write from an SDL_RWops structure */
+        //#define SDL_RWseek(ctx, offset, whence)	(ctx)->seek(ctx, offset, whence)
+        //#define SDL_RWtell(ctx)			(ctx)->seek(ctx, 0, RW_SEEK_CUR)
+        //#define SDL_RWread(ctx, ptr, size, n)	(ctx)->read(ctx, ptr, size, n)
+        //#define SDL_RWwrite(ctx, ptr, size, n)	(ctx)->write(ctx, ptr, size, n)
+        //#define SDL_RWclose(ctx)		(ctx)->close(ctx)
+        #endregion SDL_rwops.h
+
+        #region SDL_stdinc.h
+        // TODO There is a lot more code, but it appears to consist of private functions.
+
+        #region int SDL_putenv(string variable)
+        /// <summary>
+        ///     Puts a variable of the form "name=value" into the environment.
+        /// </summary>
+        /// <param name="variable">
+        ///     The "name=value" pair to write to the environment.
+        /// </param>
+        /// <returns>
+        ///     Returns -1 on an error or 0 on success.
+        /// </returns>
+        /// <remarks>
+        ///     Not all environments have a working putenv(). SDL_putenv() is not available on Windows.
+        ///     <p>
+        ///     Binds to C-function call in SDL_getenv.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_putenv(const char *variable)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_getenv" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_putenv(string variable);
+        #endregion int SDL_putenv(string variable)
+
+        #region string SDL_getenv(string name)
+        /// <summary>
+        ///     Retrieves a variable from the environment.
+        /// </summary>
+        /// <param name="name">
+        ///     The name of the environmental variable to retrieve.
+        /// </param>
+        /// <returns>
+        ///     The value of the specified environmental variable.
+        /// </returns>
+        /// <remarks>
+        ///     Not all environments have a working getenv(). SDL_getenv() is not available on Windows.
+        ///     <p>Binds to C-function call in SDL_getenv.h:
+        ///     <code>extern DECLSPEC char * SDLCALL SDL_getenv(const char *name)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_putenv" />
+        public static string SDL_getenv(string name)
+        {
+            StringBuilder stringBuilder = new StringBuilder(name);
+            __SDL_getenv(stringBuilder);
+            return stringBuilder.ToString();
+        }
+
+        // Called from SDL_getenv()
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_getenv"), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr __SDL_getenv(StringBuilder name);
+        #endregion string SDL_getenv(string name)
+        #endregion SDL_stdinc.h
+
+        #region SDL_syswm.h
+        /// <summary>
+        ///	Gives you custom hooks into the window manager information.
+        /// </summary>
+        /// <remarks>
+        /// This function gives you custom hooks into the window manager information.
+        /// It fills the structure pointed to by 'info' with custom information and
+        /// returns 1 if the function is implemented.  If it's not implemented, or
+        /// the version member of the 'info' structure is invalid, it returns 0. 
+        /// 
+        /// You typically use this function like this:
+        /// SDL_SysWMInfo info;
+        /// SDL_VERSION(&info.version);
+        /// if ( SDL_GetWMInfo(&info) ) { ... }
+        /// <p>Binds to C-function call in SDL_rwops.h:
+        /// <code>extern DECLSPEC int SDLCALL SDL_GetWMInfo(SDL_SysWMinfo *info)</code>
+        ///	</p>
+        /// </remarks>
+        /// <param name="info">
+        /// 	IntPtr to SDL_SysWMinfo struct
+        /// </param>
+        /// <returns>
+        /// It fills the structure pointed to by 'info' 
+        /// with custom information and
+        /// returns 1 if the function is implemented.  If it's not implemented, or
+        /// the version member of the 'info' structure is invalid, it returns 0.
+        /// </returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GetWMInfo(out Sdl.SDL_SysWMinfo_Unix info);
+
+        /// <summary>
+        ///	Gives you custom hooks into the window manager information.
+        /// </summary>
+        /// <remarks>
+        /// This function gives you custom hooks into the window manager information.
+        /// It fills the structure pointed to by 'info' with custom information and
+        /// returns 1 if the function is implemented.  If it's not implemented, or
+        /// the version member of the 'info' structure is invalid, it returns 0. 
+        /// 
+        /// You typically use this function like this:
+        /// SDL_SysWMInfo info;
+        /// SDL_VERSION(&info.version);
+        /// if ( SDL_GetWMInfo(&info) ) { ... }
+        /// <p>Binds to C-function call in SDL_rwops.h:
+        /// <code>extern DECLSPEC int SDLCALL SDL_GetWMInfo(SDL_SysWMinfo *info)</code>
+        ///	</p>
+        /// </remarks>
+        /// <param name="info">
+        /// 	IntPtr to SDL_SysWMinfo struct
+        /// </param>
+        /// <returns>
+        /// It fills the structure pointed to by 'info' 
+        /// with custom information and
+        /// returns 1 if the function is implemented.  If it's not implemented, or
+        /// the version member of the 'info' structure is invalid, it returns 0.
+        /// </returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GetWMInfo(out Sdl.SDL_SysWMinfo_Windows info);
+
+        /// <summary>
+        ///	Gives you custom hooks into the window manager information.
+        /// </summary>
+        /// <remarks>
+        /// This function gives you custom hooks into the window manager information.
+        /// It fills the structure pointed to by 'info' with custom information and
+        /// returns 1 if the function is implemented.  If it's not implemented, or
+        /// the version member of the 'info' structure is invalid, it returns 0. 
+        /// 
+        /// You typically use this function like this:
+        /// SDL_SysWMInfo info;
+        /// SDL_VERSION(&info.version);
+        /// if ( SDL_GetWMInfo(&info) ) { ... }
+        /// <p>Binds to C-function call in SDL_rwops.h:
+        /// <code>extern DECLSPEC int SDLCALL SDL_GetWMInfo(SDL_SysWMinfo *info)</code>
+        ///	</p>
+        /// </remarks>
+        /// <param name="info">
+        /// 	IntPtr to SDL_SysWMinfo struct
+        /// </param>
+        /// <returns>
+        /// It fills the structure pointed to by 'info' 
+        /// with custom information and
+        /// returns 1 if the function is implemented.  If it's not implemented, or
+        /// the version member of the 'info' structure is invalid, it returns 0.
+        /// </returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GetWMInfo(out Sdl.SDL_SysWMinfo_RiscOS info);
+
+        /// <summary>
+        ///	Gives you custom hooks into the window manager information.
+        /// </summary>
+        /// <remarks>
+        /// This function gives you custom hooks into the window manager information.
+        /// It fills the structure pointed to by 'info' with custom information and
+        /// returns 1 if the function is implemented.  If it's not implemented, or
+        /// the version member of the 'info' structure is invalid, it returns 0. 
+        /// 
+        /// You typically use this function like this:
+        /// SDL_SysWMInfo info;
+        /// SDL_VERSION(&info.version);
+        /// if ( SDL_GetWMInfo(&info) ) { ... }
+        /// <p>Binds to C-function call in SDL_rwops.h:
+        /// <code>extern DECLSPEC int SDLCALL SDL_GetWMInfo(SDL_SysWMinfo *info)</code>
+        ///	</p>
+        /// </remarks>
+        /// <param name="info">
+        /// 	IntPtr to SDL_SysWMinfo struct
+        /// </param>
+        /// <returns>
+        /// It fills the structure pointed to by 'info' 
+        /// with custom information and
+        /// returns 1 if the function is implemented.  If it's not implemented, or
+        /// the version member of the 'info' structure is invalid, it returns 0.
+        /// </returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GetWMInfo(out Sdl.SDL_SysWMinfo info);
+        #endregion SDL_syswm.h
+
+        #region SDL_thread.h
+        #region IntPtr SDL_CreateThread(ThreadDelegate fn, object data)
+        /// <summary>
+        ///     Create thread
+        /// </summary>
+        /// <returns>
+        ///     IntPtr to SDL_Thread struct
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_thread.h:
+        ///     <code>extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_CreateThread(ThreadDelegate fn, object data);
+        #endregion IntPtr SDL_CreateThread(ThreadDelegate fn, object data)
+
+        #region int SDL_ThreadID()
+        /// <summary>
+        ///     Get the 32-bit thread identifier for the current thread
+        /// </summary>
+        /// <returns>
+        ///     ID
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_thread.h:
+        ///     <code>extern DECLSPEC Uint32 SDLCALL SDL_ThreadID(void)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_ThreadID();
+        #endregion int SDL_ThreadID()
+
+        #region int SDL_GetThreadID(IntPtr thread)
+        /// <summary>
+        ///     Get the 32-bit thread identifier for the specified thread,
+        ///		equivalent to SDL_ThreadID() if the specified thread is NULL.
+        /// </summary>
+        /// <returns>
+        ///     ID
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_thread.h:
+        ///     <code>extern DECLSPEC Uint32 SDLCALL SDL_GetThreadID(SDL_Thread *thread)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GetThreadID(IntPtr thread);
+        #endregion int SDL_GetThreadID(IntPtr thread)
+
+        #region void SDL_WaitThread(IntPtr thread, out int status)
+        /// <summary>
+        ///     Wait for a thread to finish.
+        ///     The return code for the thread function is placed in the area
+        ///     pointed to by 'status', if 'status' is not NULL.
+        /// </summary>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_thread.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_WaitThread(IntPtr thread, out int status);
+        #endregion void SDL_WaitThread(IntPtr thread, out int status)
+
+        #region void SDL_KillThread(IntPtr thread)
+        /// <summary>
+        ///     Forcefully kill a thread without worrying about its state
+        /// </summary>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_thread.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread *thread)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_KillThread(IntPtr thread);
+        #endregion void SDL_KillThread(IntPtr thread)
+
+        #endregion SDL_thread.h
+
+        #region SDL_timer.h
+        #region int SDL_GetTicks()
+        /// <summary>
+        ///     Get the number of milliseconds since the SDL library initialization.
+        /// </summary>
+        /// <returns>
+        ///     The number of milliseconds since SDL was initialized.
+        /// </returns>
+        /// <remarks>
+        ///     Note that this value wraps if the program runs for more than ~49 days.
+        ///     <p>
+        ///     Binds to C-function call in SDL_timer.h:
+        ///     <code>extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_Delay(int)" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GetTicks();
+        #endregion int SDL_GetTicks()
+
+        #region SDL_Delay(int ms)
+        /// <summary>
+        ///     Wait a specified number of milliseconds before returning.
+        /// </summary>
+        /// <param name="ms">
+        ///     The number of milliseconds to wait.
+        /// </param>
+        /// <remarks>
+        ///     <b>SDL_Delay</b> will wait at least the specified time, but possible longer due
+        ///     to OS scheduling.  Count on a delay granularity of at least 10 ms.  Some
+        ///     platforms have shorter clock ticks but this is the most common.
+        ///     <p>
+        ///     Binds to C-function call in SDL_timer.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_AddTimer(int, SDL_NewTimerCallback)" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_Delay(int ms);
+        #endregion SDL_Delay(int ms)
+
+        #region SDL_Delay(uint ms)
+        /// <summary>
+        ///     Wait a specified number of milliseconds before returning.
+        /// </summary>
+        /// <param name="ms">
+        ///     The number of milliseconds to wait.
+        /// </param>
+        /// <remarks>
+        ///     <b>SDL_Delay</b> will wait at least the specified time, but possible longer due
+        ///     to OS scheduling.  Count on a delay granularity of at least 10 ms.  Some
+        ///     platforms have shorter clock ticks but this is the most common.
+        ///     <p>
+        ///     Binds to C-function call in SDL_timer.h:
+        ///     <code>extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_AddTimer(int, SDL_NewTimerCallback)" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern void SDL_Delay(uint ms);
+        #endregion SDL_Delay(uint ms)
+
+        #region int SDL_SetTimer(int interval, SDL_TimerCallback callback)
+        /// <summary>
+        ///     Set a callback to run after the specified number of milliseconds has elapsed.
+        /// </summary>
+        /// <param name="interval">
+        ///     The timer interval.
+        /// </param>
+        /// <param name="callback">
+        ///     The callback to run.
+        /// </param>
+        /// <returns>
+        ///     The next timer interval.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The callback function is passed the current timer interval and returns the
+        ///         next timer interval.  If the returned value is the same as the one passed
+        ///         in, the periodic alarm continues, otherwise a new alarm is scheduled.
+        ///     </para>
+        ///     <para>
+        ///         To cancel a currently running timer, call <c>Sdl.SDL_SetTimer(0, null);</c>
+        ///     </para>
+        ///     <para>
+        ///         The timer callback function may run in a different thread than your main
+        ///         constant, and so shouldn't call any functions from within itself.
+        ///     </para>
+        ///     <para>
+        ///         The maximum resolution of this timer is 10 ms, which means that if you
+        ///         request a 16 ms timer, your callback will run approximately 20 ms later on
+        ///         an unloaded system.  If you wanted to set a flag signaling a frame update at
+        ///         30 frames per second (every 33 ms), you might set a timer for 30 ms.
+        ///     </para>
+        ///     <para>
+        ///         If you use this function, you need to pass <see cref="SDL_INIT_TIMER" /> to
+        ///         <see cref="SDL_Init(int)" />.
+        ///     </para>
+        ///     <para>
+        ///         This function is kept for compatibility but has been superseded by the new
+        ///         timer functions <see cref="SDL_AddTimer(int, SDL_NewTimerCallback)" /> and
+        ///         <see cref="SDL_RemoveTimer" /> which support multiple timers.
+        ///     </para>
+        ///     <p>
+        ///     Binds to C-function call in SDL_timer.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_SetTimer(Uint32 interval, 
+        ///     SDL_TimerCallback callback)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_AddTimer(int, SDL_NewTimerCallback)" />
+        /// <seealso cref="SDL_TimerCallback" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SetTimer(int interval, SDL_TimerCallback callback);
+        #endregion int SDL_SetTimer(int interval, SDL_TimerCallback callback)
+
+        #region int SDL_SetTimer(uint interval, SDL_TimerCallback callback)
+        /// <summary>
+        ///     Set a callback to run after the specified number of milliseconds has elapsed.
+        /// </summary>
+        /// <param name="interval">
+        ///     The timer interval.
+        /// </param>
+        /// <param name="callback">
+        ///     The callback to run.
+        /// </param>
+        /// <returns>
+        ///     The next timer interval.
+        /// </returns>
+        /// <remarks>
+        ///     <para>
+        ///         The callback function is passed the current timer interval and returns the
+        ///         next timer interval.  If the returned value is the same as the one passed
+        ///         in, the periodic alarm continues, otherwise a new alarm is scheduled.
+        ///     </para>
+        ///     <para>
+        ///         To cancel a currently running timer, call <c>Sdl.SDL_SetTimer(0, null);</c>
+        ///     </para>
+        ///     <para>
+        ///         The timer callback function may run in a different thread than your main
+        ///         constant, and so shouldn't call any functions from within itself.
+        ///     </para>
+        ///     <para>
+        ///         The maximum resolution of this timer is 10 ms, which means that if you
+        ///         request a 16 ms timer, your callback will run approximately 20 ms later on
+        ///         an unloaded system.  If you wanted to set a flag signaling a frame update at
+        ///         30 frames per second (every 33 ms), you might set a timer for 30 ms.
+        ///     </para>
+        ///     <para>
+        ///         If you use this function, you need to pass <see cref="SDL_INIT_TIMER" /> to
+        ///         <see cref="SDL_Init(int)" />.
+        ///     </para>
+        ///     <para>
+        ///         This function is kept for compatibility but has been superseded by the new
+        ///         timer functions <see cref="SDL_AddTimer(int, SDL_NewTimerCallback)" /> and
+        ///         <see cref="SDL_RemoveTimer" /> which support multiple timers.
+        ///     </para>
+        ///     <p>
+        ///     Binds to C-function call in SDL_timer.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_SetTimer(Uint32 interval, 
+        ///     SDL_TimerCallback callback)</code>
+        ///     </p>
+        /// </remarks>
+        // FIXME: <seealso cref="SDL_AddTimer(int, SDL_NewTimerCallback)" />
+        /// <seealso cref="SDL_TimerCallback" />
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_SetTimer(uint interval, SDL_TimerCallback callback);
+        #endregion int SDL_SetTimer(uint interval, SDL_TimerCallback callback)
+
+        #region SDL_TimerID SDL_AddTimer(int interval, SDL_NewTimerCallback callback)
+        // TODO: Goddamn void* double whammy since it's a delegate
+        // TODO write test
+        // extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param);
+        /// <summary>
+        ///     Add a timer which will call a callback after the 
+        ///     specified number of milliseconds has elapsed.
+        /// </summary>
+        /// <param name="callback">
+        /// The callback to run.
+        /// </param>
+        /// <param name="interval">
+        /// The timer interval.
+        /// </param>
+        /// <returns>
+        /// Returns an ID value for the added timer or NULL if 
+        /// there was an error.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// Adds a callback function to be run after the specified number of 
+        /// milliseconds has elapsed. The callback function is passed the current 
+        /// timer interval and the user supplied parameter from the SDL_AddTimer 
+        /// call and returns the next timer interval. If the returned value from 
+        /// the callback is the same as the one passed in, the periodic alarm 
+        /// continues, otherwise a new alarm is scheduled.
+        /// </para>
+        /// <para>
+        /// To cancel a currently running timer call <see cref="SDL_RemoveTimer" /> 
+        /// with the timer ID returned from SDL_AddTimer.
+        /// </para>
+        /// <para>
+        /// The timer callback function may run in a different thread than your main 
+        /// program, and so shouldn't call any functions from within itself.
+        /// You may always call SDL_PushEvent, however.
+        /// </para>
+        /// <para>
+        /// The granularity of the timer is platform-dependent, 
+        /// but you should count on it being at least 10 ms as this is the 
+        /// most common number. This means that if you request a 16 ms timer,
+        ///  your callback will run approximately 20 ms later on an unloaded 
+        ///  system. If you wanted to set a flag signaling a frame update at 
+        ///  30 frames per second (every 33 ms), you might set a timer for 
+        ///  30 ms (see example below). If you use this function, you need 
+        ///  to pass <see cref="SDL_INIT_TIMER" /> to <see cref="SDL_Init(int)" />.
+        /// </para>
+        /// <p>
+        ///     Binds to C-function call in SDL_timer.h:
+        ///     <code>extern DECLSPEC SDL_TimerID SDLCALL 
+        ///     SDL_AddTimer(Uint32 interval, 
+        ///     SDL_NewTimerCallback callback, void *param)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern SDL_TimerID SDL_AddTimer(int interval, SDL_NewTimerCallback callback);
+        #endregion SDL_TimerID SDL_AddTimer(int interval, SDL_NewTimerCallback callback)
+
+        #region SDL_TimerID SDL_AddTimer(uint interval, SDL_NewTimerCallback callback)
+        // TODO: Goddamn void* double whammy since it's a delegate
+        // TODO write test
+        // extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param);
+        /// <summary>
+        ///     Add a timer which will call a callback after the 
+        ///     specified number of milliseconds has elapsed.
+        /// </summary>
+        /// <param name="callback">
+        /// The callback to run.
+        /// </param>
+        /// <param name="interval">
+        /// The timer interval.
+        /// </param>
+        /// <returns>
+        /// Returns an ID value for the added timer or NULL if 
+        /// there was an error.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// Adds a callback function to be run after the specified number of 
+        /// milliseconds has elapsed. The callback function is passed the current 
+        /// timer interval and the user supplied parameter from the SDL_AddTimer 
+        /// call and returns the next timer interval. If the returned value from 
+        /// the callback is the same as the one passed in, the periodic alarm 
+        /// continues, otherwise a new alarm is scheduled.
+        /// </para>
+        /// <para>
+        /// To cancel a currently running timer call <see cref="SDL_RemoveTimer" /> 
+        /// with the timer ID returned from SDL_AddTimer.
+        /// </para>
+        /// <para>
+        /// The timer callback function may run in a different thread than your main 
+        /// program, and so shouldn't call any functions from within itself.
+        /// You may always call SDL_PushEvent, however.
+        /// </para>
+        /// <para>
+        /// The granularity of the timer is platform-dependent, 
+        /// but you should count on it being at least 10 ms as this is the 
+        /// most common number. This means that if you request a 16 ms timer,
+        ///  your callback will run approximately 20 ms later on an unloaded 
+        ///  system. If you wanted to set a flag signaling a frame update at 
+        ///  30 frames per second (every 33 ms), you might set a timer for 
+        ///  30 ms (see example below). If you use this function, you need 
+        ///  to pass <see cref="SDL_INIT_TIMER" /> to <see cref="SDL_Init(int)" />.
+        /// </para>
+        /// <p>
+        ///     Binds to C-function call in SDL_timer.h:
+        ///     <code>extern DECLSPEC SDL_TimerID SDLCALL 
+        ///     SDL_AddTimer(Uint32 interval, 
+        ///     SDL_NewTimerCallback callback, void *param)</code>
+        ///     </p>
+        /// </remarks>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern SDL_TimerID SDL_AddTimer(uint interval, SDL_NewTimerCallback callback);
+        #endregion SDL_TimerID SDL_AddTimer(uint interval, SDL_NewTimerCallback callback)
+
+        #region SDL_bool SDL_RemoveTimer(SDL_TimerID t)
+        //TODO Write Test
+        /// <summary>
+        ///     Remove a timer which was added with <see cref="SDL_AddTimer(int, SDL_NewTimerCallback)" />.
+        /// </summary>
+        /// <param name="t">
+        ///     The timer ID to remove.
+        /// </param>
+        /// <returns>
+        ///     A boolean value indicating success. SDL_TRUE or SDL_FALSE.
+        /// </returns>
+        /// <remarks>
+        /// <p>
+        ///     Binds to C-function call in SDL_timer.h:
+        ///     <code>extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID t)</code>
+        ///     </p>
+        /// </remarks>
+        /// <seealso cref="SDL_AddTimer(int, SDL_NewTimerCallback)" />
+        // 
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_RemoveTimer(SDL_TimerID t);
+        #endregion SDL_bool SDL_RemoveTimer(SDL_TimerID t)
+        #endregion SDL_timer.h
+
+        // SDL_types.h -- deprecated
+
+        #region SDL_version.h
+        #region SDL_version SDL_VERSION()
+        /// <summary>
+        /// This method can be used to fill a version structure with the compile-time
+        /// version of the SDL library.
+        /// </summary>
+        /// <returns>
+        ///     This function returns a <see cref="Sdl.SDL_version"/> struct containing the
+        ///     compiled version number
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_version.h:
+        ///     <code>#define SDL_VERSION(X)
+        /// {
+        /// (X)->major = SDL_MAJOR_VERSION;
+        /// (X)->minor = SDL_MINOR_VERSION;
+        /// (X)->patch = SDL_PATCHLEVEL;
+        /// }</code>
+        ///     </p>
+        /// </remarks>
+        [CLSCompliant(false)]
+        public static Sdl.SDL_version SDL_VERSION()
+        {
+            Sdl.SDL_version sdlVersion = new Sdl.SDL_version();
+            sdlVersion.major = SDL_MAJOR_VERSION;
+            sdlVersion.minor = SDL_MINOR_VERSION;
+            sdlVersion.patch = SDL_PATCHLEVEL;
+            return sdlVersion;
+        }
+        #endregion SDL_version SDL_VERSION()
+
+        #region IntPtr SDL_Linked_VersionInternal()
+        //     extern DECLSPEC const SDL_version * SDLCALL SDL_Linked_Version(void)
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_Linked_Version"), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr SDL_Linked_VersionInternal();
+        #endregion IntPtr SDL_Linked_VersionInternal()
+
+        #region SDL_version SDL_Linked_Version()
+        /// <summary>
+        ///     This function gets the version of the dynamically linked SDL library.
+        /// </summary>
+        /// <returns>
+        ///     SDL_version struct
+        /// </returns>
+        /// <remarks>
+        ///     <p>
+        ///     Binds to C-function call in SDL_version.h:
+        ///     <code>extern DECLSPEC const SDL_version * SDLCALL SDL_Linked_Version(void)</code>
+        ///     </p>
+        /// </remarks>
+        public static SDL_version SDL_Linked_Version()
+        {
+            return (Sdl.SDL_version)Marshal.PtrToStructure(
+                Sdl.SDL_Linked_VersionInternal(),
+                typeof(Sdl.SDL_version));
+        }
+        #endregion SDL_version SDL_Linked_Version()
+
+        #region int SDL_VERSIONNUM( byte major, byte minor, byte patch )
+        // This method turns the version numbers into a numeric value: (1,2,3) -> (1203)
+        // This assumes that there will never be more than 100 patchlevels
+        private static int SDL_VERSIONNUM(byte major, byte minor, byte patch)
+        {
+            return (int)(major * 1000 + minor * 100 + patch);
+        }
+        #endregion int SDL_VERSIONNUM( byte major, byte minor, byte patch )
+
+        #region int SDL_COMPILEDVERSION
+        /// <summary>
+        /// This returns the current SDL version
+        /// </summary>
+        /// <remarks>
+        ///      <p>
+        ///     Binds to C-function call in SDL_version.h:
+        ///     <code>#define SDL_COMPILEDVERSION SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL)</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>
+        /// Returns the version number as a numeric value: (1.2.7 -> 1207)
+        /// </returns>
+        public static int SDL_COMPILEDVERSION
+        {
+            get
+            {
+                SDL_version version = Sdl.SDL_Linked_Version();
+                return Sdl.SDL_VERSIONNUM(version.major, version.minor, version.patch);
+            }
+        }
+        #endregion int SDL_COMPILEDVERSION
+
+        #region bool SDL_VERSION_ATLEAST( byte major, byte minor, byte patch )
+        /// <summary>
+        /// Will evaluate to true if SDL version is at least X.Y.Z
+        /// </summary>
+        /// <param name="major">Major version number</param>
+        /// <param name="minor">Minor version number</param>
+        /// <param name="patch">Patch version number</param>
+        /// <returns>True if the version of SDL is greater or equal to the version numbers passed in.</returns>
+        public static bool SDL_VERSION_ATLEAST(byte major, byte minor, byte patch)
+        {
+            return (Sdl.SDL_COMPILEDVERSION >= Sdl.SDL_VERSIONNUM(
+                major,
+                minor,
+                patch));
+        }
+        #endregion bool SDL_VERSION_ATLEAST( byte major, byte minor, byte patch )
+        #endregion SDL_version.h
+
+        #region SDL_video.h
+        #region int SDL_MUSTLOCK(IntPtr surface)
+        /// <summary>
+        /// Evaluates to true if the surface needs to be locked before access
+        /// </summary>
+        /// <param name="surface"></param>
+        /// <returns>
+        /// 1 if surface must be locked. 0 if it does not.
+        /// </returns>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_video.h:
+        ///     <code>#define SDL_MUSTLOCK(surface) (surface->offset ||	((surface->flags & (SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_RLEACCEL)) != 0))</code>
+        ///     </p>
+        /// </remarks>
+        public static int SDL_MUSTLOCK(IntPtr surface)
+        {
+            Sdl.SDL_Surface surf = (Sdl.SDL_Surface)Marshal.PtrToStructure(surface, typeof(Sdl.SDL_Surface));
+            if (((surf.flags & (Sdl.SDL_HWSURFACE | Sdl.SDL_ASYNCBLIT | Sdl.SDL_RLEACCEL)) != 0))
+            {
+                return 1;
+            }
+            else
+            {
+                return 0;
+            }
+        }
+        #endregion int SDL_MUSTLOCK(IntPtr surface)
+
+        // SDL_VideoInit and SDL_VideoQuit -- 
+        // these are private functions and will not be implemented.
+
+        #region string SDL_VideoDriverName(string namebuf, int maxlen)
+        /// <summary>
+        /// This function returns a string with the name of the
+        /// video driver.
+        /// </summary>
+        /// <remarks>
+        /// It returns NULL if no driver has been initialized.
+        /// <p>Binds to C-function call in SDL_video.h:
+        ///     <code>extern DECLSPEC char * SDLCALL SDL_VideoDriverName(char *namebuf, int maxlen)</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>
+        /// Returns a string containing the driver name. 
+        /// It returns null if no driver has been initialized.
+        /// </returns>
+        /// <param name="maxlen">
+        /// Length of string
+        /// </param>
+        /// <param name="namebuf">
+        /// A dummy string that must be initialized before being passed in.
+        /// </param>
+        public static string SDL_VideoDriverName(string namebuf, int maxlen)
+        {
+            StringBuilder stringBuilder = new StringBuilder(namebuf);
+            __SDL_VideoDriverName(stringBuilder, maxlen);
+            return stringBuilder.ToString();
+        }
+
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_VideoDriverName"),
+        SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr __SDL_VideoDriverName(StringBuilder namebuf, int maxlen);
+        #endregion string SDL_VideoDriverName(string namebuf, int maxlen)
+
+        #region IntPtr SDL_GetVideoSurface()
+        /// <summary>
+        /// This function returns a pointer to the current display surface.
+        /// </summary>
+        /// <remarks>
+        /// If SDL is doing format conversion on the display surface, this
+        /// function returns the publicly visible surface, not the real video
+        /// surface. 
+        /// <p>Binds to C-function call in SDL_video.h:
+        ///     <code>extern DECLSPEC SDL_Surface * SDLCALL SDL_GetVideoSurface(void)</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>
+        /// It returns a pointer to a SDL_Surface struct.
+        /// </returns>
+        /// <seealso cref="SDL_Surface"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_GetVideoSurface();
+        #endregion IntPtr SDL_GetVideoSurface()
+
+        #region IntPtr SDL_GetVideoInfo()
+        /// <summary>
+        /// This function returns a read-only pointer to information 
+        /// about the video hardware. 
+        /// </summary>
+        /// <remarks>
+        /// If this is called before <see cref="SDL_SetVideoMode(int, int, int, int)"/>, the 'vfmt'
+        /// member of the returned structure will contain the pixel 
+        /// format of the "best" video mode.
+        /// <p>Binds to C-function call in SDL_video.h:
+        ///     <code>extern DECLSPEC const SDL_VideoInfo * SDLCALL SDL_GetVideoInfo(void)</code>
+        ///     </p>
+        /// </remarks>
+        /// <returns>IntPtr to SDL_VideoInfo struct</returns>
+        /// <see cref="SDL_SetVideoMode(int, int, int, int)"/>
+        /// <see cref="SDL_VideoInfo"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_GetVideoInfo();
+        #endregion IntPtr SDL_GetVideoInfo()
+
+        #region int SDL_VideoModeOK(int width, int height, int bpp, int flags);
+        /// <summary>
+        /// Check to see if a particular video mode is supported.
+        /// </summary>
+        /// <remarks>
+        /// SDL_VideoModeOK returns 0 if the requested mode is not supported under any 
+        /// bit depth,
+        /// or returns the bits-per-pixel of the closest available mode 
+        /// with the
+        /// given width, height and requested <see cref="SDL_Surface"/> flags. See <see cref="SDL_SetVideoMode(int, int, int, int)"/>.
+        /// <p>The bits-per-pixel value returned is only a suggested mode. 
+        /// You can usually request and bpp you want when setting the video mode 
+        /// and SDL will emulate that color depth with a shadow video surface. 
+        /// </p>
+        /// <p>
+        /// The arguments to SDL_VideoModeOK() are the same ones you would 
+        /// pass to
+        /// <see cref="SDL_SetVideoMode(int, int, int, int)"/>
+        /// </p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags)</code>
+        ///     </p>
+        /// </remarks>
+        /// <param name="width">Width of mode</param>
+        /// <param name="height">Height of mode</param>
+        /// <param name="bpp">bit depth of Mode</param>
+        /// <param name="flags"></param>
+        /// <returns></returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_VideoModeOK(int width,
+            int height, int bpp, int flags);
+        #endregion int SDL_VideoModeOK(int width, int height, int bpp, int flags);
+
+        #region int SDL_VideoModeOK(int width, int height, int bpp, uint flags);
+        /// <summary>
+        /// Check to see if a particular video mode is supported.
+        /// </summary>
+        /// <remarks>
+        /// SDL_VideoModeOK returns 0 if the requested mode is not supported under any 
+        /// bit depth,
+        /// or returns the bits-per-pixel of the closest available mode 
+        /// with the
+        /// given width, height and requested <see cref="SDL_Surface"/> flags. See <see cref="SDL_SetVideoMode(int, int, int, int)"/>.
+        /// <p>The bits-per-pixel value returned is only a suggested mode. 
+        /// You can usually request and bpp you want when setting the video mode 
+        /// and SDL will emulate that color depth with a shadow video surface. 
+        /// </p>
+        /// <p>
+        /// The arguments to SDL_VideoModeOK() are the same ones you would 
+        /// pass to
+        /// <see cref="SDL_SetVideoMode(int, int, int, int)"/>
+        /// </p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        ///     <code>extern DECLSPEC int SDLCALL SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags)</code>
+        ///     </p>
+        /// </remarks>
+        /// <param name="width">Width of mode</param>
+        /// <param name="height">Height of mode</param>
+        /// <param name="bpp">bit depth of Mode</param>
+        /// <param name="flags"></param>
+        /// <returns></returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_VideoModeOK(int width,
+            int height, int bpp, uint flags);
+        #endregion int SDL_VideoModeOK(int width, int height, int bpp, uint flags);
+
+        #region SDL_Rect[] SDL_ListModes(IntPtr format, int flags)
+        /// <summary> 
+        /// Return a pointer to an array of available screen dimensions for the 
+        /// given format and video flags, sorted largest to smallest.  
+        /// Returns 
+        /// NULL if there are no dimensions available for a particular format, 
+        /// or (SDL_Rect **)-1 if any dimension is okay for the given format. 
+        /// </summary> 
+        /// <remarks> 
+        /// If 'format' is NULL, the mode list will be for the format given 
+        /// by <see cref="SDL_GetVideoInfo"/>()->vfmt. 
+        /// The flag parameter is an OR'd combination of <see cref="SDL_Surface">surface</see> flags. 
+        /// The flags are the same as those used <see cref="SDL_SetVideoMode(int, int, int, int)"/> and they 
+        /// play a strong role in deciding what modes are valid. 
+        /// For instance, if you pass SDL_HWSURFACE as a flag only modes that 
+        /// support hardware video surfaces will be returned.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC SDL_Rect ** SDLCALL SDL_ListModes(SDL_PixelFormat *format, Uint32 flags)</code>
+        ///     </p>
+        /// </remarks> 
+        /// <param name="format"></param> 
+        /// <param name="flags"></param> 
+        /// <returns>Returns null if no modes are available. If all modes are available returns an empty array.</returns> 
+        /// <seealso cref="SDL_SetVideoMode(int, int, int, int)">SDL_SetVideoMode</seealso>
+        /// <seealso cref="SDL_GetVideoInfo">SDL_GetVideoInfo</seealso>
+        /// <seealso cref="SDL_Rect">SDL_Rect</seealso>
+        /// <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso>
+        [CLSCompliant(false)]
+        public unsafe static SDL_Rect[] SDL_ListModes(IntPtr format, int flags)
+        {
+            IntPtr rectPtr = SDL_ListModesInternal(format, flags);
+
+            if (rectPtr == IntPtr.Zero)
+            {
+                return null;
+            }
+
+            if (rectPtr == new IntPtr(-1))
+            {
+                return new SDL_Rect[0];
+            }
+
+            Sdl.SDL_Rect** rects = (Sdl.SDL_Rect**)rectPtr.ToPointer();
+
+            int i = 0;
+
+            ArrayList modes = new ArrayList();
+
+            while (rects[i] != null)
+            {
+                Sdl.SDL_Rect rect =
+                    (Sdl.SDL_Rect)Marshal.PtrToStructure(new IntPtr(rects[i]), typeof(Sdl.SDL_Rect));
+
+                modes.Insert(0, rect);
+
+                i++;
+            }
+
+            return (Sdl.SDL_Rect[])modes.ToArray(typeof(Sdl.SDL_Rect));
+        }
+        #endregion SDL_Rect[] SDL_ListModes(IntPtr format, int flags)
+
+        #region SDL_Rect[] SDL_ListModes(IntPtr format, uint flags)
+        /// <summary> 
+        /// Return a pointer to an array of available screen dimensions for the 
+        /// given format and video flags, sorted largest to smallest.  
+        /// Returns 
+        /// NULL if there are no dimensions available for a particular format, 
+        /// or (SDL_Rect **)-1 if any dimension is okay for the given format. 
+        /// </summary> 
+        /// <remarks> 
+        /// If 'format' is NULL, the mode list will be for the format given 
+        /// by <see cref="SDL_GetVideoInfo"/>()->vfmt. 
+        /// The flag parameter is an OR'd combination of <see cref="SDL_Surface">surface</see> flags. 
+        /// The flags are the same as those used <see cref="SDL_SetVideoMode(int, int, int, int)"/> and they 
+        /// play a strong role in deciding what modes are valid. 
+        /// For instance, if you pass SDL_HWSURFACE as a flag only modes that 
+        /// support hardware video surfaces will be returned.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC SDL_Rect ** SDLCALL SDL_ListModes(SDL_PixelFormat *format, Uint32 flags)</code>
+        ///     </p>
+        /// </remarks> 
+        /// <param name="format"></param> 
+        /// <param name="flags"></param> 
+        /// <returns>Returns null if no modes are available. If all modes are available returns an empty array.</returns> 
+        /// <seealso cref="SDL_SetVideoMode(int, int, int, int)">SDL_SetVideoMode</seealso>
+        /// <seealso cref="SDL_GetVideoInfo">SDL_GetVideoInfo</seealso>
+        /// <seealso cref="SDL_Rect">SDL_Rect</seealso>
+        /// <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso>
+        [CLSCompliant(false)]
+        public unsafe static SDL_Rect[] SDL_ListModes(IntPtr format, uint flags)
+        {
+            IntPtr rectPtr = SDL_ListModesInternal(format, flags);
+
+            if (rectPtr == IntPtr.Zero)
+            {
+                return null;
+            }
+
+            if (rectPtr == new IntPtr(-1))
+            {
+                return new SDL_Rect[0];
+            }
+
+            Sdl.SDL_Rect** rects = (Sdl.SDL_Rect**)rectPtr.ToPointer();
+
+            int i = 0;
+
+            ArrayList modes = new ArrayList();
+
+            while (rects[i] != null)
+            {
+                Sdl.SDL_Rect rect =
+                    (Sdl.SDL_Rect)Marshal.PtrToStructure(new IntPtr(rects[i]), typeof(Sdl.SDL_Rect));
+
+                modes.Insert(0, rect);
+
+                i++;
+            }
+
+            return (Sdl.SDL_Rect[])modes.ToArray(typeof(Sdl.SDL_Rect));
+        }
+        #endregion SDL_Rect[] SDL_ListModes(IntPtr format, uint flags)
+
+        #region IntPtr SDL_ListModesInternal(IntPtr format, int flags)
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION,
+             EntryPoint = "SDL_ListModes"), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr SDL_ListModesInternal(
+            IntPtr format, int flags);
+        #endregion IntPtr SDL_ListModesInternal(IntPtr format, int flags)
+
+        #region IntPtr SDL_ListModesInternal(IntPtr format, uint flags)
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION,
+             EntryPoint = "SDL_ListModes"), SuppressUnmanagedCodeSecurity]
+        private static extern IntPtr SDL_ListModesInternal(
+            IntPtr format, uint flags);
+        #endregion IntPtr SDL_ListModesInternal(IntPtr format, uint flags)
+
+        #region IntPtr SDL_SetVideoMode(int width, int height, int bpp, int flags)
+        /// <summary>
+        /// Set up a video mode with the specified width, height 
+        /// and bits-per-pixel.
+        /// </summary>
+        /// <remarks>
+        /// If 'bpp' is 0, it is treated as the current display bits per pixel.
+        /// <p>
+        /// The flags parameter is the same as the flags field of the SDL_Surface 
+        /// structure. OR'd combinations of the following values are valid.
+        /// </p>
+        /// <list type="table">
+        ///		<listheader>
+        ///                 <term>Flag</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SDL_SWSURFACE" /></term>
+        ///                 <description>Create the video surface in system memory.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_HWSURFACE" /></term>
+        ///                 <description>Create the video surface in video memory ,if possible, 
+        ///                 and you may have to call SDL_LockSurface()
+        /// in order to access the raw framebuffer.  Otherwise, the video
+        ///  surface
+        /// will be created in system memory.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_ASYNCBLIT" /></term>
+        ///                 <description>Enables the use of asynchronous updates 
+        ///                 of the display surface, but you must always lock before 
+        /// accessing pixels.
+        /// SDL will wait for updates to complete before returning from the
+        ///  lock. This will usually slow down 
+        ///                 blitting on single CPU machines, but may provide a 
+        ///                 speed increase on SMP systems.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_ANYFORMAT" /></term>
+        ///                 <description>Normally, if a video surface of the 
+        ///                 requested bits-per-pixel (bpp) is not available, 
+        ///                 SDL will emulate one with a shadow surface. 
+        ///                 Passing SDL_ANYFORMAT prevents this and causes 
+        ///                 SDL to use the video surface, regardless of its 
+        ///                 pixel depth.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_HWPALETTE" /></term>
+        ///                 <description>Give SDL exclusive palette access. 
+        ///                 Without this flag you may not always get the the 
+        ///                 colors you request with <see cref="SDL_SetColors"/> 
+        ///                 or <see cref="SDL_SetPalette"/>. You should
+        ///  look
+        /// at the video surface structure to determine the actual palette.
+        /// If SDL cannot guarantee that the colors you request can be set, 
+        /// i.e. if the colormap is shared, then the video surface may be
+        ///  created
+        /// under emulation in system memory, overriding the SDL_HWSURFACE
+        ///  flag.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_DOUBLEBUF" /></term>
+        ///                 <description>Enable hardware double buffering; 
+        ///                 only valid with SDL_HWSURFACE. Calling <see cref="SDL_Flip"/> 
+        ///                 will flip the buffers and update the screen. 
+        ///                 All drawing will take place on the surface that 
+        ///                 is not displayed at the moment. If double buffering 
+        ///                 could not be enabled then SDL_Flip will just 
+        ///                 perform a <see cref="SDL_UpdateRect(System.IntPtr, int, int, int, int)"/> 
+        ///                 on the entire screen. This is usually slower than the normal 
+        /// single-buffering
+        /// scheme, but prevents "tearing" artifacts caused by modifying video 
+        /// memory while the monitor is refreshing.  It should only be used by 
+        /// applications that redraw the entire screen on every update.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_FULLSCREEN" /></term>
+        ///                 <description>SDL will attempt to use a fullscreen mode. 
+        ///                 If a hardware resolution change is not possible 
+        ///                 (for whatever reason), the next higher resolution 
+        ///                 will be used and the display window centered 
+        ///                 on a black background. The default is to create a windowed mode
+        /// if the current graphics system has a window manager.
+        /// If the SDL library is able to set a fullscreen video mode, this
+        ///  flag 
+        /// will be set in the surface that is returned.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_OPENGL" /></term>
+        ///                 <description>Create an OpenGL rendering context. 
+        ///                 You should have previously set OpenGL 
+        ///                 video attributes with <see cref="SDL_GL_SetAttribute"/>.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_OPENGLBLIT" /></term>
+        ///                 <description>Create an OpenGL rendering context, 
+        ///                 like above, but allow normal blitting operations. 
+        ///                 The screen (2D) surface may have an alpha channel,
+        ///                 and <see cref="SDL_UpdateRects"/> must be used for updating changes 
+        ///                 to the screen surface. NOTE: This option is kept for 
+        ///                 compatibility only, and is not recommended for new code.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_RESIZABLE" /></term>
+        ///                 <description>Create a resizable window. 
+        ///                 When the window is resized by the user a 
+        ///                 <see cref="SDL_VIDEORESIZE"/> event is generated and 
+        ///                 SDL_SetVideoMode can be called again with the new size.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_NOFRAME" /></term>
+        ///                 <description>If possible, SDL_NOFRAME causes 
+        ///                 SDL to create a window with no title bar or 
+        ///                 frame decoration. Fullscreen modes automatically 
+        ///                 have this flag set.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        /// 
+        /// If you rely on functionality provided by certain video flags, 
+        /// check the
+        /// flags of the returned surface to make sure that functionality 
+        /// is available.
+        /// SDL will fall back to reduced functionality if the exact flags 
+        /// you wanted
+        /// are not available.
+        /// <p>Whatever flags SDL_SetVideoMode could satisfy are set 
+        /// in the flags member of the returned surface.</p>
+        /// <p>
+        ///  The bpp parameter is the number of bits per pixel, 
+        ///  so a bpp of 24 uses the packed representation of 3 bytes/pixel. 
+        ///  For the more common 4 bytes/pixel mode, use a bpp of 32. 
+        ///  Somewhat oddly, both 15 and 16 will request a 2 bytes/pixel mode, 
+        ///  but different pixel formats.
+        /// </p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC SDL_Surface * SDLCALL SDL_SetVideoMode
+        /// (int width, int height, int bpp, Uint32 flags);</code>
+        /// </p>
+        /// </remarks>
+        /// <seealso cref="SDL_LockSurface">SDL_LockSurface</seealso>
+        /// <seealso cref="SDL_SetColors">SDL_SetColors</seealso>
+        /// <seealso cref="SDL_Flip">SDL_Flip</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="bpp"></param>
+        /// <param name="flags"></param>
+        /// <returns>The framebuffer surface, or NULL if it fails. 
+        /// The surface returned is freed by SDL_Quit() and should not be 
+        /// freed by the caller.
+        /// </returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_SetVideoMode(int width, int height,
+            int bpp, int flags);
+        #endregion IntPtr SDL_SetVideoMode(int width, int height, int bpp, int flags)
+
+        #region IntPtr SDL_SetVideoMode(int width, int height, int bpp, uint flags)
+        /// <summary>
+        /// Set up a video mode with the specified width, height 
+        /// and bits-per-pixel.
+        /// </summary>
+        /// <remarks>
+        /// If 'bpp' is 0, it is treated as the current display bits per pixel.
+        /// <p>
+        /// The flags parameter is the same as the flags field of the SDL_Surface 
+        /// structure. OR'd combinations of the following values are valid.
+        /// </p>
+        /// <list type="table">
+        ///		<listheader>
+        ///                 <term>Flag</term>
+        ///                 <description>Description</description>
+        ///             </listheader>
+        ///             <item>
+        ///                 <term><see cref="SDL_SWSURFACE" /></term>
+        ///                 <description>Create the video surface in system memory.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_HWSURFACE" /></term>
+        ///                 <description>Create the video surface in video memory ,if possible, 
+        ///                 and you may have to call SDL_LockSurface()
+        /// in order to access the raw framebuffer.  Otherwise, the video
+        ///  surface
+        /// will be created in system memory.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_ASYNCBLIT" /></term>
+        ///                 <description>Enables the use of asynchronous updates 
+        ///                 of the display surface, but you must always lock before 
+        /// accessing pixels.
+        /// SDL will wait for updates to complete before returning from the
+        ///  lock. This will usually slow down 
+        ///                 blitting on single CPU machines, but may provide a 
+        ///                 speed increase on SMP systems.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_ANYFORMAT" /></term>
+        ///                 <description>Normally, if a video surface of the 
+        ///                 requested bits-per-pixel (bpp) is not available, 
+        ///                 SDL will emulate one with a shadow surface. 
+        ///                 Passing SDL_ANYFORMAT prevents this and causes 
+        ///                 SDL to use the video surface, regardless of its 
+        ///                 pixel depth.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_HWPALETTE" /></term>
+        ///                 <description>Give SDL exclusive palette access. 
+        ///                 Without this flag you may not always get the the 
+        ///                 colors you request with <see cref="SDL_SetColors"/> 
+        ///                 or <see cref="SDL_SetPalette"/>. You should
+        ///  look
+        /// at the video surface structure to determine the actual palette.
+        /// If SDL cannot guarantee that the colors you request can be set, 
+        /// i.e. if the colormap is shared, then the video surface may be
+        ///  created
+        /// under emulation in system memory, overriding the SDL_HWSURFACE
+        ///  flag.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_DOUBLEBUF" /></term>
+        ///                 <description>Enable hardware double buffering; 
+        ///                 only valid with SDL_HWSURFACE. Calling <see cref="SDL_Flip"/> 
+        ///                 will flip the buffers and update the screen. 
+        ///                 All drawing will take place on the surface that 
+        ///                 is not displayed at the moment. If double buffering 
+        ///                 could not be enabled then SDL_Flip will just 
+        ///                 perform a <see cref="SDL_UpdateRect(System.IntPtr, int, int, int, int)"/> 
+        ///                 on the entire screen. This is usually slower than the normal 
+        /// single-buffering
+        /// scheme, but prevents "tearing" artifacts caused by modifying video 
+        /// memory while the monitor is refreshing.  It should only be used by 
+        /// applications that redraw the entire screen on every update.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_FULLSCREEN" /></term>
+        ///                 <description>SDL will attempt to use a fullscreen mode. 
+        ///                 If a hardware resolution change is not possible 
+        ///                 (for whatever reason), the next higher resolution 
+        ///                 will be used and the display window centered 
+        ///                 on a black background. The default is to create a windowed mode
+        /// if the current graphics system has a window manager.
+        /// If the SDL library is able to set a fullscreen video mode, this
+        ///  flag 
+        /// will be set in the surface that is returned.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_OPENGL" /></term>
+        ///                 <description>Create an OpenGL rendering context. 
+        ///                 You should have previously set OpenGL 
+        ///                 video attributes with <see cref="SDL_GL_SetAttribute"/>.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_OPENGLBLIT" /></term>
+        ///                 <description>Create an OpenGL rendering context, 
+        ///                 like above, but allow normal blitting operations. 
+        ///                 The screen (2D) surface may have an alpha channel,
+        ///                 and <see cref="SDL_UpdateRects"/> must be used for updating changes 
+        ///                 to the screen surface. NOTE: This option is kept for 
+        ///                 compatibility only, and is not recommended for new code.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_RESIZABLE" /></term>
+        ///                 <description>Create a resizable window. 
+        ///                 When the window is resized by the user a 
+        ///                 <see cref="SDL_VIDEORESIZE"/> event is generated and 
+        ///                 SDL_SetVideoMode can be called again with the new size.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_NOFRAME" /></term>
+        ///                 <description>If possible, SDL_NOFRAME causes 
+        ///                 SDL to create a window with no title bar or 
+        ///                 frame decoration. Fullscreen modes automatically 
+        ///                 have this flag set.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        /// 
+        /// If you rely on functionality provided by certain video flags, 
+        /// check the
+        /// flags of the returned surface to make sure that functionality 
+        /// is available.
+        /// SDL will fall back to reduced functionality if the exact flags 
+        /// you wanted
+        /// are not available.
+        /// <p>Whatever flags SDL_SetVideoMode could satisfy are set 
+        /// in the flags member of the returned surface.</p>
+        /// <p>
+        ///  The bpp parameter is the number of bits per pixel, 
+        ///  so a bpp of 24 uses the packed representation of 3 bytes/pixel. 
+        ///  For the more common 4 bytes/pixel mode, use a bpp of 32. 
+        ///  Somewhat oddly, both 15 and 16 will request a 2 bytes/pixel mode, 
+        ///  but different pixel formats.
+        /// </p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC SDL_Surface * SDLCALL SDL_SetVideoMode
+        /// (int width, int height, int bpp, Uint32 flags);</code>
+        /// </p>
+        /// </remarks>
+        /// <seealso cref="SDL_LockSurface">SDL_LockSurface</seealso>
+        /// <seealso cref="SDL_SetColors">SDL_SetColors</seealso>
+        /// <seealso cref="SDL_Flip">SDL_Flip</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="bpp"></param>
+        /// <param name="flags"></param>
+        /// <returns>The framebuffer surface, or NULL if it fails. 
+        /// The surface returned is freed by SDL_Quit() and should not be 
+        /// freed by the caller.
+        /// </returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern IntPtr SDL_SetVideoMode(int width, int height,
+            int bpp, uint flags);
+        #endregion IntPtr SDL_SetVideoMode(int width, int height, int bpp, uint flags)
+
+        #region void SDL_UpdateRects(IntPtr screen, int numrects, [In, Out] SDL_Rect[] rects)
+        /// <summary>
+        /// Makes sure the given list of rectangles is updated on the given 
+        /// screen.
+        /// </summary>
+        /// <remarks>
+        /// The rectangles must all be confined within the screen boundaries 
+        /// (no clipping is done).
+        /// <p>
+        /// This function should not be called while screen is 
+        /// <see also="SDL_LockSurface">locked</see>.
+        /// </p>
+        /// <p>Note: It is adviced to call this function only once per frame, 
+        /// since each call has some processing overhead. This is no restriction 
+        /// since you can pass any number of rectangles each time.
+        /// </p>
+        /// <p>The rectangles are not automatically merged or checked for overlap. 
+        /// In general, the programmer can use his knowledge about his particular 
+        /// rectangles to merge them in an efficient way, to avoid overdraw.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC void SDLCALL SDL_UpdateRects (SDL_Surface *screen, int numrects, SDL_Rect *rects)</code>
+        /// </p>
+        /// </remarks>
+        /// <seealso cref="SDL_UpdateRect(System.IntPtr, int, int, int, int)">SDL_UpdateRect</seealso>
+        /// <seealso cref="SDL_Rect">SDL_Rect</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        /// <seealso cref="SDL_LockSurface">SDL_LockSurface</seealso>
+        /// <param name="screen"></param>
+        /// <param name="numrects"></param>
+        /// <param name="rects"></param>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_UpdateRects(IntPtr screen,
+            int numrects, [In, Out] SDL_Rect[] rects);
+        #endregion void SDL_UpdateRects(IntPtr screen, int numrects, [In, Out] SDL_Rect[] rects)
+
+        #region void SDL_UpdateRect(IntPtr screen, int x, int y, int w, int h)
+        /// <summary>
+        /// Makes sure the given area is updated on the given screen. 
+        /// </summary>
+        /// <remarks>
+        /// <p>The rectangle must be confined within the screen boundaries (no 
+        /// clipping is done).
+        /// </p>
+        /// <p>If 'x', 'y', 'w' and 'h' are all 0, SDL_UpdateRect will update the 
+        /// entire screen.</p>
+        /// <p>These functions should not be called while 'screen' is 
+        /// <see cref="SDL_LockSurface">locked</see>.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC void SDLCALL SDL_UpdateRect (SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="screen"></param>
+        /// <param name="w"></param>
+        /// <param name="h"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_UpdateRect(IntPtr screen, int x,
+            int y, int w, int h);
+        #endregion void SDL_UpdateRect(IntPtr screen, int x, int y, int w, int h)
+
+        #region void SDL_UpdateRect(IntPtr screen, int x, int y, uint w, uint h)
+        /// <summary>
+        /// Makes sure the given area is updated on the given screen. 
+        /// </summary>
+        /// <remarks>
+        /// <p>The rectangle must be confined within the screen boundaries (no 
+        /// clipping is done).
+        /// </p>
+        /// <p>If 'x', 'y', 'w' and 'h' are all 0, SDL_UpdateRect will update the 
+        /// entire screen.</p>
+        /// <p>These functions should not be called while 'screen' is 
+        /// <see cref="SDL_LockSurface">locked</see>.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC void SDLCALL SDL_UpdateRect (SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="screen"></param>
+        /// <param name="w"></param>
+        /// <param name="h"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern void SDL_UpdateRect(IntPtr screen, int x,
+            int y, uint w, uint h);
+        #endregion void SDL_UpdateRect(IntPtr screen, int x, int y, uint w, uint h)
+
+        #region int SDL_Flip(IntPtr screen)
+        /// <summary>
+        /// Swaps screen buffers
+        /// </summary>
+        /// <remarks>
+        /// On hardware that supports double-buffering, this function sets up 
+        /// a flip
+        /// and returns.  The hardware will wait for vertical retrace, and 
+        /// then swap
+        /// video buffers before the next video surface blit or lock will
+        ///  return.
+        /// On hardware that does not support double-buffering, this is 
+        /// equivalent
+        /// to calling <see cref="SDL_UpdateRect(System.IntPtr, int, int, int, int)"/>(screen, 0, 0, 0, 0)
+        /// <p>
+        /// The SDL_DOUBLEBUF flag must have been passed to <see cref="SDL_SetVideoMode(int, int, int, int)"/>
+        ///  when
+        /// setting the video mode for this function to perform hardware 
+        /// flipping.</p>
+        /// </remarks>
+        /// <param name="screen"></param>
+        /// <returns>
+        /// This function returns 0 if successful, or -1 if there was an 
+        /// error.
+        /// </returns>
+        /// <seealso cref="SDL_SetVideoMode(int, int, int, int)">SDL_SetVideoMode</seealso>
+        /// <seealso cref="SDL_UpdateRect(System.IntPtr, int, int, int, int)">SDL_UpdateRect</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_Flip"),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_Flip(IntPtr screen);
+        #endregion int SDL_Flip(IntPtr screen)
+
+        #region int SDL_SetGamma(float red, float green, float blue)
+        /// <summary>
+        /// Set the gamma correction for each of the color channels.
+        /// </summary>
+        /// <remarks>
+        /// <p>Sets the "gamma function" for the display of each color component. 
+        /// Gamma controls the brightness/contrast of colors displayed on the screen.
+        /// A gamma value of 1.0 is identity (i.e., no adjustment is made).
+        /// </p>
+        /// <p>This function adjusts the gamma based on the "gamma function" 
+        /// parameter, you can directly specify lookup tables for gamma adjustment
+        ///  with SDL_SetGammaRamp.</p>
+        ///  <p>Not all display hardware is able to change gamma.</p>
+        /// <p>The gamma values range (approximately) between 0.1 and 10.0.</p>
+        /// <p>If this function isn't supported directly by the hardware, it will
+        /// be emulated using gamma ramps, if available.  If successful, this
+        /// function returns 0, otherwise it returns -1.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC int SDLCALL SDL_SetGamma(float red, float green, float blue)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="blue"></param>
+        /// <param name="green"></param>
+        /// <param name="red"></param>
+        /// <returns>
+        /// If successful, this
+        /// function returns 0, otherwise it returns -1.
+        /// </returns>
+        /// <seealso cref="SDL_GetGammaRamp(short[], short[], short[])">SDL_GetGammaRamp</seealso>
+        /// <seealso cref="SDL_SetGammaRamp">SDL_SetGammaRamp</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SetGamma(float red, float green,
+            float blue);
+        #endregion int SDL_SetGamma(float red, float green, float blue)
+
+        #region int SDL_SetGammaRamp(...)
+        /// <summary>
+        /// Set the gamma translation table for the red, green, and blue
+        ///  channels
+        /// of the video hardware.  
+        /// </summary>
+        /// <remarks>
+        /// Each table is an array of 256 
+        /// 16-bit quantities,
+        /// representing a mapping between the input and output for that 
+        /// channel.
+        /// The input is the index into the array, and the output is the 16-bit
+        /// gamma value at that index, scaled to the output color precision.
+        /// You may pass NULL for any of the channels to leave it unchanged.
+        /// </remarks>
+        /// <returns>
+        /// If the call succeeds, it will return 0.  If the display driver or
+        /// hardware does not support gamma translation, or otherwise fails,
+        /// this function will return -1.
+        /// </returns>
+        /// <param name="blue"></param>
+        /// <param name="green"></param>
+        /// <param name="red"></param>
+        /// <seealso cref="SDL_SetGamma">SDL_SetGamma</seealso>
+        /// <seealso cref="SDL_GetGammaRamp(short[], short[], short[])">SDL_GetGammaRamp</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SetGammaRamp([In, Out] short[] red,
+            [In, Out] short[] green,
+            [In, Out] short[] blue);
+        #endregion int SDL_SetGammaRamp(...)
+
+        #region int SDL_GetGammaRamp(...)
+        /// <summary>
+        /// Gets the color gamma lookup tables for the display.
+        /// </summary>
+        /// <remarks>
+        /// Gets the gamma translation lookup tables currently used by the display. 
+        /// Each table is an array of 256 <see cref="short"/> values.
+        /// <p>
+        /// You must pass in valid pointers to arrays of 256 16-bit quantities.
+        /// Any of the pointers may be NULL to ignore that channel.
+        /// </p>
+        /// <p>Not all display hardware is able to change gamma.
+        /// </p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDLCALL SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue)</code>
+        /// </p>
+        /// </remarks>
+        /// <returns>
+        /// If the call succeeds, it will return 0.  If the display driver or
+        /// hardware does not support gamma translation, or otherwise fails,
+        /// this function will return -1.
+        /// </returns>
+        /// <seealso cref="SDL_SetGamma">SDL_SetGamma</seealso>
+        /// <seealso cref="SDL_SetGammaRamp">SDL_SetGammaRamp</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GetGammaRamp([In, Out] short[] red,
+            [In, Out] short[] green,
+            [In, Out] short[] blue);
+        #endregion int SDL_GetGammaRamp(...)
+
+        #region int SDL_GetGammaRamp(...)
+        /// <summary>
+        /// Gets the color gamma lookup tables for the display.
+        /// </summary>
+        /// <remarks>
+        /// Gets the gamma translation lookup tables currently used by the display. 
+        /// Each table is an array of 256 <see cref="short"/> values.
+        /// <p>
+        /// You must pass in valid pointers to arrays of 256 16-bit quantities.
+        /// Any of the pointers may be NULL to ignore that channel.
+        /// </p>
+        /// <p>Not all display hardware is able to change gamma.
+        /// </p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDLCALL SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue)</code>
+        /// </p>
+        /// </remarks>
+        /// <returns>
+        /// If the call succeeds, it will return 0.  If the display driver or
+        /// hardware does not support gamma translation, or otherwise fails,
+        /// this function will return -1.
+        /// </returns>
+        /// <seealso cref="SDL_SetGamma">SDL_SetGamma</seealso>
+        /// <seealso cref="SDL_SetGammaRamp">SDL_SetGammaRamp</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_GetGammaRamp([In, Out] ushort[] red,
+            [In, Out] ushort[] green,
+            [In, Out] ushort[] blue);
+        #endregion int SDL_GetGammaRamp(...)
+
+        #region int SDL_SetColors(...)
+        /// <summary>
+        /// Sets a portion of the colormap for the given 8-bit surface.  		
+        /// </summary>
+        /// <remarks>
+        /// <p>When surface is the surface associated with the current display,
+        ///  the display colormap will be updated with the requested colors.
+        ///   If SDL_HWPALETTE was set in <see cref="SDL_SetVideoMode(int, int, int, int)"/> flags, SDL_SetColors
+        ///    will always return 1, and the palette is guaranteed to be set 
+        ///    the way you desire, even if the window colormap has to be warped
+        ///     or run under emulation.</p>
+        ///     
+        /// <p>The color components of a SDL_Color structure are 8-bits in size,
+        ///  giving you a total of 256^3 =16777216 colors.</p>
+        ///  <p>Palettized (8-bit) screen surfaces with the SDL_HWPALETTE 
+        ///     flag have two palettes, a logical palette that is used for 
+        ///     mapping blits to/from the surface and a physical palette (that 
+        ///     determines how the hardware will map the colors to the display).
+        ///      SDL_SetColors modifies both palettes (if present), and is equivalent
+        ///       to calling SDL_SetPalette with the flags set to 
+        ///       (SDL_LOGPAL | SDL_PHYSPAL).
+        ///       </p>
+        /// <p>When 'surface' is the surface associated with the current 
+        /// display, the
+        /// display colormap will be updated with the requested colors.  If 
+        /// SDL_HWPALETTE was set in SDL_SetVideoMode() flags, SDL_SetColors()
+        /// will always return 1, and the palette is guaranteed to be set 
+        /// the way
+        /// you desire, even if the window colormap has to be warped or 
+        /// run under
+        /// emulation.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC int SDLCALL SDL_SetColors(SDL_Surface *surface, SDL_Color *colors, int firstcolor, int ncolors)</code>
+        /// </p>
+        /// </remarks>
+        /// <example>/* Create a display surface with a grayscale palette */
+        ///		SDL_Surface *screen;
+        ///		SDL_Color colors[256];
+        ///		int i;
+        ///		.
+        ///		.
+        ///		.
+        ///		/* Fill colors with color information */
+        ///		for(i=0;i<256;i++)
+        ///	{
+        ///		colors[i].r=i;
+        ///		colors[i].g=i;
+        ///		colors[i].b=i;
+        ///	}
+        ///
+        ///	/* Create display */
+        ///	screen=SDL_SetVideoMode(640, 480, 8, SDL_HWPALETTE);
+        ///	if(!screen)
+        ///{
+        ///	printf("Couldn't set video mode: %s\n", SDL_GetError());
+        ///	exit(-1);
+        ///}
+        ///
+        ///	/* Set palette */
+        ///	SDL_SetColors(screen, colors, 0, 256);
+        ///	.
+        ///	.
+        ///	.
+        ///	.
+        ///	</example>
+        /// <param name="surface"></param>
+        /// <param name="firstcolor"></param>
+        /// <param name="ncolors"></param>
+        /// <param name="colors"></param>
+        /// <returns>
+        /// If 'surface' is not a palettized surface, this function does nothing, 
+        /// returning 0.
+        /// If all of the colors were set as passed to SDL_SetColors(), it will
+        /// return 1.  If not all the color entries were set exactly as given,
+        /// it will return 0, and you should look at the surface palette to
+        /// determine the actual color palette.
+        /// </returns>
+        /// <seealso cref="SDL_Color">SDL_Color</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        /// <seealso cref="SDL_SetPalette">SDL_SetPalette</seealso>
+        /// <seealso cref="SDL_SetVideoMode(int, int, int, int)">SDL_SetVideoMode</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SetColors(IntPtr surface, [In, Out] SDL_Color[] colors,
+            int firstcolor, int ncolors);
+        #endregion int SDL_SetColors(...)
+
+        #region int SDL_SetPalette(...)
+        /// <summary>
+        /// Sets the colors in the palette of an 8-bit surface.
+        /// </summary>
+        /// <remarks>Palettized (8-bit) screen surfaces with the SDL_HWPALETTE 
+        /// flag have two palettes, a logical palette that is used for mapping 
+        /// blits to/from the surface and a physical palette (that determines 
+        /// how the hardware will map the colors to the display). SDL_BlitSurface
+        ///  always uses the logical palette when blitting surfaces (if it has to
+        ///   convert between surface pixel formats). Because of this, it is often
+        ///    useful to modify only one or the other palette to achieve various 
+        ///    special color effects (e.g., screen fading, color flashes, screen dimming).
+        ///    
+        ///    <p>This function can modify either the logical or physical palette 
+        ///    by specifing SDL_LOGPAL or SDL_PHYSPALthe in the flags parameter.</p>
+        ///    
+        ///    <p>When surface is the surface associated with the current display, 
+        ///    the display colormap will be updated with the requested colors. 
+        ///    If SDL_HWPALETTE was set in SDL_SetVideoMode flags, SDL_SetPalette 
+        ///    will always return 1, and the palette is guaranteed to be set the 
+        ///    way you desire, even if the window colormap has to be warped or run
+        ///     under emulation.</p>
+        ///     <p>The color components of a SDL_Color structure are 8-bits 
+        ///     in size, giving you a total of 2563=16777216 colors.</p>
+        /// <p>
+        /// 'flags' is one or both of:
+        /// SDL_LOGPAL  -- set logical palette, which controls how blits 
+        /// are mapped to/from the surface,
+        /// SDL_PHYSPAL -- set physical palette, which controls how pixels 
+        /// look on the screen
+        /// Only screens have physical palettes. Separate change of 
+        /// physical/logical
+        /// palettes is only possible if the screen has SDL_HWPALETTE set.
+        ///</p>
+        ///
+        /// SDL_SetColors() is equivalent to calling this function with
+        ///	flags = (SDL_LOGPAL|SDL_PHYSPAL).
+        ///	<p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC int SDLCALL SDL_SetPalette(SDL_Surface *surface, int flags, SDL_Color *colors, int firstcolor, int ncolors)</code>
+        /// </p>
+        ///     </remarks>
+        ///     <example><code>
+        ///     /* Create a display surface with a grayscale palette */
+        ///		SDL_Surface *screen;
+        ///		SDL_Color colors[256];
+        ///		int i;
+        ///		.
+        ///		.
+        ///		.
+        ///		/* Fill colors with color information */
+        ///		for(i=0;i<256;i++)
+        ///	{
+        ///		colors[i].r=i;
+        ///		colors[i].g=i;
+        ///		colors[i].b=i;
+        ///	}
+        ///
+        ///	/* Create display */
+        ///	screen=SDL_SetVideoMode(640, 480, 8, SDL_HWPALETTE);
+        ///	if(!screen)
+        ///{
+        ///	printf("Couldn't set video mode: %s\n", SDL_GetError());
+        ///	exit(-1);
+        ///}
+        ///
+        ///	/* Set palette */
+        ///	SDL_SetPalette(screen, SDL_LOGPAL|SDL_PHYSPAL, colors, 0, 256);
+        ///	.
+        ///	.
+        ///	.
+        ///	.</code></example>
+        /// <param name="surface"></param>
+        /// <param name="colors"></param>
+        /// <param name="firstcolor"></param>
+        /// <param name="flags"></param>
+        /// <param name="ncolors"></param>
+        /// <returns>
+        /// If surface is not a palettized surface, this function does 
+        /// nothing, returning 0. If all of the colors were set as passed to 
+        /// SDL_SetPalette, it will return 1. If not all the color entries were
+        ///  set exactly as given, it will return 0, and you should look at the
+        ///   surface palette to determine the actual color palette.
+        /// </returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SetPalette(IntPtr surface, int flags,
+            [In, Out] SDL_Color[] colors, int firstcolor, int ncolors);
+        #endregion int SDL_SetPalette(...)
+
+        #region int SDL_MapRGB(IntPtr format, byte r, byte g, byte b)
+        /// <summary>
+        /// Map a RGB color value to a pixel format.
+        /// </summary>
+        /// <remarks>
+        /// Maps the RGB color value to the specified pixel format and returns the pixel
+        ///  value as a 32-bit int.
+        /// <p>If the format has a palette (8-bit) the index of the closest 
+        /// matching color in the palette will be returned.</p>
+        /// <p>If the specified pixel format has an alpha component it will be 
+        /// returned as all 1 bits (fully opaque).</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC Uint32 SDLCALL SDL_MapRGB (SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="format">IntPtr to <see cref="SDL_PixelFormat"/></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <returns>A pixel value best approximating the given RGB color 
+        /// value for a given pixel format. If the pixel format bpp (color depth)
+        ///  is less than 32-bpp then the unused upper bits of the return value 
+        ///  can safely be ignored (e.g., with a 16-bpp format the return value 
+        ///  can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp 
+        ///  format).</returns>
+        ///  <seealso cref="SDL_GetRGB(int, IntPtr, out byte, out byte, out byte)">SDL_GetRGB</seealso>
+        ///  <seealso cref="SDL_GetRGBA">SDL_GetRGBA</seealso>
+        ///  <seealso cref="SDL_MapRGBA">SDL_MapRGBA</seealso>
+        ///  <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_MapRGB(IntPtr format, byte r, byte g,
+            byte b);
+        #endregion int SDL_MapRGB(IntPtr format, byte r, byte g, byte b)
+
+        #region int SDL_MapRGBA(IntPtr format, byte r, byte g, byte b, byte a)
+        /// <summary>
+        /// Map a RGBA color value to a pixel format.
+        /// </summary>
+        /// <remarks>
+        /// Maps the RGBA color value to the specified pixel format and 
+        /// returns the pixel value as a 32-bit int.
+        /// <p>If the format has a palette (8-bit) the index of the closest 
+        /// matching color in the palette will be returned.</p>
+        /// <p>If the specified pixel format has no alpha component the alpha 
+        /// value will be ignored (as it will be in formats with a palette).</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA (SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b, Uint8 a)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="format"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns>A pixel value best approximating the given RGBA 
+        /// color value for a given pixel format. If the pixel format 
+        /// bpp (color depth) is less than 32-bpp then the unused upper 
+        /// bits of the return value can safely be ignored (e.g., with a 
+        /// 16-bpp format the return value can be assigned to a Uint16, 
+        /// and similarly a Uint8 for an 8-bpp format).</returns>
+        /// <seealso cref="SDL_GetRGB(int, IntPtr, out byte, out byte, out byte)">SDL_GetRGB</seealso>
+        /// <seealso cref="SDL_GetRGBA">SDL_GetRGBA</seealso>
+        /// <seealso cref="SDL_MapRGB">SDL_MapRGB</seealso>
+        /// <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso> 
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_MapRGBA(IntPtr format, byte r, byte g,
+            byte b, byte a);
+        #endregion int SDL_MapRGBA(IntPtr format, byte r, byte g, byte b, byte a)
+
+        #region void SDL_GetRGB(int pixel, IntPtr fmt, out byte r, out byte g, out byte b)
+        /// <summary>
+        /// Get RGB values from a pixel in the specified pixel format.
+        /// </summary>
+        /// <remarks>
+        /// Get RGB component values from a pixel stored in the specified pixel format.
+        /// <p>This function uses the entire 8-bit [0..255] range when converting 
+        /// color components from pixel formats with less than 8-bits per RGB component
+        ///  (e.g., a completely white pixel in 16-bit RGB565 format would return 
+        ///  [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).</p>
+        ///  <p>Binds to C-function call in SDL_video.h:
+        /// <code>void SDL_GetRGB(Uint32 pixel, SDL_PixelFormat *fmt, Uint8 *r, Uint8 *g, Uint8 *b);</code>
+        /// </p>
+        ///  </remarks>
+        /// <param name="pixel"></param>
+        /// <param name="fmt"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <seealso cref="SDL_GetRGBA">SDL_GetRGBA</seealso>
+        /// <seealso cref="SDL_MapRGB">SDL_MapRGB</seealso>
+        /// <seealso cref="SDL_MapRGBA">SDL_MapRGBA</seealso>
+        /// <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_GetRGB(int pixel, IntPtr fmt,
+            out byte r, out byte g, out byte b);
+        #endregion void SDL_GetRGB(int pixel, IntPtr fmt, out byte r, out byte g, out byte b)
+
+        #region void SDL_GetRGB(uint pixel, IntPtr fmt, out byte r, out byte g, out byte b)
+        /// <summary>
+        /// Get RGB values from a pixel in the specified pixel format.
+        /// </summary>
+        /// <remarks>
+        /// Get RGB component values from a pixel stored in the specified pixel format.
+        /// <p>This function uses the entire 8-bit [0..255] range when converting 
+        /// color components from pixel formats with less than 8-bits per RGB component
+        ///  (e.g., a completely white pixel in 16-bit RGB565 format would return 
+        ///  [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).</p>
+        ///  <p>Binds to C-function call in SDL_video.h:
+        /// <code>void SDL_GetRGB(Uint32 pixel, SDL_PixelFormat *fmt, Uint8 *r, Uint8 *g, Uint8 *b);</code>
+        /// </p>
+        ///  </remarks>
+        /// <param name="pixel"></param>
+        /// <param name="fmt"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <seealso cref="SDL_GetRGBA">SDL_GetRGBA</seealso>
+        /// <seealso cref="SDL_MapRGB">SDL_MapRGB</seealso>
+        /// <seealso cref="SDL_MapRGBA">SDL_MapRGBA</seealso>
+        /// <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern void SDL_GetRGB(uint pixel, IntPtr fmt,
+            out byte r, out byte g, out byte b);
+        #endregion void SDL_GetRGB(uint pixel, IntPtr fmt, out byte r, out byte g, out byte b)
+
+        #region void SDL_GetRGBA(...)
+        /// <summary>
+        /// Get RGBA values from a pixel in the specified pixel format.
+        /// </summary>
+        /// <remarks>
+        /// Get RGBA component values from a pixel stored in the specified pixel 
+        /// format.
+        /// <p>This function uses the entire 8-bit [0..255] range when converting 
+        /// color components from pixel formats with less than 8-bits per RGB 
+        /// component (e.g., a completely white pixel in 16-bit RGB565 format would
+        ///  return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).</p>
+        /// <p>If the surface has no alpha component, the alpha will be returned 
+        /// as 0xff (100% opaque).</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>void SDL_GetRGBA(Uint32 pixel, SDL_PixelFormat *fmt, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="pixel"></param>
+        /// <param name="fmt"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <seealso cref="SDL_GetRGB(int, IntPtr, out byte, out byte, out byte)">SDL_GetRGB</seealso>
+        /// <seealso cref="SDL_MapRGB">SDL_MapRGB</seealso>
+        /// <seealso cref="SDL_MapRGBA">SDL_MapRGBA</seealso>
+        /// <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_GetRGBA(int pixel, IntPtr fmt,
+            out byte r, out byte g, out byte b, out byte a);
+        #endregion void SDL_GetRGBA(...)
+
+        #region IntPtr SDL_CreateRGBSurface(...)
+        /// <summary>
+        /// Create an empty SDL_Surface
+        /// </summary>
+        /// <remarks>
+        /// Allocate an empty surface (must be called after <see cref="SDL_SetVideoMode(int, int, int, int)"/>).
+        /// <p>If depth is 8 bits an empty palette is allocated for the surface, 
+        /// otherwise a 'packed-pixel' <see cref="SDL_PixelFormat"/> is created using the 
+        /// [RGBA]mask's provided (see SDL_PixelFormat). The flags specifies 
+        /// the type of surface that should be created, it is an OR'd combination
+        ///  of the following possible values.</p>
+        /// <list type="table">
+        ///             <item>
+        ///                 <term><see cref="SDL_SWSURFACE" /></term>
+        ///                 <description>
+        ///                 SDL will create the surface in system memory. 
+        ///                 This improves the performance of pixel level access, 
+        ///                 however you may not be able to take advantage of 
+        ///                 some types of hardware blitting.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_HWSURFACE" /></term>
+        ///                 <description>
+        ///                 SDL will attempt to create the surface in
+        ///                  video memory. This will allow SDL to take advantage 
+        ///                  of Video->Video blits (which are often accelerated).
+        ///                  </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_SRCCOLORKEY" /></term>
+        ///                 <description>
+        ///                 This flag turns on colourkeying for 
+        ///                 blits from this surface. If SDL_HWSURFACE is also 
+        ///                 specified and colourkeyed blits are hardware-accelerated,
+        ///                  then SDL will attempt to place the surface in video 
+        ///                  memory. Use <see cref="SDL_SetColorKey(IntPtr, int, int)"/> 
+        ///                  to set or clear this flag
+        ///                   after surface creation.
+        ///                   </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_SRCALPHA" /></term>
+        ///                 <description>
+        ///                 This flag turns on alpha-blending for 
+        ///                 blits from this surface. If SDL_HWSURFACE is also 
+        ///                 specified and alpha-blending blits are 
+        ///                 hardware-accelerated, then the surface will be placed 
+        ///                 in video memory if possible. Use 
+        ///                 <see cref="SDL_SetAlpha(IntPtr, int, byte)"/> to set 
+        ///                 or clear this flag after surface creation.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///         <p><b>Note:</b> If an alpha-channel is specified (that is, 
+        ///         if Amask is nonzero), then the SDL_SRCALPHA flag is 
+        ///         automatically set. You may remove this flag by 
+        ///         calling <see cref="SDL_SetAlpha(IntPtr, int, byte)"/> after surface creation.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)</code>
+        /// </p>
+        /// </remarks>
+        /// <example>
+        /// /* Create a 32-bit surface with the bytes of each pixel in R,G,B,A order,
+        /// as expected by OpenGL for textures */
+        /// SDL_Surface *surface;
+        /// Uint32 rmask, gmask, bmask, amask;
+        ///
+        /// /* SDL interprets each pixel as a 32-bit number, so our masks must depend
+        ///   on the endianness (byte order) of the machine */
+        ///#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+        ///		rmask = 0xff000000;
+        ///		gmask = 0x00ff0000;
+        ///		bmask = 0x0000ff00;
+        ///		amask = 0x000000ff;
+        ///#else
+        ///    rmask = 0x000000ff;
+        ///    gmask = 0x0000ff00;
+        ///    bmask = 0x00ff0000;
+        ///    amask = 0xff000000;
+        ///#endif
+        ///
+        ///		surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32,
+        ///		rmask, gmask, bmask, amask);
+        ///		if(surface == NULL) 
+        ///	{
+        ///		fprintf(stderr, "CreateRGBSurface failed: %s\n", SDL_GetError());
+        ///		exit(1);
+        ///	}
+        /// </example>
+        /// <param name="flags"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="depth"></param>
+        /// <param name="Rmask"></param>
+        /// <param name="Gmask"></param>
+        /// <param name="Bmask"></param>
+        /// <param name="Amask"></param>
+        /// <returns>IntPtr to <see cref="SDL_Surface"/>, or NULL upon error.</returns>
+        /// <seealso cref="SDL_CreateRGBSurfaceFrom(System.IntPtr, int, int, int, int, int, int, int, int)">SDL_CreateRGBSurfaceFrom</seealso>
+        /// <seealso cref="SDL_FreeSurface">SDL_FreeSurface</seealso>
+        /// <seealso cref="SDL_SetVideoMode(int, int, int, int)">SDL_SetVideoMode</seealso>
+        /// <seealso cref="SDL_LockSurface">SDL_LockSurface</seealso>
+        /// <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        /// <seealso cref="SDL_SetAlpha(IntPtr, int, byte)">SDL_SetAlpha</seealso>
+        /// <seealso cref="SDL_SetColorKey(IntPtr, int, int)">SDL_SetColorKey</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_CreateRGBSurface(int flags,
+            int width, int height, int depth,
+            int Rmask, int Gmask, int Bmask, int Amask);
+        #endregion IntPtr SDL_CreateRGBSurface(...)
+
+        #region IntPtr SDL_CreateRGBSurface(...)
+        /// <summary>
+        /// Create an empty SDL_Surface
+        /// </summary>
+        /// <remarks>
+        /// Allocate an empty surface (must be called after <see cref="SDL_SetVideoMode(int, int, int, int)"/>).
+        /// <p>If depth is 8 bits an empty palette is allocated for the surface, 
+        /// otherwise a 'packed-pixel' <see cref="SDL_PixelFormat"/> is created using the 
+        /// [RGBA]mask's provided (see SDL_PixelFormat). The flags specifies 
+        /// the type of surface that should be created, it is an OR'd combination
+        ///  of the following possible values.</p>
+        /// <list type="table">
+        ///             <item>
+        ///                 <term><see cref="SDL_SWSURFACE" /></term>
+        ///                 <description>
+        ///                 SDL will create the surface in system memory. 
+        ///                 This improves the performance of pixel level access, 
+        ///                 however you may not be able to take advantage of 
+        ///                 some types of hardware blitting.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_HWSURFACE" /></term>
+        ///                 <description>
+        ///                 SDL will attempt to create the surface in
+        ///                  video memory. This will allow SDL to take advantage 
+        ///                  of Video->Video blits (which are often accelerated).
+        ///                  </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_SRCCOLORKEY" /></term>
+        ///                 <description>
+        ///                 This flag turns on colourkeying for 
+        ///                 blits from this surface. If SDL_HWSURFACE is also 
+        ///                 specified and colourkeyed blits are hardware-accelerated,
+        ///                  then SDL will attempt to place the surface in video 
+        ///                  memory. Use <see cref="SDL_SetColorKey(IntPtr, int, int)"/> 
+        ///                  to set or clear this flag
+        ///                   after surface creation.
+        ///                   </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term><see cref="SDL_SRCALPHA" /></term>
+        ///                 <description>
+        ///                 This flag turns on alpha-blending for 
+        ///                 blits from this surface. If SDL_HWSURFACE is also 
+        ///                 specified and alpha-blending blits are 
+        ///                 hardware-accelerated, then the surface will be placed 
+        ///                 in video memory if possible. Use 
+        ///                 <see cref="SDL_SetAlpha(IntPtr, int, byte)"/> to set 
+        ///                 or clear this flag after surface creation.
+        ///                 </description>
+        ///             </item>
+        ///         </list>
+        ///         <p><b>Note:</b> If an alpha-channel is specified (that is, 
+        ///         if Amask is nonzero), then the SDL_SRCALPHA flag is 
+        ///         automatically set. You may remove this flag by 
+        ///         calling <see cref="SDL_SetAlpha(IntPtr, int, byte)"/> after surface creation.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)</code>
+        /// </p>
+        /// </remarks>
+        /// <example>
+        /// /* Create a 32-bit surface with the bytes of each pixel in R,G,B,A order,
+        /// as expected by OpenGL for textures */
+        /// SDL_Surface *surface;
+        /// Uint32 rmask, gmask, bmask, amask;
+        ///
+        /// /* SDL interprets each pixel as a 32-bit number, so our masks must depend
+        ///   on the endianness (byte order) of the machine */
+        ///#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+        ///		rmask = 0xff000000;
+        ///		gmask = 0x00ff0000;
+        ///		bmask = 0x0000ff00;
+        ///		amask = 0x000000ff;
+        ///#else
+        ///    rmask = 0x000000ff;
+        ///    gmask = 0x0000ff00;
+        ///    bmask = 0x00ff0000;
+        ///    amask = 0xff000000;
+        ///#endif
+        ///
+        ///		surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32,
+        ///		rmask, gmask, bmask, amask);
+        ///		if(surface == NULL) 
+        ///	{
+        ///		fprintf(stderr, "CreateRGBSurface failed: %s\n", SDL_GetError());
+        ///		exit(1);
+        ///	}
+        /// </example>
+        /// <param name="flags"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="depth"></param>
+        /// <param name="Rmask"></param>
+        /// <param name="Gmask"></param>
+        /// <param name="Bmask"></param>
+        /// <param name="Amask"></param>
+        /// <returns>IntPtr to <see cref="SDL_Surface"/>, or NULL upon error.</returns>
+        /// <seealso cref="SDL_CreateRGBSurfaceFrom(System.IntPtr, int, int, int, int, int, int, int, int)">SDL_CreateRGBSurfaceFrom</seealso>
+        /// <seealso cref="SDL_FreeSurface">SDL_FreeSurface</seealso>
+        /// <seealso cref="SDL_SetVideoMode(int, int, int, int)">SDL_SetVideoMode</seealso>
+        /// <seealso cref="SDL_LockSurface">SDL_LockSurface</seealso>
+        /// <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        /// <seealso cref="SDL_SetAlpha(IntPtr, int, byte)">SDL_SetAlpha</seealso>
+        /// <seealso cref="SDL_SetColorKey(IntPtr, int, int)">SDL_SetColorKey</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern IntPtr SDL_CreateRGBSurface(uint flags,
+            int width, int height, int depth,
+            uint Rmask, uint Gmask, uint Bmask, uint Amask);
+        #endregion IntPtr SDL_CreateRGBSurface(...)
+
+        #region IntPtr SDL_AllocSurface(...)
+        /// <summary>
+        /// Same as <see cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)"/>
+        /// </summary>
+        /// <param name="flags"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="depth"></param>
+        /// <param name="Rmask"></param>
+        /// <param name="Gmask"></param>
+        /// <param name="Bmask"></param>
+        /// <param name="Amask"></param>
+        /// <returns></returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_CreateRGBSurface"),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_AllocSurface(int flags,
+            int width, int height, int depth,
+            int Rmask, int Gmask, int Bmask, int Amask);
+        #endregion IntPtr SDL_AllocSurface(...)
+
+        #region IntPtr SDL_AllocSurface(...)
+        /// <summary>
+        /// Same as <see cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)"/>
+        /// </summary>
+        /// <param name="flags"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="depth"></param>
+        /// <param name="Rmask"></param>
+        /// <param name="Gmask"></param>
+        /// <param name="Bmask"></param>
+        /// <param name="Amask"></param>
+        /// <returns></returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION, EntryPoint = "SDL_CreateRGBSurface"),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern IntPtr SDL_AllocSurface(uint flags,
+            int width, int height, int depth,
+            uint Rmask, uint Gmask, uint Bmask, uint Amask);
+        #endregion IntPtr SDL_AllocSurface(...)
+
+        #region IntPtr SDL_CreateRGBSurfaceFrom(...)
+        /// <summary>
+        /// Create an SDL_Surface from pixel data
+        /// </summary>
+        /// <remarks>
+        /// Creates an SDL_Surface from the provided pixel data.
+        /// <p>
+        /// The data stored in pixels is assumed to be of the depth specified 
+        /// in the parameter list. The pixel data is not copied into the SDL_Surface
+        ///  structure so it should not be freed until the surface has been freed 
+        ///  with a called to <see cref="SDL_FreeSurface"/>. pitch is the length of each scanline
+        ///   in bytes. </p>
+        ///   <p>
+        /// See <see cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)"/> for a more detailed description of the other 
+        /// parameters.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_Surface *SDL_CreateRGBSurfaceFrom(void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="pixels"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="depth"></param>
+        /// <param name="pitch">length of each scanline in bytes.</param>
+        /// <param name="Rmask"></param>
+        /// <param name="Gmask"></param>
+        /// <param name="Bmask"></param>
+        /// <param name="Amask"></param>
+        /// <returns>Returns the created surface, or NULL upon error.
+        /// </returns>
+        /// <seealso cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)"/>
+        /// <seealso cref="SDL_FreeSurface"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_CreateRGBSurfaceFrom(IntPtr pixels,
+            int width, int height, int depth, int pitch, int Rmask,
+            int Gmask, int Bmask, int Amask);
+        #endregion IntPtr SDL_CreateRGBSurfaceFrom(...)
+
+        #region IntPtr SDL_CreateRGBSurfaceFrom(...)
+        /// <summary>
+        /// Create an SDL_Surface from pixel data
+        /// </summary>
+        /// <remarks>
+        /// Creates an SDL_Surface from the provided pixel data.
+        /// <p>
+        /// The data stored in pixels is assumed to be of the depth specified 
+        /// in the parameter list. The pixel data is not copied into the SDL_Surface
+        ///  structure so it should not be freed until the surface has been freed 
+        ///  with a called to <see cref="SDL_FreeSurface"/>. pitch is the length of each scanline
+        ///   in bytes. </p>
+        ///   <p>
+        /// See <see cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)"/> for a more detailed description of the other 
+        /// parameters.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_Surface *SDL_CreateRGBSurfaceFrom(void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="pixels"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="depth"></param>
+        /// <param name="pitch">length of each scanline in bytes.</param>
+        /// <param name="Rmask"></param>
+        /// <param name="Gmask"></param>
+        /// <param name="Bmask"></param>
+        /// <param name="Amask"></param>
+        /// <returns>Returns the created surface, or NULL upon error.
+        /// </returns>
+        /// <seealso cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)"/>
+        /// <seealso cref="SDL_FreeSurface"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern IntPtr SDL_CreateRGBSurfaceFrom(IntPtr pixels,
+            int width, int height, int depth, int pitch, uint Rmask,
+            uint Gmask, uint Bmask, uint Amask);
+        #endregion IntPtr SDL_CreateRGBSurfaceFrom(...)
+
+        #region void SDL_FreeSurface(IntPtr surface)
+        /// <summary>
+        /// Frees (deletes) a SDL_Surface
+        /// </summary>
+        /// <remarks>
+        /// Frees the resources used by a previously created <see cref="SDL_Surface"/>.
+        /// If the surface was created using <see cref="SDL_CreateRGBSurfaceFrom(System.IntPtr, int, int, int, int, int, int, int, int)"/> 
+        /// then the pixel data is not freed.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>void SDL_FreeSurface(SDL_Surface *surface)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="surface"></param>
+        /// <seealso cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)">SDL_CreateRGBSurface</seealso>
+        /// <seealso cref="SDL_CreateRGBSurfaceFrom(System.IntPtr, int, int, int, int, int, int, int, int)">SDL_CreateRGBSurfaceFrom</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_FreeSurface(IntPtr surface);
+        #endregion void SDL_FreeSurface(IntPtr surface)
+
+        #region int SDL_LockSurface(IntPtr surface)
+        /// <summary>
+        /// Lock a surface for directly access.
+        /// </summary>
+        /// <remarks>
+        /// SDL_LockSurface sets up a surface for directly accessing the pixels. 
+        /// Between calls to SDL_LockSurface and SDL_UnlockSurface, you can write
+        ///  to and read from <i>surface.pixels</i>, using the pixel format stored in 
+        ///  <i>surface.format</i>. Once you are done accessing the surface, 
+        ///  you should use SDL_UnlockSurface to release it.
+        /// <p>Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates
+        ///  to 0, then you can read and write to the surface at any time, and the 
+        ///  pixel format of the surface will not change. </p>
+        /// <p>No operating system or library calls should be made between 
+        /// lock/unlock pairs, as critical system locks may be held during this time.
+        /// </p>
+        /// <p>It should be noted, that since SDL 1.1.8 surface locks are recursive.
+        ///  This means that you can lock a surface multiple times, but each lock
+        ///   must have a match unlock. </p>
+        ///<code>
+        ///		.
+        ///		SDL_LockSurface( surface );
+        ///		.
+        ///		/* Surface is locked */
+        ///		/* Direct pixel access on surface here */
+        ///		.
+        ///		SDL_LockSurface( surface );
+        ///		.
+        ///		/* More direct pixel access on surface */
+        ///		.
+        ///		SDL_UnlockSurface( surface );
+        ///		/* Surface is still locked */
+        ///		/* Note: Is versions < 1.1.8, the surface would have been */
+        ///		/* no longer locked at this stage                         */
+        ///		.
+        ///		SDL_UnlockSurface( surface );
+        ///		/* Surface is now unlocked */
+        ///		.
+        ///		</code>
+        ///		<p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_LockSurface(SDL_Surface *surface)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="surface"></param>
+        /// <returns>SDL_LockSurface returns 0, or -1 if the surface couldn't be locked.
+        /// </returns>
+        /// <seealso cref="SDL_UnlockSurface">SDL_UnlockSurface</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_LockSurface(IntPtr surface);
+        #endregion int SDL_LockSurface(IntPtr surface)
+
+        #region int SDL_UnlockSurface(IntPtr surface)
+        /// <summary>
+        /// Unlocks a previously locked surface.
+        /// </summary>
+        /// <remarks>
+        /// Surfaces that were previously locked using <see cref="SDL_LockSurface"/> 
+        /// must be unlocked with SDL_UnlockSurface. Surfaces should be 
+        /// unlocked as soon as possible.
+        /// <p>It should be noted that since 1.1.8, surface 
+        /// locks are recursive. See <see cref="SDL_LockSurface"/>.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>void SDL_UnlockSurface(SDL_Surface *surface)</code>
+        /// </p>
+        /// </remarks>
+        /// <param name="surface"></param>
+        /// <returns></returns>
+        /// <seealso cref="SDL_LockSurface">SDL_LockSurface</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_UnlockSurface(IntPtr surface);
+        #endregion int SDL_UnlockSurface(IntPtr surface)
+
+        #region IntPtr SDL_LoadBMP_RW(IntPtr src, int freesrc)
+        /// <summary>
+        /// Load a surface from a seekable SDL data source (memory or file.)
+        /// </summary>
+        /// <remarks>
+        /// If 'freesrc' is non-zero, the source will be closed after being read.
+        /// Returns the new surface, or NULL if there was an error.
+        /// The new surface should be freed with SDL_FreeSurface().
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_Surface * SDLCALL SDL_LoadBMP_RW(SDL_RWops *src, int freesrc)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="src">IntPtr to SDL_Surface</param>
+        /// <param name="freesrc"></param>
+        /// <returns></returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_LoadBMP_RW(IntPtr src, int freesrc);
+        #endregion IntPtr SDL_LoadBMP_RW(IntPtr src, int freesrc)
+
+        #region IntPtr SDL_LoadBMP(string file)
+        /// <summary>
+        /// Load a Windows BMP file into an SDL_Surface.
+        /// </summary>
+        /// <remarks>
+        /// Loads a surface from a named Windows BMP file.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>
+        /// SDL_Surface * SDL_LoadBMP(const char *file)
+        /// #define SDL_LoadBMP(file)	SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="file"></param>
+        /// <returns>Returns the new surface, or NULL if there was an error.</returns>
+        /// <seealso cref="SDL_SaveBMP">SDL_SaveBMP</seealso>
+        public static IntPtr SDL_LoadBMP(string file)
+        {
+            return SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1);
+        }
+        #endregion IntPtr SDL_LoadBMP(string file)
+
+        #region int SDL_SaveBMP_RW(IntPtr surface, IntPtr dst, int freedst)
+        /// <summary>
+        /// Save a surface to a seekable SDL data source (memory or file.)
+        /// </summary>
+        /// <remarks>If 'freedst' is non-zero, the source will be closed after 
+        /// being written.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>
+        /// int SDLCALL SDL_SaveBMP_RW (SDL_Surface *surface, SDL_RWops *dst, int freedst)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="surface"></param>
+        /// <param name="dst"></param>
+        /// <param name="freedst"></param>
+        /// <returns>Returns 0 if successful or -1 if there was an error.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SaveBMP_RW(IntPtr surface, IntPtr dst,
+            int freedst);
+        #endregion int SDL_SaveBMP_RW(IntPtr surface, IntPtr dst, int freedst)
+
+        #region int SDL_SaveBMP(IntPtr surface, string file)
+        /// <summary>
+        /// Save an SDL_Surface as a Windows BMP file.
+        /// </summary>
+        /// <remarks>
+        /// Saves the SDL_Surface surface as a Windows BMP file named file.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>
+        /// int SDL_SaveBMP(SDL_Surface *surface, const char *file);
+        /// #define SDL_SaveBMP(surface, file) SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="file"></param>
+        /// <param name="surface"></param>
+        /// <returns>Returns 0 if successful or -1 if there was an error.</returns>
+        /// <seealso cref="SDL_SaveBMP">SDL_LoadBMP</seealso>
+        public static int SDL_SaveBMP(IntPtr surface, string file)
+        {
+            return SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1);
+        }
+        #endregion int SDL_SaveBMP(IntPtr surface, string file)
+
+        #region int SDL_SetColorKey(IntPtr surface, int flag, int key)
+        /// <summary>
+        /// Sets the color key (transparent pixel) in a blittable surface and RLE acceleration.
+        /// </summary>
+        /// <remarks>
+        /// Sets the color key (transparent pixel) in a blittable surface and 
+        /// enables or disables RLE blit acceleration.
+        /// <p>RLE acceleration can substantially speed up blitting of images 
+        /// with large horizontal runs of transparent pixels (i.e., pixels that
+        ///  match the key value). The key must be of the same pixel format as 
+        ///  the surface, <see cref="SDL_MapRGB"/> is often useful for obtaining an acceptable 
+        ///  value.</p>
+        /// <p>If flag is SDL_SRCCOLORKEY then key is the transparent pixel value 
+        /// in the source image of a blit.</p>		
+        /// <p>If flag is OR'd with SDL_RLEACCEL then the surface will be draw 
+        /// using RLE acceleration when drawn with <see cref="SDL_BlitSurface"/>. The surface 
+        /// will actually be encoded for RLE acceleration the first time 
+        /// <see cref="SDL_BlitSurface"/> or <see cref="SDL_DisplayFormat"/> is called on the surface.</p>
+        /// <p>If flag is 0, this function clears any current color key.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="surface"></param>
+        /// <param name="flag"></param>
+        /// <param name="key"></param>
+        /// <returns>
+        /// This function returns 0, or -1 if there was an error.
+        /// </returns>
+        /// <seealso cref="SDL_BlitSurface">SDL_BlitSurface</seealso>
+        /// <seealso cref="SDL_DisplayFormat">SDL_DisplayFormat</seealso>
+        /// <seealso cref="SDL_MapRGB">SDL_MapRGB</seealso>
+        /// <seealso cref="SDL_SetAlpha(IntPtr, int, byte)">SDL_SetAlpha</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SetColorKey(IntPtr surface, int flag,
+            int key);
+        #endregion int SDL_SetColorKey(IntPtr surface, int flag, int key)
+
+        #region int SDL_SetColorKey(IntPtr surface, uint flag, int ukey)
+        /// <summary>
+        /// Sets the color key (transparent pixel) in a blittable surface and RLE acceleration.
+        /// </summary>
+        /// <remarks>
+        /// Sets the color key (transparent pixel) in a blittable surface and 
+        /// enables or disables RLE blit acceleration.
+        /// <p>RLE acceleration can substantially speed up blitting of images 
+        /// with large horizontal runs of transparent pixels (i.e., pixels that
+        ///  match the key value). The key must be of the same pixel format as 
+        ///  the surface, <see cref="SDL_MapRGB"/> is often useful for obtaining an acceptable 
+        ///  value.</p>
+        /// <p>If flag is SDL_SRCCOLORKEY then key is the transparent pixel value 
+        /// in the source image of a blit.</p>		
+        /// <p>If flag is OR'd with SDL_RLEACCEL then the surface will be draw 
+        /// using RLE acceleration when drawn with <see cref="SDL_BlitSurface"/>. The surface 
+        /// will actually be encoded for RLE acceleration the first time 
+        /// <see cref="SDL_BlitSurface"/> or <see cref="SDL_DisplayFormat"/> is called on the surface.</p>
+        /// <p>If flag is 0, this function clears any current color key.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="surface"></param>
+        /// <param name="flag"></param>
+        /// <param name="key"></param>
+        /// <returns>
+        /// This function returns 0, or -1 if there was an error.
+        /// </returns>
+        /// <seealso cref="SDL_BlitSurface">SDL_BlitSurface</seealso>
+        /// <seealso cref="SDL_DisplayFormat">SDL_DisplayFormat</seealso>
+        /// <seealso cref="SDL_MapRGB">SDL_MapRGB</seealso>
+        /// <seealso cref="SDL_SetAlpha(IntPtr, int, byte)">SDL_SetAlpha</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_SetColorKey(IntPtr surface, uint flag,
+            uint key);
+        #endregion int SDL_SetColorKey(IntPtr surface, uint flag, uint key)
+
+        #region int SDL_SetAlpha(IntPtr surface, int flag, byte alpha);
+        /// <summary>
+        /// Adjust the alpha properties of a surface.
+        /// </summary>
+        /// <remarks>
+        /// SDL_SetAlpha is used for setting the per-surface alpha value and/or
+        /// enabling and disabling alpha blending.
+        /// <p>The surface parameter specifies which surface whose alpha 
+        /// attributes you wish to adjust. flags is used to specify whether
+        ///  alpha blending should be used (SDL_SRCALPHA) and whether the 
+        ///  surface should use RLE acceleration for blitting (SDL_RLEACCEL).
+        ///   flags can be an OR'd combination of these two options, one of 
+        ///   these options or 0. If SDL_SRCALPHA is not passed as a flag then 
+        ///   all alpha information is ignored when blitting the surface. The
+        ///    alpha parameter is the per-surface alpha value; a surface 
+        ///    need not have an alpha channel to use per-surface alpha and 
+        ///    blitting can still be accelerated with SDL_RLEACCEL.</p>
+        /// <p>Note: The per-surface alpha value of 128 is considered a 
+        /// special case and is optimised, so it's much faster than other 
+        /// per-surface values.</p>
+        /// Alpha effects surface blitting in the following ways:
+        /// <list type="table">
+        ///             <item>
+        ///                 <term>RGBA->RGB with SDL_SRCALPHA</term>
+        ///                 <description>The source is alpha-blended with 
+        ///                 the destination, using the alpha channel. 
+        ///                 SDL_SRCCOLORKEY and the per-surface alpha 
+        ///                 are ignored.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGBA->RGB without SDL_SRCALPHA</term>
+        ///                 <description>The RGB data is copied from the source.
+        ///                  The source alpha channel and the per-surface
+        ///                   alpha value are ignored.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGB->RGBA with SDL_SRCALPHA</term>
+        ///                 <description>The source is alpha-blended with the 
+        ///                 destination using the per-surface alpha value. 
+        ///                 If SDL_SRCCOLORKEY is set, only the pixels not 
+        ///                 matching the colorkey value are copied. The alpha 
+        ///                 channel of the copied pixels is set to opaque.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGB->RGBA without SDL_SRCALPHA</term>
+        ///                 <description>The RGB data is copied from the 
+        ///                 source and the alpha value of the copied pixels
+        ///                  is set to opaque. If SDL_SRCCOLORKEY is set, 
+        ///                  only the pixels not matching the colorkey value
+        ///                   are copied.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGBA->RGBA with SDL_SRCALPHA</term>
+        ///                 <description>The source is alpha-blended with
+        ///                  the destination using the source alpha channel.
+        ///                   The alpha channel in the destination surface 
+        ///                   is left untouched. SDL_SRCCOLORKEY is ignored.
+        ///                   </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGBA->RGBA without SDL_SRCALPHA</term>
+        ///                 <description>The RGBA data is copied to the destination
+        ///                  surface. If SDL_SRCCOLORKEY is set, only the pixels 
+        ///                  not matching the colorkey value are copied.
+        ///                  </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGB->RGB with SDL_SRCALPHA</term>
+        ///                 <description>The source is alpha-blended with the 
+        ///                 destination using the per-surface alpha value. 
+        ///                 If SDL_SRCCOLORKEY is set, only the pixels not 
+        ///                 matching the colorkey value are copied.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGB->RGB without SDL_SRCALPHA</term>
+        ///                 <description>The RGB data is copied from the source.
+        ///                  If SDL_SRCCOLORKEY is set, only the pixels not 
+        ///                  matching the colorkey value are copied.
+        ///                  </description>
+        ///             </item>
+        ///         </list>
+        /// <p>Note: Note that RGBA->RGBA blits (with SDL_SRCALPHA set) keep 
+        /// the alpha of the destination surface. This means that you cannot 
+        /// compose two arbitrary RGBA surfaces this way and get the result 
+        /// you would expect from "overlaying" them; the destination alpha 
+        /// will work as a mask.</p>
+        /// <p>Also note that per-pixel and per-surface alpha cannot be
+        ///  combined; the per-pixel alpha is always used if available.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="surface"></param>
+        /// <param name="flag"></param>
+        /// <param name="alpha"></param>
+        /// <returns>This function returns 0, or -1 if there was an error.
+        /// </returns>
+        /// <seealso cref="SDL_MapRGBA">SDL_MapRGBA</seealso>
+        /// <seealso cref="SDL_GetRGBA">SDL_GetRGBA</seealso>
+        /// <seealso cref="SDL_DisplayFormatAlpha">SDL_DisplayFormatAlpha</seealso>
+        /// <seealso cref="SDL_BlitSurface">SDL_BlitSurface</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_SetAlpha(IntPtr surface, int flag,
+            byte alpha);
+        #endregion int SDL_SetAlpha(IntPtr surface, int flag, byte alpha);
+
+        #region int SDL_SetAlpha(IntPtr surface, uint flag, byte alpha);
+        /// <summary>
+        /// Adjust the alpha properties of a surface.
+        /// </summary>
+        /// <remarks>
+        /// SDL_SetAlpha is used for setting the per-surface alpha value and/or
+        /// enabling and disabling alpha blending.
+        /// <p>The surface parameter specifies which surface whose alpha 
+        /// attributes you wish to adjust. flags is used to specify whether
+        ///  alpha blending should be used (SDL_SRCALPHA) and whether the 
+        ///  surface should use RLE acceleration for blitting (SDL_RLEACCEL).
+        ///   flags can be an OR'd combination of these two options, one of 
+        ///   these options or 0. If SDL_SRCALPHA is not passed as a flag then 
+        ///   all alpha information is ignored when blitting the surface. The
+        ///    alpha parameter is the per-surface alpha value; a surface 
+        ///    need not have an alpha channel to use per-surface alpha and 
+        ///    blitting can still be accelerated with SDL_RLEACCEL.</p>
+        /// <p>Note: The per-surface alpha value of 128 is considered a 
+        /// special case and is optimised, so it's much faster than other 
+        /// per-surface values.</p>
+        /// Alpha effects surface blitting in the following ways:
+        /// <list type="table">
+        ///             <item>
+        ///                 <term>RGBA->RGB with SDL_SRCALPHA</term>
+        ///                 <description>The source is alpha-blended with 
+        ///                 the destination, using the alpha channel. 
+        ///                 SDL_SRCCOLORKEY and the per-surface alpha 
+        ///                 are ignored.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGBA->RGB without SDL_SRCALPHA</term>
+        ///                 <description>The RGB data is copied from the source.
+        ///                  The source alpha channel and the per-surface
+        ///                   alpha value are ignored.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGB->RGBA with SDL_SRCALPHA</term>
+        ///                 <description>The source is alpha-blended with the 
+        ///                 destination using the per-surface alpha value. 
+        ///                 If SDL_SRCCOLORKEY is set, only the pixels not 
+        ///                 matching the colorkey value are copied. The alpha 
+        ///                 channel of the copied pixels is set to opaque.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGB->RGBA without SDL_SRCALPHA</term>
+        ///                 <description>The RGB data is copied from the 
+        ///                 source and the alpha value of the copied pixels
+        ///                  is set to opaque. If SDL_SRCCOLORKEY is set, 
+        ///                  only the pixels not matching the colorkey value
+        ///                   are copied.</description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGBA->RGBA with SDL_SRCALPHA</term>
+        ///                 <description>The source is alpha-blended with
+        ///                  the destination using the source alpha channel.
+        ///                   The alpha channel in the destination surface 
+        ///                   is left untouched. SDL_SRCCOLORKEY is ignored.
+        ///                   </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGBA->RGBA without SDL_SRCALPHA</term>
+        ///                 <description>The RGBA data is copied to the destination
+        ///                  surface. If SDL_SRCCOLORKEY is set, only the pixels 
+        ///                  not matching the colorkey value are copied.
+        ///                  </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGB->RGB with SDL_SRCALPHA</term>
+        ///                 <description>The source is alpha-blended with the 
+        ///                 destination using the per-surface alpha value. 
+        ///                 If SDL_SRCCOLORKEY is set, only the pixels not 
+        ///                 matching the colorkey value are copied.
+        ///                 </description>
+        ///             </item>
+        ///             <item>
+        ///                 <term>RGB->RGB without SDL_SRCALPHA</term>
+        ///                 <description>The RGB data is copied from the source.
+        ///                  If SDL_SRCCOLORKEY is set, only the pixels not 
+        ///                  matching the colorkey value are copied.
+        ///                  </description>
+        ///             </item>
+        ///         </list>
+        /// <p>Note: Note that RGBA->RGBA blits (with SDL_SRCALPHA set) keep 
+        /// the alpha of the destination surface. This means that you cannot 
+        /// compose two arbitrary RGBA surfaces this way and get the result 
+        /// you would expect from "overlaying" them; the destination alpha 
+        /// will work as a mask.</p>
+        /// <p>Also note that per-pixel and per-surface alpha cannot be
+        ///  combined; the per-pixel alpha is always used if available.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha);
+        /// </code></p>
+        /// </remarks>
+        /// <param name="surface"></param>
+        /// <param name="flag"></param>
+        /// <param name="alpha"></param>
+        /// <returns>This function returns 0, or -1 if there was an error.
+        /// </returns>
+        /// <seealso cref="SDL_MapRGBA">SDL_MapRGBA</seealso>
+        /// <seealso cref="SDL_GetRGBA">SDL_GetRGBA</seealso>
+        /// <seealso cref="SDL_DisplayFormatAlpha">SDL_DisplayFormatAlpha</seealso>
+        /// <seealso cref="SDL_BlitSurface">SDL_BlitSurface</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_SetAlpha(IntPtr surface, uint flag,
+            byte alpha);
+        #endregion int SDL_SetAlpha(IntPtr surface, uint flag, byte alpha);
+
+        #region void SDL_SetClipRect(IntPtr surface, ref Sdl_Rect rect)
+        /// <summary>
+        /// Sets the clipping rectangle for a surface.
+        /// </summary>
+        /// <remarks>
+        /// Sets the clipping rectangle for a surface. When this surface 
+        /// is the destination of a blit, only the area within the clip 
+        /// rectangle will be drawn into.
+        /// <p>The rectangle pointed to by rect will be clipped to the 
+        /// edges of the surface so that the clip rectangle for a surface 
+        /// can never fall outside the edges of the surface.</p>
+        /// <p>If rect is NULL the clipping rectangle will be set to the 
+        /// full size of the surface.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>
+        /// void SDL_SetClipRect(SDL_Surface *surface, SDL_Rect *rect)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="surface">IntPtr to SDL_Surface</param>
+        /// <param name="rect">SDL_Rect</param>
+        /// <seealso cref="SDL_GetClipRect">SDL_GetClipRect</seealso>
+        /// <seealso cref="SDL_BlitSurface">SDL_BlitSurface</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_SetClipRect(IntPtr surface, ref SDL_Rect rect);
+        #endregion void SDL_SetClipRect(IntPtr surface, ref SDL_Rect rect)
+
+        #region void SDL_GetClipRect(IntPtr surface, ref SDL_Rect rect)
+        /// <summary>
+        /// Gets the clipping rectangle for a surface.
+        /// </summary>
+        /// <remarks>
+        /// Gets the clipping rectangle for a surface. 
+        /// When this surface is the destination of a blit, 
+        /// only the area within the clip rectangle is drawn into.
+        /// <p>The rectangle pointed to by rect will be filled with the 
+        /// clipping rectangle of the surface.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>
+        /// void SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="surface">IntPtr to SDL_Surface</param>
+        /// <param name="rect">SDL_Rect</param>
+        /// <seealso cref="SDL_SetClipRect">SDL_SetClipRect</seealso>
+        /// <seealso cref="SDL_BlitSurface">SDL_BlitSurface</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_GetClipRect(IntPtr surface, ref SDL_Rect rect);
+        #endregion void SDL_GetClipRect(IntPtr surface, ref SDL_Rect rect)
+
+        #region IntPtr SDL_ConvertSurface(IntPtr src, IntPtr fmt, int flags)
+        /// <summary>
+        /// Converts a surface to the same format as another surface.
+        /// </summary>
+        /// <remarks>
+        /// Creates a new surface of the specified format, 
+        /// and then copies and maps the given surface to it. 
+        /// If this function fails, it returns NULL.
+        /// <p>The flags parameter is passed to 
+        /// <see cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)"/> and has those semantics.</p>
+        /// <p>This function is used internally by <see cref="SDL_DisplayFormat"/>.</p>
+        /// <p>This function can only be called after SDL_Init.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>
+        /// SDL_Surface *SDL_ConvertSurface(SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="src">IntPtr to SDL_Surface</param>
+        /// <param name="fmt">IntPTr to SDL_PixelFormat</param>
+        /// <param name="flags"></param>
+        /// <returns>
+        /// Returns either a pointer to the new surface, or NULL on error.
+        /// </returns>
+        /// <seealso cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)">SDL_CreateRGBSurface</seealso>
+        /// <seealso cref="SDL_DisplayFormat">SDL_DisplayFormat</seealso>
+        /// <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_ConvertSurface(IntPtr src, IntPtr fmt,
+            int flags);
+        #endregion IntPtr SDL_ConvertSurface(IntPtr src, IntPtr fmt, int flags)
+
+        #region IntPtr SDL_ConvertSurface(IntPtr src, IntPtr fmt, uint flags)
+        /// <summary>
+        /// Converts a surface to the same format as another surface.
+        /// </summary>
+        /// <remarks>
+        /// Creates a new surface of the specified format, 
+        /// and then copies and maps the given surface to it. 
+        /// If this function fails, it returns NULL.
+        /// <p>The flags parameter is passed to 
+        /// <see cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)"/> and has those semantics.</p>
+        /// <p>This function is used internally by <see cref="SDL_DisplayFormat"/>.</p>
+        /// <p>This function can only be called after SDL_Init.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>
+        /// SDL_Surface *SDL_ConvertSurface(SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="src">IntPtr to SDL_Surface</param>
+        /// <param name="fmt">IntPTr to SDL_PixelFormat</param>
+        /// <param name="flags"></param>
+        /// <returns>
+        /// Returns either a pointer to the new surface, or NULL on error.
+        /// </returns>
+        /// <seealso cref="SDL_CreateRGBSurface(int, int, int, int, int, int, int, int)">SDL_CreateRGBSurface</seealso>
+        /// <seealso cref="SDL_DisplayFormat">SDL_DisplayFormat</seealso>
+        /// <seealso cref="SDL_PixelFormat">SDL_PixelFormat</seealso>
+        /// <seealso cref="SDL_Surface">SDL_Surface</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern IntPtr SDL_ConvertSurface(IntPtr src, IntPtr fmt,
+            uint flags);
+        #endregion IntPtr SDL_ConvertSurface(IntPtr src, IntPtr fmt, uint flags)
+
+        #region int SDL_BlitSurface(IntPtr src, IntPtr srcrect, IntPtr dst, IntPtr dstrect)
+        /// <summary>
+        /// This performs a fast blit from the source surface to the 
+        /// destination surface.
+        /// </summary>
+        /// <remarks>
+        /// This performs a fast blit from the source surface 
+        /// to the destination surface.
+        /// <p>The width and height in srcrect determine the 
+        /// size of the copied rectangle. Only the position is used 
+        /// in the dstrect (the width and height are ignored).</p>
+        /// <p>If srcrect is NULL, the entire surface is copied. 
+        /// If dstrect is NULL, then the destination position 
+        /// (upper left corner) is (0, 0).</p>
+        /// <p>The final blit rectangle is saved in dstrect after all 
+        /// clipping is performed (srcrect is not modified).</p>
+        /// <p>The blit function should not be called on a locked surface.</p>
+        /// <p> The results of blitting operations vary greatly depending 
+        /// on whether SDL_SRCAPLHA is set or not. See SDL_SetAlpha for an
+        ///  explaination of how this affects your results. Colorkeying and 
+        ///  alpha attributes also interact with surface blitting, as the
+        ///  following pseudo-code should hopefully explain. </p>
+        /// <code>if (source surface has SDL_SRCALPHA set) 
+        ///	{
+        ///		if (source surface has alpha channel (that is, format->Amask != 0))
+        ///		blit using per-pixel alpha, ignoring any colour key
+        ///		else {
+        ///		if (source surface has SDL_SRCCOLORKEY set)
+        ///			blit using the colour key AND the per-surface alpha value
+        ///		else
+        ///			blit using the per-surface alpha value
+        ///		}
+        ///} 
+        ///else 
+        ///{
+        ///if (source surface has SDL_SRCCOLORKEY set)
+        ///blit using the colour key
+        ///else
+        ///ordinary opaque rectangular blit
+        ///}</code>
+        ///<p>Binds to C-function call in SDL_video.h:
+        ///<code>int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
+        ///</code></p>
+        /// </remarks>
+        /// <param name="src">IntPtr to SDL_Surface</param>
+        /// <param name="srcrect">IntPtr to SDL_Rect</param>
+        /// <param name="dst">IntPtr to SDL_Surface</param>
+        /// <param name="dstrect">IntPtr to SDL_Rect</param>
+        /// <returns>If the blit is successful, it returns 0, otherwise it 
+        /// returns -1.
+        /// <p>If either of the surfaces were in video memory, 
+        /// and the blit returns -2, the video memory was lost, 
+        /// so it should be reloaded with artwork and re-blitted: </p>
+        ///
+        /// <code>while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) 
+        ///	{
+        ///		while ( SDL_LockSurface(image)) < 0 )
+        ///		SDL_Delay(10);
+        ///		-- Write image pixels to image->pixels --
+        ///		SDL_UnlockSurface(image);
+        ///	}
+        ///	</code>
+        /// <p>This happens under DirectX 5.0 when the system switches away from your 
+        /// fullscreen application. Locking the surface will also fail until you 
+        /// have access to the video memory again.</p>	
+        /// </returns>	
+        /// <seealso cref="SDL_LockSurface"/>
+        /// <seealso cref="SDL_FillRect(IntPtr, ref SDL_Rect, int)"/>
+        /// <seealso cref="SDL_Surface"/>
+        /// <seealso cref="SDL_Rect"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION,
+             EntryPoint = "SDL_UpperBlit"), SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_BlitSurface(IntPtr src, ref SDL_Rect srcrect,
+            IntPtr dst, ref SDL_Rect dstrect);
+        #endregion int SDL_BlitSurface(IntPtr src, IntPtr srcrect, IntPtr dst, IntPtr dstrect)
+
+        //	semi-private --	should not be used and will	not	be implemented.
+        //	SDL_UpperBlit									
+        //	SDL_LowerBlit
+
+        #region int SDL_FillRect(IntPtr surface, ref SDL_Rect rect, int color)
+        /// <summary>
+        /// This function performs a fast fill of the given rectangle with some color.
+        /// </summary>
+        /// <remarks>
+        /// This function performs a fast fill of the given rectangle with color. 
+        /// If dstrect is NULL, the whole surface will be filled with color.
+        /// <p>The color should be a pixel of the format used by the surface,
+        ///  and can be generated by the <see cref="SDL_MapRGB"/> or 
+        ///  <see cref="SDL_MapRGBA"/> functions.
+        ///   If the color value contains an alpha value then the destination
+        ///    is simply "filled" with that alpha information, no blending 
+        ///    takes place.</p>
+        /// <p>If there is a clip rectangle set on the destination (set via
+        ///  <see cref="SDL_SetClipRect"/>) then this function will clip based on the 
+        ///  intersection of the clip rectangle and the dstrect rectangle 
+        ///  and the dstrect rectangle will be modified to represent the 
+        ///  area actually filled.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>
+        /// int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="surface">IntPtr to SDL_Surface</param>
+        /// <param name="rect">IntPtr to SDL_Rect</param>
+        /// <param name="color"></param>
+        /// <returns>
+        /// This function returns 0 on success, or -1 on error.
+        /// </returns>
+        /// <seealso cref="SDL_MapRGB"/>
+        /// <seealso cref="SDL_MapRGBA"/>
+        /// <seealso cref="SDL_BlitSurface"/>
+        /// <seealso cref="SDL_Rect"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_FillRect(IntPtr surface, ref SDL_Rect rect,
+            int color);
+        #endregion int SDL_FillRect(IntPtr surface, ref SDL_Rect rect, int color)
+
+        #region int SDL_FillRect(IntPtr surface, ref SDL_Rect rect, uint color)
+        /// <summary>
+        /// This function performs a fast fill of the given rectangle with some color.
+        /// </summary>
+        /// <remarks>
+        /// This function performs a fast fill of the given rectangle with color. 
+        /// If dstrect is NULL, the whole surface will be filled with color.
+        /// <p>The color should be a pixel of the format used by the surface,
+        ///  and can be generated by the <see cref="SDL_MapRGB"/> or 
+        ///  <see cref="SDL_MapRGBA"/> functions.
+        ///   If the color value contains an alpha value then the destination
+        ///    is simply "filled" with that alpha information, no blending 
+        ///    takes place.</p>
+        /// <p>If there is a clip rectangle set on the destination (set via
+        ///  <see cref="SDL_SetClipRect"/>) then this function will clip based on the 
+        ///  intersection of the clip rectangle and the dstrect rectangle 
+        ///  and the dstrect rectangle will be modified to represent the 
+        ///  area actually filled.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>
+        /// int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="surface">IntPtr to SDL_Surface</param>
+        /// <param name="rect">IntPtr to SDL_Rect</param>
+        /// <param name="color"></param>
+        /// <returns>
+        /// This function returns 0 on success, or -1 on error.
+        /// </returns>
+        /// <seealso cref="SDL_MapRGB"/>
+        /// <seealso cref="SDL_MapRGBA"/>
+        /// <seealso cref="SDL_BlitSurface"/>
+        /// <seealso cref="SDL_Rect"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern int SDL_FillRect(IntPtr surface, ref SDL_Rect rect,
+            uint color);
+        #endregion int SDL_FillRect(IntPtr surface, ref SDL_Rect rect, uint color)
+
+        #region IntPtr SDL_DisplayFormat(IntPtr surface)
+        /// <summary>
+        /// Convert a surface to the display format.
+        /// </summary>
+        /// <remarks>
+        /// This function takes a surface and copies it to a new surface of the 
+        /// pixel format and colors of the video framebuffer, suitable for fast
+        ///  blitting onto the display surface. It calls 
+        ///  <see cref="SDL_ConvertSurface(IntPtr, IntPtr, int)"/>.
+        /// <p>If you want to take advantage of hardware colorkey or alpha blit
+        ///  acceleration, you should set the colorkey and alpha value before 
+        ///  calling this function.</p>
+        /// <p>If you want an alpha channel, see 
+        /// <see cref="SDL_DisplayFormatAlpha"/>.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="surface">IntPtr to SDL_Surface</param>
+        /// <returns>IntPtr to SDL_Surface. 
+        /// If the conversion fails or runs out of memory, 
+        /// it returns NULL</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_DisplayFormat(IntPtr surface);
+        #endregion IntPtr SDL_DisplayFormat(IntPtr surface)
+
+        #region IntPtr SDL_DisplayFormatAlpha(IntPtr surface)
+        /// <summary>
+        /// Convert a surface to the display format.
+        /// </summary>
+        /// <remarks>
+        /// This function takes a surface and copies it to a new surface of the 
+        /// pixel format and colors of the video framebuffer plus an alpha channel,
+        ///  suitable for fast blitting onto the display surface. 
+        ///  It calls <see cref="SDL_ConvertSurface(IntPtr, IntPtr, int)"/>.
+        /// <p>If you want to take advantage of hardware colorkey or alpha blit
+        ///  acceleration, you should set the colorkey and alpha value before 
+        ///  calling this function.</p>
+        /// <p>This function can be used to convert a colourkey to an alpha 
+        /// channel, if the SDL_SRCCOLORKEY flag is set on the surface. The 
+        /// generated surface will then be transparent (alpha=0) where the
+        ///  pixels match the colourkey, and opaque (alpha=255) elsewhere.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_Surface *SDL_DisplayFormatAlpha(SDL_Surface *surface)
+        /// </code></p></remarks>
+        /// <param name="surface"></param>
+        /// <returns>IntPtr to SDL_Surface. 
+        /// If the conversion fails or runs out of memory, 
+        /// it returns NULL</returns>
+        /// <seealso cref="SDL_ConvertSurface(IntPtr, IntPtr, int)"/>
+        /// <seealso cref="SDL_SetAlpha(IntPtr, int, byte)"/>
+        /// <seealso cref="SDL_SetColorKey(IntPtr, int, int)"/>
+        /// <seealso cref="SDL_DisplayFormat"/>
+        /// <seealso cref="SDL_Surface"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_DisplayFormatAlpha(IntPtr surface);
+        #endregion IntPtr SDL_DisplayFormatAlpha(IntPtr surface)
+
+        #region IntPtr SDL_CreateYUVOverlay(...);
+        /// <summary>
+        /// Create a YUV video overlay.
+        /// </summary>
+        /// <remarks>
+        /// SDL_CreateYUVOverlay creates a YUV overlay of the specified width, 
+        /// height and format (see <see cref="SDL_Overlay"/> for a list of 
+        /// available formats),
+        ///  for the provided display. A <see cref="SDL_Overlay"/> 
+        ///  structure is returned.
+        /// <p>The term 'overlay' is a misnomer since, unless the overlay is 
+        /// created in hardware, the contents for the display surface underneath
+        ///  the area where the overlay is shown will be overwritten when the 
+        ///  overlay is displayed.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_Overlay *SDL_CreateYUVOverlay(int width, int height, Uint32 format, SDL_Surface *display)
+        /// </code></p></remarks>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="format"></param>
+        /// <param name="display">IntPtr to SDL_Surface</param>
+        /// <returns>IntPtr to SDL_Overlay</returns>
+        /// <seealso cref="SDL_Overlay"/>
+        /// <seealso cref="SDL_DisplayYUVOverlay"/>
+        /// <seealso cref="SDL_FreeYUVOverlay"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_CreateYUVOverlay(int width, int height, int format, IntPtr display);
+        #endregion IntPtr SDL_CreateYUVOverlay(...);
+
+        #region IntPtr SDL_CreateYUVOverlay(...);
+        /// <summary>
+        /// Create a YUV video overlay.
+        /// </summary>
+        /// <remarks>
+        /// SDL_CreateYUVOverlay creates a YUV overlay of the specified width, 
+        /// height and format (see <see cref="SDL_Overlay"/> for a list of 
+        /// available formats),
+        ///  for the provided display. A <see cref="SDL_Overlay"/> 
+        ///  structure is returned.
+        /// <p>The term 'overlay' is a misnomer since, unless the overlay is 
+        /// created in hardware, the contents for the display surface underneath
+        ///  the area where the overlay is shown will be overwritten when the 
+        ///  overlay is displayed.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_Overlay *SDL_CreateYUVOverlay(int width, int height, Uint32 format, SDL_Surface *display)
+        /// </code></p></remarks>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="format"></param>
+        /// <param name="display">IntPtr to SDL_Surface</param>
+        /// <returns>IntPtr to SDL_Overlay</returns>
+        /// <seealso cref="SDL_Overlay"/>
+        /// <seealso cref="SDL_DisplayYUVOverlay"/>
+        /// <seealso cref="SDL_FreeYUVOverlay"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        [CLSCompliant(false)]
+        public static extern IntPtr SDL_CreateYUVOverlay(int width, int height, uint format, IntPtr display);
+        #endregion IntPtr SDL_CreateYUVOverlay(...);
+
+        #region int SDL_LockYUVOverlay(IntPtr overlay)
+        /// <summary>
+        /// Lock an overlay
+        /// </summary>
+        /// <remarks>
+        /// Much the same as <see cref="SDL_LockSurface"/>, 
+        /// SDL_LockYUVOverlay locks the overlay for direct access to pixel data.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_LockYUVOverlay(SDL_Overlay *overlay)
+        /// </code></p></remarks>
+        /// <param name="overlay"></param>
+        /// <returns>Returns 0 on success, or -1 on an error</returns>
+        /// <seealso cref="SDL_UnlockYUVOverlay"/>
+        /// <seealso cref="SDL_CreateYUVOverlay(int, int, int, IntPtr)"/>
+        /// <seealso cref="SDL_Overlay"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_LockYUVOverlay(IntPtr overlay);
+        #endregion int SDL_LockYUVOverlay(IntPtr overlay)
+
+        #region void SDL_UnlockYUVOverlay(IntPtr overlay)
+        /// <summary>
+        /// Unlock an overlay.
+        /// </summary>
+        /// <remarks>
+        /// The opposite to <see cref="SDL_LockYUVOverlay"/>. 
+        /// Unlocks a previously locked overlay. 
+        /// An overlay must be unlocked before it can be displayed.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>void SDLCALL SDL_UnlockYUVOverlay(SDL_Overlay *overlay)
+        /// </code></p></remarks>
+        /// <param name="overlay">IntPtr to SDL_Overlay</param>
+        /// <seealso cref="SDL_UnlockYUVOverlay"/>
+        /// <seealso cref="SDL_CreateYUVOverlay(int, int, int, IntPtr)"/>
+        /// <seealso cref="SDL_Overlay"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_UnlockYUVOverlay(IntPtr overlay);
+        #endregion void SDL_UnlockYUVOverlay(IntPtr overlay)
+
+        #region int SDL_DisplayYUVOverlay(IntPtr overlay, ref SDL_Rect dstrect)
+        /// <summary>
+        /// Blit the overlay to the display.
+        /// </summary>
+        /// <remarks>
+        /// Blit the overlay to the surface specified when it was <see cref="SDL_CreateYUVOverlay(int, int, int, IntPtr)">created</see>. 
+        /// The <see cref="SDL_Rect"/> structure, dstrect, specifies the position and size of the 
+        /// destination. If the dstrect is a larger or smaller than the overlay then
+        ///  the overlay will be scaled, this is optimized for 2x scaling.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect)
+        /// </code></p></remarks>
+        /// <param name="overlay">IntPtr to SDL_Overlay</param>
+        /// <param name="dstrect">SDL_Rect</param>
+        /// <returns>Returns 0 on success.</returns>
+        /// <seealso cref="SDL_Overlay"/>
+        /// <seealso cref="SDL_CreateYUVOverlay(int, int, int, IntPtr)"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_DisplayYUVOverlay(IntPtr overlay, ref SDL_Rect dstrect);
+        #endregion int SDL_DisplayYUVOverlay(IntPtr overlay, ref SDL_Rect dstrect)
+
+        #region void SDL_FreeYUVOverlay(IntPtr overlay)
+        /// <summary>
+        /// Free a YUV video overlay.
+        /// </summary>
+        /// <remarks>
+        /// Frees an <see cref="SDL_Overlay">overlay</see> created by <see cref="SDL_CreateYUVOverlay(int, int, int, IntPtr)"/>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_FreeYUVOverlay(SDL_Overlay *overlay)
+        /// </code></p></remarks>
+        /// <param name="overlay"></param>
+        /// <seealso cref="SDL_Overlay"/>
+        /// <seealso cref="SDL_DisplayYUVOverlay"/>
+        /// <seealso cref="SDL_CreateYUVOverlay(int, int, int, IntPtr)"/>
+        /// SDL_Overlay, SDL_DisplayYUVOverlay, SDL_FreeYUVOverlay
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_FreeYUVOverlay(IntPtr overlay);
+        #endregion void SDL_FreeYUVOverlay(IntPtr overlay)
+
+        #region int SDL_GL_LoadLibrary(string path)
+        /// <summary>
+        /// Specify an OpenGL library.
+        /// </summary>
+        /// <remarks>
+        /// If you wish, you may load the OpenGL library at runtime, this must 
+        /// be done before <see cref="SDL_SetVideoMode(int, int, int, int)"/> is called. 
+        /// The path of the GL 
+        /// library is passed to SDL_GL_LoadLibrary and it returns 0 on 
+        /// success, or -1 on 
+        ///  an error. You must then use <see cref="SDL_GL_GetProcAddress"/>
+        ///   to retrieve 
+        ///  function pointers to GL functions.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_GL_LoadLibrary(const char *path);
+        /// </code></p></remarks>
+        /// <param name="path"></param>
+        /// <returns>Returns 0 on success, or -1 on an error.</returns>
+        /// <seealso cref="SDL_GL_GetProcAddress"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GL_LoadLibrary(string path);
+        #endregion int SDL_GL_LoadLibrary(string path)
+
+        #region IntPtr SDL_GL_GetProcAddress(string proc)
+        /// <summary>
+        /// Get the address of a GL function
+        /// </summary>
+        /// <remarks>
+        /// Returns the address of the GL function proc, or NULL if the 
+        /// function is not found. If the GL library is loaded at runtime,
+        ///  with SDL_GL_LoadLibrary, then all GL functions must be retrieved
+        ///   this way. Usually this is used to retrieve function pointers 
+        ///   to OpenGL extensions.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>void *SDL_GL_GetProcAddress(const char* proc);
+        /// </code></p></remarks>
+        /// <example>
+        /// <code>
+        /// typedef void (*GL_ActiveTextureARB_Func)(unsigned int);
+        ///		GL_ActiveTextureARB_Func glActiveTextureARB_ptr = 0;
+        ///		int has_multitexture=1;
+        ///		.
+        ///		.
+        ///		.
+        ///		/* Get function pointer */
+        ///		glActiveTextureARB_ptr=(GL_ActiveTextureARB_Func) SDL_GL_GetProcAddress("glActiveTextureARB");
+        ///
+        ///		/* Check for a valid function ptr */
+        ///		if(!glActiveTextureARB_ptr)
+        ///			{
+        ///		fprintf(stderr, "Multitexture Extensions not present.\n");
+        ///		has_multitexture=0;
+        ///	}
+        ///	.
+        ///	.
+        ///	.
+        ///	.
+        ///	if(has_multitexture)
+        ///{
+        ///	glActiveTextureARB_ptr(GL_TEXTURE0_ARB);
+        ///	.
+        ///	.
+        ///}
+        ///	else
+        ///{
+        ///	.
+        ///	.
+        ///}
+        /// </code>
+        /// </example>
+        /// <param name="proc"></param>
+        /// <seealso cref="SDL_GL_LoadLibrary"/>
+        /// <returns>Returns the address of the GL function proc, or NULL if the 
+        /// function is not found.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr SDL_GL_GetProcAddress(string proc);
+        #endregion IntPtr SDL_GL_GetProcAddress(string proc)
+
+        #region void SDL_GL_SwapBuffers()
+        /// <summary>
+        /// Swap OpenGL framebuffers/Update Display
+        /// </summary>
+        /// <remarks>
+        /// Swap the OpenGL buffers, if double-buffering is supported.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>void SDL_GL_SwapBuffers(void )
+        /// </code></p></remarks>
+        /// <seealso cref="SDL_SetVideoMode(int, int, int, int)"/>
+        /// <seealso cref="SDL_GL_SetAttribute"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_GL_SwapBuffers();
+        #endregion void SDL_GL_SwapBuffers()
+
+        #region int SDL_GL_SetAttribute(SDL_GLattr attr, int val)
+        /// <summary>
+        /// Set a special SDL/OpenGL attribute.
+        /// </summary>
+        /// <remarks>
+        /// Sets the OpenGL attribute attr to value. 
+        /// The attributes you set don't 
+        /// take effect until after a call to <see cref="SDL_SetVideoMode(int, int, int, int)"/>.
+        ///  You should use 
+        /// <see cref="SDL_GL_GetAttribute"/> to check the values after a 
+        /// SDL_SetVideoMode call.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_GL_SetAttribute(SDL_GLattr attr, int value);
+        /// </code></p></remarks>
+        /// <param name="attr">SDL_GLattr enum</param>
+        /// <param name="val"></param>
+        /// <returns>Returns 0 on success, or -1 on error.</returns>
+        /// <seealso cref="SDL_GL_GetAttribute"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GL_SetAttribute(int attr,
+            int val);
+        #endregion int SDL_GL_SetAttribute(SDL_GLattr attr, int val)
+
+        #region int SDL_GL_GetAttribute(SDL_GLattr attr, out int val);
+        /// <summary>
+        /// Get the value of a special SDL/OpenGL attribute
+        /// </summary>
+        /// <remarks>
+        /// Places the value of the SDL/OpenGL 
+        /// attribute attr into value. This is 
+        /// useful after a call to <see cref="SDL_SetVideoMode(int, int, int, int)"/> to check 
+        /// whether your attributes have been 
+        /// <see cref="SDL_GL_SetAttribute">set</see> as you expected.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_GL_GetAttribute(SDLGLattr attr, int *value)
+        /// </code></p>
+        /// </remarks>
+        /// <param name="attr">SDL_GLattr enum</param>
+        /// <param name="val"></param>
+        /// <returns>Returns 0 on success, or -1 on an error.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_GL_GetAttribute(int attr,
+            out int val);
+        #endregion int SDL_GL_GetAttribute(SDL_GLattr attr, out int val);
+
+        //	Private functions that should not be called and will not be implmented.
+        //	SDL_GL_UpdateRects
+        //	SDL_GL_Lock
+        //	SDL_GL_Unlock
+
+        #region void SDL_WM_SetCaption(string title, string icon)
+        /// <summary>
+        /// Sets the title and icon text of the display window
+        /// </summary>
+        /// <remarks>
+        /// Sets the title-bar and icon name of the display window.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC void SDLCALL SDL_WM_SetCaption(const char *title, const char *icon)</code>
+        /// </p>
+        /// </remarks>
+        /// <seealso cref="SDL_WM_GetCaption">SDL_WM_GetCaption</seealso>
+        /// <seealso cref="SDL_WM_SetIcon">SDL_WM_SetIcon</seealso>
+        /// <param name="title"></param>
+        /// <param name="icon"></param>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_WM_SetCaption(string title, string icon);
+        #endregion void SDL_WM_SetCaption(string title, string icon)
+
+        #region void SDL_WM_GetCaption(out string title, out string icon)
+        /// <summary>
+        /// Gets the title and icon text of the display window
+        /// </summary>
+        /// <remarks>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>extern DECLSPEC void SDLCALL SDL_WM_GetCaption(char **title, char **icon)</code>
+        /// </p></remarks>
+        /// <param name="title"></param>
+        /// <param name="icon"></param>
+        /// <seealso cref="SDL_WM_SetCaption">SDL_WM_SetCaption</seealso>
+        /// <seealso cref="SDL_WM_SetIcon">SDL_WM_SetIcon</seealso>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_WM_GetCaption(out string title,
+            out string icon);
+        #endregion void SDL_WM_GetCaption(out string title, out string icon)
+
+        #region void SDL_WM_SetIcon(IntPtr icon, byte[] mask)
+        /// <summary>
+        /// Sets the icon for the display window.
+        /// </summary>
+        /// <remarks>
+        /// Sets the icon for the display window. Win32 icons must be 32x32.
+        /// <p>This function must be called before the first call to 
+        /// <see cref="SDL_SetVideoMode(int, int, int, int)"/>.</p>
+        /// <p>The mask is a bitmask that describes the shape of the icon.
+        ///  If mask is NULL, then the shape is determined by the colorkey 
+        ///  of icon, if any, or makes the icon rectangular (no transparency)
+        ///   otherwise.</p>
+        /// <p>If mask is non-NULL, it points to a bitmap with bits set where
+        ///  the corresponding pixel should be visible. The format of the bitmap
+        ///   is as follows: Scanlines come in the usual top-down order. Each 
+        ///   scanline consists of (width / 8) bytes, rounded up. The most 
+        ///   significant bit of each byte represents the leftmost pixel.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>void SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask);
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>SDL_WM_SetIcon(SDL_LoadBMP("icon.bmp"), NULL);
+        /// </code></example>
+        /// <param name="icon">Pointer to an SDL_Surface</param>
+        /// <param name="mask"></param>
+        /// <seealso cref="SDL_SetVideoMode(int, int, int, int)"/>
+        /// <seealso cref="SDL_WM_SetCaption"/>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_WM_SetIcon(IntPtr icon, byte[] mask);
+        #endregion void SDL_WM_SetIcon(IntPtr icon, byte[] mask)
+
+        #region int SDL_WM_IconifyWindow()
+        /// <summary>Iconify/Minimise the window</summary>
+        /// <remarks>
+        /// This function iconifies/minimizes the window, and returns 1 if it succeeded.
+        /// If the function succeeds, it generates an <see cref="SDL_APPACTIVE"/> loss event.
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_WM_IconifyWindow(void)</code></p>
+        /// </remarks>
+        /// <returns>Returns 1 if it succeeded. 
+        /// This function is a noop and returns 0 in non-windowed environments.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WM_IconifyWindow();
+        #endregion int SDL_WM_IconifyWindow()
+
+        #region int SDL_WM_ToggleFullScreen(IntPtr surface);
+        /// <summary>
+        /// Toggle fullscreen mode without changing the contents of the screen.
+        /// </summary>
+        /// <remarks>If the display surface does not require locking before accessing
+        /// the pixel information, then the memory pointers will not change.
+        ///<p>If this function was able to toggle fullscreen mode (change from 
+        /// running in a window to fullscreen, or vice-versa),
+        ///  it will return 1.
+        /// If it is not implemented, or fails, it returns 0.</p>
+        /// <p>The next call to SDL_SetVideoMode() will set the mode fullscreen
+        /// attribute based on the flags parameter - if SDL_FULLSCREEN is not
+        /// set, then the display will be windowed by default where supported.</p>
+        /// <p>This is currently only implemented in the X11 video driver.</p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>int SDL_WM_ToggleFullScreen(SDL_Surface *surface);</code></p>
+        /// </remarks>
+        /// <param name="surface"></param>
+        /// <returns>Returns 0 on failure or 1 on success.</returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WM_ToggleFullScreen(IntPtr surface);
+        #endregion int SDL_WM_ToggleFullScreen(IntPtr surface);
+
+        #region int SDL_WM_GrabInput(SDL_GrabMode mode);
+        /// <summary>
+        /// Grabs mouse and keyboard input.
+        /// </summary>
+        /// <remarks>
+        /// Grabbing means that the mouse is confined to the application 
+        /// window,
+        /// and nearly all keyboard input is passed directly to the 
+        /// application,
+        /// and not interpreted by a window manager, if any.
+        /// <p>
+        /// When mode is SDL_GRAB_QUERY the grab mode is not changed, but the current grab mode is returned.
+        /// </p>
+        /// <p>Binds to C-function call in SDL_video.h:
+        /// <code>SDL_GrabMode SDL_WM_GrabInput(SDL_GrabMode mode)</code></p>
+        /// </remarks>
+        /// <param name="mode">SDL_GrabMode</param>
+        /// <returns>The current/new SDL_GrabMode.
+        /// </returns>
+        [DllImport(SDL_NATIVE_LIBRARY, CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_WM_GrabInput(int mode);
+        #endregion int SDL_WM_GrabInput(SDL_GrabMode mode);
+        #endregion SDL_video.h
+        #endregion Sdl Methods
+    }
+}
diff --git a/src/Tao.Sdl/SdlGfx.cs b/src/Tao.Sdl/SdlGfx.cs
new file mode 100644
index 0000000..815cad2
--- /dev/null
+++ b/src/Tao.Sdl/SdlGfx.cs
@@ -0,0 +1,2411 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl
+{
+    #region Class Documentation
+    /// <summary>
+    /// SDL graphics drawing primitives and other support functions
+    /// The SDL_gfx library evolved out of the SDL_gfxPrimitives code which
+    /// provided basic drawing routines such as lines, circles or polygons
+    /// and SDL_rotozoom which implemented a interpolating rotozoomer for
+    /// SDL surfaces.
+    /// <p>
+    /// The current components of the SDL_gfx library are:
+    ///
+    /// <br>Graphic Primitives (SDL_gfxPrimitves.h)</br>
+    /// <br>Rotozoomer (SDL_rotozoom.h) </br>
+    /// <br>Framerate control (SDL_framerate.h) </br>
+    /// MMX image filters (SDL_imageFilter.h)</p>
+    /// </summary>
+    #endregion Class Documentation
+    [SuppressUnmanagedCodeSecurityAttribute()]
+    public static class SdlGfx
+    {
+        #region Private Constants
+        #region string SDL_GFX_NATIVE_LIBRARY
+        /// <summary>
+        /// Specifies SdlTtf's native library archive.
+        /// </summary>
+        /// <remarks>
+        /// Specifies SDL_gfx.dll everywhere; will be mapped via .config for mono.
+        /// </remarks>
+        private const string SDL_GFX_NATIVE_LIBRARY = "SDL_gfx.dll";
+        #endregion string SDL_GFX_NATIVE_LIBRARY
+
+        #region CallingConvention CALLING_CONVENTION
+        /// <summary>
+        /// Specifies the calling convention.
+        /// </summary>
+        /// <remarks>
+        /// Specifies <see cref="CallingConvention.Cdecl" />
+        /// for Windows and Linux.
+        /// </remarks>
+        private const CallingConvention CALLING_CONVENTION =
+            CallingConvention.Cdecl;
+        #endregion CallingConvention CALLING_CONVENTION
+        #endregion Private Constants
+
+        #region Public Constants
+        #region SDL_gfxPrimitives.h
+        // Not implementing M_PI since it is in System.Math
+        // #define M_PI	3.141592654
+
+        /// <summary>
+        /// Major Version
+        /// </summary>
+        public const int SDL_GFXPRIMITIVES_MAJOR = 2;
+        /// <summary>
+        /// Minor Version
+        /// </summary>
+        public const int SDL_GFXPRIMITIVES_MINOR = 0;
+        /// <summary>
+        /// Micro Version
+        /// </summary>
+        public const int SDL_GFXPRIMITIVES_MICRO = 16;
+        #endregion SDL_gfxPrimitives.h
+
+        #region SDL_rotozoom.h
+        /// <summary>
+        ///
+        /// </summary>
+        public const int SMOOTHING_OFF = 0;
+        /// <summary>
+        ///
+        /// </summary>
+        public const int SMOOTHING_ON = 1;
+        #endregion SDL_rotozoom.h
+
+        #region SDL_framerate.h
+        /// <summary>
+        ///
+        /// </summary>
+        public const int FPS_UPPER_LIMIT = 200;
+        /// <summary>
+        ///
+        /// </summary>
+        public const int FPS_LOWER_LIMIT = 1;
+        /// <summary>
+        ///
+        /// </summary>
+        public const int FPS_DEFAULT = 30;
+        #endregion SDL_framerate.h
+
+        // SDL_imageFilter.h -- none
+        #endregion Public Constants
+
+        #region Public Structs
+        // SDL_gfxPrimitives.h -- none
+
+        #region SDL_rotozoom.h
+        #region tColorRGBA
+        /// <summary>
+        ///
+        /// </summary>
+        public struct tColorRGBA
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            public byte r;
+            /// <summary>
+            ///
+            /// </summary>
+            public byte g;
+            /// <summary>
+            ///
+            /// </summary>
+            public byte b;
+            /// <summary>
+            ///
+            /// </summary>
+            public byte a;
+        }
+        #endregion tColorRGBA
+
+        #region tColorY
+        /// <summary>
+        ///
+        /// </summary>
+        public struct tColorY
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            public byte y;
+        }
+        #endregion tColorY
+        #endregion SDL_rotozoom.h
+
+        #region SDL_framerate.h
+        #region FPSmanager
+        /// <summary>
+        ///
+        /// </summary>
+        public struct FPSmanager
+        {
+            /// <summary>
+            ///
+            /// </summary>
+            public int framecount;
+            /// <summary>
+            ///
+            /// </summary>
+            public float rateticks;
+            /// <summary>
+            ///
+            /// </summary>
+            public int lastticks;
+            /// <summary>
+            ///
+            /// </summary>
+            public int rate;
+        }
+        #endregion FPSmanager
+        #endregion SDL_framerate.h
+
+        // SDL_imageFilter.h -- none
+        #endregion Public Structs
+
+        #region SdlGfx Methods
+        #region SDL_gfxPrimitives.h
+        #region int pixelColor(IntPtr dst, short x, short y, int color)
+        /// <summary>
+        /// Pixel
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int pixelColor(IntPtr dst, short x, short y, int color);
+        #endregion int pixelColor(IntPtr dst, short x, short y, int color)
+
+        #region int pixelRGBA(...)
+        /// <summary>
+        /// Pixel
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int pixelRGBA(
+            IntPtr dst, short x, short y, byte r,
+            byte g, byte b, byte a);
+        #endregion int pixelRGBA(...)
+
+        #region int hlineColor(IntPtr dst, short x1, short x2, short y, int color)
+        /// <summary>
+        /// Horizontal line
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int hlineColor(
+            IntPtr dst, short x1, short x2, short y, int color);
+        #endregion int hlineColor(IntPtr dst, short x1, short x2, short y, int color)
+
+        #region int hlineRGBA(...)
+        /// <summary>
+        /// Horizontal line
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int hlineRGBA(
+            IntPtr dst, short x1, short x2, short y, byte r,
+            byte g, byte b, byte a);
+        #endregion int hlineRGBA(...)
+
+        #region int vlineColor(IntPtr dst, short x, short y1, short y2, int color)
+        /// <summary>
+        /// Vertical line
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y1"></param>
+        /// <param name="y2"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int vlineColor(IntPtr dst, short x, short y1, short y2, int color);
+        #endregion int vlineColor(IntPtr dst, short x, short y1, short y2, int color)
+
+        #region int vlineRGBA(...)
+        /// <summary>
+        /// Vertical Line
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y1"></param>
+        /// <param name="y2"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int vlineRGBA(IntPtr dst, short x, short y1, short y2, byte r, byte g, byte b, byte a);
+        #endregion int vlineRGBA(...)
+
+        #region int rectangleColor(...)
+        /// <summary>
+        /// Rectangle
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int rectangleColor(
+            IntPtr dst, short x1, short y1, short x2, short y2, int color);
+        #endregion int rectangleColor(...)
+
+        #region int rectangleRGBA(...)
+        /// <summary>
+        /// Rectangle
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int rectangleRGBA(IntPtr dst, short x1, short y1,
+            short x2, short y2, byte r, byte g, byte b, byte a);
+        #endregion int rectangleRGBA(...)
+
+        #region int boxColor(...)
+        /// <summary>
+        /// Filled rectangle (Box)
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int boxColor(
+            IntPtr dst, short x1, short y1, short x2, short y2, int color);
+        #endregion int boxColor(...)
+
+        #region int boxRGBA(...)
+        /// <summary>
+        /// Filled rectangle (Box)
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int boxRGBA(
+            IntPtr dst, short x1, short y1, short x2,
+            short y2, byte r, byte g, byte b, byte a);
+        #endregion int boxRGBA(...)
+
+        #region int lineColor(...)
+        /// <summary>
+        /// Line
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int lineColor(
+            IntPtr dst, short x1, short y1, short x2, short y2, int color);
+        #endregion int lineColor(...)
+
+        #region int lineRGBA(...)
+        /// <summary>
+        /// Line
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int lineRGBA(
+            IntPtr dst, short x1, short y1,
+            short x2, short y2, byte r, byte g, byte b, byte a);
+        #endregion int lineRGBA(...)
+
+        #region int aalineColor(...)
+        /// <summary>
+        /// AA Line
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int aalineColor(
+            IntPtr dst, short x1, short y1, short x2, short y2, int color);
+        #endregion int aalineColor(...)
+
+        #region int aalineRGBA(...)
+        /// <summary>
+        /// AA Line
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int aalineRGBA(
+            IntPtr dst, short x1, short y1,
+            short x2, short y2, byte r, byte g, byte b, byte a);
+        #endregion int aalineRGBA(...)
+
+        #region int circleColor(IntPtr dst, short x, short y, short r, int color)
+        /// <summary>
+        /// Circle
+        /// </summary>
+        /// <remarks>
+        ///
+        /// <p>Binds to C-function in SDL_gfx.h
+        /// <code>
+        /// int circleColor(IntPtr dst, short x, short y, short r, int color);
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        ///
+        /// </code>
+        /// </example>
+        /// <returns>
+        ///
+        /// </returns>
+        /// <param name="color"></param>
+        /// <param name="dst"></param>
+        /// <param name="r"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int circleColor(IntPtr dst, short x, short y, short r, int color);
+        #endregion int circleColor(IntPtr dst, short x, short y, short r, int color)
+
+        #region int circleRGBA(...)
+        /// <summary>
+        /// Circle
+        /// </summary>
+        /// <remarks>
+        ///
+        /// <p>Binds to C-function in SDL_gfx.h
+        /// <code>
+        /// int circleRGBA(IntPtr dst, short x, short y, short rad, byte r, byte g, byte b, byte a)
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        ///
+        /// </code>
+        /// </example>
+        /// <returns>
+        ///
+        /// </returns>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <param name="g"></param>
+        /// <param name="rad"></param>
+        /// <param name="dst"></param>
+        /// <param name="r"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int circleRGBA(IntPtr dst, short x, short y, short rad, byte r, byte g, byte b, byte a);
+        #endregion int circleRGBA(...)
+
+        #region int filledCircleColor(IntPtr dst, short x, short y, short r, int color)
+        /// <summary>
+        /// Filled Circle
+        /// </summary>
+        /// <remarks>
+        ///
+        /// <p>Binds to C-function in SDL_gfx.h
+        /// <code>
+        /// int filledCircleColor(IntPtr dst, short x, short y, short r, int color);
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        ///
+        /// </code>
+        /// </example>
+        /// <returns>
+        ///
+        /// </returns>
+        /// <param name="color"></param>
+        /// <param name="dst"></param>
+        /// <param name="r"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int filledCircleColor(IntPtr dst, short x, short y, short r, int color);
+        #endregion int filledCircleColor(IntPtr dst, short x, short y, short r, int color)
+
+        #region int filledCircleRGBA(...)
+        /// <summary>
+        /// Filled Circle
+        /// </summary>
+        /// <remarks>
+        ///
+        /// <p>Binds to C-function in SDL_gfx.h
+        /// <code>
+        /// int filledCircleRGBA(IntPtr dst, short x, short y, short rad, byte r, byte g, byte b, byte a)
+        /// </code></p>
+        /// </remarks>
+        /// <example>
+        /// <code>
+        ///
+        /// </code>
+        /// </example>
+        /// <returns>
+        ///
+        /// </returns>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <param name="g"></param>
+        /// <param name="rad"></param>
+        /// <param name="dst"></param>
+        /// <param name="r"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int filledCircleRGBA(
+            IntPtr dst, short x, short y, short rad,
+            byte r, byte g, byte b, byte a);
+        #endregion int filledCircleRGBA(...)
+
+        #region int aacircleColor(IntPtr dst, short x, short y, short r, int color)
+        /// <summary>
+        /// AA Circle
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="r"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int aacircleColor(
+            IntPtr dst, short x, short y, short r, int color);
+        #endregion int aacircleColor(IntPtr dst, short x, short y, short r, int color)
+
+        #region int aacircleRGBA(...)
+        /// <summary>
+        /// AA Circle
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="rad"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int aacircleRGBA(
+            IntPtr dst, short x, short y,
+            short rad, byte r, byte g, byte b, byte a);
+        #endregion int aacircleRGBA(...)
+
+        #region int ellipseColor(...)
+        /// <summary>
+        /// Ellipse
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="rx"></param>
+        /// <param name="ry"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int ellipseColor(
+            IntPtr dst, short x, short y, short rx, short ry, int color);
+        #endregion int ellipseColor(...)
+
+        #region int ellipseRGBA(...)
+        /// <summary>
+        /// Ellipse
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="rx"></param>
+        /// <param name="ry"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int ellipseRGBA(
+            IntPtr dst, short x, short y,
+            short rx, short ry, byte r, byte g, byte b, byte a);
+        #endregion int ellipseRGBA(...)
+
+        #region int aaellipseColor(...)
+        /// <summary>
+        /// AA Ellipse
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="xc"></param>
+        /// <param name="yc"></param>
+        /// <param name="rx"></param>
+        /// <param name="ry"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int aaellipseColor(
+            IntPtr dst, short xc, short yc, short rx, short ry, int color);
+        #endregion int aaellipseColor(...)
+
+        #region int aaellipseRGBA(...)
+        /// <summary>
+        /// AA Ellipse
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="rx"></param>
+        /// <param name="ry"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int aaellipseRGBA(
+            IntPtr dst, short x, short y,
+            short rx, short ry, byte r, byte g, byte b, byte a);
+        #endregion int aaellipseRGBA(...)
+
+        #region int filledEllipseColor(...)
+        /// <summary>
+        /// Filled Ellipse
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="rx"></param>
+        /// <param name="ry"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int filledEllipseColor(
+            IntPtr dst, short x, short y, short rx, short ry, int color);
+        #endregion int filledEllipseColor(...)
+
+        #region int filledEllipseRGBA(...)
+        /// <summary>
+        /// Filled Ellipse
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="rx"></param>
+        /// <param name="ry"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int filledEllipseRGBA(
+            IntPtr dst, short x, short y,
+            short rx, short ry, byte r, byte g, byte b, byte a);
+        #endregion int filledEllipseRGBA(...)
+
+        #region int pieColor(...)
+        /// <summary>
+        /// Pie
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="rad"></param>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int pieColor(
+            IntPtr dst, short x, short y, short rad,
+            short start, short end, int color);
+        #endregion int pieColor(...)
+
+        #region int pieRGBA(...)
+        /// <summary>
+        /// Pie
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="rad"></param>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int pieRGBA(
+            IntPtr dst, short x, short y, short rad,
+            short start, short end, byte r, byte g, byte b, byte a);
+        #endregion int pieRGBA(...)
+
+        #region int filledPieColor(...)
+        /// <summary>
+        /// Filled Pie
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="rad"></param>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int filledPieColor(
+            IntPtr dst, short x, short y, short rad,
+            short start, short end, int color);
+        #endregion int filledPieColor(...)
+
+        #region int filledPieRGBA(...)
+        /// <summary>
+        /// Filled Pie
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="rad"></param>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int filledPieRGBA(
+            IntPtr dst, short x, short y, short rad,
+            short start, short end, byte r, byte g, byte b, byte a);
+        #endregion int filledPieRGBA(...)
+
+        #region int trigonColor(...)
+        /// <summary>
+        /// Trigon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="x3"></param>
+        /// <param name="y3"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int trigonColor(
+            IntPtr dst, short x1, short y1, short x2,
+            short y2, short x3, short y3, int color);
+        #endregion int trigonColor(...)
+
+        #region int trigonRGBA(...)
+        /// <summary>
+        /// Trigon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="x3"></param>
+        /// <param name="y3"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int trigonRGBA(
+            IntPtr dst, short x1, short y1, short x2,
+            short y2, short x3, short y3,
+            byte r, byte g, byte b, byte a);
+        #endregion int trigonRGBA(...)
+
+        #region int aatrigonColor(...)
+        /// <summary>
+        /// AA-Trigon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="x3"></param>
+        /// <param name="y3"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int aatrigonColor(
+            IntPtr dst, short x1, short y1, short x2,
+            short y2, short x3, short y3, int color);
+        #endregion int aatrigonColor(...)
+
+        #region int aatrigonRGBA(...)
+        /// <summary>
+        /// AA-Trigon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="x3"></param>
+        /// <param name="y3"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int aatrigonRGBA(
+            IntPtr dst, short x1, short y1, short x2,
+            short y2, short x3, short y3,
+            byte r, byte g, byte b, byte a);
+        #endregion int aatrigonRGBA(...)
+
+        #region int filledTrigonColor(...)
+        /// <summary>
+        /// Filled Trigon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="x3"></param>
+        /// <param name="y3"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int filledTrigonColor(
+            IntPtr dst, short x1, short y1, short x2,
+            short y2, short x3, short y3, int color);
+        #endregion int filledTrigonColor(...)
+
+        #region int filledTrigonRGBA(...)
+        /// <summary>
+        /// Filled Trigon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x1"></param>
+        /// <param name="y1"></param>
+        /// <param name="x2"></param>
+        /// <param name="y2"></param>
+        /// <param name="x3"></param>
+        /// <param name="y3"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int filledTrigonRGBA(
+            IntPtr dst, short x1, short y1, short x2,
+            short y2, short x3, short y3,
+            byte r, byte g, byte b, byte a);
+        #endregion int filledTrigonRGBA(...)
+
+        #region int polygonColor(...)
+        /// <summary>
+        /// Polygon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="vx"></param>
+        /// <param name="vy"></param>
+        /// <param name="n"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int polygonColor(
+            IntPtr dst, short[] vx, short[] vy, int n, int color);
+        #endregion int polygonColor(...)
+
+        #region int polygonRGBA(...)
+        /// <summary>
+        /// Polygon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="vx"></param>
+        /// <param name="vy"></param>
+        /// <param name="n"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int polygonRGBA(
+            IntPtr dst, short[] vx, short[] vy,
+            int n, byte r, byte g, byte b, byte a);
+        #endregion int polygonRGBA(...)
+
+        #region int aapolygonColor(...)
+        /// <summary>
+        /// AA-Polygon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="vx"></param>
+        /// <param name="vy"></param>
+        /// <param name="n"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int aapolygonColor(
+            IntPtr dst, short[] vx, short[] vy, int n, int color);
+        #endregion int aapolygonColor(...)
+
+        #region int aapolygonRGBA(...)
+        /// <summary>
+        /// AA-Polygon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="vx"></param>
+        /// <param name="vy"></param>
+        /// <param name="n"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int aapolygonRGBA(
+            IntPtr dst, short[] vx, short[] vy,
+            int n, byte r, byte g, byte b, byte a);
+        #endregion int aapolygonRGBA(...)
+
+        #region int filledPolygonColor(...)
+        /// <summary>
+        /// Filled Polygon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="vx"></param>
+        /// <param name="vy"></param>
+        /// <param name="n"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int filledPolygonColor(
+            IntPtr dst, short[] vx, short[] vy, int n, int color);
+        #endregion int filledPolygonColor(...)
+
+        #region int filledPolygonRGBA(...)
+        /// <summary>
+        /// Filled Polygon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="vx"></param>
+        /// <param name="vy"></param>
+        /// <param name="n"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int filledPolygonRGBA(
+            IntPtr dst, short[] vx, short[] vy,
+            int n, byte r, byte g, byte b, byte a);
+        #endregion int filledPolygonRGBA(...)
+
+        #region int texturedPolygon(...)
+        /// <summary>
+        /// Textured Polygon
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="vx"></param>
+        /// <param name="vy"></param>
+        /// <param name="n"></param>
+        /// <param name="texture"></param>
+        /// <param name="texture_dx"></param>
+        /// <param name="texture_dy"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int texturedPolygon(
+            IntPtr dst, short[] vx, short[] vy,
+            int n, IntPtr texture, int texture_dx, int texture_dy);
+        #endregion int texturedPolygon(...)
+
+        #region int bezierColor(...)
+        /// <summary>
+        /// Bezier
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="vx"></param>
+        /// <param name="vy"></param>
+        /// <param name="n"></param>
+        /// <param name="s">number of steps</param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int bezierColor(
+            IntPtr dst, short[] vx, short[] vy, int n, int s, int color);
+        #endregion int bezierColor(...)
+
+        #region int bezierRGBA(...)
+        /// <summary>
+        /// Bezier
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="vx"></param>
+        /// <param name="vy"></param>
+        /// <param name="n"></param>
+        /// <param name="s">number of steps</param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int bezierRGBA(
+            IntPtr dst, short[] vx, short[] vy,
+            int n, int s, byte r, byte g, byte b, byte a);
+        #endregion int bezierRGBA(...)
+
+        #region int characterColor(IntPtr dst, short x, short y, char c, int color)
+        /// <summary>
+        /// Character
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="c"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int characterColor(
+            IntPtr dst, short x, short y, char c, int color);
+        #endregion int characterColor(IntPtr dst, short x, short y, char c, int color)
+
+        #region int characterRGBA(...)
+        /// <summary>
+        /// Character
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="c"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int characterRGBA(
+            IntPtr dst, short x, short y, char c, byte r, byte g, byte b, byte a);
+        #endregion int characterRGBA(...)
+
+        #region int stringColor(...)
+        /// <summary>
+        /// String
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="c"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int stringColor(
+            IntPtr dst, short x, short y, string c, int color);
+        #endregion int stringColor(...)
+
+        #region int stringRGBA(...)
+        /// <summary>
+        /// String
+        /// </summary>
+        /// <param name="dst"></param>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="c"></param>
+        /// <param name="r"></param>
+        /// <param name="g"></param>
+        /// <param name="b"></param>
+        /// <param name="a"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int stringRGBA(
+            IntPtr dst, short x, short y, string c,
+            byte r, byte g, byte b, byte a);
+        #endregion int stringRGBA(...)
+
+        #region void gfxPrimitivesSetFont(object fontdata, int cw, int ch)
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="fontdata"></param>
+        /// <param name="cw">Width</param>
+        /// <param name="ch">Height</param>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void gfxPrimitivesSetFont(
+            object fontdata, int cw, int ch);
+        #endregion void gfxPrimitivesSetFont(object fontdata, int cw, int ch)
+        #endregion SDL_gfxPrimitives.h
+
+        #region SDL_rotozoom.h
+        #region IntPtr rotozoomSurface(...)
+        /// <summary>
+        /// Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
+        /// 'angle' is the rotation in degrees. 'zoom' a scaling factor. If 'smooth' is 1
+        /// then the destination 32bit surface is anti-aliased. If the surface is not 8bit
+        /// or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
+        /// </summary>
+        /// <param name="src"></param>
+        /// <param name="angle"></param>
+        /// <param name="zoom"></param>
+        /// <param name="smooth"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr rotozoomSurface(
+            IntPtr src, double angle, double zoom, int smooth);
+        #endregion IntPtr rotozoomSurface(...)
+
+        #region IntPtr rotozoomSurfaceXY(...)
+        /// <summary>
+        /// Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface. 
+        /// 'angle' is the rotation in degrees. 
+        /// 'zoomx' and 'zoomy' are scaling factors that  can also be negative. 
+        /// In this case the corresponding axis is flipped.  
+        /// If 'smooth'   is 1 then the destination 32bit surface is anti-aliased. 
+        /// If the surface is not 8bit  or 32bit RGBA/ABGR it will be converted into 
+        /// a 32bit RGBA format on the fly.   
+        /// Note: Flipping currently only works with antialiasing turned off.
+        /// </summary>
+        /// <param name="src"></param>
+        /// <param name="angle"></param>
+        /// <param name="zoomx"></param>
+        /// <param name="zoomy"></param>
+        /// <param name="smooth"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr rotozoomSurfaceXY(
+            IntPtr src, double angle, double zoomx, double zoomy, int smooth);
+        #endregion IntPtr rotozoomSurfaceXY(...)
+
+        #region void rotozoomSurfaceSize(...)
+        /// <summary>
+        /// Returns the size of the target surface for a rotozoomSurface() call
+        /// </summary>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="angle"></param>
+        /// <param name="zoom"></param>
+        /// <param name="dstheight"></param>
+        /// <param name="dstwidth"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void rotozoomSurfaceSize(
+            int width, int height, double angle,
+            double zoom, out int dstwidth, out int dstheight);
+        #endregion void rotozoomSurfaceSize(...)
+
+        #region void rotozoomSurfaceSizeXY(...)
+        /// <summary>
+        /// Returns the size of the target surface for a rotozoomSurface() call
+        /// </summary>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="angle"></param>
+        /// <param name="zoomx"></param>
+        /// <param name="zoomy"></param>
+        /// <param name="dstheight"></param>
+        /// <param name="dstwidth"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void rotozoomSurfaceSizeXY(
+            int width, int height, double angle,
+            double zoomx, double zoomy, out int dstwidth, out int dstheight);
+        #endregion void rotozoomSurfaceSizeXY(...)
+
+        #region IntPtr zoomSurface(...)
+        /// <summary>
+        /// Zooms a 32bit or 8bit 'src' surface to newly created 'dst' surface.
+        /// 'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is 1
+        /// then the destination 32bit surface is anti-aliased. If the surface is not 8bit
+        /// or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
+        /// </summary>
+        /// <param name="src"></param>
+        /// <param name="zoomx"></param>
+        /// <param name="zoomy"></param>
+        /// <param name="smooth"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr zoomSurface(
+            IntPtr src, double zoomx, double zoomy, int smooth);
+        #endregion IntPtr zoomSurface(...)
+
+        #region void zoomSurfaceSize(...)
+        /// <summary>
+        /// Returns the size of the target surface for a zoomSurface() call
+        /// </summary>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <param name="zoomx"></param>
+        /// <param name="zoomy"></param>
+        /// <param name="dstheight"></param>
+        /// <param name="dstwidth"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void zoomSurfaceSize(
+            int width, int height,
+            double zoomx, double zoomy, out int dstwidth, out int dstheight);
+        #endregion void zoomSurfaceSize(...)
+
+        #region IntPtr shrinkSurface(...)
+        /// <summary>
+        /// Shrinks a 32bit or 8bit 'src' surface ti a newly created 'dst' surface.
+        /// 'factorx' and 'factory' are the shrinking ratios (i.e. 2=1/2 the size,
+        /// 3=1/3 the size, etc.) The destination surface is antialiased by averaging
+        /// the source box RGBA or Y information. If the surface is not 8bit
+        /// or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
+        /// </summary>
+        /// <param name="src"></param>
+        /// <param name="factorx"></param>
+        /// <param name="factory"></param>
+        /// <returns></returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr shrinkSurface(
+            IntPtr src, int factorx, int factory);
+        #endregion IntPtr shrinkSurface(...)
+
+        #endregion SDL_rotozoom.h
+
+        #region SDL_framerate.h
+        #region void SDL_initFramerate(IntPtr manager)
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        /// <p>
+        /// Binds to C-function call in SDL_framerate.h.
+        /// <code>
+        /// void SDL_initFramerate(FPSmanager * manager)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="manager">IntPtr to FPSmanager struct</param>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_initFramerate(IntPtr manager);
+        #endregion void SDL_initFramerate(IntPtr manager)
+
+        #region int SDL_setFramerate(IntPtr manager, int rate)
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        /// <p>
+        /// Binds to C-function call in SDL_framerate.h.
+        /// <code>
+        /// int SDL_setFramerate(FPSmanager * manager, int rate)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="manager">IntPtr to FPSmanager struct</param>
+        /// <param name="rate"></param>
+        /// <returns>Returns 0 for success and -1 for error</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_setFramerate(IntPtr manager, int rate);
+        #endregion int SDL_setFramerate(IntPtr manager, int rate)
+
+        #region int SDL_getFramerate(IntPtr manager)
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        /// <p>
+        /// Binds to C-function call in SDL_framerate.h.
+        /// <code>
+        /// int SDL_getFramerate(FPSmanager * manager)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="manager">IntPtr to FPSmanager struct</param>
+        /// <returns>Returns value for success and -1 for error</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_getFramerate(IntPtr manager);
+        #endregion int SDL_getFramerate(IntPtr manager)
+
+        #region void SDL_framerateDelay(IntPtr manager)
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        /// <p>
+        /// Binds to C-function call in SDL_framerate.h.
+        /// <code>
+        /// void SDL_framerateDelay(FPSmanager * manager)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <param name="manager">IntPtr to FPSmanager struct</param>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_framerateDelay(IntPtr manager);
+        #endregion void SDL_framerateDelay(IntPtr manager)
+        #endregion SDL_framerate.h
+
+        #region SDL_imageFilter.h
+        #region int SDL_imageFilterMMXdetect()
+        /// <summary>
+        /// Detect MMX capability in CPU
+        /// </summary>
+        /// <remarks>
+        /// <p>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterMMXdetect(void)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        /// <returns>
+        /// Returns 0 for success and -1 for Error.
+        /// </returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterMMXdetect();
+        #endregion int SDL_imageFilterMMXdetect()
+
+        #region void SDL_imageFilterMMXoff()
+        /// <summary>
+        /// Force use of MMX off.
+        /// </summary>
+        /// <remarks>
+        /// <p>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// void SDL_imageFilterMMXoff(void)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_imageFilterMMXoff();
+        #endregion void SDL_imageFilterMMXoff()
+
+        #region void SDL_imageFilterMMXon()
+        /// <summary>
+        /// Turn possible use of MMX back on
+        /// </summary>
+        /// <remarks>
+        /// <p>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// void SDL_imageFilterMMXon(void)
+        /// </code>
+        /// </p>
+        /// </remarks>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_imageFilterMMXon();
+        #endregion void SDL_imageFilterMMXon()
+
+        #region int SDL_imageFilterAdd(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterAdd: D = saturation255(S1 + S2)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterAdd(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterAdd(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterAdd(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+
+        #region int SDL_imageFilterMean(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterMean: D = S1/2 + S2/2
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterMean(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterMean(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterMean(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+
+        #region int SDL_imageFilterSub(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterSub: D = saturation0(S1 - S2)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_framerate.h.
+        /// <code>
+        /// int SDL_imageFilterSub(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterSub(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterSub(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+
+        #region int SDL_imageFilterAbsDiff(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterAbsDiff: D = | S1 - S2 |
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterAbsDiff(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterAbsDiff(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterAbsDiff(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+
+        #region int SDL_imageFilterMult(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterMult: D = saturation(S1 * S2)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterMult(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterMult(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterMult(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+
+        #region int SDL_imageFilterMultNor(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterMultNor: D = S1 * S2 (non-MMX)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterMultNor(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterMultNor(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterMultNor(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+
+        #region int SDL_imageFilterMultDivby2(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterMultDivby2: D = saturation255(S1/2 * S2)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterMultDivby2(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterMultDivby2(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterMultDivby2(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+
+        #region int SDL_imageFilterMultDivby4(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterMultDivby4: D = saturation255(S1/2 * S2)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterMultDivby4(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterMultDivby4(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterMultDivby4(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+
+        #region int SDL_imageFilterBitAnd(byte[] Src1, byte[] Src2, byte[] Dest, int length
+        /// <summary>
+        /// SDL_imageFilterBitAnd: D = S1 & S2
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterBitAnd(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterBitAnd(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterBitAnd(byte[] Src1, byte[] Src2, byte[] Dest, int length
+
+        #region int SDL_imageFilterBitOr(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterBitOr: D = S1 | S2
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterBitAnd(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterBitOr(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterBitOr(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+
+        #region int SDL_imageFilterDiv(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterDiv: D = S1 / S2 (non-MMX)
+        /// </summary>
+        /// <remarks>
+        /// int SDL_imageFilterDiv(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Src2">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterDiv(byte[] Src1, byte[] Src2, byte[] Dest, int length);
+        #endregion int SDL_imageFilterDiv(byte[] Src1, byte[] Src2, byte[] Dest, int length)
+
+        #region int SDL_imageFilterBitNegation(byte[] Src1, byte[] Dest, int length)
+        /// <summary>
+        /// SDL_imageFilterBitNegation: D = !S
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterNegation(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, int length)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterBitNegation(byte[] Src1, byte[] Dest, int length);
+        #endregion int SDL_imageFilterBitNegation(byte[] Src1, byte[] Dest, int length)
+
+        #region int SDL_imageFilterAddByte(byte[] Src1, byte[] Dest, int length, byte C)
+        /// <summary>
+        /// SDL_imageFilterAddByte: D = saturation255(S + C)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterAddByte(unsigned char *Src1, unsigned char *Dest, int length, unsigned char C)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="C">Byte to add</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterAddByte(byte[] Src1, byte[] Dest, int length, byte C);
+        #endregion int SDL_imageFilterAddByte(byte[] Src1, byte[] Dest, int length, byte C)
+
+        #region int SDL_imageFilterAddUint(byte[] Src1, byte[] Dest, int length, int C)
+        /// <summary>
+        /// SDL_imageFilterAddUint: D = saturation255(S + (uint)C)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterAddUint(unsigned char *Src1, unsigned char *Dest, int length, unsigned int C)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="C">int to add</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterAddUint(byte[] Src1, byte[] Dest, int length, int C);
+        #endregion int SDL_imageFilterAddUint(byte[] Src1, byte[] Dest, int length, int C)
+
+        #region int SDL_imageFilterAddBytetoHalf(byte[] Src1, byte[] Dest, int length, byte C)
+        /// <summary>
+        /// SDL_imageFilterAddByteToHalf: D = saturation255(S/2 + C)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterAddByteToHalf(unsigned char *Src1, unsigned char *Dest, int length, unsigned char C)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="C">Byte to add</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterAddByteToHalf(byte[] Src1, byte[] Dest, int length, byte C);
+        #endregion int SDL_imageFilterAddBytetoHalf(byte[] Src1, byte[] Dest, int length, byte C)
+
+        #region int SDL_imageFilterSubByte(byte[] Src1, byte[] Dest, int length, byte C)
+        /// <summary>
+        /// SDL_imageFilterSubByte: D = saturation0(S - C)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterSubByte(unsigned char *Src1, unsigned char *Dest, int length, unsigned char C)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="C">Byte to add</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterSubByte(byte[] Src1, byte[] Dest, int length, byte C);
+        #endregion int SDL_imageFilterSubByte(byte[] Src1, byte[] Dest, int length, byte C)
+
+        #region int SDL_imageFilterSubUint(byte[] Src1, byte[] Dest, int length, int C)
+        /// <summary>
+        /// SDL_imageFilterSubUint: D = saturation0(S - (uint)C)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterSubUint(unsigned char *Src1, unsigned char *Dest, int length, unsigned int C)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="C">int to add</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterSubUint(byte[] Src1, byte[] Dest, int length, int C);
+        #endregion int SDL_imageFilterSubUint(byte[] Src1, byte[] Dest, int length, int C)
+
+        #region int SDL_imageFilterShiftRight(byte[] Src1, byte[] Dest, int length, byte N)
+        /// <summary>
+        /// SDL_imageFilterShiftRight: D = saturation0(S >> N)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterShiftRight(unsigned char *Src1, unsigned char *Dest, int length, unsigned char C)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="N">Shift</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterShiftRight(byte[] Src1, byte[] Dest, int length, byte N);
+        #endregion int SDL_imageFilterShiftRight(byte[] Src1, byte[] Dest, int length, byte N)
+
+        #region int SDL_imageFilterShiftRightUint(byte[] Src1, byte[] Dest, int length, byte N)
+        /// <summary>
+        /// SDL_imageFilterShiftRightUint: D = saturation0((uint)S >> N)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterShiftRightUint(unsigned char *Src1, unsigned char *Dest, int length, unsigned char C)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="N">Shift</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterShiftRightUint(byte[] Src1, byte[] Dest, int length, byte N);
+        #endregion int SDL_imageFilterShiftRightUint(byte[] Src1, byte[] Dest, int length, byte N)
+
+        #region int SDL_imageFilterMultByByte(byte[] Src1, byte[] Dest, int length, byte C)
+        /// <summary>
+        /// SDL_imageFilterMultByByte: D = saturation255(S * C)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterMultByByte(unsigned char *Src1, unsigned char *Dest, int length, unsigned char C)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="C">Byte</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterMultByByte(byte[] Src1, byte[] Dest, int length, byte C);
+        #endregion int SDL_imageFilterMultByByte(byte[] Src1, byte[] Dest, int length, byte C)
+
+        #region int SDL_imageFilterShiftRightAndMultByByte(byte[] Src1, byte[] Dest, int length, byte N, byte C)
+        /// <summary>
+        /// SDL_imageFilterShiftRightAndMultByByte: D = saturation255((S >> N) * C)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterShiftRightAndMultByByte(unsigned char *Src1, unsigned char *Dest, int length, unsigned char N, unsigned char C)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="C">Byte</param>
+        /// <param name="N">Shift</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterShiftRightAndMultByByte(
+            byte[] Src1, byte[] Dest, int length, byte N, byte C);
+        #endregion int SDL_imageFilterShiftRightAndMultByByte(byte[] Src1, byte[] Dest, int length, byte N, byte C)
+
+        #region int SDL_imageFilterShiftLeftByte(byte[] Src1, byte[] Dest, int length, byte N)
+        /// <summary>
+        /// SDL_imageFilterShiftLeftByte: D = (S << N)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterShiftLeftByte(unsigned char *Src1, unsigned char *Dest, int length, unsigned char N)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="N">Shift</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterShiftLeftByte(byte[] Src1, byte[] Dest, int length, byte N);
+        #endregion int SDL_imageFilterShiftLeftByte(byte[] Src1, byte[] Dest, int length, byte N)
+
+        #region int SDL_imageFilterShiftLeft(byte[] Src1, byte[] Dest, int length, byte N)
+        /// <summary>
+        /// SDL_imageFilterShiftLeft: D = saturation255(S << N)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterShiftLeft(unsigned char *Src1, unsigned char *Dest, int length, unsigned char N)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="N">Shift</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterShiftLeft(byte[] Src1, byte[] Dest, int length, byte N);
+        #endregion int SDL_imageFilterShiftLeft(byte[] Src1, byte[] Dest, int length, byte N)
+
+        #region int SDL_imageFilterShiftLeftUint(byte[] Src1, byte[] Dest, int length, byte N)
+        /// <summary>
+        /// SDL_imageFilterShiftLeftUint: D = ((uint)S << N)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterShiftLeftUint(unsigned char *Src1, unsigned char *Dest, int length, unsigned char N)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="N">Shift</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterShiftLeftUint(byte[] Src1, byte[] Dest, int length, byte N);
+        #endregion int SDL_imageFilterShiftLeftUint(byte[] Src1, byte[] Dest, int length, byte N)
+
+        #region int SDL_imageFilterBinarizeUsingThreshold((byte[] Src1, byte[] Dest, int length, byte T)
+        /// <summary>
+        /// SDL_imageFilterBinarizeUsingThreshold: D = S >= T ? 255:0
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterBinarizeUsingThreshold(unsigned char *Src1, unsigned char *Dest, int length, unsigned char T);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="T">Threshold</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterBinarizeUsingThreshold(
+            byte[] Src1, byte[] Dest, int length, byte T);
+        #endregion int SDL_imageFilterBinarizeUsingThreshold((byte[] Src1, byte[] Dest, int length, byte T)
+
+        #region int SDL_imageFilterClipToRange(...)
+        /// <summary>
+        /// SDL_imageFilterClipToRange: D = (S >= Tmin) & (S <= Tmax) 255:0
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterClipToRange(unsigned char *Src1, unsigned char *Dest, int length, unsigned char Tmin, unsigned char Tmax);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="Tmin">Threshold</param>
+        /// <param name="Tmax">Threshold</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterClipToRange(
+            byte[] Src1, byte[] Dest, int length, byte Tmin, byte Tmax);
+        #endregion int SDL_imageFilterClipToRange(...)
+
+        #region int SDL_imageFilterNormalizeLinear(...)
+        /// <summary>
+        /// SDL_imageFilterNormalizeLinear: D = saturation255((Nmax - Nmin)/(Cmax - Cmin)*(S - Cmin) + Nmin)
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterNormalizeLinear(unsigned char *Src1, unsigned char *Dest, int length, int Cmin, int Cmax, int Nmin, int Nmax);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="Nmin">Threshold</param>
+        /// <param name="Nmax">Threshold</param>
+        /// <param name="Cmin">Threshold</param>
+        /// <param name="Cmax">Threshold</param>
+        /// <param name="length">Size of array</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterNormalizeLinear(
+            byte[] Src1, byte[] Dest, int length,
+            int Cmin, int Cmax, int Nmin, int Nmax);
+        #endregion int SDL_imageFilterNormalizeLinear(...)
+
+        #region int SDL_imageFilterConvolveKernel3x3Divide(...)
+        /// <summary>
+        /// SDL_imageFilterConvolveKernel3x3Divide: Dij = saturation0and255( ... ). For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterConvolveKernel3x3Divide(unsigned char *Src, unsigned char *Dest, int rows, int columns, signed short *Kernel, unsigned char Divisor);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="rows">Threshold</param>
+        /// <param name="columns">Threshold</param>
+        /// <param name="Kernel">Size of array</param>
+        /// <param name="Divisor"></param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterConvolveKernel3x3Divide(
+            byte[] Src1, byte[] Dest, int rows,
+            int columns, short[] Kernel, byte Divisor);
+        #endregion int SDL_imageFilterConvolveKernel3x3Divide(...)
+
+        #region int SDL_imageFilterConvolveKernel5x5Divide(...)
+        /// <summary>
+        /// SDL_imageFilterConvolveKernel5x5Divide: Dij = saturation0and255( ... ). For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterConvolveKernel5x5Divide(unsigned char *Src, unsigned char *Dest, int rows, int columns, signed short *Kernel, unsigned char Divisor);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="columns"></param>
+        /// <param name="Divisor"></param>
+        /// <param name="Kernel"></param>
+        /// <param name="rows"></param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterConvolveKernel5x5Divide(
+            byte[] Src1, byte[] Dest, int rows,
+            int columns, short[] Kernel, byte Divisor);
+        #endregion int SDL_imageFilterConvolveKernel5x5Divide(...)
+
+        #region int SDL_imageFilterConvolveKernel7x7Divide(...)
+        /// <summary>
+        /// SDL_imageFilterConvolveKernel7x7Divide: Dij = saturation0and255( ... ). For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterConvolveKernel7x7Divide(unsigned char *Src, unsigned char *Dest, int rows, int columns, signed short *Kernel, unsigned char Divisor);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="columns"></param>
+        /// <param name="Divisor"></param>
+        /// <param name="Kernel"></param>
+        /// <param name="rows"></param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterConvolveKernel7x7Divide(
+            byte[] Src1, byte[] Dest, int rows,
+            int columns, short[] Kernel, byte Divisor);
+        #endregion int SDL_imageFilterConvolveKernel7x7Divide(...)
+
+        #region int SDL_imageFilterConvolveKernel9x9Divide(...)
+        /// <summary>
+        /// SDL_imageFilterConvolveKernel9x9Divide: Dij = saturation0and255( ... ). For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterConvolveKernel9x9Divide(unsigned char *Src, unsigned char *Dest, int rows, int columns, signed short *Kernel, unsigned char Divisor);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="columns"></param>
+        /// <param name="Divisor"></param>
+        /// <param name="Kernel"></param>
+        /// <param name="rows"></param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterConvolveKernel9x9Divide(
+            byte[] Src1, byte[] Dest, int rows,
+            int columns, short[] Kernel, byte Divisor);
+        #endregion int SDL_imageFilterConvolveKernel9x9Divide(...)
+
+        #region int SDL_imageFilterConvolveKernel3x3ShiftRight(...)
+        /// <summary>
+        /// SDL_imageFilterConvolveKernel3x3ShiftRight: Dij = saturation0and255( ... ). For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterConvolveKernel3x3ShiftRight(unsigned char *Src, unsigned char *Dest, int rows, int columns, signed short *Kernel, unsigned char NRightShift);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="columns"></param>
+        /// <param name="NRightShift"></param>
+        /// <param name="Kernel"></param>
+        /// <param name="rows"></param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterConvolveKernel3x3ShiftRight(
+            byte[] Src1, byte[] Dest, int rows,
+            int columns, short[] Kernel, byte NRightShift);
+        #endregion int SDL_imageFilterConvolveKernel3x3ShiftRight(...)
+
+        #region int SDL_imageFilterConvolveKernel5x5ShiftRight(...)
+        /// <summary>
+        /// SDL_imageFilterConvolveKernel5x5ShiftRight: Dij = saturation0and255( ... ). For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterConvolveKernel5x5ShiftRight(unsigned char *Src, unsigned char *Dest, int rows, int columns, signed short *Kernel, unsigned char NRightShift);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="columns"></param>
+        /// <param name="NRightShift"></param>
+        /// <param name="Kernel"></param>
+        /// <param name="rows"></param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterConvolveKernel5x5ShiftRight(
+            byte[] Src1, byte[] Dest, int rows,
+            int columns, short[] Kernel, byte NRightShift);
+        #endregion int SDL_imageFilterConvolveKernel5x5ShiftRight(...)
+
+        #region int SDL_imageFilterConvolveKernel7x7ShiftRight(...)
+        /// <summary>
+        /// SDL_imageFilterConvolveKernel7x7ShiftRight: Dij = saturation0and255( ... ). For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterConvolveKernel7x7ShiftRight(unsigned char *Src, unsigned char *Dest, int rows, int columns, signed short *Kernel, unsigned char NRightShift);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="rows">Threshold</param>
+        /// <param name="columns">Threshold</param>
+        /// <param name="Kernel">Size of array</param>
+        /// <param name="NRightShift"></param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterConvolveKernel7x7ShiftRight(
+            byte[] Src1, byte[] Dest, int rows,
+            int columns, short[] Kernel, byte NRightShift);
+        #endregion int SDL_imageFilterConvolveKernel7x7ShiftRight(...)
+
+        #region int SDL_imageFilterConvolveKernel9x9ShiftRight(...)
+        /// <summary>
+        /// SDL_imageFilterConvolveKernel9x9ShiftRight: Dij = saturation0and255( ... ). For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterConvolveKernel9x9ShiftRight(unsigned char *Src, unsigned char *Dest, int rows, int columns, signed short *Kernel, unsigned char NRightShift);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="rows">Threshold</param>
+        /// <param name="columns">Threshold</param>
+        /// <param name="Kernel">Size of array</param>
+        /// <param name="NRightShift"></param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterConvolveKernel9x9ShiftRight(
+            byte[] Src1, byte[] Dest, int rows,
+            int columns, short[] Kernel, byte NRightShift);
+        #endregion int SDL_imageFilterConvolveKernel9x9ShiftRight(...)
+
+        #region int SDL_imageFilterSobelX(byte[] Src1, byte[] Dest, int rows, int columns)
+        /// <summary>
+        /// SDL_imageFilterSobelX: Dij = saturation255( ... ). For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterSobelX(unsigned char *Src, unsigned char *Dest, int rows, int columns)
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="rows">Threshold</param>
+        /// <param name="columns">Threshold</param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterSobelX(byte[] Src1, byte[] Dest, int rows, int columns);
+        #endregion int SDL_imageFilterSobelX(byte[] Src1, byte[] Dest, int rows, int columns)
+
+        #region int SDL_imageFilterSobelXShiftRight(...)
+        /// <summary>
+        /// SDL_imageFilterSobelXShiftRight: Dij = saturation255( ... ). For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// int SDL_imageFilterSobelXShiftRight(unsigned char *Src, unsigned char *Dest, int rows, int columns, unsigned char NRightShift);
+        /// </code>
+        /// </remarks>
+        /// <param name="Src1">Array of bytes</param>
+        /// <param name="Dest">Array of bytes returned after operation.</param>
+        /// <param name="rows">Threshold</param>
+        /// <param name="columns">Threshold</param>
+        /// <param name="NRightShift"></param>
+        /// <returns>Returns 0 for success and -1 for Error.</returns>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_imageFilterSobelXShiftRight(
+            byte[] Src1, byte[] Dest, int rows, int columns, byte NRightShift);
+        #endregion int SDL_imageFilterSobelXShiftRight(...)
+
+        #region void SDL_imageFilterAlignStack()
+        /// <summary>
+        /// Align stack to 32 byte boundary -- Functionality untested! --. For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// void SDL_imageFilterAlignStack(void)
+        /// </code>
+        /// </remarks>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_imageFilterAlignStack();
+        #endregion void SDL_imageFilterAlignStack()
+
+        #region void SDL_imageFilterRestoreStack()
+        /// <summary>
+        /// Restore stack to 32 byte boundary -- Functionality untested! --. For MMX processors only.
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_imageFilter.h.
+        /// <code>
+        /// void SDL_imageFilterRestoreStack(void)
+        /// </code>
+        /// </remarks>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern void SDL_imageFilterRestoreStack();
+        #endregion void SDL_imageFilterRestoreStack()
+        #endregion SDL_imageFilter.h
+
+        #region SDL_gfxBlitFunc.h
+
+        #region int SDL_gfxBlitRGBA(IntPtr src, ref Sdl.SDL_Rect srcrect, IntPtr dst, Sdl.SDL_Rect dstrect)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_gfxBlitFunc.h.
+        /// <code>
+        /// int  SDL_gfxBlitRGBA(SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect);
+        /// </code>
+        /// </remarks>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_gfxBlitRGBA(IntPtr src, ref Sdl.SDL_Rect srcrect, IntPtr dst, Sdl.SDL_Rect dstrect);
+        #endregion int SDL_gfxBlitRGBA(IntPtr src, ref Sdl.SDL_Rect srcrect, IntPtr dst, Sdl.SDL_Rect dstrect)
+
+        #region int SDL_gfxSetAlpha(IntPtr src, byte a)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <remarks>
+        /// Binds to C-function call in SDL_gfxBlitFunc.h.
+        /// <code>
+        /// int SDL_gfxSetAlpha(SDL_Surface * src, Uint8 a);
+        /// </code>
+        /// </remarks>
+        [DllImport(SDL_GFX_NATIVE_LIBRARY,
+             CallingConvention = CALLING_CONVENTION),
+        SuppressUnmanagedCodeSecurity]
+        public static extern int SDL_gfxSetAlpha(IntPtr src, byte a);
+        #endregion int SDL_gfxSetAlpha(IntPtr src, byte a)
+
+        #endregion SDL_gfxBlitFunc.h
+
+        #endregion SdlGfxMethods
+    }
+}
diff --git a/src/Tao.Sdl/SdlImage.cs b/src/Tao.Sdl/SdlImage.cs
new file mode 100644
index 0000000..2c4c9ae
--- /dev/null
+++ b/src/Tao.Sdl/SdlImage.cs
@@ -0,0 +1,1396 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl 
+{
+	#region Class Documentation
+	/// <summary>
+	/// SDL_Image bindings for .NET. 
+	/// <p>A simple library to load images of various formats as SDL surfaces.</p>
+	/// </summary>
+	/// <remarks>
+	/// Images provide the basic visual building blocks for any user 
+	/// interface. Colors and fun shapes are the stuff that we as kids 
+	/// looked at for 
+	///  hours at a time while trying to shoot down big aliens and rescue 
+	///  pixelated princesses. Now it's our turn to make the images that 
+	///  others will remember later in life perhaps. Now how do we get 
+	///  this dang images into our SDL programs, and be flexible in the 
+	///  handling of the images so that we don't even have to worry about 
+	///  what various formats they may be in? This is where SDLimage makes 
+	///  all of our lives easier. This document doesn't help you make 
+	///  artwork, but it will give you the functional knowledge on how to 
+	///  get that art into your game. Now go forth and make your Stick Figure 
+	///  of Justice, someone else might fill in for your lack of artistry, 
+	///  at least you won't have to make much of an effort to include the 
+	///  new and better art into your code. 
+	///  <p>
+	///	This is a simple library to load images of various formats as 
+	///	SDL surfaces.</p>
+	///	<p>This library supports BMP, PNM (PPM/PGM/PBM), XPM, LBM, PCX, 
+	///	GIF, JPEG, PNG,
+	///	TGA, and TIFF formats.</p>
+	///<p>
+	///	<br>JPEG support requires the JPEG library.</br>
+	///	<br>PNG support requires the PNG library.
+	///	and the Zlib library.</br>
+	///	<br>TIFF support requires the TIFF library.</br>
+	///	</p>
+	///	<p>
+	///	SDL_image supports loading and decoding images from the 
+	///	following formats:</p>
+	///	<code>
+	///	TGA TrueVision Targa (MUST have .tga) 
+	///	
+	///	BMP Windows Bitmap(.bmp) 
+	///	
+	///	PNM Portable Anymap (.pnm)
+	///	
+	///		.pbm = Portable BitMap (mono)
+	///		.pgm = Portable GreyMap (256 greys)
+	///		.ppm = Portable PixMap (full color) 
+	///		
+	///	XPM X11 Pixmap (.xpm) can be #included directly in code
+	///		This is NOT the same as XBM(X11 Bitmap) format, which is for monocolor
+	///		images. 
+	///		
+	///	XCF 
+	///	
+	///	GIMP native (.xcf) (XCF = eXperimental Computing Facility?)
+	///	This format is always changing, and since there's no library supplied
+	///	by the GIMP project to load XCF, the loader may frequently fail to 
+	///	load much of any image from an XCF file. It's better to load this 
+	///	in GIMP and convert to a better supported image format. 
+	///	
+	///	PCX ZSoft IBM PC Paintbrush (.pcx) 
+	///	GIF CompuServe Graphics Interchange Format (.gif) 
+	///	JPG Joint Photographic Experts Group JFIF format (.jpg or .jpeg) 
+	///	TIF Tagged Image File Format (.tif or .tiff) 
+	///	LBM Interleaved Bitmap (.lbm or .iff) FORM : ILBM or PBM(packed bitmap)
+	///	HAM6, HAM8, and 24bit types are not supported. 
+	///	PNG Portable Network Graphics (.png) 
+	///	</code>
+	/// </remarks>
+	#endregion Class Documentation
+	[SuppressUnmanagedCodeSecurityAttribute()]
+	public static class SdlImage 
+	{
+		#region Private Constants
+		#region string SDL_IMAGE_NATIVE_LIBRARY
+		/// <summary>
+		///     Specifies SdlImage's native library archive.
+		/// </summary>
+		/// <remarks>
+		///     Specifies SDL_image.dll everywhere; will be mapped via .config for mono.
+		/// </remarks>
+		private const string SDL_IMAGE_NATIVE_LIBRARY = "SDL_image.dll";
+
+		#endregion string SDL_IMAGE_NATIVE_LIBRARY
+
+		#region CallingConvention CALLING_CONVENTION
+		/// <summary>
+		///     Specifies the calling convention.
+		/// </summary>
+		/// <remarks>
+		///     Specifies <see cref="CallingConvention.Cdecl" /> 
+		///     for Windows and Linux.
+		/// </remarks>
+		private const CallingConvention CALLING_CONVENTION = 
+			CallingConvention.Cdecl;
+		#endregion CallingConvention CALLING_CONVENTION
+		#endregion Private Constants
+	
+		#region Public Constants
+		/// <summary>
+		/// Major Version
+		/// </summary>
+		public const int SDL_IMAGE_MAJOR_VERSION = 1;
+		/// <summary>
+		/// Minor Version
+		/// </summary>
+		public const int SDL_IMAGE_MINOR_VERSION = 2;
+		/// <summary>
+		/// Patch Version
+		/// </summary>
+		public const int SDL_IMAGE_PATCHLEVEL = 5;
+		#endregion Public Constants
+		
+		#region SdlImage Methods
+		#region SDL_version SDL_IMAGE_VERSION() 
+		/// <summary>
+		/// This method can be used to fill a version structure with the compile-time
+		/// version of the SDL_image library.
+		/// </summary>
+		/// <returns>
+		///     This function returns a <see cref="Sdl.SDL_version"/> struct containing the
+		///     compiled version number
+		/// </returns>
+		/// <remarks>
+		///     <p>
+		///     Binds to C-function call in SDL_image.h:
+		///     <code>#define SDL_IMAGE_VERSION(X)
+		/// {
+		/// (X)->major = SDL_IMAGE_MAJOR_VERSION;
+		/// (X)->minor = SDL_IMAGE_MINOR_VERSION;
+		/// (X)->patch = SDL_IMAGE_PATCHLEVEL;
+		/// }</code>
+		///     </p>
+		/// </remarks>
+		public static Sdl.SDL_version SDL_IMAGE_VERSION() 
+		{ 
+			Sdl.SDL_version sdlVersion = new Sdl.SDL_version();
+			sdlVersion.major = SDL_IMAGE_MAJOR_VERSION;
+			sdlVersion.minor = SDL_IMAGE_MINOR_VERSION;
+			sdlVersion.patch = SDL_IMAGE_PATCHLEVEL;
+			return sdlVersion;
+		} 
+		#endregion SDL_version SDL_IMAGE_VERSION() 
+
+		#region IntPtr IMG_Linked_VersionInternal()
+		//     const SDL_version * IMG_Linked_Version(void)
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="IMG_Linked_Version"), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr IMG_Linked_VersionInternal();
+		#endregion IntPtr IMG_Linked_VersionInternal()
+
+		#region SDL_version IMG_Linked_Version() 
+		/// <summary>
+		///     Using this you can compare the runtime version to the 
+		/// version that you compiled with.
+		/// </summary>
+		/// <returns>
+		///     This function gets the version of the dynamically 
+		/// linked SDL_image library in an <see cref="Sdl.SDL_version"/> struct.
+		/// </returns>
+		/// <remarks>
+		///     <p>
+		///     Binds to C-function call in SDL_image.h:
+		///     <code>const SDL_version * IMG_Linked_Version(void)</code>
+		///     </p>
+		/// </remarks>
+		public static Sdl.SDL_version IMG_Linked_Version() 
+		{ 
+			return (Sdl.SDL_version)Marshal.PtrToStructure(
+				IMG_Linked_VersionInternal(), 
+				typeof(Sdl.SDL_version)); 
+		} 
+		#endregion SDL_version IMG_Linked_Version() 
+
+		#region IntPtr IMG_LoadTyped_RW(IntPtr src, int freesrc, string type)
+		/// <summary>
+		/// Load an image from an SDL data source.
+		/// The 'type' may be one of: "BMP", "GIF", "PNG", etc.
+		/// If the image format supports a transparent pixel, SDL will set the
+		/// colorkey for the surface.  You can enable RLE acceleration on the
+		/// surface afterwards by calling:
+		/// SDL_SetColorKey(image, SDL_RLEACCEL, image.format.colorkey);
+		/// </summary>
+		/// <param name="freesrc">
+		/// A non-zero value mean is will automatically close/free 
+		/// the src for you. 
+		/// </param>
+		/// <param name="src">
+		/// The image is loaded from this. 
+		/// </param>
+		/// <param name="type">
+		/// A string that indicates which format type to interpret the image 
+		/// as.
+		/// <p>Here is a list of the currently recognized strings 
+		/// (case is not important):</p>
+		/// <br>"TGA"</br>
+		/// <br>"BMP"</br>
+		/// <br>"PNM"</br>
+		/// <br>"XPM"</br>
+		/// <br>"XCF"</br>
+		/// <br>"PCX"</br>
+		/// <br>"GIF"</br>
+		/// <br>"JPG"</br>
+		/// <br>"TIF"</br>
+		/// <br>"LBM"</br>
+		/// <br>"PNG"</br>
+		/// </param>
+		/// <remarks>
+		/// Load src for use as a surface. 
+		/// This can load all supported image formats. 
+		/// This method does not guarantee that the format 
+		/// specified by type is the format of the loaded image, 
+		/// except in the case when TGA format is specified 
+		/// (or any other non-magicable format). 
+		/// Using SDL_RWops is not covered here, 
+		/// but they enable you to load from almost any source. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, char *type)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // load sample.tga into image
+		///		SDL_Surface *image;
+		///		image=IMG_Load_RW(SDL_RWFromFile("sample.tga", "rb"), 1, "TGA");
+		///		if(!image) 
+		///	{
+		///		printf("IMG_Load_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_Load"/>
+		/// <seealso cref="IMG_Load_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadTyped_RW(
+			IntPtr src, 
+			int freesrc, 
+			string type);
+		#endregion IntPtr IMG_LoadTyped_RW(IntPtr src, int freesrc, string type)
+
+		#region IntPtr IMG_Load(string file)
+		/// <summary>
+		/// Load from a file.
+		/// </summary>
+		/// <remarks>
+		/// Load file for use as an image in a new surface. 
+		/// This actually calls IMG_LoadTyped_RW, with the file extension 
+		/// used as the type string. This can load all supported image files,
+		/// including TGA as long as the filename ends with ".tga". 
+		/// It is best to call this outside of event loops, and rather 
+		/// keep the loaded images around until you are really done with 
+		/// them, as disk speed and image conversion to a surface is not 
+		/// that speedy. Don't forget to SDL_FreeSurface the returned 
+		/// surface pointer when you are through with it. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_Load(const char *file)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="file">
+		/// Image file name to load a surface from. 
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, such as no support 
+		/// built for the image, or a file reading error. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // load sample.png into image
+		///		SDL_Surface *image;
+		///		image=IMG_Load("sample.png");
+		///		if(!image) 
+		///	{
+		///		printf("IMG_Load: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_Load_RW"/>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_Load(string file);
+		#endregion IntPtr IMG_Load(string file)
+
+		#region IntPtr IMG_Load_RW(IntPtr src, int freesrc)
+		/// <summary>
+		/// Load an image of an unspecified format
+		/// </summary>
+		/// <param name="freesrc">
+		/// A non-zero value mean is will automatically close/free 
+		/// the src for you. 
+		/// </param>
+		/// <param name="src">
+		/// The image is loaded from pointer. 
+		/// </param>
+		/// <remarks>
+		/// Load src for use as a surface. 
+		/// This can load all supported image formats, except TGA. 
+		/// Using SDL_RWops is not covered here, 
+		/// but they enable you to load from almost any source. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_Load_RW(SDL_RWops *src, int freesrc)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // load sample.png in to image
+		///		SDL_Surface *image;
+		///	image=IMG_Load_RW(SDL_RWFromFile("sample.png", "rb"), 1);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_Load_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_Load"/>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_Load_RW(IntPtr src, int freesrc);
+		#endregion IntPtr IMG_Load_RW(IntPtr src, int freesrc)
+
+		//int IMG_InvertAlpha(int on) is a deprecated function.
+
+		#region IntPtr IMG_isBMP(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported BMP file.
+		/// </summary>
+		/// <remarks>
+		/// If the BMP format is supported, 
+		/// then the image data is tested to see if it is readable as a BMP,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isBMP(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a BMP and the BMP format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.bmp to see if it is a BMP
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.bmp", "rb");
+		///		if(IMG_isBMP(rwop))
+		///		printf("sample.bmp is a BMP file.\n");
+		///		else
+		///		printf("sample.bmp is not a BMP file, or BMP support is not available.\n");
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isBMP(IntPtr src);
+		#endregion IntPtr IMG_isBMP(IntPtr src)
+
+		#region IntPtr IMG_isPNM(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported PNM file.
+		/// </summary>
+		/// <remarks>
+		/// If the PNM format is supported, 
+		/// then the image data is tested to see if it is readable as a PNM,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isPNM(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a PNM and the PNM format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.pnm to see if it is a PNM
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.pnm", "rb");
+		///		if(IMG_isPNM(rwop))
+		///		printf("sample.pnm is a PNM file.\n");
+		///		else
+		///		printf("sample.pnm is not a PNM file, or PNM support is not available.\n");
+		/// </code></example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isPNM(IntPtr src);
+		#endregion IntPtr IMG_isPNM(IntPtr src)
+
+		#region IntPtr IMG_isXPM(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported XPM file.
+		/// </summary>
+		/// <remarks>
+		/// If the XPM format is supported, 
+		/// then the image data is tested to see if it is readable as a XPM,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isXPM(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a XPM and the XPM format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.xpm to see if it is a XPM
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.xpm", "rb");
+		///		if(IMG_isXPM(rwop))
+		///		printf("sample.xpm is a XPM file.\n");
+		///		else
+		///		printf("sample.xpm is not a XPM file, or XPM support is not available.\n");
+		/// </code></example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isXPM(IntPtr src);
+		#endregion IntPtr IMG_isXPM(IntPtr src)
+
+		#region IntPtr IMG_isXV(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported XV file.
+		/// </summary>
+		/// <remarks>
+		/// If the XV format is supported, 
+		/// then the image data is tested to see if it is readable as a XV,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isXV(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a XV and the XV format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.xv to see if it is a XV
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.xv", "rb");
+		///		if(IMG_isXV(rwop))
+		///		printf("sample.xpm is a XV file.\n");
+		///		else
+		///		printf("sample.xpm is not a XV file, or XV support is not available.\n");
+		/// </code></example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isXV(IntPtr src);
+		#endregion IntPtr IMG_isXV(IntPtr src)
+
+		#region IntPtr IMG_isXCF(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported XCF file.
+		/// </summary>
+		/// <remarks>
+		/// If the XCF format is supported, 
+		/// then the image data is tested to see if it is readable as a XCF,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isXCF(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a XCF and the XCF format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.xcf to see if it is a XCF
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.xcf", "rb");
+		///		if(IMG_isXCF(rwop))
+		///		printf("sample.xcf is a XCF file.\n");
+		///		else
+		///		printf("sample.xcf is not a XCF file, or XCF support is not available.\n");
+		/// </code></example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isXCF(IntPtr src);
+		#endregion IntPtr IMG_isXCF(IntPtr src)
+
+		#region IntPtr IMG_isPCX(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported PCX file.
+		/// </summary>
+		/// <remarks>
+		/// If the PCX format is supported, 
+		/// then the image data is tested to see if it is readable as a PCX,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isPCX(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a PCX and the PCX format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.pcx to see if it is a PCX
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.pcx", "rb");
+		///		if(IMG_isPCX(rwop))
+		///		printf("sample.pcx is a PCX file.\n");
+		///		else
+		///		printf("sample.pcx is not a PCX file, or PCX support is not available.\n");
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isPCX(IntPtr src);
+		#endregion IntPtr IMG_isPCX(IntPtr src)
+
+		#region IntPtr IMG_isGIF(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported GIF file.
+		/// </summary>
+		/// <remarks>
+		/// If the GIF format is supported, 
+		/// then the image data is tested to see if it is readable as a GIF,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isGIF(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a GIF and the GIF format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.gif to see if it is a GIF
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.gif", "rb");
+		///		if(IMG_isGIF(rwop))
+		///		printf("sample.gif is a GIF file.\n");
+		///		else
+		///		printf("sample.gif is not a GIF file, or GIF support is not available.\n");
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isGIF(IntPtr src);
+		#endregion IntPtr IMG_isGIF(IntPtr src)
+
+		#region IntPtr IMG_isJPG(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported JPG file.
+		/// </summary>
+		/// <remarks>
+		/// If the JPG format is supported, 
+		/// then the image data is tested to see if it is readable as a JPG,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isJPG(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a JPG and the JPG format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.jpg to see if it is a JPG
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.jpg", "rb");
+		///		if(IMG_isJPG(rwop))
+		///		printf("sample.jpg is a JPG file.\n");
+		///		else
+		///		printf("sample.jpg is not a JPG file, or JPG support is not available.\n");
+		/// </code></example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isJPG(IntPtr src);
+		#endregion IntPtr IMG_isJPG(IntPtr src)
+
+		#region IntPtr IMG_isTIF(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported TIF file.
+		/// </summary>
+		/// <remarks>
+		/// If the TIF format is supported, 
+		/// then the image data is tested to see if it is readable as a TIF,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isTIF(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a TIF and the TIF format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.tif to see if it is a TIF
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.tif", "rb");
+		///		if(IMG_isTIF(rwop))
+		///		printf("sample.tif is a TIF file.\n");
+		///		else
+		///		printf("sample.tif is not a TIF file, or TIF support is not available.\n");
+		/// </code></example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isTIF(IntPtr src);
+		#endregion IntPtr IMG_isTIF(IntPtr src)
+
+		#region IntPtr IMG_isPNG(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported PNG file.
+		/// </summary>
+		/// <remarks>
+		/// If the PNG format is supported, 
+		/// then the image data is tested to see if it is readable as a PNG,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isPNG(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a PNG and the PNG format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.png to see if it is a PNG
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.png", "rb");
+		///		if(IMG_isPNG(rwop))
+		///		printf("sample.png is a PNG file.\n");
+		///		else
+		///		printf("sample.png is not a PNG file, or PNG support is not available.\n");
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isPNG(IntPtr src);
+		#endregion IntPtr IMG_isPNG(IntPtr src)
+
+		#region IntPtr IMG_isLBM(IntPtr src)
+		/// <summary>
+		/// Test for valid, supported LBM file.
+		/// </summary>
+		/// <remarks>
+		/// If the LBM format is supported, 
+		/// then the image data is tested to see if it is readable as a LBM,
+		///  otherwise it returns false (Zero). 
+		///  <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// int IMG_isLBM(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="src"></param>
+		/// <returns>
+		/// 1 if the image is a LBM and the LBM format support is
+		///  compiled into SDL_image. 0 is returned otherwise. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Test sample.lbm to see if it is a LBM
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.lbm", "rb");
+		///		if(IMG_isLBM(rwop))
+		///		printf("sample.lbm is a LBM file.\n");
+		///		else
+		///		printf("sample.lbm is not a LBM file, or LBM support is not available.\n");
+		/// </code></example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_isLBM(IntPtr src);
+		#endregion IntPtr IMG_isLBM(IntPtr src)
+
+		#region IntPtr IMG_LoadBMP_RW(IntPtr src)
+		/// <summary>
+		/// Load a .BMP image.
+		/// </summary>
+		/// <param name="src">
+		/// The BMP image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if BMP is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a BMP image for use as a surface, 
+		/// if BMP support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadBMP_RW(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.bmp into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.bmp", "rb");
+		///		image=IMG_LoadBMP_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadBMP_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code></example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isBMP"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadBMP_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadBMP_RW(IntPtr src)
+		
+		#region IntPtr IMG_LoadPNM_RW(IntPtr src)
+		/// <summary>
+		/// Load a .PNM image.
+		/// </summary>
+		/// <param name="src">
+		/// The PNM image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if PNM is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a PNM image for use as a surface, 
+		/// if PNM support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadPNM_RW(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.pnm into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.pnm", "rb");
+		///		image=IMG_LoadPNM_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadPNM_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isPNM"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadPNM_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadPNM_RW(IntPtr src)
+		
+		#region IntPtr IMG_LoadXPM_RW(IntPtr src)
+		/// <summary>
+		/// Load a .XPM image.
+		/// </summary>
+		/// <param name="src">
+		/// The XPM image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if XPM is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a XPM image for use as a surface, 
+		/// if XPM support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.xpm into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.xpm", "rb");
+		///		image=IMG_LoadXPM_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadXPM_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isXPM"/>
+		/// <seealso cref="IMG_ReadXPMFromArray"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadXPM_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadXPM_RW(IntPtr src)
+		
+		#region IntPtr IMG_LoadXCF_RW(IntPtr src)
+		/// <summary>
+		/// Load a .XCF image.
+		/// </summary>
+		/// <param name="src">
+		/// The XCF image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if XCF is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a XCF image for use as a surface, 
+		/// if XCF support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadXCF_RW(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.xcf into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.xcf", "rb");
+		///		image=IMG_LoadXCF_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadXCF_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isXCF"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadXCF_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadXCF_RW(IntPtr src)
+
+		#region IntPtr IMG_LoadXV_RW(IntPtr src)
+		/// <summary>
+		/// Load a .XV image.
+		/// </summary>
+		/// <param name="src">
+		/// The XV image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if XV is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a XV image for use as a surface, 
+		/// if XV support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadXV_RW(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.xv into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.xv", "rb");
+		///		image=IMG_LoadXV_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadXV_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isXV"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadXV_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadXV_RW(IntPtr src)
+		
+		#region IntPtr IMG_LoadPCX_RW(IntPtr src)
+		/// <summary>
+		/// Load a .PCX image.
+		/// </summary>
+		/// <param name="src">
+		/// The PCX image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if PCX is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a PCX image for use as a surface, 
+		/// if PCX support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadPCX_RW(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.pcx into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.pcx", "rb");
+		///		image=IMG_LoadPCX_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadPCX_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isPCX"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadPCX_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadPCX_RW(IntPtr src)
+		
+		#region IntPtr IMG_LoadGIF_RW(IntPtr src)
+		/// <summary>
+		/// Load a .GIF image.
+		/// </summary>
+		/// <param name="src">
+		/// The GIF image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if GIF is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a GIF image for use as a surface, 
+		/// if GIF support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadGIF_RW(SDL_RWops *src)
+		/// </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.gif into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.gif", "rb");
+		///		image=IMG_LoadGIF_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadGIF_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isGIF"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadGIF_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadGIF_RW(IntPtr src)
+		
+		#region IntPtr IMG_LoadJPG_RW(IntPtr src)
+		/// <summary>
+		/// Load a .JPG image.
+		/// </summary>
+		/// <param name="src">
+		/// The JPG image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if JPG is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a JPG image for use as a surface, 
+		/// if JPG support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadJPG_RW(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.jpg into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.jpg", "rb");
+		///		image=IMG_LoadJPG_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadJPG_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isJPG"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadJPG_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadJPG_RW(IntPtr src)
+		
+		#region IntPtr IMG_LoadTIF_RW(IntPtr src)
+		/// <summary>
+		/// Load a .TIF image.
+		/// </summary>
+		/// <param name="src">
+		/// The TIF image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if TIF is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a TIF image for use as a surface, 
+		/// if TIF support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadTIF_RW(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.tif into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.tif", "rb");
+		///		image=IMG_LoadTIF_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadTIF_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isTIF"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadTIF_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadTIF_RW(IntPtr src)
+		
+		#region IntPtr IMG_LoadPNG_RW(IntPtr src)
+		/// <summary>
+		/// Load a .PNG image.
+		/// </summary>
+		/// <param name="src">
+		/// The PNG image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if PNG is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a PNG image for use as a surface, 
+		/// if PNG support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.png into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.png", "rb");
+		///		image=IMG_LoadPNG_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadPNG_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isPNG"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadPNG_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadPNG_RW(IntPtr src)
+
+		#region IntPtr IMG_LoadTGA_RW(IntPtr src)
+		/// <summary>
+		/// Load a .TGA image.
+		/// </summary>
+		/// <param name="src">
+		/// The BMP image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if BMP is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a TGA image for use as a surface, 
+		/// if TGA support is compiled into the SDL_image library. 
+		/// If you try to load a non TGA image, 
+		/// you might succeed even when it's not TGA image formatted data, 
+		/// this is because the TGA has no magic, 
+		/// which is a way of identifying a filetype from a 
+		/// signature in it's contents. So be careful with this. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>SDL_Surface *IMG_LoadTGA_RW(SDL_RWops *src)
+		/// </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.tga into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.tga", "rb");
+		///		image=IMG_LoadTGA_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadTGA_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadTGA_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadTGA_RW(IntPtr src)
+
+		#region IntPtr IMG_LoadLBM_RW(IntPtr src)
+		/// <summary>
+		/// Load a .LBM image.
+		/// </summary>
+		/// <param name="src">
+		/// The LBM image is loaded from this
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if LBM is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a LBM image for use as a surface, 
+		/// if LBM support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_LoadLBM_RW(SDL_RWops *src)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.lbm into image
+		///		SDL_Surface *image;
+		///		SDL_RWops *rwop;
+		///		rwop=SDL_RWFromFile("sample.lbm", "rb");
+		///		image=IMG_LoadLBM_RW(rwop);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_LoadLBM_RW: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="IMG_LoadTyped_RW"/>
+		/// <seealso cref="IMG_isLBM"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_LoadLBM_RW(IntPtr src);
+		#endregion IntPtr IMG_LoadLBM_RW(IntPtr src)
+
+		#region IntPtr IMG_ReadXPMFromArray(string[] src)
+		/// <summary>
+		/// Load a .XPM image from an array.
+		/// </summary>
+		/// <param name="src">
+		/// The source xpm data. The XPM image is loaded from this.
+		/// </param>
+		/// <returns>
+		/// a pointer to the image as a new SDL_Surface. 
+		/// NULL is returned on errors, like if XPM is not supported, 
+		/// or a read error. 
+		/// </returns>
+		/// <remarks>
+		/// Load src as a XPM image for use as a surface, 
+		/// if XPM support is compiled into the SDL_image library. 
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// SDL_Surface *IMG_ReadXPMFromArray(char **xpm)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load sample.xpm into image
+		///#include "sample.xpm"
+		///		SDL_Surface *image;
+		///		image=IMG_ReadXPMFromArray(sample_xpm);
+		///		if(!image) 
+		///	{
+		///		printf("IMG_ReadXPMFromArray: %s\n", IMG_GetError());
+		///		// handle error
+		///	}
+		/// </code></example>
+		/// <seealso cref="IMG_LoadXPM_RW"/>
+		[DllImport(SDL_IMAGE_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr IMG_ReadXPMFromArray(string[] src);
+		#endregion IntPtr IMG_ReadXPMFromArray(string[] src)
+
+		#region void IMG_SetError(string message)
+		/// <summary>
+		/// Set the current error string
+		/// </summary>
+		/// <remarks>
+		/// This is the same as SDL_SetError, which sets the error string
+		///  which may be fetched with IMG_GetError (or SDL_GetError). 
+		///  This functions acts like printf, except that it is limited 
+		///  to SDL_ERRBUFIZE(1024) chars in length. It only accepts the
+		///   following format types: %s, %d, %f, %p. No variations are 
+		///   supported, like %.2f would not work. For any more specifics
+		///    read the SDL docs.
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// void IMG_SetError(const char *fmt, ...)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// int myimagefunc(int i) {
+		///		IMG_SetError("myimagefunc is not implemented! %d was passed in.",i);
+		///		return(-1);
+		///	}
+		/// </code></example>
+		/// <param name="message"></param>
+		/// <seealso cref="IMG_GetError"/>
+		public static void IMG_SetError(string message)
+		{
+			Sdl.SDL_SetError(message);
+		}
+		#endregion void IMG_SetError(string message)
+
+		#region string IMG_GetError()
+		/// <summary>
+		/// Get the current error string
+		/// </summary>
+		/// <remarks>
+		/// This is the same as SDL_GetError, which returns the last 
+		/// error set as a string which you may use to tell the user 
+		/// what happened when an error status has been returned from
+		///  an SDL_image function call.
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// char *IMG_GetError() 
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// a char pointer (string) containing a humam 
+		/// readable version or the reason for the last error that
+		///  occured.
+		///  </returns>
+		/// <seealso cref="IMG_SetError"/>
+		public static string IMG_GetError()
+		{
+			return Sdl.SDL_GetError();
+		}
+		#endregion string IMG_GetError()
+		#endregion SdlImage Methods
+	}
+}
diff --git a/src/Tao.Sdl/SdlMixer.cs b/src/Tao.Sdl/SdlMixer.cs
new file mode 100644
index 0000000..465de63
--- /dev/null
+++ b/src/Tao.Sdl/SdlMixer.cs
@@ -0,0 +1,3341 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl 
+{
+	#region Class Documentation
+	/// <summary>
+	/// <p>SdlMixer is a simple multi-channel audio mixer. 
+	/// It supports 8 channels of 16 bit stereo audio, plus a 
+	/// single channel of music, mixed by the popular MikMod MOD, 
+	/// Timidity MIDI and SMPEG MP3 libraries.</p> 
+	/// <p>
+	/// The mixer can currently load Microsoft WAVE files and 
+	/// Creative Labs VOC files as audio samples, and can load MIDI 
+	/// files via Timidity and the following music formats via 
+	/// MikMod: .MOD .S3M .IT .XM. It can load Ogg Vorbis streams 
+	/// as music if built with the Ogg Vorbis libraries, and 
+	/// finally it can load MP3 music using the SMPEG library.</p> 
+	/// <p>
+	/// The process of mixing MIDI files to wave output is very CPU 
+	/// intensive, so if playing regular WAVE files sound great, but
+	///  playing MIDI files sound choppy, try using 8-bit audio, 
+	///  mono audio, or lower frequencies.</p>
+	/// </summary>
+	/// <remarks>
+	/// This assumes you have gotten SDL_mixer and installed it 
+	/// on your system. SDL_mixer has an INSTALL document in the
+	///  source distribution to help you get it compiled and installed. 
+	///	SDL_mixer supports playing music and sound samples from 
+	///	the following formats:
+	///	<code>
+	///	- WAVE/RIFF (.wav)
+	///	- AIFF (.aiff)
+	///	- VOC (.voc)
+	///	- MOD (.mod .xm .s3m .669 .it .med and more) using included mikmod
+	///	- MIDI (.mid) using timidity or native midi hardware
+	///	- OggVorbis (.ogg) requiring ogg/vorbis libraries on system
+	///	- MP3 (.mp3) requiring SMPEG library on system
+	///	- also any command-line player, which is not mixed by SDL_mixer...
+	///	</code>
+	///	<p>
+	///	When using SDL_mixer functions you need to avoid the 
+	///	following functions from SDL:</p>
+	/// <p><code>
+	///	SDL_OpenAudio 
+	///	Use Mix_OpenAudio instead. 
+	///	SDL_CloseAudio 
+	///	Use Mix_CloseAudio instead. 
+	///	SDL_PauseAudio 
+	///	Use Mix_Pause(-1) and Mix_PauseMusic instead, to pause.
+	///	Use Mix_Resume(-1) and Mix_ResumeMusic instead, to unpause. 
+	///	SDL_LockAudio 
+	///	This is just not needed since SDL_mixer handles this for you.
+	///	Using it may cause problems as well. 
+	///	SDL_UnlockAudio 
+	///	This is just not needed since SDL_mixer handles this for you.
+	///	Using it may cause problems as well. </code></p>
+	///	<p>You may call the following functions freely:</p> 
+	/// <code>
+	///	SDL_AudioDriverName 
+	///	This will still work as usual. 
+	///	SDL_GetAudioStatus 
+	///	This will still work, though it will likely return 
+	///	SDL_AUDIO_PLAYING even though SDL_mixer is just playing silence. 
+	///	It is also a BAD idea to call SDL_mixer and SDL audio 
+	///	functions from a callback. Callbacks include Effects 
+	///	functions and other SDL_mixer audio hooks. </code>
+	/// </remarks>
+	#endregion Class Documentation
+	[SuppressUnmanagedCodeSecurityAttribute()]
+	public static class SdlMixer 
+	{
+		#region Private Constants
+		#region string SDL_MIXER_NATIVE_LIBRARY
+		/// <summary>
+		///     Specifies SdlMixer native library archive.
+		/// </summary>
+		/// <remarks>
+		///     Specifies SDL_mixer.dll everywhere; will be mapped via .config for mono.
+		/// </remarks>
+		private const string SDL_MIXER_NATIVE_LIBRARY = "SDL_mixer.dll";
+		#endregion string SDL_MIXER_NATIVE_LIBRARY
+
+		#region CallingConvention CALLING_CONVENTION
+		/// <summary>
+		///     Specifies the calling convention.
+		/// </summary>
+		/// <remarks>
+		///     Specifies <see cref="CallingConvention.Cdecl" /> 
+		///     for Windows and Linux.
+		/// </remarks>
+		private const CallingConvention CALLING_CONVENTION = 
+			CallingConvention.Cdecl;
+		#endregion CallingConvention CALLING_CONVENTION
+		#endregion Private Constants
+
+		#region Public Constants
+		/// <summary>
+		/// Major Version
+		/// </summary>
+		public const int MIX_MAJOR_VERSION = 1;
+		/// <summary>
+		/// Minor Version
+		/// </summary>
+		public const int MIX_MINOR_VERSION = 2;
+		/// <summary>
+		/// Patch Version
+		/// </summary>
+		public const int MIX_PATCHLEVEL = 7;
+		/// <summary>
+		/// The default mixer has this many simultaneous mixing 
+		/// channels after the first call to Mix_OpenAudio.
+		/// </summary>
+		public const int MIX_CHANNELS = 8;
+
+		/// <summary>
+		/// Good default sample rate in Hz (samples per second)
+		///  for PC sound cards.
+		/// </summary>
+		public const int MIX_DEFAULT_FREQUENCY = 22050;
+
+		/// <summary>
+		/// The suggested default is signed 16bit samples in host byte order.
+		/// </summary>
+		public static int MIX_DEFAULT_FORMAT 
+		{
+			get 
+			{
+				if (Sdl.SDL_BYTEORDER == Sdl.SDL_LIL_ENDIAN)
+				{
+					return Sdl.AUDIO_S16SYS;
+				}
+				else
+				{
+					return Sdl.AUDIO_S16MSB;
+				}
+			}
+		}
+
+		/// <summary>
+		/// Stereo sound is a good default.
+		/// </summary>
+		public const int MIX_DEFAULT_CHANNELS = 2;
+
+		/// <summary>
+		/// Maximum value for any volume setting.
+		/// </summary>
+		/// <remarks>
+		/// This is currently the same as <see cref="Sdl.SDL_MIX_MAXVOLUME"/>.
+		/// </remarks>
+		public const int MIX_MAX_VOLUME = 128;
+
+		/// <summary>
+		/// This is the channel number used for post processing effects.
+		/// </summary>
+		public const int MIX_CHANNEL_POST = -2;
+
+		/// <summary>
+		/// A convience definition for the string name of the
+		///  environment variable to define when you desire 
+		///  the internal effects to sacrifice quality and/or 
+		///  RAM for speed. The environment variable must be 
+		///  set (else nonexisting) before Mix_OpenAudio is 
+		///  called for the setting to take effect.
+		/// </summary>
+		public const string MIX_EFFECTSMAXSPEED = "MIX_EFFECTSMAXSPEED";
+		#endregion Public Constants
+
+		#region Public Enums
+		#region Mix_Fading
+		//        /// <summary>
+		//        /// Fader effect type enumerations
+		//        /// </summary>
+		//        /// <remarks>
+		//        /// Return values from Mix_FadingMusic and Mix_FadingChannel
+		//        ///  are of these enumerated values. If no fading is taking 
+		//        ///  place on the queried channel or music, then MIX_NO_FADING
+		//        ///   is returned. Otherwise they are self explanatory.
+		//        /// </remarks>
+		//        /// <seealso cref="Mix_FadingChannel"/>
+		//        /// <seealso cref="Mix_FadingMusic"/>
+		//       public enum Mix_Fading {
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int MIX_NO_FADING = 0;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int MIX_FADING_OUT = 1;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int MIX_FADING_IN = 2;
+		// }
+		#endregion Mix_Fading
+
+		#region Mix_MusicType
+		//        /// <summary>
+		//        /// Music type enumerations
+		//        /// </summary>
+		//        /// <remarks>
+		//		/// Return values from Mix_GetMusicType are of these enumerated values.
+		//		/// If no music is playing then MUS_NONE is returned.
+		//		/// If music is playing via an external command then MUS_CMD is returned.
+		//		/// Otherwise they are self explanatory.
+		//		/// </remarks>
+		//		/// <seealso cref="Mix_GetMusicType"/>
+		//       public enum Mix_MusicType 
+		//		{
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int MUS_NONE = 0;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int MUS_CMD = 1;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int MUS_WAV = 2;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int MUS_MOD = 3;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int MUS_MID = 4;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int MUS_OGG = 5;
+		/// <summary>
+		/// 
+		/// </summary>
+		public const int MUS_MP3 = 6;
+		//       } 
+		#endregion Mix_MusicType
+		#endregion Public Enums
+
+		#region Public Structs
+		#region Mix_Chunk
+		/// <summary>
+		/// The internal format for an audio chunk
+		/// </summary>
+		/// <remarks>
+		/// The internal format for an audio chunk. 
+		/// This stores the sample data, the length in bytes of that data,
+		///  and the volume to use when mixing the sample. 
+		///  <p>Struct in SDL_mixer.h
+		///  <code>
+		///  typedef struct Mix_Chunk {
+		///		int allocated;
+		///		Uint8 *abuf;
+		///		Uint32 alen;
+		///		Uint8 volume;     /* Per-sample volume, 0-128 */
+		///	} Mix_Chunk;
+		///  </code></p>
+		/// </remarks>
+		/// <seealso cref="Mix_VolumeChunk"/>
+		/// <seealso cref="Mix_GetChunk"/>
+		/// <seealso cref="Mix_LoadWAV"/>
+		/// <seealso cref="Mix_LoadWAV_RW"/>
+		/// <seealso cref="Mix_FreeChunk"/>
+		public struct Mix_Chunk 
+		{
+			/// <summary>
+			/// a boolean indicating whether to free abuf when the chunk 
+			/// is freed.
+			/// </summary>
+			/// <remarks>0 if the memory was not allocated and thus not 
+			/// owned by this chunk.
+			/// 1 if the memory was allocated and is thus owned by this chunk.
+			/// </remarks>
+			public int allocated;
+			/// <summary>
+			/// Pointer to the sample data, which is 
+			/// in the output format and sample rate.
+			/// </summary>
+			public IntPtr abuf;
+			/// <summary>
+			/// Length of abuf in bytes.
+			/// </summary>
+			public int alen;
+			/// <summary>
+			/// 0 = silent, 128 = max volume. 
+			/// This takes effect when mixing.
+			/// </summary>
+			public byte volume;
+		} 
+		#endregion Mix_Chunk
+		#endregion Public Structs
+
+		#region Public Delegates
+		#region void MusicFinishedDelegate()
+		/// <summary>
+		/// 
+		/// </summary>
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate void MusicFinishedDelegate();
+		#endregion void MusicFinishedDelegate()
+
+		#region void MixFunctionDelegate(IntPtr udata, IntPtr stream, int len)
+		/// <summary>
+		/// 
+		/// </summary>
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate void MixFunctionDelegate(IntPtr udata, [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] stream, int len);
+		#endregion void MixFunctionDelegate(IntPtr udata, IntPtr stream, int len)
+
+		#region void ChannelFinishedDelegate(int channel)
+		/// <summary>
+		/// 
+		/// </summary>
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate void ChannelFinishedDelegate(int channel);
+		#endregion void ChannelFinishedDelegate(int channel)
+
+		#region void MixEffectFunctionDelegate(...)
+		/// <summary>
+		/// Special effect callback function pointer
+		/// </summary>
+		/// <remarks>
+		/// This is the prototype for effect processing functions. 
+		/// These functions are used to apply effects processing on 
+		/// a sample chunk. As a channel plays a sample, the registered 
+		/// effect functions are called. Each effect would then read and
+		///  perhaps alter the len bytes of stream. It may also be 
+		///  advantageous to keep the effect state in the udata, with would 
+		///  be setup when registering the effect function on a channel.
+		/// <p>
+		/// <code>
+		/// void (*Mix_EffectFunc_t)(int chan, void *stream, int len, void *udata)
+		/// </code></p>
+		/// </remarks>
+		/// <param name="chan">
+		/// The channel number that this effect is effecting now.
+		/// MIX_CHANNEL_POST is passed in for post processing effects over the 
+		/// final mix.
+		/// </param>
+		/// <param name="stream">
+		/// The buffer containing the current sample to process.
+		/// </param>
+		/// <param name="len">
+		/// The length of stream in bytes.
+		/// </param>
+		/// <param name="udata">
+		/// User data pointer that was passed in to Mix_RegisterEffect 
+		/// when registering this effect processor function.
+		/// </param>
+		/// <seealso cref="Mix_RegisterEffect"/>
+		/// <seealso cref="Mix_UnregisterEffect"/>
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate void MixEffectFunctionDelegate(int chan, IntPtr stream, int len, IntPtr udata);
+		#endregion void MixEffectFunctionDelegate(...)
+
+		#region void MixEffectDoneDelegate(int chan, IntPtr udata)
+		/// <summary>
+		/// Special effect done callback function pointer
+		/// </summary>
+		/// <remarks>
+		/// This is the prototype for effect processing functions. 
+		/// This is called when a channel has finished playing, or 
+		/// halted, or is deallocated. This is also called when a processor
+		/// is unregistered while processing is active. At that time the effects
+		///  processing function may want to reset some internal variables or 
+		///  free some memory. It should free memory at least, because the 
+		///  processor could be freed after this call.
+		/// <p>
+		/// <code>void (*Mix_EffectDone_t)(int chan, void *udata)
+		/// </code></p></remarks>
+		/// <param name="chan">
+		/// The channel number that this effect is effecting now.
+		/// MIX_CHANNEL_POST is passed in for post processing effects over the 
+		/// final mix.
+		/// </param>
+		/// <param name="udata">
+		/// User data pointer that was passed in to Mix_RegisterEffect 
+		/// when registering this effect processor function.
+		/// </param>
+		/// <seealso cref="Mix_RegisterEffect"/>
+		/// <seealso cref="Mix_UnregisterEffect"/>
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate void MixEffectDoneDelegate(int chan, IntPtr udata);
+		#endregion void MixEffectDoneDelegate(int chan, IntPtr udata)
+		#endregion Public Delegates
+		
+		#region SdlMixer Methods
+		#region SDL_version MIX_VERSION() 
+		/// <summary>
+		/// This method can be used to fill a version structure with the compile-time
+		/// version of the SDL_mixer library.
+		/// </summary>
+		/// <returns>
+		///     This function returns a <see cref="Sdl.SDL_version"/> struct containing the
+		///     compiled version number
+		/// </returns>
+		/// <remarks>
+		///     <p>
+		///     Binds to C-function call in SDL_mixer.h:
+		///     <code>#define SDL_MIX_VERSION(X)
+		/// {
+		/// (X)->major = SDL_MIX_MAJOR_VERSION;
+		/// (X)->minor = SDL_MIX_MINOR_VERSION;
+		/// (X)->patch = SDL_MIX_PATCHLEVEL;
+		/// }</code>
+		///     </p>
+		/// </remarks>
+		public static Sdl.SDL_version MIX_VERSION() 
+		{ 
+			Sdl.SDL_version sdlVersion = new Sdl.SDL_version();
+			sdlVersion.major = MIX_MAJOR_VERSION;
+			sdlVersion.minor = MIX_MINOR_VERSION;
+			sdlVersion.patch = MIX_PATCHLEVEL;
+			return sdlVersion;
+		} 
+		#endregion SDL_version MIX_VERSION() 
+
+		#region IntPtr Mix_Linked_VersionInternal()
+		//     const SDL_version * Mix_Linked_Version(void)
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="Mix_Linked_Version"), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr Mix_Linked_VersionInternal();
+		#endregion IntPtr Mix_Linked_VersionInternal()
+
+		#region SDL_version Mix_Linked_Version() 
+		/// <summary>
+		///     Using this you can compare the runtime version to the 
+		/// version that you compiled with.
+		/// </summary>
+		/// <returns>
+		///     This function gets the version of the dynamically 
+		/// linked SDL_mixer library in an <see cref="Sdl.SDL_version"/> struct.
+		/// </returns>
+		/// <remarks>
+		///     <p>
+		///     Binds to C-function call in SDL_mixer.h:
+		///     <code>const SDL_version * Mix_Linked_Version(void)</code>
+		///     </p>
+		/// </remarks>
+		public static Sdl.SDL_version Mix_Linked_Version() 
+		{ 
+			return (Sdl.SDL_version)Marshal.PtrToStructure(
+				Mix_Linked_VersionInternal(), 
+				typeof(Sdl.SDL_version)); 
+		} 
+		#endregion SDL_version Mix_Linked_Version() 
+	
+		#region int Mix_OpenAudio(...)
+		/// <summary>
+		/// Open the mixer with a certain audio format
+		/// </summary>
+		/// <remarks>
+		/// Initialize the mixer API.
+		/// <p>
+		///	This must be called before using other functions in this 
+		///	library.
+		///	SDL must be initialized with SDL_INIT_AUDIO before this call. 
+		///	frequency would be 44100 for 44.1KHz, which is CD audio rate. 
+		///	Most games use 22050, because 44100 requires too much CPU power
+		///	 on older computers. chunksize is the size of each mixed sample.
+		///	  The smaller this is the more your hooks will be called. 
+		///	  If make this too small on a slow system, sound may skip. 
+		///	  If made to large, sound effects will lag behind the action more.
+		///	   You want a happy medium for your target computer.
+		///	    You also may make this 4096, or larger, if you are
+		///	     just playing music. MIX_CHANNELS(8) mixing channels
+		///	      will be allocated by default. You may call this function
+		///	       multiple times, however you will have to call Mix_CloseAudio
+		///	        just as many times for the device to actually close.
+		///	         The format will not changed on subsequent calls. 
+		///	         So you will have to close all the way before
+		///	          trying to open with different format parameters.</p>
+		///	          
+		///	          <p>format is based on SDL audio support, see SDL_audio.h. Here are the values listed there:</p>
+		///
+		/// <code>
+		/// AUDIO_U8
+		/// Unsigned 8-bit samples
+		///
+		/// AUDIO_S8
+		/// Signed 8-bit samples
+		///
+		/// AUDIO_U16LSB
+		/// Unsigned 16-bit samples, in little-endian byte order
+		///
+		/// AUDIO_S16LSB
+		/// Signed 16-bit samples, in little-endian byte order
+		///
+		/// AUDIO_U16MSB
+		/// Unsigned 16-bit samples, in big-endian byte order
+		///
+		/// AUDIO_S16MSB
+		/// Signed 16-bit samples, in big-endian byte order
+		///
+		/// AUDIO_U16
+		/// same as AUDIO_U16LSB (for backwards compatability probably)
+		///
+		/// AUDIO_S16
+		/// same as AUDIO_S16LSB (for backwards compatability probably)
+		///
+		/// AUDIO_U16SYS
+		/// Unsigned 16-bit samples, in system byte order
+		///
+		/// AUDIO_S16SYS
+		/// Signed 16-bit samples, in system byte order
+		/// </code>
+		///
+		/// <p>MIX_DEFAULT_FORMAT is the same as AUDIO_S16SYS.</p>
+		/// <p>Binds to C-funtion in SDL_mixer.h
+		/// <code>
+		/// int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize)
+		/// </code></p>
+		/// </remarks>
+		/// <param name="frequency">
+		/// Output sampling frequency in samples per second (Hz).
+		/// you might use MIX_DEFAULT_FREQUENCY(22050) 
+		/// since that is a good value for most games.
+		/// </param>
+		/// <param name="format">
+		/// Output sample format.
+		/// </param>
+		/// <param name="channels">
+		/// Number of sound channels in output.
+		/// Set to 2 for stereo, 1 for mono. 
+		/// This has nothing to do with mixing channels.
+		/// </param>
+		/// <param name="chunksize">
+		/// Bytes used per output sample.
+		/// </param>
+		/// <returns>
+		/// 0 on success, -1 on errors 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // start SDL with audio support
+		///		if(SDL_Init(SDL_INIT_AUDIO)==-1) 
+		///	{
+		///		printf("SDL_Init: %s\n", SDL_GetError());
+		///		exit(1);
+		///	}
+		///	// open 44.1KHz, signed 16bit, system byte order,
+		///	//      stereo audio, using 1024 byte chunks
+		///	if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1) 
+		///{
+		///	printf("Mix_OpenAudio: %s\n", Mix_GetError());
+		///	exit(2);
+		///}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_CloseAudio"/>
+		/// <seealso cref="Mix_QuerySpec"/>
+		/// <seealso cref="Mix_AllocateChannels"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_OpenAudio(
+			int frequency, short format, int channels, int chunksize);
+		#endregion int Mix_OpenAudio(...)
+
+		#region int Mix_AllocateChannels(int numchans)
+		/// <summary>
+		/// Dynamically change the number of channels managed by the mixer.
+		/// If decreasing the number of channels, the upper channels are
+		/// stopped. 
+		/// <p>This function returns the new number of allocated channels.</p>
+		/// </summary>
+		/// <remarks>
+		/// Set the number of channels being mixed. 
+		/// This can be called multiple times, 
+		/// even with sounds playing. If numchans is less
+		///  than the current number of channels, then the
+		///   higher channels will be stopped, freed, and
+		///    therefore not mixed any longer. It's 
+		///    probably not a good idea to change the
+		///     size 1000 times a second though.
+		/// If any channels are deallocated, 
+		/// any callback set by Mix_ChannelFinished 
+		/// will be called when each channel 
+		/// is halted to be freed. Note: passing 
+		/// in zero WILL free all mixing channels, 
+		/// however music will still play. 
+		/// </remarks>
+		/// <param name="numchans">
+		/// Number of channels to allocate for mixing. 
+		/// A negative number will not do anything, it will tell
+		///  you how many channels are currently allocated.
+		/// </param>
+		/// <returns>
+		/// The number of channels allocated.
+		/// Never fails...but a high number of channels
+		/// can segfault if you run out of memory. We're talking REALLY high!
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // allocate 16 mixing channels
+		/// Mix_AllocateChannels(16);
+		/// </code></example>
+		/// <seealso cref="Mix_OpenAudio"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_AllocateChannels(int numchans);
+		#endregion int Mix_AllocateChannels(int numchans)
+
+		#region int Mix_QuerySpec(out int frequency, out short format, out int channels)
+		/// <summary>
+		/// Get output format.
+		/// </summary>
+		/// <remarks>
+		/// Get the actual audio format in use by the opened 
+		/// audio device.
+		///  This may or may not match the parameters you
+		///   passed to Mix_OpenAudio.
+		///   <p>Binds to C-function in SDL_mixer.h
+		///   <code>int Mix_QuerySpec(int *frequency, Uint16 *format, int *channels)
+		///   </code></p>
+		/// </remarks>
+		/// <param name="channels">
+		/// A pointer to an int where the 
+		/// number of audio channels will be stored.
+		/// 2 will mean stereo, 1 will mean mono.
+		/// </param>
+		/// <param name="format">
+		/// A pointer to a short where the output format actually
+		///  being used by the audio device will be stored.
+		/// </param>
+		/// <param name="frequency">
+		/// A pointer to an int 
+		/// where the frequency actually used by the opened 
+		/// audio device will be stored. 
+		/// </param>
+		/// <returns>
+		/// 0 on error. If the device was open the number of times 
+		/// it was opened will be returned. The values of the 
+		/// arguments variables are not set on an error.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // get and print the audio format in use
+		///		int numtimesopened, frequency, channels;
+		///		Uint16 format;
+		///		numtimesopened=Mix_QuerySpec(&frequency, &format, &channels);
+		///		if(!numtimesopened) 
+		///	{
+		///		printf("Mix_QuerySpec: %s\n",Mix_GetError());
+		///	}
+		///	else 
+		///{
+		///	char *format_str="Unknown";
+		///	switch(format) 
+		///{
+		///	case AUDIO_U8: format_str="U8"; break;
+		///	case AUDIO_S8: format_str="S8"; break;
+		///	case AUDIO_U16LSB: format_str="U16LSB"; break;
+		///	case AUDIO_S16LSB: format_str="S16LSB"; break;
+		///	case AUDIO_U16MSB: format_str="U16MSB"; break;
+		///	case AUDIO_S16MSB: format_str="S16MSB"; break;
+		///}
+		///	printf("opened=%d times  frequency=%dHz  format=%s  channels=%d",
+		///	numtimesopened, frequency, format, channels);
+		///}
+		/// </code>
+		/// </example>
+		///  <seealso cref="Mix_OpenAudio"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_QuerySpec(
+			out int frequency, 
+			out short format, out int channels);
+		#endregion int Mix_QuerySpec(out int frequency, out short format, out int channels)
+
+		#region IntPtr Mix_LoadWAV_RW(IntPtr src, int freesrc)
+		/// <summary>
+		/// Load a wave file or a music (.mod .s3m .it .xm) file
+		/// </summary>
+		/// <remarks>
+		/// Load src for use as a sample. 
+		/// This can load WAVE, AIFF, RIFF, OGG, and VOC formats. 
+		/// Using SDL_RWops is not covered here, but they enable 
+		/// you to load from almost any source.
+		/// <p>Binds to C-function in SDL_mixer.h
+		///   <code>Mix_Chunk *Mix_LoadWAV_RW(SDL_RWops *src, int freesrc)
+		///   </code></p>
+		/// </remarks>
+		/// <param name="src">
+		/// The source SDL_RWops as a pointer. 
+		/// The sample is loaded from this.
+		/// </param>
+		/// <param name="freesrc">
+		/// A non-zero value mean is will automatically 
+		/// close/free the src for you.
+		/// </param>
+		/// <returns>
+		/// a pointer to the sample as a Mix_Chunk. 
+		/// NULL is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // load sample.wav in to sample
+		///		Mix_Chunk *sample;
+		///		sample=Mix_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1);
+		///		if(!sample) 
+		///	{
+		///		printf("Mix_LoadWAV_RW: %s\n", Mix_GetError());
+		///		// handle error
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_LoadWAV"/>
+		/// <seealso cref="Mix_QuickLoad_WAV"/>
+		/// <seealso cref="Mix_FreeChunk"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr Mix_LoadWAV_RW(IntPtr src, int freesrc);
+		#endregion IntPtr Mix_LoadWAV_RW(IntPtr src, int freesrc)
+
+		#region IntPtr Mix_LoadWAV(string file)
+		/// <summary>
+		/// Load WAV from a file.
+		/// </summary>
+		/// <param name="file">
+		/// File name to load sample from.
+		/// </param>
+		/// <remarks>
+		/// Load file for use as a sample. 
+		/// This is actually Mix_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1).
+		///  This can load WAVE, AIFF, RIFF, OGG, and VOC files.
+		///  <p>Binds to C-function in SDL_mixer.h
+		///   <code>Mix_Chunk *Mix_LoadWAV(char *file)
+		///   </code></p>
+		/// </remarks>
+		/// <returns>
+		/// a pointer to the sample as a Mix_Chunk. 
+		/// NULL is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // load sample.wav in to sample
+		///		Mix_Chunk *sample;
+		///		sample=Mix_LoadWAV("sample.wav");
+		///		if(!sample) 
+		///	{
+		///		printf("Mix_LoadWAV: %s\n", Mix_GetError());
+		///		// handle error
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_LoadWAV_RW"/>
+		/// <seealso cref="Mix_QuickLoad_WAV"/>
+		/// <seealso cref="Mix_FreeChunk"/>
+		public static IntPtr Mix_LoadWAV(string file) 
+		{
+			return Mix_LoadWAV_RW(Sdl.SDL_RWFromFile(file, "rb"), 1);
+		}
+		#endregion IntPtr Mix_LoadWAV(string file)
+
+		#region IntPtr Mix_LoadMUS(string file)
+		/// <summary>
+		/// Load a music file into a Mix_Music
+		/// </summary>
+		/// <param name="file">Name of music file to use.
+		/// </param>
+		/// <returns>
+		/// A pointer to a Mix_Music. NULL is returned on errors.
+		/// </returns>
+		/// <remarks>
+		/// Load music file to use. This can load WAVE, MOD, MIDI, OGG, MP3, 
+		/// and any file that you use a command to play with.
+		/// <p>If you are using an external command to play the music, 
+		/// you must call Mix_SetMusicCMD before this, otherwise the 
+		/// internal players will be used. Alternatively, if you have 
+		/// set an external command up and don't want to use it, you 
+		/// must call Mix_SetMusicCMD(NULL) to use the built-in players 
+		/// again.</p>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>Mix_Music *Mix_LoadMUS(const char *file)
+		/// </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load the MP3 file "music.mp3" to play as music
+		///		Mix_Music *music;
+		///		music=Mix_LoadMUS("music.mp3");
+		///		if(!music) 
+		///	{
+		///		printf("Mix_LoadMUS(\"music.mp3\"): %s\n", Mix_GetError());
+		///		// this might be a critical error...
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_SetMusicCMD"/>
+		/// <seealso cref="Mix_PlayMusic"/>
+		/// <seealso cref="Mix_FadeInMusic"/>
+		/// <seealso cref="Mix_FadeInMusicPos"/> 
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr Mix_LoadMUS(string file);
+		#endregion IntPtr Mix_LoadMUS(string file)
+
+		#region IntPtr Mix_LoadMUS_RW(IntPtr rw)
+		/// <summary>
+		/// Load a music file from an SDL_RWop object (Ogg and MikMod specific currently)
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>Mix_Music *Mix_LoadMUS_RW(SDL_RWops *rw)
+		/// </code></p>
+		/// </remarks>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr Mix_LoadMUS_RW(IntPtr rw);
+		#endregion IntPtr Mix_LoadMUS_RW(IntPtr rw)
+
+		#region IntPtr Mix_QuickLoad_WAV(IntPtr mem)
+		/// <summary>
+		/// Load a wave file of the mixer format from a memory buffer
+		/// </summary>
+		/// <remarks>
+		/// Load mem as a WAVE/RIFF file into a new sample. 
+		/// The WAVE in mem must be already in the output format.
+		///  It would be better to use Mix_LoadWAV_RW if you aren't sure.
+		/// Note: This function does very little checking. 
+		/// If the format mismatches the output format, or 
+		/// if the buffer is not a WAVE, it will not return an error.
+		///  This is probably a dangerous function to use.
+		///  <p>Binds to C-function in SDL_mixer.h
+		/// <code>Mix_Chunk *Mix_QuickLoad_WAV(Uint8 *mem)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="mem">
+		/// Memory buffer containing a WAVE file in output format. 
+		/// </param>
+		/// <returns>
+		/// a pointer to the sample as a Mix_Chunk. 
+		/// NULL is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // quick-load a wave from memory
+		///		// Uint8 *wave; // I assume you have the wave loaded raw,
+		///		// or compiled in the program...
+		///		Mix_Chunk *wave_chunk;
+		///		if(!(wave_chunk=Mix_QuickLoad_WAV(wave))) 
+		///	{
+		///		printf("Mix_QuickLoad_WAV: %s\n", Mix_GetError());
+		///		// handle error
+		///	}
+		///	</code></example>
+		///	<seealso cref="Mix_LoadWAV"/>
+		/// <seealso cref="Mix_QuickLoad_RAW"/>
+		/// <seealso cref="Mix_FreeChunk"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY,
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr Mix_QuickLoad_WAV(
+			IntPtr mem);
+		#endregion IntPtr Mix_QuickLoad_WAV(IntPtr mem)
+
+		#region IntPtr Mix_QuickLoad_RAW(IntPtr mem, int len)
+		/// <summary>
+		/// Load raw audio data of the mixer format from a memory buffer 
+		/// </summary>
+		/// <remarks>
+		/// Load mem as a raw sample. The data in mem must be already in 
+		/// the output format. If you aren't sure what you are doing, 
+		/// this is not a good function for you!
+		/// <p>Note: This function does very little checking. 
+		/// If the format mismatches the output format it 
+		/// will not return an error. This is probably a 
+		/// dangerous function to use.</p>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>Mix_Chunk *Mix_QuickLoad_RAW(Uint8 *mem)
+		/// </code>
+		/// </p> 
+		/// </remarks>
+		/// <param name="len"></param>
+		/// <param name="mem">
+		/// Memory buffer containing a WAVE file in output format. 
+		/// Load mem as a raw sample. 
+		/// The data in mem must be already in the output format. 
+		/// If you aren't sure what you are doing, 
+		/// this is not a good function for you!
+		/// </param>
+		/// <returns>
+		/// a pointer to the sample as a Mix_Chunk. 
+		/// NULL is returned on errors, such as when out of memory.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // quick-load a raw sample from memory
+		///		// Uint8 *raw; // I assume you have the raw data here,
+		///		// or compiled in the program...
+		///		Mix_Chunk *raw_chunk;
+		///		if(!(raw_chunk=Mix_QuickLoad_RAW(raw))) 
+		///	{
+		///		printf("Mix_QuickLoad_RAW: %s\n", Mix_GetError());
+		///		// handle error
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_LoadWAV"/>
+		/// <seealso cref="Mix_QuickLoad_WAV"/>
+		/// <seealso cref="Mix_FreeChunk"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr Mix_QuickLoad_RAW(
+			IntPtr mem, int len);
+		#endregion IntPtr Mix_QuickLoad_RAW(IntPtr mem, int len)
+
+		#region void Mix_FreeChunk(IntPtr chunk)
+		/// <summary>
+		/// Free an audio chunk previously loaded
+		/// </summary>
+		/// <remarks>
+		/// Free the memory used in chunk, and free chunk itself as well. 
+		/// Do not use chunk after this without loading a new sample to 
+		/// it. Note: It's a bad idea to free a chunk that is still 
+		/// being played...
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>void Mix_FreeChunk(Mix_Chunk *chunk)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="chunk">
+		/// Pointer to the Mix_Chunk to free.
+		/// </param>
+		/// <example>
+		/// <code>
+		/// // free the sample
+		///		// Mix_Chunk *sample;
+		///		Mix_FreeChunk(sample);
+		///		sample=NULL; // to be safe...
+		///		</code></example>
+		///	<seealso cref="Mix_LoadWAV"/>
+		/// <seealso cref="Mix_QuickLoad_WAV"/>
+		/// <seealso cref="Mix_LoadWAV_RW"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_FreeChunk(IntPtr chunk);
+		#endregion void Mix_FreeChunk(IntPtr chunk)
+
+		#region void Mix_FreeMusic(IntPtr music)
+		/// <summary>
+		/// Free a Mix_Music
+		/// </summary>
+		/// <remarks>
+		/// Free the loaded music. If music is playing it will be halted. 
+		/// If music is fading out, then this function will wait (blocking)
+		///  until the fade out is complete.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>void Mix_FreeMusic(Mix_Music *music)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // free music
+		///		Mix_Music *music;
+		///		Mix_FreeMusic(music);
+		///		music=NULL; // so we know we freed it...
+		/// </code>
+		/// </example>
+		/// <param name="music">Pointer to Mix_Music to free.</param>
+		/// <seealso cref="Mix_LoadMUS"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_FreeMusic(IntPtr music);
+		#endregion void Mix_FreeMusic(IntPtr music)
+
+		#region Mix_MusicType Mix_GetMusicType(IntPtr music)
+		/// <summary>
+		/// Find out the music format of a mixer music, 
+		/// or the currently playing music, if 'music' is NULL.
+		/// </summary>
+		/// <remarks>
+		/// Tells you the file format encoding of the music. 
+		/// This may be handy when used with Mix_SetMusicPosition,
+		/// and other music functions that vary based on the type 
+		/// of music being played. If you want to know the type of 
+		/// music currently being played, pass in NULL to music.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>Mix_MusicType Mix_GetMusicType(const Mix_Music *music)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="music">The music to get the type of.
+		/// NULL will get the currently playing music type.
+		/// </param>
+		/// <returns>The type of music or if music is NULL then 
+		/// the currently playing music type, otherwise MUS_NONE
+		///  if no music is playing.</returns>
+		///  <seealso cref="Mix_SetPosition"/>
+		///  <example>
+		///  <code>
+		///  // print the type of music currently playing
+		///		switch(Mix_GetMusicType(NULL))
+		///	{
+		///		case MUS_NONE:
+		///		MUS_CMD:
+		///		printf("Command based music is playing.\n");
+		///		break;
+		///		MUS_WAV:
+		///		printf("WAVE/RIFF music is playing.\n");
+		///		break;
+		///		MUS_MOD:
+		///		printf("MOD music is playing.\n");
+		///		break;
+		///		MUS_MID:
+		///		printf("MIDI music is playing.\n");
+		///		break;
+		///		MUS_OGG:
+		///		printf("OGG music is playing.\n");
+		///		break;
+		///		MUS_MP3:
+		///		printf("MP3 music is playing.\n");
+		///		break;
+		///		default:
+		///		printf("Unknown music is playing.\n");
+		///		break;
+		///	}
+		///  </code></example>
+		///  <seealso cref="Mix_SetPosition"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_GetMusicType(IntPtr music);
+		#endregion Mix_MusicType Mix_GetMusicType(IntPtr music)
+
+		#region void Mix_SetPostMix(MixFunctionDelegate mix_func, IntPtr arg)
+		/// <summary>
+		/// Hook in a postmix processor
+		/// </summary>
+		/// <remarks>
+		/// Hook a processor function mix_func to the postmix stream for post
+		///  processing effects. You may just be reading the data and 
+		///  displaying it, or you may be altering the stream to add an
+		///  echo. Most processors also have state data that they allocate 
+		///  as they are in use, this would be stored in the arg pointer
+		///   data space. This processor is never really finished, until
+		///    the audio device is closed, or you pass NULL as the mix_func.
+		/// <p>There can only be one postmix function used at a time through 
+		/// this method. Use 
+		/// Mix_RegisterEffect(MIX_CHANNEL_POST, mix_func, NULL, arg) to 
+		/// use multiple postmix processors.</p>
+		/// <p>This postmix processor is run AFTER all the registered 
+		/// postmixers set up by Mix_RegisterEffect.</p>
+		/// <p>
+		/// <code>void Mix_SetPostMix(void (*mix_func)(void *udata, Uint8 *stream, int len), void *arg)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // make a passthru processor function that does nothing...
+		///		void noEffect(void *udata, Uint8 *stream, int len)
+		///		{
+		///			// you could work with stream here...
+		///		}
+		///		...
+		///		// register noEffect as a postmix processor
+		///		Mix_SetPostMix(noEffect, NULL);
+		/// </code>
+		/// </example>
+		/// <param name="mix_func">The function pointer for the postmix processor.
+		/// NULL unregisters the current postmixer.</param>
+		/// <param name="arg">A pointer to data to pass into the mix_func's 
+		/// udata parameter. It is a good place to keep the state data for 
+		/// the processor, especially if the processor is made to handle 
+		/// multiple channels at the same time.
+		/// This may be NULL, depending on the processor.</param>
+		/// <seealso cref="Mix_RegisterEffect"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_SetPostMix(MixFunctionDelegate mix_func, IntPtr arg);
+		#endregion void Mix_SetPostMix(MixFunctionDelegate mix_func, IntPtr arg)
+
+		#region void Mix_HookMusic(MixFunctionDelegate mix_func, IntPtr arg)
+		/// <summary>
+		/// Hook for a custom music player
+		/// </summary>
+		/// <remarks>
+		/// This sets up a custom music player function. The function will 
+		/// be called with arg passed into the udata parameter when the 
+		/// mix_func is called. The stream parameter passes in the audio 
+		/// stream buffer to be filled with len bytes of music. The music 
+		/// player will then be called automatically when the mixer needs 
+		/// it. Music playing will start as soon as this is called. All the 
+		/// music playing and stopping functions have no effect on music 
+		/// after this. Pause and resume will work. Using a custom music 
+		/// player and the internal music player is not possible, the custom 
+		/// music player takes priority. To stop the custom music player call
+		///  Mix_HookMusic(NULL, NULL).
+		/// <p>NOTE: NEVER call SDL_Mixer functions, nor SDL_LockAudio, 
+		/// from a callback function.</p>
+		/// <p>
+		/// <code>void Mix_HookMusic(void (*mix_func)(void *udata, Uint8 *stream, int len), void *arg)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // make a music play function
+		///		// it expects udata to be a pointer to an int
+		///		void myMusicPlayer(void *udata, Uint8 *stream, int len)
+		///		{
+		///			int i, pos=*(int*)udata;
+		///
+		///			// fill buffer with...uh...music...
+		///			for(i=0; i<len; i++)
+		///				stream[i]=(i+pos)&ff;
+		///
+		///			// set udata for next time
+		///			pos+=len;
+		///			*(int*)udata=pos;
+		///		}
+		///		...
+		///		// use myMusicPlayer for playing...uh...music
+		///		int music_pos=0;
+		///		Mix_HookMusic(myMusicPlayer, &music_pos);
+		/// </code>
+		/// </example>
+		/// <param name="mix_func">Function pointer to a music player mixer function.
+		/// NULL will stop the use of the music player, 
+		/// returning the mixer to using the internal music players 
+		/// like usual.</param>
+		/// <param name="arg">
+		/// This is passed to the mix_func's udata parameter when it is called.
+		/// </param>
+		/// <seealso cref="Mix_SetMusicCMD"/>
+		/// <seealso cref="Mix_GetMusicHookData"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_HookMusic(MixFunctionDelegate mix_func, IntPtr arg);
+		#endregion void Mix_HookMusic(MixFunctionDelegate mix_func, IntPtr arg)
+
+		#region void Mix_HookMusicFinished(MusicFinishedDelegate music_finished)
+		/// <summary>
+		/// Add your own callback when the music has finished playing.
+		/// This callback is only called if the music finishes naturally.
+		/// </summary>
+		/// <remarks>
+		/// This sets up a function to be called when music playback is halted. 
+		/// Any time music stops, the music_finished function will be called. 
+		/// Call with NULL to remove the callback.
+		/// <p>NOTE: NEVER call SDL_Mixer functions, nor SDL_LockAudio, 
+		/// from a callback function.</p>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>void Mix_HookMusicFinished(void (*music_finished)())
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="music_finished">
+		/// Function pointer to a void function(). 
+		/// NULL will remove the hook.
+		/// </param>
+		/// <example>
+		/// <code>
+		/// // make a music finished function
+		///		void musicFinished()
+		///		{
+		///			printf("Music stopped.\n");
+		///		}
+		///		...
+		///		// use musicFinished for when music stops
+		///		Mix_HookMusicFinished(musicFinished);
+		/// </code></example>
+		/// <seealso cref="Mix_HaltMusic"/>
+		/// <seealso cref="Mix_FadeOutMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_HookMusicFinished(MusicFinishedDelegate music_finished);
+		#endregion void Mix_HookMusicFinished(MusicFinishedDelegate music_finished)
+
+		#region IntPtr Mix_GetMusicHookData()
+		/// <summary>
+		/// Get a pointer to the user data for the current music hook
+		/// </summary>
+		/// <remarks>
+		/// Get the arg passed into Mix_HookMusic.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>void *Mix_GetMusicHookData()
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // retrieve the music hook data pointer
+		/// void *data;
+		/// data=Mix_GetMusicHookData();
+		/// </code></example>
+		/// <returns>the arg pointer.</returns>
+		/// <seealso cref="Mix_HookMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr Mix_GetMusicHookData();
+		#endregion IntPtr Mix_GetMusicHookData()
+
+		#region void Mix_ChannelFinished(ChannelFinishedDelegate channel_finished)
+		/// <summary>
+		/// Set callback for when channel finishes playing
+		/// </summary>
+		/// <remarks>
+		/// When channel playback is halted, then the specified 
+		/// channel_finished function is called. The channel parameter 
+		/// will contain the channel number that has finished.
+		/// <p>NOTE: NEVER call SDL_Mixer functions, 
+		/// nor SDL_LockAudio, from a callback function.</p>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>void Mix_ChannelFinished(void (*channel_finished)(int channel))
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // a simple channel_finished function
+		///		void channelDone(int channel) 
+		///		{
+		///			printf("channel %d finished playback.\n",channel);
+		///		}
+		///
+		///		// make a channelDone function
+		///		void channelDone(int channel)
+		///		{
+		///			printf("channel %d finished playing.\n", channel);
+		///		}
+		///		...
+		///		// set the callback for when a channel stops playing
+		///		Mix_ChannelFinished(channelDone);
+		/// </code></example>
+		/// <param name="channel_finished">
+		/// Function to call when any channel finishes playback. 
+		/// </param>
+		/// <seealso cref="Mix_HaltChannel"/>
+		/// <seealso cref="Mix_ExpireChannel"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_ChannelFinished(
+			ChannelFinishedDelegate channel_finished);
+		#endregion void Mix_ChannelFinished(ChannelFinishedDelegate channel_finished)
+
+		#region int Mix_RegisterEffect(...)
+		/// <summary>
+		/// Hook a processor to a channel
+		/// </summary>
+		/// <remarks>
+		/// Hook a processor function f into a channel for post processing
+		///  effects. You may just be reading the data and displaying it, 
+		///  or you may be altering the stream to add an echo. Most 
+		///  processors also have state data that they allocate as they 
+		///  are in use, this would be stored in the arg pointer data space.
+		///   When a processor is finished being used, any function passed 
+		///   into d will be called, which is when your processor should clean
+		///    up the data in the arg data space.
+		/// <p>The effects are put into a linked list, and always appended to 
+		/// the end, meaning they always work on previously registered effects
+		///  output. Effects may be added multiple times in a row. Effects are
+		///   cumulative this way.</p>
+		/// <p>
+		/// <code>int Mix_RegisterEffect(int chan, Mix_EffectFunc_t f, Mix_EffectDone_t d, void *arg)
+		/// </code></p></remarks>
+		/// <param name="f">
+		/// The function pointer for the effects processor.
+		/// </param>
+		/// <param name="arg"></param>
+		/// <param name="chan">channel number to register f and d on.
+		/// Use MIX_CHANNEL_POST to process the postmix stream.</param>
+		/// <param name="d">
+		/// The function pointer for any cleanup routine to be called 
+		/// when the channel is done playing a sample.
+		/// This may be NULL for any processors that don't need to 
+		/// clean up any memory or other dynamic data.
+		/// </param>
+		/// <returns>
+		/// Zero on errors, such as a nonexisting channel
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // make a passthru processor function that does nothing...
+		///		void noEffect(int chan, void *stream, int len, void *udata)
+		///		{
+		///			// you could work with stream here...
+		///		}
+		///		...
+		///		// register noEffect as a postmix processor
+		///		if(!Mix_RegisterEffect(MIX_CHANNEL_POST, noEffect, NULL, NULL)) 
+		///	{
+		///		printf("Mix_RegisterEffect: %s\n", Mix_GetError());
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_UnregisterEffect"/>
+		/// <seealso cref="Mix_UnregisterAllEffects"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_RegisterEffect(int chan, 
+			MixEffectFunctionDelegate f, 
+			MixEffectDoneDelegate d,
+			IntPtr arg);
+		#endregion int Mix_RegisterEffect(...)
+
+		#region int Mix_UnregisterEffect(...)
+		/// <summary>
+		/// Unhook a processor from a channel
+		/// </summary>
+		/// <remarks>
+		/// Remove the oldest (first found) registered effect function 
+		/// f from the effect list for channel. This only removes the 
+		/// first found occurance of that function, so it may need to 
+		/// be called multiple times if you added the same function multiple
+		///  times, just stop removing when Mix_UnregisterEffect returns an
+		///   error, to remove all occurances of f from a channel.
+		/// <p>If the channel is active the registered effect will have its 
+		/// Mix_EffectDone_t function called, if it was specified in 
+		/// Mix_RegisterEffect.</p>
+		/// <p>
+		/// <code>int Mix_UnregisterEffect(int channel, Mix_EffectFunc_t f)
+		/// </code></p></remarks>
+		/// <param name="f">The function to remove from channel.</param>
+		/// <param name="chan">Channel number to remove f from as a post processor.
+		/// <p>Use MIX_CHANNEL_POST for the postmix stream.</p></param>
+		/// <returns>
+		/// Zero on errors, such as invalid channel, 
+		/// or effect function not registered on channel.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // unregister the noEffect from the postmix effects
+		/// // this removes all occurances of noEffect registered to the postmix
+		/// while(Mix_UnregisterEffect(MIX_CHANNEL_POST, noEffect));
+		/// // you may print Mix_GetError() if you want to check it.
+		/// // it should say "No such effect registered" after this loop.
+		/// </code></example>
+		/// <seealso cref="Mix_RegisterEffect"/>
+		/// <seealso cref="Mix_UnregisterAllEffects"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_UnregisterEffect(int chan, 
+			MixEffectFunctionDelegate f);
+		#endregion int Mix_UnregisterEffect(...)
+
+		#region int Mix_UnregisterAllEffects(int channel)
+		/// <summary>
+		/// Unhook all processors from a channel
+		/// </summary>
+		/// <remarks>
+		/// This removes all effects registered to channel. 
+		/// If the channel is active all the registered effects will 
+		/// have their Mix_EffectDone_t functions called, if they 
+		/// were specified in Mix_RegisterEffect.
+		/// <p>
+		/// <code>int Mix_UnregisterAllEffects(int channel)
+		/// </code></p></remarks>
+		/// <param name="channel">
+		/// Channel to remove all effects from.
+		/// Use MIX_CHANNEL_POST for the postmix stream.
+		/// </param>
+		/// <returns>
+		/// Zero on errors, such as channel not existing.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // remove all effects from channel 0
+		///		if(!Mix_UnregisterAllEffects(0)) 
+		///	{
+		///		printf("Mix_UnregisterAllEffects: %s\n", Mix_GetError());
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_UnregisterEffect"/>
+		/// <seealso cref="Mix_RegisterEffect"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_UnregisterAllEffects(int channel);
+		#endregion int Mix_UnregisterAllEffects(int channel)
+
+		#region int Mix_SetPanning(int channel, byte left, byte right)
+		/// <summary>
+		/// Stereo panning
+		/// </summary>
+		/// <remarks>
+		/// This effect will only work on stereo audio. Meaning you called 
+		/// Mix_OpenAudio with 2 channels (MIX_DEFAULT_CHANNELS). The easiest
+		///  way to do true panning is to call 
+		///  Mix_SetPanning(channel, left, 254 - left); so that the total 
+		///  volume is correct, if you consider the maximum volume to be 127
+		///   per channel for center, or 254 max for left, this works, but 
+		///   about halves the effective volume.
+		/// <p>This Function registers the effect for you, so don't try to 
+		/// Mix_RegisterEffect it yourself.</p>
+		/// <p>NOTE: Setting both left and right to 255 will unregister the 
+		/// effect from channel. You cannot unregister it any other way, 
+		/// unless you use Mix_UnregisterAllEffects on the channel.</p>
+		/// <p>NOTE: Using this function on a mono audio device will not
+		/// register the effect, nor will it return an error status.</p>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_SetPanning(int channel, Uint8 left, Uint8 right)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel number to register this effect on.
+		/// Use MIX_CHANNEL_POST to process the postmix stream.
+		/// </param>
+		/// <param name="left">
+		/// Volume for the left channel, range is 0(silence) to 255(loud) 
+		/// </param>
+		/// <param name="right">
+		/// Volume for the left channel, range is 0(silence) to 255(loud)
+		/// </param>
+		/// <returns>
+		/// Zero on errors, such as bad channel, or if Mix_RegisterEffect failed.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // pan channel 1 halfway to the left
+		///		if(!Mix_SetPanning(1, 255, 127)) 
+		///	{
+		///		printf("Mix_SetPanning: %s\n", Mix_GetError());
+		///		// no panning, is it ok?
+		///	}
+		///	</code>
+		/// </example>
+		/// <seealso cref="Mix_SetPosition"/>
+		/// <seealso cref="Mix_UnregisterAllEffects"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_SetPanning(
+			int channel, byte left, byte right);
+		#endregion int Mix_SetPanning(int channel, byte left, byte right)
+
+		#region int Mix_SetPosition(int channel, short angle, byte distance)
+		/// <summary>
+		/// Panning(angular) and distance
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_SetPosition(int channel, Sint16 angle, Uint8 distance)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel number to register this effect on.
+		/// Use MIX_CHANNEL_POST to process the postmix stream.
+		/// </param>
+		/// <param name="angle">
+		/// Direction in relation to forward from 0 to 360 degrees. 
+		/// Larger angles will be reduced to this range using angles % 360.
+		/// 0 = directly in front.
+		/// 90 = directly to the right.
+		/// 180 = directly behind.
+		/// 270 = directly to the left.
+		/// So you can see it goes clockwise starting at directly in front.
+		/// This ends up being similar in effect to Mix_SetPanning.
+		/// </param>
+		/// <param name="distance">
+		/// The distance from the listener, from 0(near/loud) to 255(far/quiet).
+		/// This is the same as the Mix_SetDistance effect.
+		///	</param>
+		/// <returns>
+		/// Zero on errors, such as an invalid channel, 
+		/// or if Mix_RegisterEffect failed.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // set channel 2 to be behind and right, and 100 units away
+		///		if(!Mix_SetPosition(2, 135, 100)) 
+		///	{
+		///		printf("Mix_SetPosition: %s\n", Mix_GetError());
+		///		// no position effect, is it ok?
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_SetPanning"/>
+		/// <seealso cref="Mix_SetDistance"/>
+		/// <seealso cref="Mix_UnregisterAllEffects"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_SetPosition(
+			int channel, short angle, byte distance);
+		#endregion int Mix_SetPosition(int channel, short angle, byte distance)
+
+		#region int Mix_SetDistance(int channel, byte distance)
+		/// <summary>
+		/// Distance attenuation (volume)
+		/// </summary>
+		/// <remarks>
+		/// This effect simulates a simple attenuation of volume due to distance. 
+		/// The volume never quite reaches silence, even at max distance.
+		/// NOTE: Using a distance of 0 will cause the effect to unregister 
+		/// itself from channel. You cannot unregister it any other way, 
+		/// unless you use Mix_UnregisterAllEffects on the channel.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_SetDistance(int channel, Uint8 distance)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel number to register this effect on.
+		/// Use MIX_CHANNEL_POST to process the postmix stream.
+		/// </param>
+		/// <param name="distance">
+		/// Specify the distance from the listener, 
+		/// from 0(close/loud) to 255(far/quiet). 
+		/// </param>
+		/// <returns>
+		/// Zero on errors, such as an invalid channel, 
+		/// or if Mix_RegisterEffect failed.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // distance channel 1 to be farthest away
+		///		if(!Mix_SetDistance(1, 255)) 
+		///	{
+		///		printf("Mix_SetDistance: %s\n", Mix_GetError());
+		///		// no distance, is it ok?
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_SetPosition"/>
+		/// <seealso cref="Mix_UnregisterAllEffects"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_SetDistance(
+			int channel, byte distance);
+		#endregion int Mix_SetDistance(int channel, byte distance)
+
+		// int Mix_SetReverb(int channel, Uint8 echo) is not part of the public API
+
+		#region int Mix_SetReverseStereo(int channel, int flip)
+		/// <summary>
+		/// Swap stereo left and right
+		/// </summary>
+		/// <remarks>
+		/// Simple reverse stereo, swaps left and right channel sound.
+		/// <p>NOTE: Using a flip of 0, will cause the effect to unregister 
+		/// itself from channel. You cannot unregister it any other way, 
+		/// unless you use Mix_UnregisterAllEffects on the channel.</p>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_SetReverseStereo(int channel, int flip)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel number to register this effect on.
+		/// Use MIX_CHANNEL_POST to process the postmix stream.
+		/// </param>
+		/// <param name="flip">
+		/// Must be non-zero to work, means nothing to the effect processor itself.
+		/// set to zero to unregister the effect from channel.
+		/// </param>
+		/// <returns>
+		/// Zero on errors, such as an invalid channel, or if Mix_RegisterEffect failed.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // set the total mixer output to be reverse stereo
+		///		if(!Mix_SetReverseStereo(MIX_CHANNEL_POST, 1)) 
+		///	{
+		///		printf("Mix_SetReverseStereo: %s\n", Mix_GetError());
+		///		// no reverse stereo, is it ok?
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_UnregisterAllEffects"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_SetReverseStereo(
+			int channel, int flip);
+		#endregion int Mix_SetReverseStereo(int channel, int flip)
+
+		#region int Mix_ReserveChannels(int num)
+		/// <summary>
+		/// Prevent channels from being used in default group
+		/// </summary>
+		/// <remarks>
+		/// Reserve num channels from being used when playing samples when 
+		/// passing in -1 as a channel number to playback functions. The 
+		/// channels are reserved starting from channel 0 to num-1. Passing
+		///  in zero will unreserve all channels. Normally SDL_mixer starts 
+		///  without any channels reserved.
+		///  <p>
+		///  The following functions are affected by this setting:
+		///  <br><see cref="Mix_PlayChannel"/></br>
+		///  <br><see cref="Mix_PlayChannelTimed"/></br>
+		///  <br><see cref="Mix_FadeInChannel"/></br>
+		///  <br><see cref="Mix_FadeInChannelTimed"/></br>
+		///  </p>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_ReserveChannels(int num)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="num">
+		/// Number of channels to reserve from default mixing.
+		/// Zero removes all reservations.
+		/// </param>
+		/// <returns>The number of channels reserved. 
+		/// Never fails, but may return less channels than you ask for,
+		///  depending on the number of channels previously allocated.
+		///  </returns>
+		///  <example>
+		///  <code>
+		///  // reserve the first 8 mixing channels
+		///		int reserved_count;
+		///		reserved_count=Mix_ReserveChannels(8);
+		///		if(reserved_count!=8) 
+		///	{
+		///		printf("reserved %d channels from default mixing.\n",reserved_count);
+		///		printf("8 channels were not reserved!\n");
+		///		// this might be a critical error...
+		///	}
+		///  </code></example>
+		///  <seealso cref="Mix_AllocateChannels"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_ReserveChannels(int num);
+		#endregion int Mix_ReserveChannels(int num)
+
+		#region int Mix_GroupChannel(int which, int tag)
+		/// <summary>
+		/// Add/remove channel to/from group
+		/// </summary>
+		/// <remarks>
+		/// Add which channel to group tag, or reset 
+		/// it's group to the default group tag (-1).
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_GroupChannel(int which, int tag)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="which">
+		/// Channel number of channels to assign tag to.
+		/// </param>
+		/// <param name="tag">
+		/// A group number Any positive numbers (including zero).
+		/// -1 is the default group. Use -1 to remove a group tag essentially.
+		/// </param>
+		/// <returns>
+		/// True(1) on success. False(0) is returned when 
+		/// the channel specified is invalid.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // add channel 0 to group 1
+		///		if(!Mix_GroupChannel(0,1)) 
+		///	{
+		///		// bad channel, apparently channel 1 isn't allocated
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_GroupChannels"/>
+		/// <seealso cref="Mix_AllocateChannels"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_GroupChannel(int which, int tag);
+		#endregion int Mix_GroupChannel(int which, int tag)
+
+		#region int Mix_GroupChannels(int from, int to, int tag)
+		/// <summary>
+		/// Assign several consecutive channels to a group
+		/// </summary>
+		/// <remarks>
+		/// Add channels starting at from up through to to group tag, 
+		/// or reset it's group to the default group tag (-1). 
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_GroupChannels(int from, int to, int tag)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="from">
+		/// First Channel number of channels to assign tag to. 
+		/// Must be less or equal to to.
+		/// </param>
+		/// <param name="to">
+		/// Last Channel number of channels to assign tag to. Must be greater or equal to from.
+		/// </param>
+		/// <param name="tag">
+		/// A group number. Any positive numbers (including zero).
+		/// -1 is the default group. Use -1 to remove a group tag essentially.
+		/// </param>
+		/// <returns>
+		/// The number of tagged channels on success. If that number is less 
+		/// than to-from+1 then some channels were no tagged because they didn't 
+		/// exist.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // add channels 0 through 7 to group 1
+		///		if(Mix_GroupChannels(0,7,1)!=8) 
+		///	{
+		///		// some bad channels, apparently some channels aren't allocated
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_GroupChannel"/>
+		/// <seealso cref="Mix_AllocateChannels"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_GroupChannels(
+			int from, int to, int tag);
+		#endregion int Mix_GroupChannels(int from, int to, int tag)
+
+		#region int Mix_GroupAvailable(int tag)
+		/// <summary>
+		/// Get first inactive channel in group.
+		/// </summary>
+		/// <remarks>
+		/// Find the first available (not playing) channel in group tag.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_GroupAvailable(int tag)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="tag">
+		/// A group number Any positive numbers (including zero).
+		/// -1 will search ALL channels.
+		/// </param>
+		/// <returns>
+		/// The channel found on success. -1 is returned when no 
+		/// channels in the group are available.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // find the first available channel in group 1
+		///		int channel;
+		///		channel=Mix_GroupAvailable(1);
+		///		if (channel==-1) 
+		///	{
+		///		// no channel available...
+		///		// perhaps search for oldest or newest channel in use...
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_GroupOldest"/>
+		/// <seealso cref="Mix_GroupNewer"/>
+		/// <seealso cref="Mix_GroupChannel"/>
+		/// <seealso cref="Mix_GroupChannels"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_GroupAvailable(int tag);
+		#endregion int Mix_GroupAvailable(int tag)
+
+		#region int Mix_GroupCount(int tag)
+		/// <summary>
+		/// Get number of channels in group.
+		/// </summary>
+		/// <remarks>
+		/// Count the number of channels in group tag.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_GroupCount(int tag)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="tag">
+		/// A group number Any positive numbers (including zero).
+		/// -1 will count ALL channels.
+		/// </param>
+		/// <returns>
+		/// The number of channels found in the group. This function never fails.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // count the number of channels in group 1
+		/// printf("There are %d channels in group 1\n", Mix_GroupCount(1));
+		/// </code></example>
+		/// <seealso cref="Mix_GroupChannel"/>
+		/// <seealso cref="Mix_GroupChannels"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_GroupCount(int tag);
+		#endregion int Mix_GroupCount(int tag)
+
+		#region int Mix_GroupOldest(int tag)
+		/// <summary>
+		/// Get oldest busy channel in group
+		/// </summary>
+		/// <remarks>
+		/// Find the oldest actively playing channel in group tag.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_GroupOldest(int tag)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="tag">
+		/// A group number Any positive numbers (including zero).
+		/// -1 will search ALL channels.
+		/// </param>
+		/// <returns>
+		/// The channel found on success. -1 is returned when no channels in
+		///  the group are playing or the group is empty.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // find the oldest playing channel in group 1
+		///		int channel;
+		///		channel=Mix_GroupOldest(1);
+		///		if (channel==-1) 
+		///	{
+		///		// no channel playing or allocated...
+		///		// perhaps just search for an available channel...
+		///	}
+		/// </code></example>
+		/// <seealso cref="Mix_GroupNewer"/>
+		/// <seealso cref="Mix_GroupAvailable"/>
+		/// <seealso cref="Mix_GroupChannel"/>
+		/// <seealso cref="Mix_GroupChannels"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_GroupOldest(int tag);
+		#endregion int Mix_GroupOldest(int tag)
+
+		#region int Mix_GroupNewer(int tag)
+		/// <summary>
+		/// Get youngest busy channel in group
+		/// </summary>
+		/// <remarks>
+		/// Find the newest, most recently started, actively playing 
+		/// channel in group tag.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_GroupNewer(int tag)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="tag">
+		/// A group number Any positive numbers (including zero).
+		/// -1 will search ALL channels.
+		/// </param>
+		/// <returns>
+		/// The channel found on success. -1 is returned when no channels in 
+		/// the group are playing or the group is empty.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // find the newest playing channel in group 1
+		///		int channel;
+		///		channel=Mix_GroupNewer(1);
+		///		if (channel==-1) 
+		///	{
+		///		// no channel playing or allocated...
+		///		// perhaps just search for an available channel...
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_GroupOldest"/>
+		/// <seealso cref="Mix_GroupAvailable"/>
+		/// <seealso cref="Mix_GroupChannel"/>
+		/// <seealso cref="Mix_GroupChannels"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_GroupNewer(int tag);
+		#endregion int Mix_GroupNewer(int tag)
+
+		#region int Mix_PlayChannelTimed(...)
+		/// <summary>
+		/// Play loop and limit by time.
+		/// </summary>
+		/// <remarks>
+		/// If the sample is long enough and has enough 
+		/// loops then the sample will stop after ticks milliseconds. 
+		/// Otherwise this function is the same as <see cref="Mix_PlayChannel"/>.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to play on, or -1 for the first free unreserved channel.
+		/// </param>
+		/// <param name="chunk">
+		/// Sample to play.
+		/// </param>
+		/// <param name="loops">
+		/// Number of loops, -1 is infinite loops.
+		/// Passing one here plays the sample twice (1 loop).
+		/// </param>
+		/// <param name="ticks">
+		/// Millisecond limit to play sample, at most.
+		/// If not enough loops or the sample chunk is not long enough,
+		/// then the sample may stop before this timeout occurs.
+		/// -1 means play forever.
+		/// </param>
+		/// <returns>
+		/// the channel the sample is played on. 
+		/// On any errors, -1 is returned.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // play sample on first free unreserved channel
+		///		// play it for half a second
+		///		// Mix_Chunk *sample; //previously loaded
+		///		if(Mix_PlayChannelTimed(-1, sample, -1 , 500)==-1) 
+		///	{
+		///		printf("Mix_PlayChannel: %s\n",Mix_GetError());
+		///		// may be critical error, or maybe just no channels were free.
+		///		// you could allocated another channel in that case...
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PlayChannel"/>
+		/// <seealso cref="Mix_FadeInChannelTimed"/>
+		/// <seealso cref="Mix_FadeOutChannel"/>
+		/// <seealso cref="Mix_ReserveChannels"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_PlayChannelTimed(
+			int channel, IntPtr chunk, int loops, int ticks);
+		#endregion int Mix_PlayChannelTimed(...)
+
+		#region int Mix_PlayChannel(int channel, IntPtr chunk, int loops)
+		/// <summary>
+		/// Play loop.
+		/// </summary>
+		/// <remarks>
+		/// Play chunk on channel, or if channel is -1, 
+		/// pick the first free unreserved channel. 
+		/// The sample will play for loops+1 number of times, 
+		/// unless stopped by halt, or fade out, or setting a 
+		/// new expiration time of less time than it would have 
+		/// originally taken to play the loops, or closing the mixer.
+		/// <p>Note: this just calls Mix_PlayChannelTimed() 
+		/// with ticks set to -1.</p>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_PlayChannel(int channel, Mix_Chunk *chunk, int loops)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to play on, or -1 for the first free unreserved channel. 
+		/// </param>
+		/// <param name="chunk">
+		/// Sample to play. 
+		/// </param>
+		/// <param name="loops">
+		/// Number of loops, -1 is infinite loops.
+		/// Passing one here plays the sample twice (1 loop).
+		/// </param>
+		/// <returns>
+		/// the channel the sample is played on. On any errors,
+		///  -1 is returned.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // play sample on first free unreserved channel
+		///		// play it exactly once through
+		///		// Mix_Chunk *sample; //previously loaded
+		///		if(Mix_PlayChannel(-1, sample, 1)==-1) 
+		///	{
+		///		printf("Mix_PlayChannel: %s\n",Mix_GetError());
+		///		// may be critical error, or maybe just no channels were free.
+		///		// you could allocated another channel in that case...
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PlayChannelTimed"/>
+		/// <seealso cref="Mix_FadeInChannel"/>
+		/// <seealso cref="Mix_HaltChannel"/>
+		/// <seealso cref="Mix_ExpireChannel"/>
+		/// <seealso cref="Mix_ReserveChannels"/>
+		public static int Mix_PlayChannel(int channel, IntPtr chunk, int loops)
+		{
+			return Mix_PlayChannelTimed(channel, chunk, loops, -1);
+		}
+		#endregion int Mix_PlayChannel(int channel, IntPtr chunk, int loops)
+
+		#region int Mix_PlayMusic(IntPtr music, int loops)
+		/// <summary>
+		/// Play music, with looping
+		/// </summary>
+		/// <remarks>
+		/// Play the loaded music loop times through from start to finish. 
+		/// The previous music will be halted, or if fading out it waits
+		///  (blocking) for that to finish.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_PlayMusic(Mix_Music *music, int loops)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="music">
+		/// Pointer to Mix_Music to play.
+		/// </param>
+		/// <param name="loops">
+		/// number of times to play through the music.
+		/// <br>0 plays the music zero times...</br>
+		/// <br>-1 plays the music forever (or as close as it can get to that)</br>
+		/// </param>
+		/// <returns>
+		/// 0 on success, or -1 on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // play music forever
+		///		// Mix_Music *music; // I assume this has been loaded already
+		///		if(Mix_PlayMusic(music, -1)==-1) 
+		///	{
+		///		printf("Mix_PlayMusic: %s\n", Mix_GetError());
+		///		// well, there's no music, but most games don't break without music...
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_FadeInMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_PlayMusic(IntPtr music, int loops);
+		#endregion int Mix_PlayMusic(IntPtr music, int loops)
+
+		#region int Mix_FadeInMusic(IntPtr music, int loops, int ms)
+		/// <summary>
+		/// Play music, with looping, and fade in
+		/// </summary>
+		/// <remarks>
+		/// Fade in over ms milliseconds of time, the loaded music, 
+		/// playing it loop times through from start to finish.
+		/// The fade in effect only applies to the first loop.
+		/// Any previous music will be halted, or if it is fading out i
+		/// t will wait (blocking) for the fade to complete.
+		/// This function is the same as Mix_FadeInMusicPos(music, loops, ms, 0).
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_FadeInMusic(Mix_Music *music, int loops, int ms)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="music">
+		/// Pointer to Mix_Music to play.
+		/// </param>
+		/// <param name="loops">
+		/// number of times to play through the music.
+		/// <br>
+		/// 0 plays the music zero times...
+		/// </br>
+		/// <br>
+		/// -1 plays the music forever (or as close as it can get to that)
+		/// </br>
+		/// </param>
+		/// <param name="ms">
+		/// Milliseconds for the fade-in effect to complete.
+		/// </param>
+		/// <returns>
+		/// 0 on success, or -1 on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // play music forever, fading in over 2 seconds
+		///		// Mix_Music *music; // I assume this has been loaded already
+		///		if(Mix_FadeInMusic(music, -1, 2000)==-1) 
+		///	{
+		///		printf("Mix_FadeInMusic: %s\n", Mix_GetError());
+		///		// well, there's no music, but most games don't break without music...
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PlayMusic"/>
+		/// <seealso cref="Mix_FadeInMusicPos"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_FadeInMusic(IntPtr music, int loops, int ms);
+		#endregion int Mix_FadeInMusic(IntPtr music, int loops, int ms)
+
+		#region int Mix_FadeInMusicPos(...)
+		/// <summary>
+		/// Play music from a start point, with looping, and fade in
+		/// </summary>
+		/// <remarks>
+		/// Fade in over ms milliseconds of time, the loaded music, 
+		/// playing it loop times through from start to finish.
+		/// The fade in effect only applies to the first loop. The first
+		///  time the music is played, it posistion will be set to position,
+		///   which means different things for different types of music files,
+		///    see Mix_SetMusicPosition for more info on that. Any previous 
+		///    music will be halted, or if it is fading out it will wait 
+		///    (blocking) for the fade to complete.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="music">
+		/// Pointer to Mix_Music to play.
+		/// </param>
+		/// <param name="loops">
+		/// number of times to play through the music.
+		/// <br>
+		/// 0 plays the music zero times...
+		/// </br>
+		/// <br>
+		/// -1 plays the music forever (or as close as it can get to that)
+		/// </br>
+		/// </param>
+		/// <param name="ms">
+		/// Milliseconds for the fade-in effect to complete.
+		/// </param>
+		/// <param name="position">
+		/// Position to play from, see <see cref="Mix_SetMusicPosition"/> for meaning.
+		/// </param>
+		/// <returns>
+		/// 0 on success, or -1 on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // play music forever, fading in over 2 seconds
+		///		// Mix_Music *music; // I assume this has been loaded already
+		///		if(Mix_FadeInMusicPos(music, -1, 2000)==-1) 
+		///	{
+		///		printf("Mix_FadeInMusic: %s\n", Mix_GetError());
+		///		// well, there's no music, but most games don't break without music...
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PlayMusic"/>
+		/// <seealso cref="Mix_FadeInMusic"/>
+		/// <seealso cref="Mix_SetMusicPosition"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_FadeInMusicPos(
+			IntPtr music, int loops, int ms, double position);
+		#endregion int Mix_FadeInMusicPos(...)
+
+		#region int Mix_FadeInChannelTimed(...)
+		/// <summary>
+		/// Play loop with fade in and limit by time
+		/// </summary>
+		/// <remarks>
+		/// If the sample is long enough and has enough loops then the sample
+		///  will stop after ticks milliseconds. Otherwise this function 
+		///  is the same as <see cref="Mix_FadeInChannel"/>.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_FadeInChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ms, int ticks)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to play on, or -1 for the first free unreserved channel.
+		/// </param>
+		/// <param name="chunk">
+		/// Sample to play.
+		/// </param>
+		/// <param name="loops">
+		/// Number of loops, -1 is infinite loops.
+		/// </param>
+		/// <param name="ms">
+		/// Milliseconds of time that the fade-in effect should 
+		/// take to go from silence to full volume.
+		/// </param>
+		/// <param name="ticks">Millisecond limit to play sample, at most.
+		/// If not enough loops or the sample chunk is not long enough, 
+		/// then the sample may stop before this timeout occurs.
+		///  -1 means play forever.</param>
+		/// <returns>
+		/// the channel the sample is played on. On any errors, -1 is returned.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // play sample on first free unreserved channel
+		///		// play it for half a second
+		///		// Mix_Chunk *sample; //previously loaded
+		///		if(Mix_PlayChannelTimed(-1, sample, -1 , 500)==-1) 
+		///	{
+		///		printf("Mix_PlayChannel: %s\n",Mix_GetError());
+		///		// may be critical error, or maybe just no channels were free.
+		///		// you could allocated another channel in that case...
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PlayChannelTimed"/>
+		/// <seealso cref="Mix_FadeInChannel"/>
+		/// <seealso cref="Mix_HaltChannel"/>
+		/// <seealso cref="Mix_FadingChannel"/>
+		/// <seealso cref="Mix_ReserveChannels"/>
+		/// <seealso cref="Mix_ExpireChannel"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_FadeInChannelTimed(
+			int channel, IntPtr chunk, int loops, int ms, int ticks);
+		#endregion int Mix_FadeInChannelTimed(...)
+
+		#region int Mix_FadeInChannel(...)
+		/// <summary>
+		/// Play loop with fade in
+		/// </summary>
+		/// <remarks>
+		/// Play chunk on channel, or if channel is -1, 
+		/// pick the first free unreserved channel.
+		/// The channel volume starts at 0 and fades up to 
+		/// full volume over ms milliseconds of time. 
+		/// The sample may end before the fade-in is 
+		/// complete if it is too short or doesn't have enough loops. 
+		/// The sample will play for loops+1 number of times, 
+		/// unless stopped by halt, or fade out, or setting 
+		/// a new expiration time of less time than it would 
+		/// have originally taken to play the loops, or closing the mixer.
+		/// Note: this just calls <see cref="Mix_FadeInChannelTimed"/> 
+		/// with ticks set to -1.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_FadeInChannel(int channel, Mix_Chunk *chunk, int loops, int ms)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to play on, or -1 for the first free unreserved channel.
+		/// </param>
+		/// <param name="chunk">Sample to play.</param>
+		/// <param name="loops">
+		/// Number of loops, -1 is infinite loops.
+		/// Passing one here plays the sample twice (1 loop).
+		/// </param>
+		/// <param name="ms">
+		/// Milliseconds of time that the fade-in effect 
+		/// should take to go from silence to full volume.
+		/// </param>
+		/// <returns>
+		/// the channel the sample is played on. 
+		/// On any errors, -1 is returned.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // play sample on first free unreserved channel
+		///		// play it exactly 3 times through
+		///		// fade in over one second
+		///		// Mix_Chunk *sample; //previously loaded
+		///		if(Mix_FadeInChannel(-1, sample, 3, 1000)==-1) 
+		///	{
+		///		printf("Mix_FadeInChannel: %s\n",Mix_GetError());
+		///		// may be critical error, or maybe just no channels were free.
+		///		// you could allocated another channel in that case...
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PlayChannel"/>
+		/// <seealso cref="Mix_FadeInChannelTimed"/>
+		/// <seealso cref="Mix_FadingChannel"/>
+		/// <seealso cref="Mix_FadeOutChannel"/>
+		/// <seealso cref="Mix_ReserveChannels"/>
+		public static int Mix_FadeInChannel(
+			int channel, IntPtr chunk, int loops, int ms) 
+		{
+			return Mix_FadeInChannelTimed(channel, chunk, loops, ms, -1);
+		}
+		#endregion int Mix_FadeInChannel(...)
+
+		#region int Mix_Volume(int channel, int volume)
+		/// <summary>
+		/// Set the mix volume of a channel
+		/// </summary>
+		/// <remarks>
+		/// Set the volume for any allocated channel. 
+		/// If channel is -1 then all channels at are set at once. 
+		/// The volume is applied during the final mix, along 
+		/// with the sample volume. So setting this volume to 
+		/// 64 will halve the output of all samples played on 
+		/// the specified channel. All channels default to a 
+		/// volume of 128, which is the max. Newly allocated 
+		/// channels will have the max volume set, so setting 
+		/// all channels volumes does not affect subsequent 
+		/// channel allocations.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_Volume(int channel, int volume)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to set mix volume for.
+		/// -1 will set the volume for all allocated channels.
+		/// </param>
+		/// <param name="volume">
+		/// The volume to use from 0 to MIX_MAX_VOLUME(128).
+		/// If greater than MIX_MAX_VOLUME,
+		/// then it will be set to MIX_MAX_VOLUME.
+		/// If less than 0 then the volume will not be set.
+		/// </param>
+		/// <returns>
+		/// current volume of the channel. 
+		/// If channel is -1, the average volume is returned.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // set channel 1 to half volume
+		///		Mix_Volume(1,MIX_MAX_VOLUME/2);
+		///
+		///		// print the average volume
+		///		printf("Average volume is %d\n",Mix_Volume(-1,-1));
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_VolumeChunk"/>
+		/// <seealso cref="Mix_VolumeMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_Volume(int channel, int volume);
+		#endregion int Mix_Volume(int channel, int volume)
+
+		#region int Mix_VolumeChunk(IntPtr chunk, int volume)
+		/// <summary>
+		/// Set mix volume
+		/// </summary>
+		/// <remarks>
+		/// Set chunk->volume to volume.
+		/// The volume setting will take effect 
+		/// when the chunk is used on a channel, 
+		/// being mixed into the output.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_VolumeChunk(Mix_Chunk *chunk, int volume)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="chunk">
+		/// Pointer to the Mix_Chunk to set the volume in.
+		/// </param>
+		/// <param name="volume">
+		/// The volume to use from 0 to MIX_MAX_VOLUME(128).
+		/// If greater than MIX_MAX_VOLUME,
+		/// then it will be set to MIX_MAX_VOLUME.
+		/// If less than 0 then chunk->volume will not be set.
+		/// </param>
+		/// <returns>
+		/// previous chunk->volume setting. 
+		/// if you passed a negative value for volume then this 
+		/// volume is still the current volume for the chunk.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // set the sample's volume to 1/2
+		///		// Mix_Chunk *sample;
+		///		int previous_volume;
+		///		previous_volume=Mix_VolumeChunk(sample, MIX_MAX_VOLUME/2);
+		/// 	printf("previous_volume: %d\n", previous_volume);
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_Chunk"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_VolumeChunk(IntPtr chunk, int volume);
+		#endregion int Mix_VolumeChunk(IntPtr chunk, int volume)
+
+		#region int Mix_VolumeMusic(int volume)
+		/// <summary>
+		/// Set music volume
+		/// </summary>
+		/// <remarks>
+		/// Set the volume to volume, if it is 0 or greater, and return the 
+		/// previous volume setting. Setting the volume during a fade will 
+		/// not work, the faders use this function to perform their effect! 
+		/// Setting volume while using an external music player set by 
+		/// <see cref="Mix_SetMusicCMD"/> will have no effect, and 
+		/// <see cref="Mix_GetError"/> will 
+		/// show the reason why not.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_VolumeMusic(int volume)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="volume">
+		/// Music volume, from 0 to MIX_MAX_VOLUME(128).
+		/// Values greater than MIX_MAX_VOLUME will use MIX_MAX_VOLUME.
+		/// -1 does not set the volume, but does return the current volume setting.
+		/// </param>
+		/// <returns>
+		/// The previous volume setting.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // set the music volume to 1/2 maximum, and then check it
+		///		printf("volume was    : %d\n", Mix_VolumeMusic(MIX_MAX_VOLUME/2));
+		///		printf("volume is now : %d\n", Mix_VolumeMusic(-1));
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_FadeInMusic"/>
+		/// <seealso cref="Mix_FadeOutMusic"/>
+		/// <seealso cref="Mix_SetMusicCMD"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_VolumeMusic(int volume);
+		#endregion int Mix_VolumeMusic(int volume)
+
+		#region int Mix_HaltChannel(int channel)
+		/// <summary>
+		/// Stop playing on a channel
+		/// </summary>
+		/// <remarks>
+		/// Halt channel playback, or all channels if -1 is passed in.
+		/// Any callback set by Mix_ChannelFinished will be called.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_HaltChannel(int channel)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to stop playing, or -1 for all channels.
+		/// </param>
+		/// <returns>
+		/// always returns zero. (kinda silly)
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // halt playback on all channels
+		/// Mix_HaltChannel(-1);
+		/// </code></example>
+		/// <seealso cref="Mix_ExpireChannel"/>
+		/// <seealso cref="Mix_FadeOutChannel"/>
+		/// <seealso cref="Mix_ChannelFinished"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_HaltChannel(int channel);
+		#endregion int Mix_HaltChannel(int channel)
+
+		#region int Mix_HaltGroup(int tag)
+		/// <summary>
+		/// Stop a group 
+		/// </summary>
+		/// <remarks>
+		/// Halt playback on all channels in group tag.
+		/// Any callback set by Mix_ChannelFinished will be called once for each channel that stops. 
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_HaltGroup(int tag)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="tag">
+		/// Group to fade out.
+		/// NOTE: -1 will NOT halt all channels. Use Mix_HaltChannel(-1) for that instead.
+		/// </param>
+		/// <returns>
+		/// always returns zero. (more silly than <see cref="Mix_HaltChannel"/>) 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // halt playback on all channels in group 1
+		/// Mix_HaltGroup(1);
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_FadeOutGroup"/>
+		/// <seealso cref="Mix_HaltChannel"/>
+		/// <seealso cref="Mix_ChannelFinished"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_HaltGroup(int tag);
+		#endregion int Mix_HaltGroup(int tag)
+
+		#region int Mix_HaltMusic()
+		/// <summary>
+		/// Stop music playback
+		/// </summary>
+		/// <remarks>
+		/// Halt playback of music. This interrupts music fader effects. 
+		/// Any callback set by Mix_HookMusicFinished will be called 
+		/// when the music stops.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_HaltMusic()
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>always returns zero. (even more silly than Mix_HaltGroup)
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // halt music playback
+		/// Mix_HaltMusic();
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_FadeOutMusic"/>
+		/// <seealso cref="Mix_HookMusicFinished"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_HaltMusic();
+		#endregion int Mix_HaltMusic()
+
+		#region int Mix_ExpireChannel(int channel, int ticks)
+		/// <summary>
+		/// Change the timed stoppage of a channel
+		/// </summary>
+		/// <remarks>
+		/// Halt channel playback, or all channels if -1 is passed in,
+		///  after ticks milliseconds. Any callback set by 
+		///  <see cref="Mix_ChannelFinished"/> 
+		///  will be called when the channel expires.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_ExpireChannel(int channel, int ticks)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to stop playing, or -1 for all channels.
+		/// </param>
+		/// <param name="ticks">
+		/// Milliseconds until channel(s) halt playback. 
+		/// </param>
+		/// <returns>
+		/// Number of channels set to expire. Whether or not they are active.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // halt playback on all channels in 2 seconds
+		/// Mix_ExpireChannel(-1, 2000);
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_HaltChannel"/>
+		/// <seealso cref="Mix_FadeOutChannel"/>
+		/// <seealso cref="Mix_ChannelFinished"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_ExpireChannel(int channel, int ticks);
+		#endregion int Mix_ExpireChannel(int channel, int ticks)
+
+		#region int Mix_FadeOutChannel(int which, int ms)
+		/// <summary>
+		/// Stop playing channel after timed fade out
+		/// </summary>
+		/// <remarks>
+		/// Gradually fade out which channel over ms milliseconds starting 
+		/// from now. The channel will be halted after the fade out is 
+		/// completed. Only channels that are playing are set to fade out,
+		///  including paused channels. Any callback set by 
+		///  <see cref="Mix_ChannelFinished"/> will be called when the channel
+		///   finishes fading out.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_FadeOutChannel(int which, int ms)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="which">
+		/// Channel to fade out, or -1 to fade all channels out.
+		/// </param>
+		/// <param name="ms">
+		/// Milliseconds of time that the fade-out effect 
+		/// should take to go to silence, starting now.
+		/// </param>
+		/// <returns>The number of channels set to fade out.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // fade out all channels to finish 3 seconds from now
+		/// printf("starting fade out of %d channels\n", Mix_FadeOutChannel(-1, 3000));
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_FadeInChannel"/>
+		/// <seealso cref="Mix_FadeInChannelTimed"/>
+		/// <seealso cref="Mix_FadingChannel"/>
+		/// <seealso cref="Mix_ChannelFinished"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_FadeOutChannel(int which, int ms);
+		#endregion int Mix_FadeOutChannel(int which, int ms)
+
+		#region int Mix_FadeOutGroup(int tag, int ms)
+		/// <summary>
+		/// Fade out a group over time
+		/// </summary>
+		/// <remarks>
+		/// Gradually fade out channels in group tag over ms milliseconds
+		///  starting from now. The channels will be halted after the fade
+		///   out is completed. Only channels that are playing are set to 
+		///   fade out, including paused channels. Any callback set by 
+		///   <see cref="Mix_ChannelFinished"/> will be called when each 
+		///   channel finishes fading out.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_FadeOutGroup(int tag, int ms)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="tag">
+		/// Group to fade out.
+		/// NOTE: -1 will NOT fade all channels out. 
+		/// Use Mix_FadeOutChannel(-1) for that instead.
+		/// </param>
+		/// <param name="ms">
+		/// Milliseconds of time that the fade-out effect 
+		/// should take to go to silence, starting now.
+		/// </param>
+		/// <returns>
+		/// The number of channels set to fade out.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // fade out all channels in group 1 to finish 3 seconds from now
+		/// printf("starting fade out of %d channels\n", Mix_FadeOutGroup(1, 3000));
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_HaltGroup"/>
+		/// <seealso cref="Mix_FadeOutChannel"/>
+		/// <seealso cref="Mix_FadingChannel"/>
+		/// <seealso cref="Mix_ChannelFinished"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_FadeOutGroup(int tag, int ms);
+		#endregion int Mix_FadeOutGroup(int tag, int ms)
+
+		#region int Mix_FadeOutMusic(int ms)
+		/// <summary>
+		/// Stop music, with fade out
+		/// </summary>
+		/// <remarks>
+		/// Gradually fade out the music over ms milliseconds starting from 
+		/// now. The music will be halted after the fade out is completed. 
+		/// Only when music is playing and not fading already are set to 
+		/// fade out, including paused channels. Any callback set by 
+		/// <see cref="Mix_HookMusicFinished"/> will be called when 
+		/// the music finishes fading out.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_FadeOutMusic(int ms)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="ms">
+		/// Milliseconds of time that the fade-out effect 
+		/// should take to go to silence, starting now.
+		/// </param>
+		/// <returns>1 on success, 0 on failure.</returns>
+		/// <example>
+		/// <code>
+		/// // fade out music to finish 3 seconds from now
+		///		while(!Mix_FadeOutMusic(3000) && Mix_PlayingMusic()) 
+		///	{
+		///		// wait for any fades to complete
+		///		SDL_Delay(100);
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_HaltMusic"/>
+		/// <seealso cref="Mix_FadingMusic"/>
+		/// <seealso cref="Mix_PlayingMusic"/>
+		/// <seealso cref="Mix_HookMusicFinished"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_FadeOutMusic(int ms);
+		#endregion int Mix_FadeOutMusic(int ms)
+
+		#region Mix_Fading Mix_FadingMusic()
+		/// <summary>
+		/// Get status of current music fade activity
+		/// </summary>
+		/// <remarks>
+		/// Tells you if music is fading in, out, or not at all. 
+		/// Does not tell you if the channel is playing anything, 
+		/// or paused, so you'd need to test that separately.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>Mix_Fading Mix_FadingMusic() 
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the fading status. Never returns an error.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // check the music fade status
+		///		switch(Mix_FadingMusic()) 
+		///	{
+		///		case MIX_NO_FADING:
+		///		printf("Not fading music.\n");
+		///		break;
+		///		case MIX_FADING_OUT:
+		///		printf("Fading out music.\n");
+		///		break;
+		///		case MIX_FADING_IN:
+		///		printf("Fading in music.\n");
+		///		break;
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PausedMusic"/>
+		/// <seealso cref="Mix_PlayingMusic"/>
+		/// <seealso cref="Mix_FadeInMusicPos"/>
+		/// <seealso cref="Mix_FadeOutMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_FadingMusic();
+		#endregion Mix_Fading Mix_FadingMusic()
+
+		#region Mix_Fading Mix_FadingChannel(int which)
+		/// <summary>
+		/// Get the fade status of a channel
+		/// </summary>
+		/// <remarks>
+		/// Tells you if which channel is fading in, out, or not. 
+		/// Does not tell you if the channel is playing anything, 
+		/// or paused, so you'd need to test that separately.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>Mix_Fading Mix_FadingChannel(int which)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="which">
+		/// Channel to get the fade activity status from.
+		/// -1 is not valid, and will probably crash the program.
+		/// </param>
+		/// <returns>the fading status. Never returns an error.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // check the fade status on channel 0
+		///		switch(Mix_FadingChannel(0)) 
+		///	{
+		///	case MIX_NO_FADING:
+		///		printf("Not fading.\n");
+		///		break;
+		///		case MIX_FADING_OUT:
+		///		printf("Fading out.\n");
+		///		break;
+		///		case MIX_FADING_IN:
+		///		printf("Fading in.\n");
+		///		break;
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_Paused"/>
+		/// <seealso cref="Mix_Playing"/>
+		/// <seealso cref="Mix_FadeInChannel"/>
+		/// <seealso cref="Mix_FadeInChannelTimed"/>
+		/// <seealso cref="Mix_FadeOutChannel"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_FadingChannel(int which);
+		#endregion Mix_Fading Mix_FadingChannel(int which)
+
+		#region void Mix_Pause(int channel)
+		/// <summary>
+		/// Pause a particular channel
+		/// </summary>
+		/// <remarks>
+		/// Pause channel, or all playing channels if -1 is passed in. 
+		/// You may still halt a paused channel.
+		/// Note: Only channels which are actively playing will be paused.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>void Mix_Pause(int channel)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to pause on, or -1 for all channels.
+		/// </param>
+		/// <example>
+		/// <code>
+		/// // pause all sample playback
+		/// Mix_Pause(-1);
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_Resume"/>
+		/// <seealso cref="Mix_Paused"/>
+		/// <seealso cref="Mix_HaltChannel"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_Pause(int channel);
+		#endregion void Mix_Pause(int channel)
+
+		#region void Mix_Resume(int channel)
+		/// <summary>
+		/// Resume a paused channel
+		/// </summary>
+		/// <remarks>
+		/// Unpause channel, or all playing and 
+		/// paused channels if -1 is passed in.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>void Mix_Resume(int channel)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to resume playing, or -1 for all channels.
+		/// </param>
+		/// <example>
+		/// <code>
+		/// // resume playback on all previously active channels
+		/// Mix_Resume(-1);
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_Pause"/>
+		/// <seealso cref="Mix_Paused"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_Resume(int channel);
+		#endregion void Mix_Resume(int channel)
+
+		#region int Mix_Paused(int channel)
+		/// <summary>
+		/// Get the pause status of a channel
+		/// </summary>
+		/// <remarks>
+		/// Tells you if channel is paused, or not.
+		/// Note: Does not check if the channel has been halted 
+		/// after it was paused, which may seem a little weird.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_Paused(int channel)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to test whether it is paused or not.
+		/// -1 will tell you how many channels are paused.
+		/// </param>
+		/// <returns>
+		/// Zero if the channel is not paused. Otherwise if you passed in -1,
+		///  the number of paused channels is returned. If you passed in a 
+		///  specific channel, then 1 is returned if it is paused.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // check the pause status on all channels
+		/// printf("%d channels are paused\n", Mix_Paused(-1));
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_Playing"/>
+		/// <seealso cref="Mix_Pause"/>
+		/// <seealso cref="Mix_Resume"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_Paused(int channel);
+		#endregion int Mix_Paused(int channel)
+
+		#region void Mix_PauseMusic()
+		/// <summary>
+		/// Pause music
+		/// </summary>
+		/// <remarks>
+		/// Pause the music playback. You may halt paused music.
+		/// Note: Music can only be paused if it is actively playing.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>void Mix_PauseMusic()
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // pause music playback
+		/// Mix_PauseMusic();
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_ResumeMusic"/>
+		/// <seealso cref="Mix_PausedMusic"/>
+		/// <seealso cref="Mix_HaltMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_PauseMusic();
+		#endregion void Mix_PauseMusic()
+
+		#region void Mix_ResumeMusic()
+		/// <summary>
+		/// Resume paused music
+		/// </summary>
+		/// <remarks>
+		/// Unpause the music. This is safe to use on halted, 
+		/// paused, and already playing music.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>void Mix_ResumeMusic() 
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // resume music playback
+		/// Mix_ResumeMusic();
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PauseMusic"/>
+		/// <seealso cref="Mix_PausedMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_ResumeMusic();
+		#endregion void Mix_ResumeMusic()
+
+		#region void Mix_RewindMusic()
+		/// <summary>
+		/// Rewind music to beginning
+		/// </summary>
+		/// <remarks>
+		/// Rewind the music to the start. This is safe to use on halted, 
+		/// paused, and already playing music. It is not useful to rewind
+		///  the music immediately after starting playback, because it 
+		///  starts at the beginning by default.
+		///  <p>This function only works for these streams: 
+		///  MOD, OGG, MP3, Native MIDI.</p>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>void Mix_RewindMusic() 
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // rewind music playback to the start
+		/// Mix_RewindMusic();
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PlayMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_RewindMusic();
+		#endregion void Mix_RewindMusic()
+
+		#region int Mix_PausedMusic()
+		/// <summary>
+		/// Test whether music is paused
+		/// </summary>
+		/// <remarks>
+		/// Tells you if music is paused, or not.
+		/// Note: Does not check if the music was been halted 
+		/// after it was paused, which may seem a little weird.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_PausedMusic()
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// Zero if music is not paused. 1 if it is paused. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // check the music pause status
+		/// printf("music is%s paused\n", Mix_PausedMusic()?"":" not");
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PlayingMusic"/>
+		/// <seealso cref="Mix_PauseMusic"/>
+		/// <seealso cref="Mix_ResumeMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_PausedMusic();
+		#endregion int Mix_PausedMusic()
+
+		#region int Mix_SetMusicPosition(double position)
+		/// <summary>
+		/// Set position of playback in stream.
+		/// </summary>
+		/// <remarks>
+		/// Set the position of the currently playing music. 
+		/// The position takes different meanings for different music sources.
+		/// It only works on the music sources listed below.
+		/// <code>
+		/// MOD 
+		/// The double is cast to Uint16 and used for a pattern number in the module.
+		/// Passing zero is similar to rewinding the song. 
+		/// OGG 
+		/// Jumps to position seconds from the beginning of the song. 
+		/// MP3 
+		/// Jumps to position seconds from the current position in the stream.
+		/// </code>
+		/// So you may want to call Mix_RewindMusic before this.
+		/// Does not go in reverse...negative values do nothing.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_SetMusicPosition(double position)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="position">Position to play from.</param>
+		/// <returns>
+		/// 0 on success, or -1 if the codec doesn't support this function. 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // skip one minute into the song, from the start
+		/// // this assumes you are playing an MP3
+		///		Mix_RewindMusic();
+		///		if(Mix_SetMusicPosition(60.0)==-1) 
+		///	{
+		///		printf("Mix_SetMusicPosition: %s\n", Mix_GetError());
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_FadeInMusicPos"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_SetMusicPosition(double position);
+		#endregion int Mix_SetMusicPosition(double position)
+
+		#region int Mix_Playing(int channel)
+		/// <summary>
+		/// Get the active playing status of a channel
+		/// </summary>
+		/// <remarks>
+		/// Tells you if channel is playing, or not.
+		/// Note: Does not check if the channel has been paused.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_Playing(int channel)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to test whether it is playing or not.
+		/// -1 will tell you how many channels are playing.
+		/// </param>
+		/// <returns>
+		/// Zero if the channel is not playing. Otherwise if you passed in -1, 
+		/// the number of channels playing is returned. If you passed in a 
+		/// specific channel, then 1 is returned if it is playing.</returns>
+		/// <example>
+		/// <code>
+		/// // check how many channels are playing samples
+		/// printf("%d channels are playing\n", Mix_Playing(-1));
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_Paused"/>
+		/// <seealso cref="Mix_PlayChannel"/>
+		/// <seealso cref="Mix_Pause"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_Playing(int channel);
+		#endregion int Mix_Playing(int channel)
+
+		#region int Mix_PlayingMusic()
+		/// <summary>
+		/// Test whether music is playing
+		/// </summary>
+		/// <remarks>
+		/// Tells you if music is actively playing, or not.
+		/// Note: Does not check if the channel has been paused.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_PlayingMusic() 
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns></returns>
+		/// <example>
+		/// <code>
+		/// // check if music is playing
+		/// printf("music is%s playing.\n", Mix_PlayingMusic()?"":" not");
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PausedMusic"/>
+		/// <seealso cref="Mix_FadingMusic"/>
+		/// <seealso cref="Mix_PlayMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_PlayingMusic();
+		#endregion int Mix_PlayingMusic()
+
+		#region int Mix_SetMusicCMD(string command)
+		/// <summary>
+		/// Use external program for music playback
+		/// </summary>
+		/// <remarks>
+		/// Setup a command line music player to use to play music. 
+		/// Any music playing will be halted. The music file to play 
+		/// is set by calling <see cref="Mix_LoadMUS"/>(filename), 
+		/// and the filename is appended as the last argument on the 
+		/// commandline. This allows you to reuse the music command 
+		/// to play multiple files. The command will be sent signals 
+		/// SIGTERM to halt, SIGSTOP to pause, and SIGCONT to resume. 
+		/// The command program should react correctly to those signals
+		///  for it to function properly with SDL_Mixer. 
+		///  <see cref="Mix_VolumeMusic"/> has no effect when using an 
+		///  external music player, and <see cref="Mix_GetError"/> will 
+		///  have an error code set. You should set the music volume in 
+		///  the music player's command if the music player supports that.
+		///   Looping music works, by calling the command again when the 
+		///   previous music player process has ended. Playing music 
+		///   through a command uses a forked process to execute the music command.
+		/// <p>To use the internal music players set the command to NULL.</p>
+		/// <p>NOTE: External music is not mixed by SDL_mixer, 
+		/// so no post-processing hooks will be for music.</p>
+		/// <p>NOTE: Playing music through an external command may not work 
+		/// if the sound driver does not support multiple openings of the 
+		/// audio device, since SDL_Mixer already has the audio device 
+		/// open for playing samples through channels.</p>
+		/// <p>NOTE: Commands are not totally portable, so be careful.</p>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_SetMusicCMD(const char *command)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="command">
+		/// System command to play the music. Should be a complete command,
+		///  as if typed in to the command line, but it should expect the 
+		///  filename to be added as the last argument.
+		/// NULL will turn off using an external command for music, 
+		/// returning to the internal music playing functionality.
+		/// </param>
+		/// <returns>
+		/// 0 on success, or -1 on any errors, such as running out of memory.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // use mpg123 to play music
+		///		Mix_Music *music=NULL;
+		///		if(Mix_SetMusicCMD("mpg123 -q")==-1) 
+		///	{
+		///		perror("Mix_SetMusicCMD");
+		///	} 
+		///	else 
+		///{
+		///	// play some mp3 file
+		///	music=Mix_LoadMUS("music.mp3");
+		///	if(music) 
+		///{
+		///	Mix_PlayMusic(music,1);
+		///}
+		///}
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_PlayMusic"/>
+		/// <seealso cref="Mix_VolumeMusic"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_SetMusicCMD(string command);
+		#endregion int Mix_SetMusicCMD(string command)
+
+		#region int Mix_SetSynchroValue(int value)
+		/// <summary>
+		/// Synchro value is set by MikMod from modules while playing
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_SetSynchroValue(int value)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		/// <seealso cref="Mix_GetSynchroValue"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_SetSynchroValue(int value);
+		#endregion int Mix_SetSynchroValue(int value)
+
+		#region int Mix_GetSynchroValue()
+		/// <summary>
+		/// Synchro value is set by MikMod from modules while playing
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>int Mix_GetSynchroValue(void)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns></returns>
+		/// <seealso cref="Mix_SetSynchroValue"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int Mix_GetSynchroValue();
+		#endregion int Mix_GetSynchroValue()
+
+		#region IntPtr Mix_GetChunk(int channel)
+		/// <summary>
+		/// Get the sample playing on a channel
+		/// </summary>
+		/// <remarks>
+		/// Get the most recent sample chunk pointer played on channel. 
+		/// This pointer may be currently playing, or just the last used.
+		/// Note: The actual chunk may have been freed, so this pointer 
+		/// may not be valid anymore.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>Mix_Chunk *Mix_GetChunk(int channel)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="channel">
+		/// Channel to get the current Mix_Chunk playing.
+		/// -1 is not valid, but will not crash the program.
+		/// </param>
+		/// <returns>
+		/// Pointer to the Mix_Chunk. NULL is returned if the channel is not 
+		/// allocated, or if the channel has not played any samples yet.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // get the last chunk used by channel 0
+		/// printf("Mix_Chunk* last in use on channel 0 was: %08p\n", Mix_GetChunk(0));
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_Chunk"/>
+		/// <seealso cref="Mix_Playing"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr Mix_GetChunk(int channel);
+		#endregion IntPtr Mix_GetChunk(int channel)
+
+		#region void Mix_CloseAudio()
+		/// <summary>
+		/// Close sound mixer
+		/// </summary>
+		/// <remarks>
+		/// <p>Shutdown and cleanup the mixer API.</p>
+		/// After calling this all audio is stopped, 
+		/// the device is closed, and the SDL_mixer functions 
+		/// should not be used. You may, of course, 
+		/// use Mix_OpenAudio to start 
+		/// the functionality again.
+		/// <p>Note: This function doesn't do anything until you
+		/// have called it the same number of times that you called
+		///  <see cref="Mix_OpenAudio"/>. You may use 
+		///  <see cref="Mix_QuerySpec"/> to find out how many
+		///   times Mix_CloseAudio needs to be called before the device is
+		///    actually closed.</p>
+		///    <p>Binds to C-function in SDL_mixer.h
+		/// <code>void Mix_CloseAudio()
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns></returns>
+		/// <example>
+		/// <code>
+		/// Mix_CloseAudio();
+		/// // you could SDL_Quit(); here...or not.
+		/// </code>
+		/// </example>
+		/// <seealso cref="Mix_OpenAudio"/>
+		/// <seealso cref="Mix_QuerySpec"/>
+		[DllImport(SDL_MIXER_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void Mix_CloseAudio();
+		#endregion void Mix_CloseAudio()
+
+		#region void Mix_SetError(string message)
+		/// <summary>
+		/// Set the current error string
+		/// </summary>
+		/// <remarks>
+		/// This is the same as SDL_SetError, which sets the error string
+		/// which may be fetched with Mix_GetError (or SDL_GetError). 
+		/// This functions acts like printf, except that it is limited to
+		///  SDL_ERRBUFIZE(1024) chars in length. It only accepts the 
+		///  following format types: %s, %d, %f, %p. No variations are 
+		///  supported, like %.2f would not work. For any more specifics 
+		///  read the SDL docs.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>
+		/// void Mix_SetError(const char *fmt, ...)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// int mymixfunc(int i) {
+		///		Mix_SetError("mymixfunc is not implemented! %d was passed in.",i);
+		///		return(-1);
+		///	}
+		/// </code></example>
+		/// <param name="message"></param>
+		/// <seealso cref="Mix_GetError"/>
+		public static void Mix_SetError(string message)
+		{
+			Sdl.SDL_SetError(message);
+		}
+		#endregion void Mix_SetError(string message)
+
+		#region string Mix_GetError()
+		/// <summary>
+		/// Get the current error string
+		/// </summary>
+		/// <remarks>
+		/// This is the same as SDL_GetError, which returns the last error set 
+		/// as a string which you may use to tell the user what happened when 
+		/// an error status has been returned from an SDL_mixer function call.
+		/// <p>Binds to C-function in SDL_mixer.h
+		/// <code>
+		/// char *Mix_GetError() 
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// a char pointer (string) containing a humam 
+		/// readable version or the reason for the last error that
+		///  occured.
+		///  </returns>
+		///  <example>
+		///  <code>
+		///  printf("Oh My Goodness, an error : %s", Mix_GetError());
+		///  </code>
+		///  </example>
+		/// <seealso cref="Mix_SetError"/>
+		public static string Mix_GetError()
+		{
+			return Sdl.SDL_GetError();
+		}
+		#endregion string Mix_GetError()
+		#endregion SdlMixer Methods
+	}
+}
diff --git a/src/Tao.Sdl/SdlNet.cs b/src/Tao.Sdl/SdlNet.cs
new file mode 100644
index 0000000..b1ef4f4
--- /dev/null
+++ b/src/Tao.Sdl/SdlNet.cs
@@ -0,0 +1,2320 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl
+{
+	#region Class Documentation
+	/// <summary>
+	/// SDL_net is a portable network library for use with SDL.
+	/// </summary>
+	#endregion Class Documentation
+	[SuppressUnmanagedCodeSecurityAttribute()]
+	public static class SdlNet
+	{
+		#region Private Constants
+		#region string SDL_NET_NATIVE_LIBRARY
+		/// <summary>
+		///     Specifies SdlNet's native library archive.
+		/// </summary>
+		/// <remarks>
+		///     Specifies SDL_net.dll everywhere; will be mapped via 
+		///     .config for mono.
+		/// </remarks>
+		private const string SDL_NET_NATIVE_LIBRARY = "SDL_net.dll";
+		#endregion string SDL_NET_NATIVE_LIBRARY
+
+		#region CallingConvention CALLING_CONVENTION
+		/// <summary>
+		///     Specifies the calling convention.
+		/// </summary>
+		/// <remarks>
+		///     Specifies <see cref="CallingConvention.Cdecl" /> 
+		///     for Windows and Linux.
+		/// </remarks>
+		private const CallingConvention CALLING_CONVENTION = 
+			CallingConvention.Cdecl;
+		#endregion CallingConvention CALLING_CONVENTION
+		#endregion Private Constants
+		
+		#region Public Constants
+		/// <summary>
+		/// Major Version
+		/// </summary>
+		public const int SDL_NET_MAJOR_VERSION = 1;
+		/// <summary>
+		/// Minor Version
+		/// </summary>
+		public const int SDL_NET_MINOR_VERSION = 2;
+		/// <summary>
+		/// Patch Version
+		/// </summary>
+		public const int SDL_NET_PATCHLEVEL = 6;
+		/// <summary>
+		/// Used for listening on all network interfaces.
+		/// </summary>
+		public const byte INADDR_ANY = unchecked((byte)0x00000000);
+		/// <summary>
+		/// Which has limited applications.
+		/// </summary>
+		public const byte INADDR_NONE = unchecked((byte)0xFFFFFFFF);
+		/// <summary>
+		/// Used as destination when sending a message to all clients on 
+		/// a subnet that allows broadcasts.
+		/// </summary>
+		public const byte INADDR_BROADCAST = unchecked((byte)0xFFFFFFFF);
+		/// <summary>
+		/// The maximum number of channels on a UDP socket.
+		/// </summary>
+		public const byte SDLNET_MAX_UDPCHANNELS = 32;
+		/// <summary>
+		/// The maximum number of addresses bound to a single UDP socket
+		///  channel.
+		/// </summary>
+		public const byte SDLNET_MAX_UDPADDRESSES = 4;
+		#endregion Public Constants
+		
+		#region Public Structs
+		#region IPAddress
+		/// <summary>
+		/// IP Address and Port number
+		/// </summary>
+		/// <remarks>
+		/// This type contains the information used to 
+		/// form network connections and sockets.
+		/// <p>Binds to C-function call in SDL_net.h:
+		/// <code>
+		/// typedef struct {
+		///		Uint32 host;
+		///		Uint16 port;
+		/// } IPaddress;
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="SDLNet_TCP_Open"/>
+		/// <seealso cref="SDLNet_ResolveHost"/>
+		/// <seealso cref="SDLNet_ResolveIP"/>
+		public struct IPaddress  
+		{
+			/// <summary>
+			/// The 32-bit IPv4 address of a host, encoded in Network Byte
+			///  Order.
+			/// </summary>
+			public int host;
+			/// <summary>
+			/// The 16-bit IPv4 port number of a socket, 
+			/// encoded in Network Byte Order.
+			/// </summary>
+			public	short port;
+		}
+		#endregion IPAddress
+		
+		#region UDPpacket
+		/// <summary>
+		/// UDP packet data encapsulation
+		/// </summary>
+		/// <remarks>
+		/// This struct is used with UDPsockets to send and receive data. 
+		/// It also helps keep track of a packets sending/receiving 
+		/// settings and status. The channels concept helps prioritize,
+		///  or segregate differring types of data packets.
+		/// <p>Binds to C-function call in SDL_net.h:
+		/// <code>
+		/// typedef struct {
+		/// 	int channel;
+		/// 	Uint8 *data;
+		/// 	int len;
+		/// 	int maxlen;
+		/// 	int status;
+		/// 	IPaddress address;
+		/// } UDPpacket;
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="IPaddress"/>
+		/// <seealso cref="SDLNet_AllocPacket"/>
+		/// <seealso cref="SDLNet_ResizePacket"/>
+		/// <seealso cref="SDLNet_FreePacket"/>
+		/// <seealso cref="SDLNet_AllocPacketV"/>
+		/// <seealso cref="SDLNet_FreePacketV"/>
+		public struct UDPpacket
+		{
+			/// <summary>
+			/// The (software) channel number for this packet. 
+			/// This can also be used as a priority value for the packet.
+			///  If no channel is assigned, the value is -1.
+			/// </summary>
+			public int channel;
+			/// <summary>
+			/// The data contained in this packet, this is the meat.
+			/// </summary>
+			public IntPtr data;
+			/// <summary>
+			/// This is the meaningful length of the data in bytes.
+			/// </summary>
+			public int len;
+			/// <summary>
+			/// This is size of the data buffer, which may be larger 
+			/// than the meaningful length. This is only used for 
+			/// packet creation on the senders side.
+			/// </summary>
+			public int maxlen;
+			/// <summary>
+			/// This contains the number of bytes sent, or a -1 on errors,
+			///  after sending. This is useless for a received packet.
+			/// </summary>
+			public int status;
+			/// <summary>
+			/// This is the resolved IPaddress to be used when sending, 
+			/// or it is the remote source of a received packet.
+			/// </summary>
+			public IPaddress address;
+		}
+		#endregion UDPpacket
+		
+		#region TCPsocket
+		/// <summary>
+		/// TCP socket type (opaque)
+		/// </summary>
+		/// <remarks>
+		/// This is an opaque data type used for TCP connections. 
+		/// This is a pointer, and so it could be NULL at times. 
+		/// NULL would indicate no socket has been established.
+		/// <code>
+		/// typedef struct _TCPsocket *TCPsocket
+		/// </code>
+		/// </remarks>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="SDLNet_GenericSocket"/>
+		public struct TCPsocket
+		{
+		}
+		#endregion TCPsocket
+		
+		#region UDPsocket
+		/// <summary>
+		/// UDP socket type (opaque)
+		/// </summary>
+		/// <remarks>
+		/// This is an opaque data type used for UDP sockets. 
+		/// This is a pointer, and so it could be NULL at times. 
+		/// NULL would indicate no socket has been established.
+		/// <code>
+		/// typedef struct _UDPsocket *UDPsocket
+		/// </code>
+		/// </remarks>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <seealso cref="SDLNet_GenericSocket"/>
+		public struct UDPsocket
+		{
+		}
+		#endregion UDPsocket
+		
+		#region SDLNet_SocketSet
+		/// <summary>
+		/// Socket Set type (opaque)
+		/// </summary>
+		/// <remarks>
+		/// This is an opaque data type used for socket sets. 
+		/// This is a pointer, and so it could be NULL at times. 
+		/// NULL would indicate no socket set has been created.
+		/// <code>
+		/// typedef struct _SDLNet_SocketSet *SDLNet_SocketSet
+		/// </code>
+		/// </remarks>
+		/// <seealso cref="TCPsocket"/>
+		/// <seealso cref="UDPsocket"/>
+		public struct SDLNet_SocketSet
+		{
+		}
+		#endregion SDLNet_SocketSet
+		
+		#region SDLNet_GenericSocket
+		/// <summary>
+		/// A generic type for UDP and TCP sockets
+		/// </summary>
+		/// <remarks>
+		/// This data type is able to be used for both UDPsocket 
+		/// and TCPsocket types.
+		/// After calling SDLNet_CheckSockets, 
+		/// if this socket is in SDLNet_SocketSet used, 
+		/// the ready will be set according to activity on the socket. 
+		/// This is the only real use for this type, as it doesn't 
+		/// help you know what type of socket it is.
+		/// <code>
+		/// typedef struct {
+		///     int ready;
+		/// } *SDLNet_GenericSocket;
+		/// </code>
+		/// </remarks>
+		/// <seealso cref="TCPsocket"/>
+		/// <seealso cref="UDPsocket"/>
+		public struct SDLNet_GenericSocket
+		{
+			/// <summary>
+			/// Non-zero when data is ready to be read, 
+			/// or a server socket has a connection attempt 
+			/// ready to be accepted.
+			/// </summary>
+			public int ready;
+		}
+		#endregion SDLNet_GenericSocket
+		#endregion Public Structs
+		
+		#region SdlNet Methods
+		#region General
+		#region SDL_version SDL_NET_VERSION() 
+		/// <summary>
+		/// This method can be used to fill a version structure with the compile-time
+		/// version of the SDL_net library.
+		/// </summary>
+		/// <returns>
+		///     This function returns a <see cref="Sdl.SDL_version"/> struct containing the
+		///     compiled version number
+		/// </returns>
+		/// <remarks>
+		///     <p>
+		///     Binds to C-function call in SDL_net.h:
+		///     <code>#define SDL_NET_VERSION(X)
+		/// {
+		/// (X)->major = SDL_NET_MAJOR_VERSION;
+		/// (X)->minor = SDL_NET_MINOR_VERSION;
+		/// (X)->patch = SDL_NET_PATCHLEVEL;
+		/// }</code>
+		///     </p>
+		/// </remarks>
+		public static Sdl.SDL_version SDL_NET_VERSION() 
+		{ 
+			Sdl.SDL_version sdlVersion = new Sdl.SDL_version();
+			sdlVersion.major = SDL_NET_MAJOR_VERSION;
+			sdlVersion.minor = SDL_NET_MINOR_VERSION;
+			sdlVersion.patch = SDL_NET_PATCHLEVEL;
+			return sdlVersion;
+		} 
+		#endregion SDL_version SDL_NET_VERSION() 
+
+		#region IntPtr SDLNet_Linked_VersionInternal()
+		//     const SDL_version * SDLNet_Linked_Version(void)
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="SDLNet_Linked_Version"), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr SDLNet_Linked_VersionInternal();
+		#endregion IntPtr SDLNet_Linked_VersionInternal()
+
+		#region SDL_version SDLNet_Linked_Version() 
+		/// <summary>
+		///     Using this you can compare the runtime version to the 
+		/// version that you compiled with.
+		/// </summary>
+		/// <returns>
+		///     This function gets the version of the dynamically 
+		/// linked SDL_net library in an <see cref="Sdl.SDL_version"/> struct.
+		/// </returns>
+		/// <remarks>
+		///     <p>
+		///     Binds to C-function call in SDL_net.h:
+		///     <code>const SDL_version * SDLNet_Linked_Version(void)</code>
+		///     </p>
+		/// </remarks>
+		public static Sdl.SDL_version SDLNet_Linked_Version() 
+		{ 
+			return (Sdl.SDL_version)Marshal.PtrToStructure(
+				SDLNet_Linked_VersionInternal(), 
+				typeof(Sdl.SDL_version)); 
+		} 
+		#endregion SDL_version SDLNet_Linked_Version()
+
+		#region int SDLNet_Init()
+		/// <summary>
+		/// Initialize the network API.
+		/// </summary>
+		/// <remarks>
+		/// This must be called before using other functions in this library.
+		/// SDL must be initialized before this call because this 
+		/// library uses utility functions from the SDL library.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>extern DECLSPEC int  SDLCALL SDLNet_Init(void);</code>
+		/// </p>
+		/// </remarks>
+		/// <returns>0 on success, -1 on errors</returns>
+		/// <example>
+		/// <code>
+		/// if(SDL_Init(0)==-1) {
+		///     printf("SDL_Init: %s\n", SDL_GetError());
+		///     exit(1);
+		/// }
+		/// if(SDLNet_Init()==-1) {
+		///     printf("SDLNet_Init: %s\n", SDLNet_GetError());
+		///		exit(2);
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_Quit"/>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_Init();
+		#endregion int SDLNet_Init()
+		
+		#region void SDLNet_Quit()
+		
+		/// <summary>
+		/// Shutdown and cleanup the network API.
+		/// </summary>
+		/// <remarks>
+		/// After calling this all sockets are closed, and the SDL_net 
+		/// functions should not be used. You may, of course, use SDLNet_Init
+		/// to use the functionality again.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>extern DECLSPEC void SDLCALL SDLNet_Quit(void);</code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// SDLNet_Quit();
+		/// // you could SDL_Quit(); here...or not.
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_Init"/>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void SDLNet_Quit();
+		#endregion void SDLNet_Quit()
+		
+		#region string SDLNet_GetError()
+		/// <summary>
+		/// Get the current error string
+		/// </summary>
+		/// <remarks>
+		/// This is the same as SDL_GetError, which returns the 
+		/// last error set as a string which you may use to tell 
+		/// the user what happened when an error status has been returned 
+		/// from an SDLNet_function.
+		/// <p>Binds to C-function call in SDL_error.h:
+		///     <code>#define SDLNet_GetError	SDL_GetError</code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// A string containing a human readable version 
+		/// or the reason for the last error that occured.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// printf("Oh My Goodness, an error : %s", SDLNet_GetError());
+		/// </code>
+		/// </example>
+		public static string SDLNet_GetError()
+		{
+			return Sdl.SDL_GetError();
+		}
+		#endregion string SDLNet_GetError()
+
+		#region void SDLNet_SetError(string message)
+		/// <summary>
+		/// This is the same as SDL_SetError, which sets an SDL error message
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function call in SDL_error.h:
+		///     <code>#define SDLNet_SetError	SDL_SetError</code>
+		/// </p>
+		/// </remarks>
+		/// <param name="message">
+		/// The error message to set.
+		/// </param>
+		public static void SDLNet_SetError(string message)
+		{
+			Sdl.SDL_SetError(message);
+		}
+		#endregion void SDLNet_SetError(string message)
+		
+		#region void SDLNet_Write16(short value, IntPtr area)
+		/// <summary>
+		/// Put the 16bit (a short on 32bit systems) value 
+		/// into the data buffer area in network byte order.
+		/// </summary>
+		/// <remarks>
+		/// This helps avoid byte order differences 
+		/// between two systems that are talking over the network.
+		///  The value can be a signed number, the unsigned parameter 
+		///  type doesn't affect the data. The area pointer need not 
+		///  be at the beginning of a buffer, but must have at 
+		///  least 2 bytes of space left, 
+		///  including the byte currently pointed at.
+		/// <p>Binds to C-function call in SDL_error.h:
+		///     <code>extern DECLSPEC void SDLCALL SDLNet_Write16(Uint16 value, void *area)</code>
+		/// </p>
+		///  </remarks>
+		/// <example>
+		/// <code>
+		/// // put my number into a data buffer to prepare for 
+		/// // sending to a remote host
+		/// char data[1024];
+		/// Sint16 number=12345;
+		/// SDLNet_Write16((Uint16)number,data);
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_Write32"/>
+		/// <seealso cref="SDLNet_Read16"/>
+		/// <param name="value">
+		/// The 16bit number to put into the 
+		/// area buffer.
+		/// </param>
+		/// <param name="area">
+		/// The pointer into a data buffer, at which to put the number.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void SDLNet_Write16(short value, IntPtr area);
+		#endregion void SDLNet_Write16(short value, IntPtr area)
+		
+		#region void SDLNet_Write32(int value, IntPtr area)
+		/// <summary>
+		/// Put the 32bit (a long on 32bit systems) value into 
+		/// the data buffer area in network byte order.
+		/// </summary>
+		/// <remarks>
+		/// This helps avoid byte order differences between two 
+		/// systems that are talking over the network. 
+		/// The value can be a signed number, the unsigned 
+		/// parameter type doesn't affect the data. 
+		/// The area pointer need not be at the beginning of a buffer,
+		/// but must have at least 4 bytes of space left, 
+		/// including the byte currently pointed at.
+		/// <p>Binds to C-function call in SDL_error.h:
+		///     <code>extern DECLSPEC void SDLCALL SDLNet_Write32(Uint32 value, void *area)</code>
+		/// </p>
+		///  </remarks>
+		/// <example>
+		/// <code>
+		/// // put my number into a data buffer to prepare 
+		/// // for sending to a remote host
+		/// char data[1024];
+		/// Uint32 number=0xDEADBEEF;
+		/// SDLNet_Write32(number,data);
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_Write16"/>
+		/// <seealso cref="SDLNet_Read32"/>
+		/// <param name="value">
+		/// The 32bit number to put into the area buffer.
+		/// </param>
+		/// <param name="area">
+		/// The pointer into a data buffer, at which to put the number.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void SDLNet_Write32(int value, IntPtr area);
+		#endregion void SDLNet_Write32(int value, IntPtr area)
+		
+		#region short SDLNet_Read16(IntPtr area)
+		/// <summary>
+		/// Get a 16bit (a short on 32bit systems) value from 
+		/// the data buffer area which is in network byte order.
+		/// </summary>
+		/// <remarks>
+		/// This helps avoid byte order differences between 
+		/// two systems that are talking over the network. 
+		/// The returned value can be a signed number, 
+		/// the unsigned parameter type doesn't affect the data. 
+		/// The area pointer need not be at the beginning of a buffer,
+		/// but must have at least 2 bytes of space left, 
+		/// including the byte currently pointed at.
+		/// <p>Binds to C-function call in SDL_error.h:
+		///     <code>extern DECLSPEC Uint16 SDLCALL SDLNet_Read16(void *area)</code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // get a number from a data buffer to use on this host
+		/// //char *ptr; //this points into a previously received data buffer
+		/// Sint16 number;
+		/// number=(Sint16) SDLNet_Read16(ptr);
+		/// // number is now in your hosts byte order, ready to use.
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_Write16"/>
+		/// <seealso cref="SDLNet_Read32"/>
+		/// <param name="area">The pointer into a data buffer, at which to get the number from.</param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern short SDLNet_Read16(IntPtr area);
+		#endregion short SDLNet_Read16(IntPtr area)
+		
+		#region int SDLNet_Read32(IntPtr area)
+		/// <summary>
+		/// Get a 32bit (a long on 32bit systems) value from the data buffer area which is in network byte order.
+		/// </summary>
+		/// <remarks>
+		/// This helps avoid byte order differences between two 
+		/// systems that are talking over the network. The 
+		/// returned value can be a signed number, the unsigned
+		/// parameter type doesn't affect the data. The area 
+		/// pointer need not be at the beginning of a buffer,
+		/// but must have at least 4 bytes of space left,
+		/// including the byte currently pointed at.
+		/// <p>Binds to C-function call in SDL_error.h:
+		///     <code>extern DECLSPEC Uint32 SDLCALL SDLNet_Read32(void *area)</code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // get a number from a data buffer to use on this host
+		/// //char *ptr; //this points into a previously received data buffer
+		/// Uint32 number;
+		/// number=SDLNet_Read32(ptr);
+		/// // number is now in your hosts byte order, ready to use.
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_Write32"/>
+		/// <seealso cref="SDLNet_Read16"/>
+		/// <param name="area">The pointer into a data buffer, at which to get the number from.</param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_Read32(IntPtr area);
+		#endregion int SDLNet_Read32(IntPtr area)
+		#endregion General
+		
+		#region Name Resolution
+		#region int SDLNet_ResolveHost(ref IPaddress address, string host, short port)
+		/// <summary>
+		/// Resolve the string host, and fill in the IPaddress pointed to by address with the resolved IP and the port number passed in through port.
+		/// </summary>
+		/// <remarks>
+		/// This is the best way to fill in the IPaddress struct for later use. This function does not actually open any sockets, it is used to prepare the arguments for the socket opening functions.
+		/// WARNING: this function will put the host and port into Network Byte Order into the address fields, so make sure you pass in the data in your hosts byte order. (normally not an issue)
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC int SDLCALL SDLNet_ResolveHost(IPaddress *address, const char *host, Uint16 port)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>0 on success. -1 on errors, plus address.host will be INADDR_NONE. An error would likely be that the address could not be resolved. If 'host' is NULL, the resolved host will be set to INADDR_ANY.</returns>
+		/// <example>For a server listening on all interfaces, on port 1234:
+		/// <code>
+		/// // create a server type IPaddress on port 1234
+		/// IPaddress ipaddress;
+		/// SDLNet_ResolveHost(ipaddress, NULL, 1234);
+		/// </code>
+		/// For a client connecting to "host.domain.ext", at port 1234:
+		/// <code>
+		/// // create an IPaddress for host name "host.domain.ext" on port 1234
+		/// // this is used by a client
+		/// IPaddress ipaddress;
+		/// SDLNet_ResolveHost(ipaddress, "host.domain.ext", 1234);
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_ResolveIP"/>
+		/// <seealso cref="IPaddress"/>
+		/// <param name="address">This points to the IPaddress that will be filled in. It doesn't need to be set before calling this, but it must be allocated in memory.</param>
+		/// <param name="host">For connecting to a server, this is the hostname or IP in a string. For becoming a server, this is NULL. If you do use NULL, all network interfaces would be listened to for incoming connections, using the INADDR_ANY address.</param>
+		/// <param name="port">For connecting to a server, this is the the servers listening port number. For becoming a server, this is the port to listen on. If you are just doing Domain Name Resolution functions, this can be 0.</param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_ResolveHost(ref IPaddress address, string host, short port);
+		#endregion int SDLNet_ResolveHost(ref IPaddress address, string host, short port)
+		
+		#region string SDLNet_ResolveIP(ref IPaddress address)
+		/// <summary>
+		/// Resolve the IPv4 numeric address in address->host, and return the hostname as a string. 
+		/// </summary>
+		/// <remarks>
+		/// This is the best way to fill in the IPaddress struct for later use. This function does not actually open any sockets, it is used to prepare the arguments for the socket opening functions.
+		/// WARNING: this function will put the host and port into Network Byte Order into the address fields, so make sure you pass in the data in your hosts byte order. (normally not an issue)
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC const char * SDLCALL SDLNet_ResolveIP(IPaddress *ip);
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>a valid char pointer (string) on success. the returned hostname will have host and domain, as in "host.domain.ext". NULL is returned on errors, such as when it's not able to resolve the host name. The returned pointer is not to be freed. Each time you call this function the previous pointer's data will change to the new value, so you may have to copy it into a local buffer to keep it around longer.</returns>
+		/// <example>
+		/// <code>
+		/// // resolve the host name of the address in ipaddress
+		/// //IPaddress ipaddress;
+		/// char *host;
+		/// if(!(host=SDLNet_ResolveIP(IPaddress))) {
+		/// 	printf("SDLNet_ResolveIP: %s\n", SDLNet_GetError());
+		///     exit(1);
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_ResolveHost"/>
+		/// <seealso cref="IPaddress"/>
+		/// <param name="address">This points to the IPaddress that will be resolved to a host name. The address->port is ignored.</param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern string SDLNet_ResolveIP(ref IPaddress address);
+		#endregion string SDLNet_ResolveIP(ref IPaddress address)
+		#endregion Name Resolution
+				
+		#region TCP Sockets
+		#region IntPtr SDLNet_TCP_Open(ref IPaddress ip)
+		/// <summary>
+		/// Open a TCP client or server socket 
+		/// </summary>
+		/// <remarks>
+		/// Connect to the host and port contained in ip using a TCP connection.
+		/// If the host is INADDR_ANY, then only the port number is used, and a socket is created that can be used to later accept incoming TCP connections.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC TCPsocket SDLCALL SDLNet_TCP_Open(IPaddress *ip)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>a valid TCPsocket on success, which indicates a successful connection has been established, or a socket has been created that is valid to accept incoming TCP connections. NULL is returned on errors, such as when it's not able to create a socket, or it cannot connect to host and/or port contained in ip.</returns>
+		/// <example>
+		/// <code>
+		/// // connect to localhost at port 9999 using TCP (client)
+		/// IPaddress ip;
+		/// TCPsocket tcpsock;
+		/// 
+		/// if(SDLNet_ResolveHost(&ip,"localhost",9999)==-1) {
+		///     printf("SDLNet_ResolveHost: %s\n", SDLNet_GetError());
+		///     exit(1);
+		/// }
+		/// 
+		/// tcpsock=SDLNet_TCP_Open(&ip);
+		/// if(!tcpsock) {
+		///     printf("SDLNet_TCP_Open: %s\n", SDLNet_GetError());
+		///     exit(2);
+		/// }
+		/// </code>
+		///
+		/// <code>
+		/// // create a listening TCP socket on port 9999 (server)
+		/// IPaddress ip;
+		/// TCPsocket tcpsock;
+		/// 
+		/// if(SDLNet_ResolveHost(&ip,NULL,9999)==-1) {
+		///     printf("SDLNet_ResolveHost: %s\n", SDLNet_GetError());
+		///     exit(1);
+		/// }
+		/// 
+		/// tcpsock=SDLNet_TCP_Open(&ip);
+		/// if(!tcpsock) {
+		///     printf("SDLNet_TCP_Open: %s\n", SDLNet_GetError());
+		///     exit(2);
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_TCP_Accept"/>
+		/// <seealso cref="SDLNet_TCP_Close"/>
+		/// <seealso cref="IPaddress"/>
+		/// <seealso cref="TCPsocket"/>
+		/// 
+		/// <param name="ip">This points to the IPaddress that contains the resolved IP address and port number to use.</param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SDLNet_TCP_Open(ref IPaddress ip);
+		#endregion IntPtr SDLNet_TCP_Open(ref IPaddress ip)
+
+		#region IntPtr SDLNet_TCP_Accept(IntPtr server)
+		/// <summary>
+		/// Accept a connection on a server socket 
+		/// </summary>
+		/// <remarks>
+		/// Accept an incoming connection on the server TCPsocket.
+		/// Do not use this function on a connected socket. 
+		/// Server sockets are never connected to a remote host. 
+		/// What you get back is a new TCPsocket that is connected to the remote host.
+		/// This is a non-blocking call, so if no connections are there to be accepted,
+		/// you will get a NULL
+		/// TCPsocket and the program will continue going.
+		///
+		/// Accept an incoming connection on the given server socket.
+		/// The newly created socket is returned, or NULL if there was an error.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC TCPsocket SDLCALL SDLNet_TCP_Accept(TCPsocket server)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>a valid TCPsocket on success, which indicates a successful connection has been established. NULL is returned on errors, such as when it's not able to create a socket, or it cannot finish connecting to the originating host and port. There also may not be a connection attempt in progress, so of course you cannot accept nothing, and you get a NULL in this case as well.</returns>
+		/// <example>
+		/// <code>
+		/// // accept a connection coming in on server_tcpsock
+		/// TCPsocket new_tcpsock;
+		/// 
+		/// new_tcpsock=SDLNet_TCP_Accept(server_tcpsock);
+		/// if(!new_tcpsock) {
+		///     printf("SDLNet_TCP_Accept: %s\n", SDLNet_GetError());
+		/// }
+		/// else {
+		///     // communicate over new_tcpsock
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_TCP_Open"/>
+		/// <seealso cref="SDLNet_TCP_Close"/>
+		/// <seealso cref="SDLNet_TCP_GetPeerAddress"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="server">
+		/// This is the server TCPsocket which was previously created by
+		/// SDLNet_TCP_Open.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SDLNet_TCP_Accept(TCPsocket server);
+		#endregion IntPtr SDLNet_TCP_Accept(TCPsocket server)
+
+		#region IntPtr SDLNet_TCP_GetPeerAddress(TCPsocket sock)
+		/// <summary>
+		/// Get the remote host address and port number 
+		/// </summary>
+		/// <remarks>
+		/// Get the Peer's (the other side of the connection, 
+		/// the remote side, not the local side) IP address and port number.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC IPaddress * SDLCALL SDLNet_TCP_GetPeerAddress(TCPsocket sock)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// an IPaddress. NULL is returned on errors, or when sock is a server socket.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // get the remote IP and port
+		/// //TCPsocket new_tcpsock;
+		/// IPaddress *remote_ip;
+		/// 
+		/// remote_ip=SDLNet_TCP_GetPeerAddress(new_tcpsock);
+		/// if(!remote_ip) {
+		///     printf("SDLNet_TCP_GetPeerAddress: %s\n", SDLNet_GetError());
+		///     printf("This may be a server socket.\n");
+		/// }
+		/// else {
+		///     // print the info in IPaddress or something else...
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_TCP_Open"/>
+		/// <seealso cref="SDLNet_TCP_Accept"/>
+		/// <seealso cref="IPaddress"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="sock">
+		/// This is a valid TCPsocket.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SDLNet_TCP_GetPeerAddress(TCPsocket sock);
+		#endregion IntPtr SDLNet_TCP_GetPeerAddress(TCPsocket sock)
+
+		#region int SDLNet_TCP_Send(TCPsocket sock, IntPtr data, int len)
+		/// <summary>
+		/// Send data over a connected socket 
+		/// </summary>
+		/// <remarks>
+		/// Send data of length len over the socket sock.
+		/// This routine is not used for server sockets.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC int SDLCALL SDLNet_TCP_Send(TCPsocket sock, const void *data, int len)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the number of bytes sent. If the number returned is less than len,
+		/// then an error occured, such as the client disconnecting.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // send a hello over sock
+		/// //TCPsocket sock;
+		/// int len,result;
+		/// char *msg="Hello!";
+		/// 
+		/// len=strlen(msg)+1; // add one for the terminating NULL
+		/// result=SDLNet_TCP_Send(sock,msg,len);
+		/// if(result<len) {
+		///     printf("SDLNet_TCP_Send: %s\n", SDLNet_GetError());
+		///     // It may be good to disconnect sock because it is likely invalid now.
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_TCP_Open"/>
+		/// <seealso cref="SDLNet_TCP_Close"/>
+		/// <seealso cref="SDLNet_TCP_Accept"/>
+		/// <seealso cref="SDLNet_TCP_Recv"/>
+		/// <seealso cref="SDLNet_TCP_GetPeerAddress"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="sock">
+		/// This is a valid, connected, TCPsocket.
+		/// </param>
+		/// <param name="data">
+		/// This is a pointer to the data to send over sock.
+		/// </param>
+		/// <param name="len">
+		/// This is the length (in bytes) of the data.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_TCP_Send(TCPsocket sock, IntPtr data, int len);
+		#endregion int SDLNet_TCP_Send(TCPsocket sock, IntPtr data, int len)
+
+		#region int SDLNet_TCP_Recv(TCPsocket sock, IntPtr data, int maxlen)
+		/// <summary>
+		/// Receive data from a connected socket 
+		/// </summary>
+		/// <remarks>Receive data of exactly length maxlen bytes from the socket sock, into the memory pointed to by data. This routine is not used for server sockets. Unless there is an error, or the connection is closed, the buffer will read maxlen bytes. If you read more than is sent from the other end, then it will wait until the full requested length is sent, or until the connection is closed from the other end. You may have to read 1 byte at a time for some applications, for instance, te [...]
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC int SDLCALL SDLNet_TCP_Recv(TCPsocket sock, void *data, int maxlen)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the number of bytes received. If the number returned is less than or equal to zero, then an error occured, or the remote host has closed the connection.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // receive some text from sock
+		/// //TCPsocket sock;
+		/// #define MAXLEN 1024
+		/// int result;
+		/// char msg[MAXLEN];
+		/// 
+		/// result=SDLNet_TCP_Recv(sock,msg,MAXLEN);
+		/// if(result<=0) {
+		///     // An error may have occured, but sometimes you can just ignore it
+		///     // It may be good to disconnect sock because it is likely invalid now.
+		/// }
+		/// printf("Received: \"%s\"\n",msg);
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_TCP_Open"/>
+		/// <seealso cref="SDLNet_TCP_Close"/>
+		/// <seealso cref="SDLNet_TCP_Accept"/>
+		/// <seealso cref="SDLNet_TCP_Send"/>
+		/// <seealso cref="SDLNet_TCP_GetPeerAddress"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="sock">
+		/// This is a valid, connected, TCPsocket.
+		/// </param>
+		/// <param name="data">
+		/// This is a pointer to the buffer that receives the data from sock.
+		/// </param>
+		/// <param name="maxlen">
+		/// This is the maximum length (in bytes) that will be read into data.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_TCP_Recv(TCPsocket sock, IntPtr data, int maxlen);
+		#endregion int SDLNet_TCP_Recv(TCPsocket sock, IntPtr data, int maxlen)
+
+		#region void SDLNet_TCP_Close(IntPtr sock)
+		/// <summary>
+		/// Close a TCP socket 
+		/// </summary>
+		/// <remarks>
+		/// This shutsdown, disconnects, and closes the TCPsocket sock. After this, you can be assured that this socket is not in use anymore. You can reuse the sock variable after this to open a new connection with SDLNet_TCP_Open. Do not try to use any other functions on a closed socket, as it is now invalid.
+		/// 
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC void SDLCALL SDLNet_TCP_Close(TCPsocket sock)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// nothing, this always succeeds for all we need to know.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // close the connection on sock
+		/// //TCPsocket sock;
+		/// 
+		/// SDLNet_TCP_Close(sock);
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_TCP_Close"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="sock">
+		/// A valid TCPsocket. This can be a server or client type socket.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void SDLNet_TCP_Close(IntPtr sock);
+		#endregion void SDLNet_TCP_Close(IntPtr sock)
+		#endregion TCP Sockets
+
+		#region UDP Packets
+		#region IntPtr SDLNet_AllocPacket(int size)
+		/// <summary>
+		/// Allocate a new UDP packet with a data buffer 
+		/// </summary>
+		/// <remarks>
+		/// Create (via malloc) a new UDPpacket with a data buffer of size bytes. The new packet should be freed using SDLNet_FreePacket when you are done using it.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC UDPpacket * SDLCALL SDLNet_AllocPacket(int size)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// a pointer to a new empty UDPpacket. NULL is returned on errors, such as out-of-memory.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // create a new UDPpacket to hold 1024 bytes of data
+		/// UDPpacket *packet;
+		/// 
+		/// packet=SDLNet_AllocPacket(1024);
+		/// if(!packet) {
+		///     printf("SDLNet_AllocPacket: %s\n", SDLNet_GetError());
+		///     // perhaps do something else since you can't make this packet
+		/// }
+		/// else {
+		///     // do stuff with this new packet
+		///     // SDLNet_FreePacket this packet when finished with it
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="IPaddress"/>
+		/// <seealso cref="SDLNet_AllocPacketV"/>
+		/// <seealso cref="SDLNet_ResizePacket"/>
+		/// <seealso cref="SDLNet_FreePacket"/>
+		/// <seealso cref="SDLNet_UDP_Send"/>
+		/// <seealso cref="SDLNet_UDP_SendV"/>
+		/// <param name="size">
+		/// Size, in bytes, of the data buffer to be allocated in the new UDPpacket. Zero is invalid.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SDLNet_AllocPacket(int size);
+		#endregion IntPtr SDLNet_AllocPacket(int size)
+
+		#region IntPtr SDLNet_ResizePacket(IntPtr packet, int newsize)
+		/// <summary>
+		/// Resize the data buffer in a UDPpacket 
+		/// </summary>
+		/// <remarks>
+		/// Resize a UDPpackets data buffer to size bytes. The old data buffer will not be retained, so the new buffer is invalid after this call.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC int SDLCALL SDLNet_ResizePacket(UDPpacket *packet, int newsize)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the new size of the data in the packet. If the number returned is less than what you asked for, that's an error.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Resize a UDPpacket to hold 2048 bytes of data
+		/// //UDPpacket *packet;
+		/// int newsize;
+		/// 
+		/// newsize=SDLNet_ResizePacket(packet, 2048);
+		/// if(newsize<2048) {
+		///     printf("SDLNet_ResizePacket: %s\n", SDLNet_GetError());
+		///     // perhaps do something else since you didn't get the buffer you wanted
+		/// }
+		/// else {
+		///     // do stuff with the resized packet
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="SDLNet_AllocPacket"/>
+		/// <seealso cref="SDLNet_AllocPacketV"/>
+		/// <seealso cref="SDLNet_FreePacket"/>
+		/// <param name="packet">
+		/// A pointer to the UDPpacket to be resized.
+		/// </param>
+		/// <param name="newsize">
+		/// The new desired size, in bytes, of the data buffer to be allocated in the UDPpacket.
+		/// Zero is invalid.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SDLNet_ResizePacket(IntPtr packet, int newsize);
+		#endregion IntPtr SDLNet_ResizePacket(IntPtr packet, int newsize)
+
+		#region IntPtr SDLNet_FreePacket(IntPtr packet)
+		/// <summary>
+		/// Free a previously allocated UDPpacket 
+		/// </summary>
+		/// <remarks>
+		/// Free a UDPpacket from memory. Do not use this UDPpacket after this function is called on it.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC void SDLCALL SDLNet_FreePacket(UDPpacket *packet)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// nothing, this always succeeds.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Free a UDPpacket
+		/// //UDPpacket *packet;
+		/// 
+		/// SDLNet_FreePacket(packet);
+		/// packet=NULL; //just to help you know that it is freed
+		/// </code>
+		/// </example>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="SDLNet_AllocPacket"/>
+		/// <seealso cref="SDLNet_AllocPacketV"/>
+		/// <seealso cref="SDLNet_FreePacketV"/>
+		/// <seealso cref="SDLNet_ResizePacket"/>
+		/// <param name="packet">
+		/// A pointer to the UDPpacket to be freed from memory.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SDLNet_FreePacket(IntPtr packet);
+		#endregion IntPtr SDLNet_FreePacket(IntPtr packet)
+
+		#region IntPtr SDLNet_AllocPacketV(int howmany, int size)
+		/// <summary>
+		/// Allocate a vector of UDPpackets 
+		/// </summary>
+		/// <remarks>
+		/// Create (via malloc) a vector of new UDPpackets, each with data buffers of size bytes. The new packet vector should be freed using SDLNet_FreePacketV when you are done using it. The returned vector is one entry longer than requested, for a terminating NULL.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC UDPpacket ** SDLCALL SDLNet_AllocPacketV(int howmany, int size)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// a pointer to a new empty UDPpacket vector. NULL is returned on errors, such as out-of-memory.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // create a new UDPpacket vector to hold 1024 bytes of data in 10 packets
+		/// UDPpacket **packetV;
+		/// 
+		/// packetV=SDLNet_AllocPacketV(10, 1024);
+		/// if(!packetV) {
+		///     printf("SDLNet_AllocPacketV: %s\n", SDLNet_GetError());
+		///     // perhaps do something else since you can't make this packet
+		/// }
+		/// else {
+		///     // do stuff with this new packet vector
+		///     // SDLNet_FreePacketV this packet vector when finished with it
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="IPaddress"/>
+		/// <seealso cref="SDLNet_AllocPacketV"/>
+		/// <seealso cref="SDLNet_ResizePacket"/>
+		/// <seealso cref="SDLNet_FreePacket"/>
+		/// <seealso cref="SDLNet_UDP_Send"/>
+		/// <seealso cref="SDLNet_UDP_SendV"/>
+		/// <param name="howmany">
+		/// The number of UDPpackets to allocate.
+		/// </param>
+		/// <param name="size">
+		/// Size, in bytes, of the data buffers to be allocated in the new UDPpackets.
+		/// Zero is invalid.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SDLNet_AllocPacketV(int howmany, int size);
+		#endregion IntPtr SDLNet_AllocPacketV(int howmany, int size)
+
+		#region IntPtr SDLNet_FreePacketV(IntPtr packetV)
+		/// <summary>
+		/// Free a vector of UDPpackets 
+		/// </summary>
+		/// <remarks>
+		/// Free a UDPpacket vector from memory. Do not use this UDPpacket vector, or any UDPpacket in it, after this function is called on it.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC void SDLCALL SDLNet_FreePacketV(UDPpacket **packetV)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// nothing, this always succeeds.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Free a UDPpacket vector
+		/// //UDPpacket **packet;
+		/// 
+		/// SDLNet_FreePacketV(packetV);
+		/// packetV=NULL; //just to help you know that it is freed
+		/// </code>
+		/// </example>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="SDLNet_AllocPacket"/>
+		/// <seealso cref="SDLNet_AllocPacketV"/>
+		/// <seealso cref="SDLNet_FreePacket"/>
+		/// <seealso cref="SDLNet_ResizePacket"/>
+		/// <param name="packetV">
+		/// A pointer to the UDPpacket to be freed from memory.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SDLNet_FreePacketV(IntPtr packetV);
+		#endregion IntPtr SDLNet_FreePacketV(IntPtr packetV)
+		#endregion UDP Packets
+
+		#region UDP Sockets
+		#region IntPtr SDLNet_UDP_Open(short port)
+		/// <summary>
+		/// Create a UDP socket 
+		/// </summary>
+		/// <remarks>Open a socket to be used for UDP packet sending and/or receiving. 
+		/// If a non-zero port is given it will be used, otherwise any open port
+		/// number will be used automatically. Unlike TCP sockets, this socket
+		/// does not require a remote host IP to connect to, this is because UDP
+		/// ports are never actually connected like TCP ports are. This socket
+		/// is able to send and receive directly after this simple creation.
+		///
+		/// If 'port' is non-zero, the UDP socket is bound to a local port. 
+		/// The 'port' should be given in native byte order, but is used
+		/// internally in network (big endian) byte order, in addresses, etc.
+		/// This allows other systems to send to this socket via a known port.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC UDPsocket SDLCALL SDLNet_UDP_Open(Uint16 port)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// a valid UDPsocket on success. NULL is returned on errors, 
+		/// such as when it's not able to create a socket,
+		/// or it cannot assign the non-zero port as requested.
+		/// </returns>
+		/// <example>
+		/// Note that below I say server, but clients may also open
+		/// a specific port, though it is prefered that a client be
+		/// more flexible, given that the port may be already allocated
+		/// by another process, such as a server. In such a case you 
+		/// will not be able to open the socket, and your program 
+		/// will be stuck, so it is better to just use whatever port
+		/// you are given by using a specified port of zero. 
+		/// Then the client will always work. The client can inform 
+		/// the server what port to talk back to, or the server can
+		/// just look at the source of the packets it is receiving 
+		/// to know where to respond to.
+		/// <code>
+		/// // create a UDPsocket on port 6666 (server)
+		/// UDPsocket udpsock;
+		/// 
+		/// udpsock=SDLNet_UDP_Open(6666);
+		/// if(!udpsock) {
+		///     printf("SDLNet_UDP_Open: %s\n", SDLNet_GetError());
+		///     exit(2);
+		/// }
+		/// </code>
+		///
+		/// <code>
+		/// // create a UDPsocket on any available port (client)
+		/// UDPsocket udpsock;
+		/// 
+		/// udpsock=SDLNet_UDP_Open(0);
+		/// if(!udpsock) {
+		///     printf("SDLNet_UDP_Open: %s\n", SDLNet_GetError());
+		///     exit(2);
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_UDP_Close"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <param name="port">
+		/// This is the port number (in native byte order) on which to receive UDP
+		/// packets. Most servers will want to use a known port number here so that
+		/// clients can easily communicate with the server. This can also be zero,
+		/// which then opens an anonymous unused port number, to most likely be
+		/// used to send UDP packets from.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SDLNet_UDP_Open(short port);
+		#endregion IntPtr SDLNet_UDP_Open(short port)
+
+		#region int SDLNet_UDP_Bind(IntPtr sock, int channel, ref IPaddress address)
+		/// <summary>
+		/// Assign an IP address number to a socket channel 
+		/// </summary> 
+		/// <remarks>
+		/// Bind an address to a channel on a socket. 
+		/// Incoming packets are only allowed from bound addresses for the socket channel.
+		/// All outgoing packets on that channel,
+		/// regardless of the packets internal address, 
+		/// will attempt to send once on each bound address on that channel.
+		/// You may assign up to SDLNET_MAX_UDPADDRESSES to each channel. 
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///    	extern DECLSPEC int SDLCALL SDLNet_UDP_Bind(UDPsocket sock, int channel, IPaddress *address)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// The channel number that was bound. -1 is returned on errors, such as no free channels, or this channel has SDLNET_MAX_UDPADDRESSES already assigned to it, or you have used a channel higher or equal to SDLNET_MAX_UDPCHANNELS, or lower than -1.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Bind address to the first free channel
+		/// //UDPsocket udpsock;
+		/// //IPaddress *address;
+		/// int channel;
+		/// 
+		/// channel=SDLNet_UDP_Bind(udpsock, -1, address);
+		/// if(channel==-1) {
+		///     printf("SDLNet_UDP_Bind: %s\n", SDLNet_GetError());
+		///     // do something because we failed to bind
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_UDP_Unbind"/>
+		/// <seealso cref="SDLNet_UDP_GetPeerAddress"/>
+		/// <seealso cref="SDLNet_UDP_Open"/>
+		/// <seealso cref="IPaddress"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <param name="sock">
+		/// the UDPsocket on which to assign the address.
+		/// </param>
+		/// <param name="channel">The channel to assign address to. This should be less than SDLNET_MAX_UDPCHANNELS. If -1 is used, then the first unbound channel will be used, this should only be used for incomming packet filtering, as it will find the first channel with less than SDLNET_MAX_UDPADDRESSES assigned to it and use that one.
+		/// </param>
+		/// <param name="address">
+		/// The resolved IPaddress to assign to the socket's channel. 
+		/// The host and port are both used. 
+		/// It is not helpful to bind 0.0.0.0 to a channel.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_UDP_Bind(IntPtr sock, int channel, ref IPaddress address);
+		#endregion int SDLNet_UDP_Bind(IntPtr sock, int channel, ref IPaddress address)
+
+		#region void SDLNet_UDP_Unbind(IntPtr sock, int channel)
+		/// <summary>
+		/// Remove all assigned IP addresses from a socket channel 
+		/// </summary> 
+		/// <remarks>
+		/// This removes all previously assigned (bound) addresses 
+		/// from a socket channel.
+		/// After this you may bind new addresses to the socket 
+		/// channel.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///    	extern DECLSPEC void SDLCALL SDLNet_UDP_Unbind(UDPsocket sock, int channel)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// nothing, this always succeeds.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // unbind all addresses on the UDPsocket channel 0
+		/// //UDPsocket udpsock;
+		/// 
+		/// SDLNet_UDP_Unbind(udpsock, 0);
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_UDP_Bind"/>
+		/// <seealso cref="SDLNet_UDP_Close"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <param name="sock">
+		/// A valid UDPsocket to unbind addresses from.
+		/// </param>
+		/// <param name="channel">
+		/// The channel to unbind the addresses from in the UDPsocket.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void SDLNet_UDP_Unbind(IntPtr sock, int channel);
+		#endregion void SDLNet_UDP_Unbind(IntPtr sock, int channel)
+
+		#region IntPtr SDLNet_UDP_GetPeerAddress(IntPtr sock, int channel)
+		/// <summary>
+		/// Get the assigned IP address for a socket channel or get 
+		/// the port you opened the socket with 
+		/// </summary> 
+		/// <remarks>
+		/// Get the primary address assigned to this channel. 
+		/// Only the first bound address is returned.
+		/// When channel is -1, get the port that this socket 
+		/// is bound to on the local computer, 
+		/// this only means something if you opened the socket 
+		/// with a specific port number.
+		/// Do not free the returned IPaddress pointer.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///    	extern DECLSPEC IPaddress * SDLCALL SDLNet_UDP_GetPeerAddress(UDPsocket sock, int channel)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// a pointer to an IPaddress. 
+		/// NULL is returned for unbound channels and on any errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // get the primary address bound to UDPsocket channel 0
+		/// 
+		/// //UDPsocket udpsock;
+		/// //IPaddress *address;
+		/// 
+		/// address=SDLNet_UDP_GetPeerAddress(udpsock, 0);
+		/// if(!address) {
+		///     printf("SDLNet_UDP_GetPeerAddress: %s\n", SDLNet_GetError());
+		///     // do something because we failed to get the address
+		/// }
+		/// else {
+		///     // perhaps print out address->host and address->port
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_UDP_Unbind"/>
+		/// <seealso cref="SDLNet_UDP_Bind"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <param name="sock">
+		/// A valid UDPsocket that probably has an address assigned to the channel.
+		/// </param>
+		/// <param name="channel">
+		/// The channel to get the primary address from in the socket. 
+		/// This may also be -1 to get the port which this socket is 
+		/// bound to on the local computer.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SDLNet_UDP_GetPeerAddress(IntPtr sock, int channel);
+		#endregion IntPtr SDLNet_UDP_GetPeerAddress(IntPtr sock, int channel)
+
+		#region int SDLNet_UDP_SendV(IntPtr sock, IntPtr packets, int npackets)
+		/// <summary>
+		/// Send a UDPpacket vector 
+		/// </summary> 
+		/// <remarks>
+		/// Send npackets of packetV using the specified sock socket. 
+		/// Each packet is sent in the same way as in SDLNet_UDP_Send
+		/// (see section 3.4.6 SDLNet_UDP_Send).
+		/// Don't forget to set the length of the packets in the len
+		/// element of the packets you are sending!
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///    	extern DECLSPEC int SDLCALL SDLNet_UDP_SendV(UDPsocket sock, UDPpacket **packets, int npackets)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// The number of destinations sent to that worked, 
+		/// for each packet in the vector, all summed up. 
+		/// 0 is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // send a vector of 10 packets using UDPsocket
+		/// //UDPsocket udpsock;
+		/// //UDPpacket **packetV;
+		/// int numsent;
+		/// 
+		/// numsent=SDLNet_UDP_SendV(udpsock, packetV, 10);
+		/// if(!numsent) {
+		///     printf("SDLNet_UDP_SendV: %s\n", SDLNet_GetError());
+		///     // do something because we failed to send
+		///     // this may just be because no addresses are bound to the channels...
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_UDP_Bind"/>
+		/// <seealso cref="SDLNet_UDP_Send"/>
+		/// <seealso cref="SDLNet_UDP_Recv"/>
+		/// <seealso cref="SDLNet_UDP_RecvV"/>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <param name="sock">
+		/// A valid UDPsocket.
+		/// </param>
+		/// <param name="packets">
+		/// The vector of packets to send.
+		/// </param>
+		/// <param name="npackets">
+		/// number of packets in the packetV vector to send.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_UDP_SendV(IntPtr sock, IntPtr packets, int npackets);
+		#endregion int SDLNet_UDP_SendV(IntPtr sock, IntPtr packets, int npackets)
+
+		#region int SDLNet_UDP_Send(IntPtr sock, int channel, IntPtr packet)
+		/// <summary>
+		/// Send a UDPpacket
+		/// </summary> 
+		/// <remarks>
+		/// Send packet using the specified socket sock, using the 
+		/// specified channel or else the packet's address.
+		/// If channel is not -1 then the packet is sent to all the 
+		/// socket channels bound addresses. If socket sock's channel 
+		/// is not bound to any destinations, then the packet is not 
+		/// sent at all!
+		/// If the channel is -1, then the packet's address is used 
+		/// as the destination.
+		/// Don't forget to set the length of the packet in the len 
+		/// element of the packet you are sending! NOTE: the packet->channel 
+		/// will be set to the channel passed in to this function.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///    	extern DECLSPEC int SDLCALL SDLNet_UDP_Send(UDPsocket sock, int channel, UDPpacket *packet)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// The number of destinations sent to that worked. 
+		/// 0 is returned on errors.Note that since a channel can 
+		/// point to multiple destinations, there should be just as
+		/// many packets sent, so dont assume it will always return 1 
+		/// on success. Unfortunately there's no way to get the number
+		/// of destinations bound to a channel, so either you have to
+		/// remember the number bound, or just test for the zero 
+		/// return value indicating all channels failed.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // send a packet using a UDPsocket, using the packet's channel as the channel
+		/// //UDPsocket udpsock;
+		/// //UDPpacket *packet;
+		/// int numsent;
+		/// 
+		/// numsent=SDLNet_UDP_Send(udpsock, packet->channel, packet);
+		/// if(!numsent) {
+		///     printf("SDLNet_UDP_Send: %s\n", SDLNet_GetError());
+		///     // do something because we failed to send
+		///     // this may just be because no addresses are bound to the channel...
+		/// }
+		/// </code>
+		/// Here's a way of sending one packet using it's internal channel setting.
+		/// This is actually what SDLNet_UDP_Send ends up calling for you.
+		/// <code>
+		/// // send a packet using a UDPsocket, using the packet's channel as the channel
+		/// //UDPsocket udpsock;
+		/// //UDPpacket *packet;
+		/// int numsent;
+		/// 
+		/// numsent=SDLNet_UDP_SendV(sock, &packet, 1);
+		/// if(!numsent) {
+		///     printf("SDLNet_UDP_SendV: %s\n", SDLNet_GetError());
+		///     // do something because we failed to send
+		///     // this may just be because no addresses are bound to the channel...
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_UDP_Bind"/>
+		/// <seealso cref="SDLNet_UDP_SendV"/>
+		/// <seealso cref="SDLNet_UDP_Recv"/>
+		/// <seealso cref="SDLNet_UDP_RecvV"/>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <param name="sock">
+		/// A valid UDPsocket.
+		/// </param>
+		/// <param name="channel">
+		/// what channel to send packet on.
+		/// </param>
+		/// <param name="packet">
+		/// The packet to send.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_UDP_Send(IntPtr sock, int channel, IntPtr packet);
+		#endregion int SDLNet_UDP_Send(IntPtr sock, int channel, IntPtr packet)
+
+		#region int SDLNet_UDP_RecvV(IntPtr sock, IntPtr packets)
+		/// <summary>
+		/// Receive into a UDPpacket vector 
+		/// </summary> 
+		/// <remarks>
+		/// Receive into a packet vector on the specified socket sock.
+		/// packetV is a NULL terminated array. Packets will be 
+		/// received until the NULL is reached, or there are none
+		/// ready to be received.
+		/// This call is otherwise the same as SDLNet_UDP_Recv 
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///    	extern DECLSPEC int SDLCALL SDLNet_UDP_RecvV(UDPsocket sock, UDPpacket **packets)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the number of packets received. 
+		/// 0 is returned when no packets are received.
+		/// -1 is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // try to receive some waiting udp packets
+		/// //UDPsocket udpsock;
+		/// //UDPpacket **packetV;
+		/// int numrecv, i;
+		/// 
+		/// numrecv=SDLNet_UDP_RecvV(udpsock, &packetV);
+		/// if(numrecv==-1) {
+		///     // handle error, perhaps just print out the SDL_GetError string.
+		/// }
+		/// for(i=0; i<numrecv; i++) {
+		///     // do something with packetV[i]
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_UDP_Bind"/>
+		/// <seealso cref="SDLNet_UDP_Send"/>
+		/// <seealso cref="SDLNet_UDP_SendV"/>
+		/// <seealso cref="SDLNet_UDP_Recv"/>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <param name="sock">
+		/// A valid UDPsocket.
+		/// </param>
+		/// <param name="packets">
+		/// The packet vector to receive into.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_UDP_RecvV(IntPtr sock, IntPtr packets);
+		#endregion int SDLNet_UDP_RecvV(IntPtr sock, IntPtr packets)
+
+		#region int SDLNet_UDP_Recv(IntPtr sock, IntPtr packet)
+		/// <summary>
+		/// Receive into a UDPpacket 
+		/// </summary> 
+		/// <remarks>
+		/// Receive a packet on the specified sock socket.
+		/// The packet you pass in must have enough of a data size 
+		/// allocated for the incoming packet data to fit into. 
+		/// This means you should have knowledge of your size needs
+		/// before trying to receive UDP packets.
+		/// The packet will have it's address set to the remote 
+		/// sender's address.
+		/// The socket's channels are checked in highest to lowest 
+		/// order, so if an address is bound to multiple channels,
+		/// the highest channel with the source address bound will 
+		/// be retreived before the lower bound channels. So, the 
+		/// packets channel will also be set to the highest numbered
+		/// channel that has the remote address and port assigned to
+		/// it. Otherwise the channel will -1, which you can filter 
+		/// out easily if you want to ignore unbound source address.
+		/// Note that the local and remote channel numbers do not have
+		/// to, and probably won't, match, as they are only local
+		/// settings, they are not sent in the packet.
+		/// This is a non-blocking call, meaning if there's no data
+		/// ready to be received the function will return.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///    	extern DECLSPEC int SDLCALL SDLNet_UDP_Recv(UDPsocket sock, UDPpacket *packet)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// 1 is returned when a packet is received.
+		/// 0 is returned when no packets are received.
+		/// -1 is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // try to receive some waiting udp packets
+		/// //UDPsocket udpsock;
+		/// //UDPpacket packet;
+		/// int numrecv;
+		/// 
+		/// numrecv=SDLNet_UDP_Recv(udpsock, &packet);
+		/// if(numrecv) {
+		///     // do something with packet
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_UDP_Bind"/>
+		/// <seealso cref="SDLNet_UDP_Send"/>
+		/// <seealso cref="SDLNet_UDP_SendV"/>
+		/// <seealso cref="SDLNet_UDP_RecvV"/>
+		/// <seealso cref="UDPpacket"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <param name="sock">
+		/// A valid UDPsocket.
+		/// </param>
+		/// <param name="packet">
+		/// The packet to receive into.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_UDP_Recv(IntPtr sock, IntPtr packet);
+		#endregion int SDLNet_UDP_Recv(IntPtr sock, IntPtr packet)
+
+		#region void SDLNet_UDP_Close(IntPtr sock)
+		/// <summary>
+		/// Close and free a UDP socket 
+		/// </summary>
+		/// <remarks>
+		/// Shutdown, close, and free a UDPsocket.
+		/// Don't use the UDPsocket after calling this, 
+		/// except to open a new one.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC void SDLCALL SDLNet_UDP_Close(UDPsocket sock)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// nothing, this always succeeds.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // unbind all addresses on the UDPsocket channel 0
+		/// //UDPsocket udpsock;
+		/// 
+		/// SDLNet_UDP_Close(udpsock);
+		/// udpsock=NULL; //this helps us know that this UDPsocket is not valid anymore
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_UDP_Open"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <param name="sock">
+		/// A valid UDPsocket to shutdown, close, and free.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void SDLNet_UDP_Close(IntPtr sock);
+		#endregion void SDLNet_UDP_Close(IntPtr sock)
+		#endregion UDP Sockets
+		
+		#region Socket Sets
+		#region SDLNet_SocketSet SDLNet_AllocSocketSet(int maxsockets)
+		/// <summary>
+		/// Create a new socket set 
+		/// </summary>
+		/// <remarks>
+		/// Create a socket set that will be able to watch up to 
+		/// maxsockets number of sockets. The same socket set can 
+		/// be used for both UDP and TCP sockets.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC SDLNet_SocketSet SDLCALL SDLNet_AllocSocketSet(int maxsockets)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// A new, empty, SDLNet_SocketSet. NULL is returned on errors, such as out-of-memory.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Create a socket set to handle up to 16 sockets
+		/// SDLNet_SocketSet set;
+		/// 
+		/// set=SDLNet_AllocSocketSet(16);
+		/// if(!set) {
+		///     printf("SDLNet_AllocSocketSet: %s\n", SDLNet_GetError());
+		///     exit(1); //most of the time this is a major error, but do what you want.
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_FreeSocketSet"/>
+		/// <seealso cref="SDLNet_AddSocket"/>
+		/// <seealso cref="SDLNet_SocketSet"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="maxsockets">
+		/// The maximum number of sockets you will want to watch.
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern SDLNet_SocketSet SDLNet_AllocSocketSet(int maxsockets);
+		#endregion SDLNet_SocketSet SDLNet_AllocSocketSet(int maxsockets)
+
+		#region int SDLNet_AddSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock)
+		/// <summary>
+		/// Add a socket to a socket set 
+		/// </summary>
+		/// <remarks>
+		/// Add a socket to a socket set that will be watched. 
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC int SDLCALL SDLNet_AddSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the number of sockets used in the set on success. -1 is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // add two sockets to a socket set
+		/// //SDLNet_SocketSet set;
+		/// //UDPsocket udpsock;
+		/// //TCPsocket tcpsock;
+		/// int numused;
+		/// 
+		/// numused=SDLNet_UDP_AddSocket(set,udpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_AddSocket: %s\n", SDLNet_GetError());
+		///     // perhaps you need to restart the set and make it bigger...
+		/// }
+		/// numused=SDLNet_TCP_AddSocket(set,tcpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_AddSocket: %s\n", SDLNet_GetError());
+		///     // perhaps you need to restart the set and make it bigger...
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_AllocSocketSet"/>
+		/// <seealso cref="SDLNet_DelSocket"/>
+		/// <seealso cref="SDLNet_CheckSockets"/>
+		/// <seealso cref="SDLNet_SocketSet"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="set">
+		/// The socket set to add this socket to
+		/// </param>
+		/// <param name="sock">
+		/// The socket to add to the socket set
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_AddSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock);
+		#endregion int SDLNet_AddSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock)
+
+		#region int SDLNet_TCP_AddSocket(SDLNet_SocketSet set, IntPtr sock)
+		/// <summary>
+		/// Add a socket to a socket set 
+		/// </summary>
+		/// <remarks>
+		/// Add a socket to a socket set that will be watched. 
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     #define SDLNet_TCP_AddSocket(set, sock) SDLNet_AddSocket(set, (SDLNet_GenericSocket)sock)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the number of sockets used in the set on success. -1 is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // add two sockets to a socket set
+		/// //SDLNet_SocketSet set;
+		/// //UDPsocket udpsock;
+		/// //TCPsocket tcpsock;
+		/// int numused;
+		/// 
+		/// numused=SDLNet_UDP_AddSocket(set,udpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_AddSocket: %s\n", SDLNet_GetError());
+		///     // perhaps you need to restart the set and make it bigger...
+		/// }
+		/// numused=SDLNet_TCP_AddSocket(set,tcpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_AddSocket: %s\n", SDLNet_GetError());
+		///     // perhaps you need to restart the set and make it bigger...
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_AllocSocketSet"/>
+		/// <seealso cref="SDLNet_DelSocket"/>
+		/// <seealso cref="SDLNet_CheckSockets"/>
+		/// <seealso cref="SDLNet_SocketSet"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="set">
+		/// The socket set to add this socket to
+		/// </param>
+		/// <param name="sock">
+		/// The socket to add to the socket set
+		/// </param>
+		public static int SDLNet_TCP_AddSocket(SDLNet_SocketSet set, IntPtr sock)
+		{
+			SdlNet.SDLNet_GenericSocket genericSocket = (SdlNet.SDLNet_GenericSocket)Marshal.PtrToStructure(sock, typeof(SdlNet.SDLNet_GenericSocket));
+			return SdlNet.SDLNet_AddSocket(set, genericSocket);
+		}
+		#endregion int SDLNet_TCP_AddSocket(SDLNet_SocketSet set, IntPtr sock)
+
+		#region int SDLNet_UDP_AddSocket(SDLNet_SocketSet set, IntPtr sock)
+		/// <summary>
+		/// Add a socket to a socket set 
+		/// </summary>
+		/// <remarks>
+		/// Add a socket to a socket set that will be watched. 
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     #define SDLNet_UDP_AddSocket(set, sock) SDLNet_AddSocket(set, (SDLNet_GenericSocket)sock)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the number of sockets used in the set on success. -1 is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // add two sockets to a socket set
+		/// //SDLNet_SocketSet set;
+		/// //UDPsocket udpsock;
+		/// //TCPsocket tcpsock;
+		/// int numused;
+		/// 
+		/// numused=SDLNet_UDP_AddSocket(set,udpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_AddSocket: %s\n", SDLNet_GetError());
+		///     // perhaps you need to restart the set and make it bigger...
+		/// }
+		/// numused=SDLNet_TCP_AddSocket(set,tcpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_AddSocket: %s\n", SDLNet_GetError());
+		///     // perhaps you need to restart the set and make it bigger...
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_AllocSocketSet"/>
+		/// <seealso cref="SDLNet_DelSocket"/>
+		/// <seealso cref="SDLNet_CheckSockets"/>
+		/// <seealso cref="SDLNet_SocketSet"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="set">
+		/// The socket set to add this socket to
+		/// </param>
+		/// <param name="sock">
+		/// The socket to add to the socket set
+		/// </param>
+		public static int SDLNet_UDP_AddSocket(SDLNet_SocketSet set, IntPtr sock)
+		{
+			SdlNet.SDLNet_GenericSocket genericSocket = (SdlNet.SDLNet_GenericSocket)Marshal.PtrToStructure(sock, typeof(SdlNet.SDLNet_GenericSocket));
+			return SdlNet.SDLNet_AddSocket(set, genericSocket);
+		}		
+		#endregion int SDLNet_UDP_AddSocket(SDLNet_SocketSet set, IntPtr sock)
+
+		#region int SDLNet_DelSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock)
+		/// <summary>
+		/// Remove a socket from a socket set 
+		/// </summary>
+		/// <remarks>
+		/// Free the socket set from memory.
+		/// Do not reference the set after this call, 
+		/// except to allocate a new one. 
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC int SDLCALL SDLNet_DelSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the number of sockets used in the set on success. -1 is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // remove two sockets from a socket set
+		/// //SDLNet_SocketSet set;
+		/// //UDPsocket udpsock;
+		/// //TCPsocket tcpsock;
+		/// int numused;
+		/// 
+		/// numused=SDLNet_UDP_DelSocket(set,udpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_DelSocket: %s\n", SDLNet_GetError());
+		///     // perhaps the socket is not in the set
+		/// }
+		/// numused=SDLNet_TCP_DelSocket(set,tcpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_DelSocket: %s\n", SDLNet_GetError());
+		///     // perhaps the socket is not in the set
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_AddSocket"/>
+		/// <seealso cref="SDLNet_FreeSocketSet"/>
+		/// <seealso cref="SDLNet_SocketSet"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="set">
+		/// The socket set to remove this socket from 
+		/// </param>
+		/// <param name="sock">
+		/// the socket to remove from the socket set  
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void SDLNet_DelSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock);
+		#endregion void SDLNet_DelSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock)
+
+		#region int SDLNet_TCP_DelSocket(SDLNet_SocketSet set, IntPtr sock)
+		/// <summary>
+		/// Remove a socket from a socket set 
+		/// </summary>
+		/// <remarks>
+		/// Free the socket set from memory.
+		/// Do not reference the set after this call, 
+		/// except to allocate a new one. 
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     #define SDLNet_TCP_DelSocket(set, sock) SDLNet_DelSocket(set, (SDLNet_GenericSocket)sock)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the number of sockets used in the set on success. -1 is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // remove two sockets from a socket set
+		/// //SDLNet_SocketSet set;
+		/// //UDPsocket udpsock;
+		/// //TCPsocket tcpsock;
+		/// int numused;
+		/// 
+		/// numused=SDLNet_UDP_DelSocket(set,udpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_DelSocket: %s\n", SDLNet_GetError());
+		///     // perhaps the socket is not in the set
+		/// }
+		/// numused=SDLNet_TCP_DelSocket(set,tcpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_DelSocket: %s\n", SDLNet_GetError());
+		///     // perhaps the socket is not in the set
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_AddSocket"/>
+		/// <seealso cref="SDLNet_FreeSocketSet"/>
+		/// <seealso cref="SDLNet_SocketSet"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="set">
+		/// The socket set to remove this socket from 
+		/// </param>
+		/// <param name="sock">
+		/// the socket to remove from the socket set  
+		/// </param>
+		public static void SDLNet_TCP_DelSocket(SDLNet_SocketSet set, IntPtr sock)
+		{
+			SdlNet.SDLNet_GenericSocket genericSocket = (SdlNet.SDLNet_GenericSocket)Marshal.PtrToStructure(sock, typeof(SdlNet.SDLNet_GenericSocket));
+			SdlNet.SDLNet_DelSocket(set, genericSocket);
+		}		
+		#endregion void SDLNet_TCP_DelSocket(SDLNet_SocketSet set, IntPtr sock)
+
+		#region int SDLNet_UDP_DelSocket(SDLNet_SocketSet set, IntPtr sock)
+		/// <summary>
+		/// Remove a socket from a socket set 
+		/// </summary>
+		/// <remarks>
+		/// Free the socket set from memory.
+		/// Do not reference the set after this call, 
+		/// except to allocate a new one. 
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     #define SDLNet_UDP_DelSocket(set, sock) SDLNet_DelSocket(set, (SDLNet_GenericSocket)sock)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the number of sockets used in the set on success. -1 is returned on errors.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // remove two sockets from a socket set
+		/// //SDLNet_SocketSet set;
+		/// //UDPsocket udpsock;
+		/// //TCPsocket tcpsock;
+		/// int numused;
+		/// 
+		/// numused=SDLNet_UDP_DelSocket(set,udpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_DelSocket: %s\n", SDLNet_GetError());
+		///     // perhaps the socket is not in the set
+		/// }
+		/// numused=SDLNet_TCP_DelSocket(set,tcpsock);
+		/// if(numused==-1) {
+		///     printf("SDLNet_DelSocket: %s\n", SDLNet_GetError());
+		///     // perhaps the socket is not in the set
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_AddSocket"/>
+		/// <seealso cref="SDLNet_FreeSocketSet"/>
+		/// <seealso cref="SDLNet_SocketSet"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="set">
+		/// The socket set to remove this socket from 
+		/// </param>
+		/// <param name="sock">
+		/// the socket to remove from the socket set  
+		/// </param>
+		public static void SDLNet_UDP_DelSocket(SDLNet_SocketSet set, IntPtr sock)
+		{
+			SdlNet.SDLNet_GenericSocket genericSocket = (SdlNet.SDLNet_GenericSocket)Marshal.PtrToStructure(sock, typeof(SdlNet.SDLNet_GenericSocket));
+			SdlNet.SDLNet_DelSocket(set, genericSocket);
+		}		
+		#endregion void SDLNet_UDP_DelSocket(SDLNet_SocketSet set, IntPtr sock)
+
+		#region int SDLNet_CheckSockets(SDLNet_SocketSet set, int timeout)
+		/// <summary>
+		/// Check and wait for sockets in a set to have activity 
+		/// </summary>
+		/// <remarks>
+		/// Check all sockets in the socket set for activity. If a non-zero timeout is given then this function will wait for activity, or else it will wait for timeout milliseconds. 
+		/// NOTE: "activity" also includes disconnections and other errors, which would be determined by a failed read/write attempt.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC int SDLCALL SDLNet_CheckSockets(SDLNet_SocketSet set, Uint32 timeout)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// the number of sockets with activity. -1 is returned on errors, and you may not get a meaningful error message. -1 is also returned for an empty set (nothing to check). 
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Wait for up to 1 second for network activity
+		/// //SDLNet_SocketSet set;
+		/// int numready;
+		/// 
+		/// numready=SDLNet_CheckSockets(set, 1000);
+		/// if(numready==-1) {
+		///     printf("SDLNet_CheckSockets: %s\n", SDLNet_GetError());
+		///     //most of the time this is a system error, where perror might help you.
+		///     perror("SDLNet_CheckSockets");
+		/// }
+		/// else if(numready) {
+		///     printf("There are %d sockets with activity!\n",numready);
+		///     // check all sockets with SDLNet_SocketReady and handle the active ones.
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_SocketReady"/>
+		/// <seealso cref="SDLNet_AddSocket"/>
+		/// <seealso cref="SDLNet_DelSocket"/>
+		/// <seealso cref="SDLNet_AllocSocketSet"/>
+		/// <seealso cref="SDLNet_SocketSet"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="set">
+		/// The socket set to check
+		/// </param>
+		/// <param name="timeout">
+		/// The amount of time (in milliseconds).
+		/// 0 means no waiting.
+		/// -1 means to wait over 49 days! (think about it)
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern int SDLNet_CheckSockets(SDLNet_SocketSet set, int timeout);
+		#endregion int SDLNet_CheckSockets(SDLNet_SocketSet set, int timeout)
+
+		#region int SDLNet_SocketReady(IntPtr sock)
+		/// <summary>
+		/// See if a socket has activity 
+		/// </summary>
+		/// <remarks>
+		/// Check whether a socket has been marked as active. This function should only be used on a socket in a socket set, and that set has to have had SDLNet_CheckSockets (see SDLNet_CheckSockets) called upon it.
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     #define SDLNet_SocketReady(sock) ((sock != NULL) && ((SDLNet_GenericSocket)sock)->ready)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// non-zero for activity. zero is returned for no activity.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // Wait forever for a connection attempt
+		/// //SDLNet_SocketSet set;
+		/// //TCPsocket serversock, client;
+		/// int numready;
+		/// 
+		/// numready=SDLNet_CheckSockets(set, 1000);
+		/// if(numready==-1) {
+		///     printf("SDLNet_CheckSockets: %s\n", SDLNet_GetError());
+		///     //most of the time this is a system error, where perror might help you.
+		///     perror("SDLNet_CheckSockets");
+		/// }
+		/// else if(numready) {
+		///     printf("There are %d sockets with activity!\n",numready);
+		///     // check all sockets with SDLNet_SocketReady and handle the active ones.
+		///     if(SDLNet_SocketReady(serversock)) {
+		///         client=SDLNet_TCP_Accept(serversock);
+		///         if(client) {
+		///             // play with the client.
+		///         }
+		///     }
+		/// }
+		/// </code>
+		/// To just quickly do network handling with no waiting, we do this.
+		/// <code>
+		/// // Check for, and handle UDP data
+		/// //SDLNet_SocketSet set;
+		/// //UDPsocket udpsock;
+		/// //UDPpacket *packet;
+		/// int numready, numpkts;
+		/// 
+		/// numready=SDLNet_CheckSockets(set, 0);
+		/// if(numready==-1) {
+		///     printf("SDLNet_CheckSockets: %s\n", SDLNet_GetError());
+		///     //most of the time this is a system error, where perror might help you.
+		///     perror("SDLNet_CheckSockets");
+		/// }
+		/// else if(numready) {
+		///     printf("There are %d sockets with activity!\n",numready);
+		///     // check all sockets with SDLNet_SocketReady and handle the active ones.
+		///     if(SDLNet_SocketReady(udpsock)) {
+		///         numpkts=SDLNet_UDP_Recv(udpsock,&packet);
+		///         if(numpkts) {
+		///             // process the packet.
+		///         }
+		///     }
+		/// }
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_CheckSockets"/>
+		/// <seealso cref="SDLNet_AddSocket"/>
+		/// <seealso cref="SDLNet_DelSocket"/>
+		/// <seealso cref="SDLNet_AllocSocketSet"/>
+		/// <seealso cref="SDLNet_SocketSet"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="sock">
+		/// The socket to check for activity.
+		/// Both UDPsocket and TCPsocket can be used with this function.
+		/// </param>
+		public static int SDLNet_SocketReady(IntPtr sock)
+		{
+			if (sock != IntPtr.Zero)
+			{
+				SdlNet.SDLNet_GenericSocket genericSocket = (SdlNet.SDLNet_GenericSocket)Marshal.PtrToStructure(sock, typeof(SdlNet.SDLNet_GenericSocket));
+				return genericSocket.ready;
+			}
+			else
+			{
+				return 0;
+			}
+		}		
+		#endregion int SDLNet_SocketReady(IntPtr sock)
+
+		#region void SDLNet_FreeSocketSet(SDLNet_SocketSet set)
+		/// <summary>
+		/// Free a socket set 
+		/// </summary>
+		/// <remarks>
+		/// Free the socket set from memory.
+		/// Do not reference the set after this call, 
+		/// except to allocate a new one. 
+		/// <p>Binds to C-function call in SDL_net.h:
+		///     <code>
+		///     extern DECLSPEC void SDLCALL SDLNet_FreeSocketSet(SDLNet_SocketSet set)
+		///     </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// nothing, this call always succeeds.
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // free a socket set
+		/// //SDLNet_SocketSet set;
+		/// 
+		/// SDLNet_FreeSocketSet(set);
+		/// set=NULL; //this helps us remember that this set is not allocated
+		/// </code>
+		/// </example>
+		/// <seealso cref="SDLNet_AllocSocketSet"/>
+		/// <seealso cref="SDLNet_AddSocket"/>
+		/// <seealso cref="SDLNet_SocketSet"/>
+		/// <seealso cref="UDPsocket"/>
+		/// <seealso cref="TCPsocket"/>
+		/// <param name="set">
+		/// The socket set to free from memory 
+		/// </param>
+		[DllImport(SDL_NET_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION), SuppressUnmanagedCodeSecurity]
+		public static extern void SDLNet_FreeSocketSet(SDLNet_SocketSet set);
+		#endregion void SDLNet_FreeSocketSet(SDLNet_SocketSet set)
+		#endregion Socket Sets		
+		#endregion SdlNet Methods
+
+        #region Not Yet implemented
+        //		/* Inline macro functions to read/write network data */
+//
+//		/* Warning, some systems have data access alignment restrictions */
+//#if defined(sparc) || defined(mips)
+//#define SDL_DATA_ALIGNED	1
+//#endif
+//#ifndef SDL_DATA_ALIGNED
+//#define SDL_DATA_ALIGNED	0
+//#endif
+//
+//		/* Write a 16 bit value to network packet buffer */
+//#if !SDL_DATA_ALIGNED
+//#define SDLNet_Write16(value, areap)	\
+//		(*(Uint16 *)(areap) = SDL_SwapBE16(value))
+//#else
+//#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+//#define SDLNet_Write16(value, areap)	\
+//do 					\
+//{					\
+//	Uint8 *area = (Uint8 *)(areap);	\
+//	area[0] = (value >>  8) & 0xFF;	\
+//	area[1] =  value        & 0xFF;	\
+//} while ( 0 )
+//#else
+//#define SDLNet_Write16(value, areap)	\
+//do 					\
+//{					\
+//	Uint8 *area = (Uint8 *)(areap);	\
+//	area[1] = (value >>  8) & 0xFF;	\
+//	area[0] =  value        & 0xFF;	\
+//} while ( 0 )
+//#endif
+//#endif /* !SDL_DATA_ALIGNED */
+//
+//		/* Write a 32 bit value to network packet buffer */
+//#if !SDL_DATA_ALIGNED
+//#define SDLNet_Write32(value, areap) 	\
+//		*(Uint32 *)(areap) = SDL_SwapBE32(value);
+//#else
+//#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+//#define SDLNet_Write32(value, areap) 	\
+//do					\
+//{					\
+//	Uint8 *area = (Uint8 *)(areap);	\
+//	area[0] = (value >> 24) & 0xFF;	\
+//	area[1] = (value >> 16) & 0xFF;	\
+//	area[2] = (value >>  8) & 0xFF;	\
+//	area[3] =  value       & 0xFF;	\
+//} while ( 0 )
+//#else
+//#define SDLNet_Write32(value, areap) 	\
+//do					\
+//{					\
+//	Uint8 *area = (Uint8 *)(areap);	\
+//	area[3] = (value >> 24) & 0xFF;	\
+//	area[2] = (value >> 16) & 0xFF;	\
+//	area[1] = (value >>  8) & 0xFF;	\
+//	area[0] =  value       & 0xFF;	\
+//} while ( 0 )
+//#endif
+//#endif /* !SDL_DATA_ALIGNED */
+//
+//		/* Read a 16 bit value from network packet buffer */
+//#if !SDL_DATA_ALIGNED
+//#define SDLNet_Read16(areap) 		\
+//		(SDL_SwapBE16(*(Uint16 *)(areap)))
+//#else
+//#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+//#define SDLNet_Read16(areap) 		\
+//	((((Uint8 *)areap)[0] <<  8) | ((Uint8 *)areap)[1] <<  0)
+//#else
+//#define SDLNet_Read16(areap) 		\
+//	((((Uint8 *)areap)[1] <<  8) | ((Uint8 *)areap)[0] <<  0)
+//#endif
+//#endif /* !SDL_DATA_ALIGNED */
+//
+//		/* Read a 32 bit value from network packet buffer */
+//#if !SDL_DATA_ALIGNED
+//#define SDLNet_Read32(areap) 		\
+//		(SDL_SwapBE32(*(Uint32 *)(areap)))
+//#else
+//#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+//#define SDLNet_Read32(areap) 		\
+//	((((Uint8 *)areap)[0] << 24) | (((Uint8 *)areap)[1] << 16) | \
+//	 (((Uint8 *)areap)[2] <<  8) |  ((Uint8 *)areap)[3] <<  0)
+//#else
+//#define SDLNet_Read32(areap) 		\
+//	((((Uint8 *)areap)[3] << 24) | (((Uint8 *)areap)[2] << 16) | \
+//	 (((Uint8 *)areap)[1] <<  8) |  ((Uint8 *)areap)[0] <<  0)
+//#endif
+        //#endif /* !SDL_DATA_ALIGNED */
+        #endregion Not Yet implemented
+    }
+}
diff --git a/src/Tao.Sdl/SdlTtf.cs b/src/Tao.Sdl/SdlTtf.cs
new file mode 100644
index 0000000..35b1162
--- /dev/null
+++ b/src/Tao.Sdl/SdlTtf.cs
@@ -0,0 +1,1830 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl 
+{
+	#region Class Documentation
+	/// <summary>
+	/// This library supports Sdl_ttf 2.0.8.
+	/// This library is a wrapper around the excellent FreeType 1.2 library,
+	///  available at: http://www.freetype.org
+	/// <p>
+	///	WARNING: There may be patent issues with using the FreeType library.
+	///	 Check the FreeType website for up-to-date details. 
+	///	 </p>
+	///	 <p>
+	///	This library allows you to use TrueType fonts to render text in SDL
+	///	 applications. 
+	/// </p>
+	/// <p>
+	///	Be careful when including fonts with your application, as many of 
+	///	them are copyrighted. 
+	///	The Microsoft fonts, for example, are not freely redistributable 
+	///	and even the free "web" 
+	///	fonts they provide are only redistributable in their special 
+	///	executable installer form (May 1998). 
+	///	There are plenty of freeware and shareware fonts available on the 
+	///	Internet though, and may suit your purposes. 
+	///	</p>
+	/// </summary>
+	/// <remarks>
+	/// SDL_ttf supports loading fonts from TrueType font files, 
+	/// normally ending in .ttf, though some .fon files are also valid for 
+	/// use. Note that most fonts are copyrighted, check the license on the 
+	/// font before you use and redistribute
+	/// </remarks>
+	#endregion Class Documentation
+	[SuppressUnmanagedCodeSecurityAttribute()]
+	public static class SdlTtf 
+	{
+		#region Private Constants
+		#region string SDL_TTF_NATIVE_LIBRARY
+		/// <summary>
+		///     Specifies SdlTtf's native library archive.
+		/// </summary>
+		/// <remarks>
+		///     Specifies SDL_ttf.dll everywhere; will be mapped via .config for mono.
+		/// </remarks>
+		private const string SDL_TTF_NATIVE_LIBRARY = "SDL_ttf.dll";
+		#endregion string SDL_TTF_NATIVE_LIBRARY
+
+		#region CallingConvention CALLING_CONVENTION
+		/// <summary>
+		///     Specifies the calling convention.
+		/// </summary>
+		/// <remarks>
+		///     Specifies <see cref="CallingConvention.Cdecl" /> 
+		///     for Windows and Linux.
+		/// </remarks>
+		private const CallingConvention CALLING_CONVENTION = 
+			CallingConvention.Cdecl;
+		#endregion CallingConvention CALLING_CONVENTION
+		#endregion Private Constants
+		
+		#region Public Constants
+		/// <summary>
+		/// Major Version
+		/// </summary>
+		public const int TTF_MAJOR_VERSION = 2;
+		/// <summary>
+		/// Minor Version
+		/// </summary>
+		public const int TTF_MINOR_VERSION = 0;
+		/// <summary>
+		/// Patch Version
+		/// </summary>
+		public const int TTF_PATCHLEVEL = 8;
+		/// <summary>
+		/// Used to indicate regular, normal, plain rendering style.
+		/// </summary>
+		public const byte TTF_STYLE_NORMAL = 0x00;
+		/// <summary>
+		/// Used to indicate bold rendering style. 
+		/// This is used a bitmask along with other styles.
+		/// </summary>
+		public const byte TTF_STYLE_BOLD = 0x01;
+		/// <summary>
+		/// Used to indicate italicized rendering style. 
+		/// This is used a bitmask along with other styles.
+		/// </summary>
+		public const byte TTF_STYLE_ITALIC = 0x02;
+		/// <summary>
+		/// Used to indicate underlined rendering style. 
+		/// This is used a bitmask along with other styles.
+		/// </summary>
+		public const byte TTF_STYLE_UNDERLINE = 0x04;
+		/// <summary>
+		/// This allows you to switch byte-order of UNICODE text data 
+		/// to native order, meaning the mode of your CPU. This is meant
+		/// to be used in a UNICODE string that you are using with the 
+		/// SDL_ttf API.
+		/// </summary>
+		public const int UNICODE_BOM_NATIVE = 0xFEFF;
+		/// <summary>
+		/// This allows you to switch byte-order of UNICODE text data to
+		///  swapped order, meaning the reversed mode of your CPU. 
+		///  So if your CPU is LSB, then the data will be interpreted
+		///   as MSB. This is meant to be used in a UNICODE string 
+		///   that you are using with the SDL_ttf API.
+		/// </summary>
+		public const int UNICODE_BOM_SWAPPED = 0xFFFE;
+		#endregion Public Constants
+
+		#region Public Structs
+		#region TTF_Font
+		/// <summary>
+		/// The opaque holder of a loaded font
+		/// </summary>
+		/// <remarks>
+		/// The opaque holder of a loaded font. You should always be using 
+		/// a pointer of this type, as in TTF_Font*, and not just plain 
+		/// TTF_Font. This stores the font data in a struct that is exposed
+		/// only by using the API functions to get information. 
+		/// You should not try to access the struct data directly, 
+		/// since the struct may change in different versions of the API, 
+		/// and thus your program would be unreliable.
+		/// <p>Struct in SDL_ttf.h
+		/// <code>struct _TTF_Font TTF_Font;
+		/// </code></p>
+		/// </remarks>
+		public struct TTF_Font 
+		{
+		}
+		#endregion TTF_Font
+		#endregion Public Structs
+	
+		#region SdlTtf Methods
+		#region SDL_version TTF_VERSION() 
+		/// <summary>
+		/// This method can be used to fill a version structure with the compile-time
+		/// version of the SDL_ttf library.
+		/// </summary>
+		/// <returns>
+		///     This function returns a <see cref="Sdl.SDL_version"/> struct containing the
+		///     compiled version number
+		/// </returns>
+		/// <remarks>
+		///     <p>
+		///     Binds to C-function call in SDL_ttf.h:
+		///     <code>#define SDL_TTF_VERSION(X)
+		/// {
+		/// (X)->major = SDL_TTF_MAJOR_VERSION;
+		/// (X)->minor = SDL_TTF_MINOR_VERSION;
+		/// (X)->patch = SDL_TTF_PATCHLEVEL;
+		/// }</code>
+		///     </p>
+		/// </remarks>
+		public static Sdl.SDL_version TTF_VERSION() 
+		{ 
+			Sdl.SDL_version sdlVersion = new Sdl.SDL_version();
+			sdlVersion.major = TTF_MAJOR_VERSION;
+			sdlVersion.minor = TTF_MINOR_VERSION;
+			sdlVersion.patch = TTF_PATCHLEVEL;
+			return sdlVersion;
+		} 
+		#endregion SDL_version TTF_VERSION() 
+
+		#region IntPtr TTF_Linked_VersionInternal()
+		//     const SDL_version * TTF_Linked_Version(void)
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, CallingConvention=CALLING_CONVENTION, EntryPoint="TTF_Linked_Version"), SuppressUnmanagedCodeSecurity]
+		private static extern IntPtr TTF_Linked_VersionInternal();
+		#endregion IntPtr TTF_Linked_VersionInternal()
+
+		#region SDL_version TTF_Linked_Version() 
+		/// <summary>
+		///     Using this you can compare the runtime version to the 
+		/// version that you compiled with.
+		/// </summary>
+		/// <returns>
+		///     This function gets the version of the dynamically 
+		/// linked SDL_ttf library in an <see cref="Sdl.SDL_version"/> struct.
+		/// </returns>
+		/// <remarks>
+		///     <p>
+		///     Binds to C-function call in SDL_ttf.h:
+		///     <code>const SDL_version * TTF_Linked_Version(void)</code>
+		///     </p>
+		/// </remarks>
+		public static Sdl.SDL_version TTF_Linked_Version() 
+		{ 
+			return (Sdl.SDL_version)Marshal.PtrToStructure(
+				TTF_Linked_VersionInternal(), 
+				typeof(Sdl.SDL_version)); 
+		} 
+		#endregion SDL_version TTF_Linked_Version() 
+
+		#region void TTF_ByteSwappedUNICODE(int swapped)
+		/// <summary>
+		/// This function tells the library whether UNICODE text is generally
+		/// byteswapped.  A UNICODE BOM character in a string will override
+		/// this setting for the remainder of that string.
+		/// </summary>
+		/// <remarks>
+		/// This function tells SDL_ttf whether UNICODE (Uint16 per character)
+		///  text is generally byteswapped. A UNICODE_BOM_NATIVE or 
+		///  UNICODE_BOM_SWAPPED character in a string will temporarily 
+		///  override this setting for the remainder of that string, 
+		///  however this setting will be restored for the next one. 
+		///  The default mode is non-swapped, native endianess of the CPU. 
+		///  <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  void TTF_ByteSwappedUNICODE(int swapped)
+		///  </code></p>
+		/// </remarks>
+		/// <param name="swapped">
+		/// if non-zero then UNICODE data is byte swapped relative to the 
+		/// CPU's native endianess.<p>
+		/// if zero, then do not swap UNICODE data, 
+		/// use the CPU's native endianess.</p>
+		/// </param>
+		/// <example>
+		/// <code>
+		/// // Turn on byte swapping for UNICODE text
+		/// TTF_ByteSwappedUNICODE(1);
+		/// </code>
+		/// </example>
+		/// <returns></returns>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void TTF_ByteSwappedUNICODE(int swapped);
+		#endregion void TTF_ByteSwappedUNICODE(int swapped)
+
+		#region int TTF_Init()
+		/// <summary>
+		/// Initialize the TTF engine - returns 0 if successful, -1 on error
+		/// </summary>
+		/// <remarks>
+		/// Initialize the truetype font API.
+		/// <p>
+		/// This must be called before using other functions in this 
+		/// library, excepting TTF_WasInit.</p>
+		/// <p>
+		/// SDL does not have to be initialized before this call.</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int TTF_Init()
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// if(TTF_Init()==-1) {
+		///		printf("TTF_Init: %s\n", TTF_GetError());
+		///		exit(2);
+		///	}
+		/// </code>
+		/// </example>
+		/// <returns>
+		/// 0 on success, -1 on errors 
+		/// </returns>
+		/// <seealso cref="TTF_WasInit"/>
+		/// <seealso cref="TTF_Quit"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_Init();
+		#endregion int TTF_Init()
+
+		#region IntPtr TTF_OpenFont(string file, int ptsize)
+		/// <summary>
+		/// Open a font file and create a font of the specified point size.
+		/// Some .fon fonts will have several sizes embedded in the file, so the
+		/// point size becomes the index of choosing which size.  
+		/// If the value
+		/// is too high, the last indexed size will be the default.
+		/// </summary>
+		/// <param name="file">File name to load font from.</param>
+		/// <param name="ptsize">Point size (based on 72DPI) to load font as.
+		///  This basically translates to pixel height.</param>
+		///  <remarks>
+		///  Load file for use as a font, at ptsize size. 
+		///  This is actually TTF_OpenFontIndex(file, ptsize, 0). 
+		///  This can load TTF and FON files.
+		///  <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  TTF_Font *TTF_OpenFont(const char *file, int ptsize)
+		///  </code></p>
+		///  </remarks>
+		///  <example>
+		/// <code>
+		/// // load font.ttf at size 16 into font
+		///		TTF_Font *font;
+		///		font=TTF_OpenFont("font.ttf", 16);
+		///		if(!font) 
+		///	{
+		///		printf("TTF_OpenFont: %s\n", TTF_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <returns>
+		/// a pointer to the font as a TTF_Font. NULL is returned on errors.
+		/// </returns>
+		/// <seealso cref="TTF_OpenFontIndex"/>
+		/// <seealso cref="TTF_OpenFontRW"/>
+		/// <seealso cref="TTF_CloseFont"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_OpenFont(string file, int ptsize);
+		#endregion IntPtr TTF_OpenFont(string file, int ptsize)
+
+		#region IntPtr TTF_OpenFontIndex(string file, int ptsize, long index)
+		/// <summary>
+		/// Open a font file and create a font of the specified point size.
+		/// Some .fon fonts will have several sizes embedded in the file, so the
+		/// point size becomes the index of choosing which size.  
+		/// If the value
+		/// is too high, the last indexed size will be the default.
+		/// </summary>
+		/// <param name="file">File name to load font from.</param>
+		/// <param name="ptsize">
+		/// Point size (based on 72DPI) to load font as.
+		/// This basically translates to pixel height.
+		/// </param>
+		/// <param name="index">
+		/// choose a font face from a multiple font face containing file. 
+		/// The first face is always index 0.
+		/// </param>
+		/// <remarks>
+		/// Load file, face index, for use as a font, at ptsize size. 
+		/// This is actually TTF_OpenFontIndexRW(SDL_RWFromFile(file), 
+		/// ptsize, index), but checks that the RWops it creates is 
+		/// not NULL. This can load TTF and FON files.
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  TTF_Font *TTF_OpenFontIndex(const char *file, int ptsize, long index)
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load font.ttf, face 0, at size 16 into font
+		///		TTF_Font *font;
+		///		font=TTF_OpenFontIndex("font.ttf", 16, 0);
+		///		if(!font) 
+		///	{
+		///		printf("TTF_OpenFontIndex: %s\n", TTF_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <returns>
+		/// a pointer to the font as a TTF_Font. NULL is returned on errors.
+		/// </returns>
+		/// <seealso cref="TTF_OpenFontIndexRW"/>
+		/// <seealso cref="TTF_OpenFont"/>
+		/// <seealso cref="TTF_CloseFont"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_OpenFontIndex(
+			string file, int ptsize, long index);
+		#endregion IntPtr TTF_OpenFontIndex(string file, int ptsize, long index)
+
+		#region IntPtr TTF_OpenFontRW(IntPtr src, int freesrc, int ptsize)
+		/// <summary>
+		/// Open a font file suing RWOps and create a font of the specified point size.
+		/// Some .fon fonts will have several sizes embedded in the file, so the
+		/// point size becomes the index of choosing which size.  
+		/// If the value
+		/// is too high, the last indexed size will be the default.
+		/// </summary>
+		/// <param name="src">The font is loaded from this.</param>
+		/// <param name="freesrc">
+		/// A non-zero value mean is will automatically close/free the 
+		/// src for you.
+		/// </param>
+		/// <param name="ptsize">
+		/// Point size (based on 72DPI) to load font as. 
+		/// This basically translates to pixel height.
+		/// </param>
+		/// <remarks>
+		/// Load src for use as a font, at ptsize size. 
+		/// This is actually TTF_OpenFontIndexRW(src, freesrc, ptsize, 0).
+		/// This can load TTF and FON formats.
+		/// Using SDL_RWops is not covered here, 
+		/// but they enable you to load from almost any source.
+		/// <p>
+		/// NOTE: src is not checked for NULL, so be careful.</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  TTF_Font *TTF_OpenFontRW(SDL_RWops *src, int freesrc, int ptsize)
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load font.ttf at size 16 into font
+		///		TTF_Font *font;
+		///		font=TTF_OpenFontRW(SDL_RWFromFile("font.ttf"), 1, 16);
+		///		if(!font) 
+		///	{
+		///		printf("TTF_OpenFontRW: %s\n", TTF_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <returns>
+		/// a pointer to the font as a TTF_Font. NULL is returned on errors.
+		/// </returns>
+		/// <seealso cref="TTF_OpenFontIndexRW"/>
+		/// <seealso cref="TTF_OpenFont"/>
+		/// <seealso cref="TTF_CloseFont"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_OpenFontRW(
+			IntPtr src, 
+			int freesrc, 
+			int ptsize);
+		#endregion IntPtr TTF_OpenFontRW(IntPtr src, int freesrc, int ptsize)
+
+		#region IntPtr TTF_OpenFontIndexRW(...)
+		/// <summary>
+		/// Open a font file using RWOps with an index and create 
+		/// a font of the specified point size.
+		/// Some .fon fonts will have several sizes embedded in the file, so the
+		/// point size becomes the index of choosing which size.  
+		/// If the value
+		/// is too high, the last indexed size will be the default.
+		/// </summary>
+		/// <param name="freesrc">
+		/// A non-zero value mean is will automatically close/free 
+		/// the src for you.
+		/// </param>
+		/// <param name="index">
+		/// choose a font face from a multiple font face containing file. 
+		/// The first face is always index 0.
+		/// </param>
+		/// <param name="src">The font is loaded from this.</param>
+		/// <param name="ptsize">
+		/// Point size (based on 72DPI) to load font as. 
+		/// This basically translates to pixel height.
+		/// </param>
+		/// <remarks>
+		/// Load src, face index, for use as a font, at ptsize size. 
+		/// This can load TTF and FON formats.
+		/// Using SDL_RWops is not covered here, 
+		/// but they enable you to load from almost any source.
+		/// 
+		/// NOTE: src is not checked for NULL, so be careful.
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  TTF_Font *TTF_OpenFontIndexRW(SDL_RWops *src, int freesrc, int ptsize, long index)
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // load font.ttf, face 0, at size 16 into font
+		///		TTF_Font *font;
+		///		font=TTF_OpenFontRW(SDL_RWFromFile("font.ttf"), 1, 16, 0);
+		///		if(!font) 
+		///	{
+		///		printf("TTF_OpenFontIndexRW: %s\n", TTF_GetError());
+		///		// handle error
+		///	}
+		/// </code>
+		/// </example>
+		/// <returns>
+		/// a pointer to the font as a TTF_Font. NULL is returned on errors.
+		/// </returns>
+		/// <seealso cref="TTF_OpenFontIndex"/>
+		/// <seealso cref="TTF_OpenFontRW"/>
+		/// <seealso cref="TTF_CloseFont"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_OpenFontIndexRW(
+			IntPtr src, int freesrc, int ptsize, long index);
+		#endregion IntPtr TTF_OpenFontIndexRW(...)
+
+		#region void TTF_SetFontStyle(IntPtr font, int style)
+		/// <summary>
+		/// Set the font style
+		/// This font style is implemented by modifying the font glyphs, and
+		/// doesn't reflect any inherent properties of the truetype font file.
+		/// </summary>
+		/// <param name="font">The loaded font to get the style of </param>
+		/// <param name="style">
+		/// A bitmask of the desired style composed 
+		/// from the TTF_STYLE_* defined values
+		/// </param>
+		/// <remarks>
+		/// Set the rendering style of the loaded font.
+		/// <p>
+		/// NOTE: Passing a NULL font into this function will cause a segfault.
+		/// </p>
+		/// <p>
+		/// NOTE: This will flush the internal cache of previously rendered
+		///  glyphs, even if there is no change in style, so it may be best 
+		///  to check the current style using TTF_GetFontStyle first.
+		///  </p>
+		/// <p>
+		/// NOTE: I've seen that combining TTF_STYLE_UNDERLINE with anything 
+		/// can cause a segfault, other combinations may also do this. 
+		/// Some brave soul may find the cause of this and fix it...
+		/// </p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  void TTF_SetFontStyle(TTF_Font *font, int style)
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // set the loaded font's style to bold italics
+		///		//TTF_Font *font;
+		///		TTF_SetFontStyle(font, TTF_STYLE_BOLD|TTF_STYLE_ITALIC);
+		///
+		///		// render some text in bold italics...
+		///
+		///		// set the loaded font's style back to normal
+		///		TTF_SetFontStyle(font, TTF_STYLE_NORMAL);
+		/// </code>
+		/// </example>
+		/// <seealso cref="TTF_GetFontStyle"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void TTF_SetFontStyle(IntPtr font, int style);
+		#endregion void TTF_SetFontStyle(IntPtr font, int style)
+
+		#region int TTF_GetFontStyle(IntPtr font)
+		/// <summary>
+		/// Retrieve the font style
+		/// This font style is implemented by modifying the font glyphs, and
+		/// doesn't reflect any inherent properties of the truetype font file.
+		/// </summary>
+		/// <remarks>
+		/// Get the rendering style of the loaded font.
+		///<p>
+		/// NOTE: Passing a NULL font into this function will cause a segfault.
+		/// </p>
+		/// </remarks>
+		/// <param name="font">The loaded font to get the style of </param>
+		/// <returns>
+		/// The style as a bitmask composed of the following masks:
+		/// <br>TTF_STYLE_BOLD</br>
+		/// <br>TTF_STYLE_ITALIC</br>
+		/// <br>TTF_STYLE_UNDERLINE</br>
+		/// <p>If no style is set then TTF_STYLE_NORMAL is returned.</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int TTF_GetFontStyle(TTF_Font *font)
+		///  </code></p>
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // get the loaded font's style
+		///		//TTF_Font *font;
+		///		int style;
+		///		style=TTF_GetFontStyle(font);
+		///		printf("The font style is:");
+		///		if(style==TTF_STYLE_NORMAL)
+		///		printf(" normal");
+		///		else 
+		///	{
+		///		if(style&TTF_STYLE_BOLD)
+		///		printf(" bold");
+		///		if(style&TTF_STYLE_ITALIC)
+		///		printf(" italic");
+		///		if(style&TTF_STYLE_UNDERLINE)
+		///		printf(" underline");
+		///	}
+		///	printf("\n");
+		/// </code>
+		/// </example>
+		/// <seealso cref="TTF_SetFontStyle"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_GetFontStyle(IntPtr font);
+		#endregion int TTF_GetFontStyle(IntPtr font)
+
+		#region int TTF_FontHeight(IntPtr font)
+		/// <summary>
+		/// Get the total height of the font - usually equal to point size
+		/// </summary>
+		/// <param name="font">
+		/// The loaded font to get the max height of 
+		/// </param>
+		/// <remarks>
+		/// Get the maximum pixel height of all glyphs of the loaded font. 
+		/// You may use this height for rendering text as close together 
+		/// vertically as possible, though adding at least one pixel height
+		///  to it will space it so they can't touch. Remember that SDL_ttf 
+		///  doesn't handle multiline printing, so you are responsible for 
+		///  line spacing, see the TTF_FontLineSkip as well.
+		/// <p>
+		/// NOTE: Passing a NULL font into this function will cause a segfault.</p>
+		/// </remarks>
+		/// <returns>
+		/// The maximum pixel height of all glyphs in the font.
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int TTF_FontHeight(TTF_Font *font)
+		///  </code></p>
+		/// </returns>
+		/// <example>
+		/// <code>
+		/// // get the loaded font's max height
+		///		//TTF_Font *font;
+		///		printf("The font max height is: %d\n", TTF_FontHeight(font));
+		/// </code>
+		/// </example>
+		/// <seealso cref="TTF_FontAscent"/>
+		/// <seealso cref="TTF_FontDescent"/>
+		/// <seealso cref="TTF_FontLineSkip"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_FontHeight(IntPtr font);
+		#endregion int TTF_FontHeight(IntPtr font)
+
+		#region int TTF_FontAscent(IntPtr font)
+		/// <summary>
+		/// Get font max ascent (y above origin).
+		/// Get the offset from the baseline to the top of the font
+		/// This is a positive value, relative to the baseline.
+		/// </summary>
+		/// <param name="font">The loaded font to get the ascent 
+		/// (height above baseline) of </param>
+		/// <remarks>
+		/// Get the maximum pixel ascent of all glyphs of the loaded font. 
+		/// This can also be interpreted as the distance from the top of 
+		/// the font to the baseline.
+		/// <p>
+		/// It could be used when drawing an individual glyph relative to 
+		/// a top point, by combining it with the glyph's maxy metric to 
+		/// resolve the top of the rectangle used when blitting the glyph 
+		/// on the screen.</p>
+		/// <p>
+		/// rect.y = top + TTF_FontAscent(font) - glyph_metric.maxy;
+		/// </p>
+		/// <p>NOTE: Passing a NULL font into this function will 
+		/// cause a segfault.</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int TTF_FontAscent(TTF_Font *font)
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // get the loaded font's max ascent
+		///		//TTF_Font *font;
+		///
+		///		printf("The font ascent is: %d\n", TTF_FontAscent(font));
+		/// </code>
+		/// </example>
+		/// <returns>
+		/// The maximum pixel ascent of all glyphs in the font.
+		/// </returns>
+		/// <seealso cref="TTF_FontHeight"/>
+		/// <seealso cref="TTF_FontDescent"/>
+		/// <seealso cref="TTF_FontLineSkip"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_FontAscent(IntPtr font);
+		#endregion int TTF_FontAscent(IntPtr font)
+
+		#region int TTF_FontDescent(IntPtr font)
+		/// <summary>
+		/// Get font min descent (y below origin).
+		/// Get the offset from the baseline to the bottom of the font
+		/// This is a negative value, relative to the baseline.
+		/// </summary>
+		/// <param name="font">
+		/// The loaded font to get the descent (height below baseline) of 
+		/// </param>
+		/// <remarks>
+		/// Get the maximum pixel descent of all glyphs of the loaded font. 
+		/// This can also be interpreted as the distance from the baseline 
+		/// to the bottom of the font.
+		/// It could be used when drawing an individual glyph relative to a 
+		/// bottom point, by combining it with the glyph's maxy metric 
+		/// to resolve the top of the rectangle used when blitting the 
+		/// glyph on the screen.
+		/// <p>
+		/// rect.y = bottom - TTF_FontDescent(font) - glyph_metric.maxy;
+		/// </p>
+		/// <p>NOTE: Passing a NULL font into this function will cause a segfault.</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int TTF_FontDescent(TTF_Font *font)
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // get the loaded font's max descent
+		///		//TTF_Font *font;
+		///
+		///		printf("The font descent is: %d\n", TTF_FontDescent(font));
+		/// </code>
+		/// </example>
+		/// <returns>
+		/// The maximum pixel height of all glyphs in the font.
+		/// </returns>
+		/// <seealso cref="TTF_FontHeight"/>
+		/// <seealso cref="TTF_FontAscent"/>
+		/// <seealso cref="TTF_FontLineSkip"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_FontDescent(IntPtr font);
+		#endregion int TTF_FontDescent(IntPtr font)
+
+		#region int TTF_FontLineSkip(IntPtr font)
+		/// <summary>
+		/// Get the recommended spacing between lines of text for this font.
+		/// </summary>
+		/// <param name="font">
+		/// The loaded font to get the line skip height of 
+		/// </param>
+		/// <remarks>
+		/// Get the reccomended pixel height of a rendered line of text 
+		/// of the loaded font. This is usually larger than the 
+		/// TTF_FontHeight of the font.
+		/// <p>
+		/// NOTE: Passing a NULL font into this function will cause a segfault.
+		/// </p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int TTF_FontLineSkip(TTF_Font *font)
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // get the loaded font's max descent
+		///		//TTF_Font *font;
+		///
+		///		printf("The font descent is: %d\n", TTF_FontDescent(font));
+		/// </code>
+		/// </example>
+		/// <returns>
+		/// The maximum pixel height of all glyphs in the font.
+		/// </returns>
+		/// <seealso cref="TTF_FontHeight"/>
+		/// <seealso cref="TTF_FontAscent"/>
+		/// <seealso cref="TTF_FontDescent"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_FontLineSkip(IntPtr font);
+		#endregion int TTF_FontLineSkip(IntPtr font)
+
+		#region long TTF_FontFaces(IntPtr font)
+		/// <summary>
+		/// Get the number of faces of the font
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  long TTF_FontFaces(TTF_Font *font)
+		///  </code></p>
+		///  </remarks>
+		///  <example>
+		/// <code>
+		/// 
+		/// </code>
+		/// </example>
+		/// <param name="font"></param>
+		/// <returns>Number of faces in a font</returns>
+		/// <seealso cref="TTF_FontFaceIsFixedWidth"/>
+		/// <seealso cref="TTF_FontFaceFamilyName"/>
+		/// <seealso cref="TTF_FontFaceStyleName"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern long TTF_FontFaces(IntPtr font);
+		#endregion long TTF_FontFaces(IntPtr font)
+
+		#region int TTF_FontFaceIsFixedWidth(IntPtr font)
+		/// <summary>
+		/// Get whether font is monospaced or not.
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int TTF_FontFaceIsFixedWidth(TTF_Font *font)
+		///  </code></p>
+		///  </remarks>
+		///  <example>
+		/// <code>
+		/// 
+		/// </code>
+		/// </example>
+		/// <param name="font"></param>
+		/// <returns>1 if true, 0 if false</returns>
+		/// <seealso cref="TTF_FontFaces"/>
+		/// <seealso cref="TTF_FontFaceFamilyName"/>
+		/// <seealso cref="TTF_FontFaceStyleName"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_FontFaceIsFixedWidth(IntPtr font);
+		#endregion int TTF_FontFaceIsFixedWidth(IntPtr font)
+
+		#region string TTF_FontFaceFamilyName(IntPtr font)
+		/// <summary>
+		/// Get current font face family name string.
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  char * TTF_FontFaceFamilyName(TTF_Font *font)
+		///  </code></p>
+		///  </remarks>
+		///  <example>
+		/// <code>
+		/// 
+		/// </code>
+		/// </example>
+		/// <param name="font"></param>
+		/// <returns>Name of font family</returns>
+		/// <seealso cref="TTF_FontFaces"/>
+		/// <seealso cref="TTF_FontFaceIsFixedWidth"/>
+		/// <seealso cref="TTF_FontFaceStyleName"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern string TTF_FontFaceFamilyName(IntPtr font);
+		#endregion string TTF_FontFaceFamilyName(IntPtr font)
+
+		#region string TTF_FontFaceStyleName(IntPtr font)
+		/// <summary>
+		/// Get current font face style name string.
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  char * TTF_FontFaceStyleName(TTF_Font *font)
+		///  </code></p>
+		///  </remarks>
+		///  <example>
+		/// <code>
+		/// 
+		/// </code>
+		/// </example>
+		/// <param name="font"></param>
+		/// <returns></returns>
+		/// <seealso cref="TTF_FontFaces"/>
+		/// <seealso cref="TTF_FontFaceIsFixedWidth"/>
+		/// <seealso cref="TTF_FontFaceFamilyName"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern string TTF_FontFaceStyleName(IntPtr font);
+		#endregion string TTF_FontFaceStyleName(IntPtr font)
+
+		#region int TTF_GlyphMetrics(...)
+		/// <summary>
+		/// Get individual font glyph metrics 
+		/// </summary>
+		/// <remarks>
+		/// To understand what these metrics mean, here is a useful link:
+		/// http://freetype.sourceforge.net/freetype2/docs/tutorial/step2.html
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int TTF_GlyphMetrics(TTF_Font *font, Uint16 ch, int *minx, int *maxx, int *miny, int *maxy, int *advance)
+		///  </code></p>
+		///  </remarks>
+		///  <example>
+		/// <code>
+		/// 
+		/// </code>
+		/// </example>
+		/// <param name="font"></param>
+		/// <param name="ch"></param>
+		/// <param name="minx"></param>
+		/// <param name="maxx"></param>
+		/// <param name="miny"></param>
+		/// <param name="maxy"></param>
+		/// <param name="advance"></param>
+		/// <returns></returns>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_GlyphMetrics(
+			IntPtr font, 
+			short ch,
+			out int minx, 
+			out int maxx, 
+			out int miny, 
+			out int maxy, 
+			out int advance);
+		#endregion int TTF_GlyphMetrics(...)
+
+		#region int TTF_SizeText(...)
+		/// <summary>
+		/// Get size of LATIN1 text string as would be rendered 
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h)
+		///  </code></p>
+		///  </remarks>
+		///  <example>
+		/// <code>
+		/// 
+		/// </code>
+		/// </example>
+		/// <param name="font"></param>
+		/// <param name="text"></param>
+		/// <param name="w"></param>
+		/// <param name="h"></param>
+		/// <returns></returns>
+		/// <seealso cref="TTF_SizeUTF8"/>
+		/// <seealso cref="TTF_SizeUNICODE"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_SizeText(
+			IntPtr font, 
+			[MarshalAs(UnmanagedType.LPWStr)] string text, 
+			out int w, out int h);
+		#endregion int TTF_SizeText(...)
+
+		#region int TTF_SizeUTF8(...)
+		/// <summary>
+		/// Get size of UTF8 text string as would be rendered
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int SDLCALL TTF_SizeUTF8(TTF_Font *font, const char *text, int *w, int *h)
+		///  </code></p>
+		///  </remarks>
+		///  <example>
+		/// <code>
+		/// 
+		/// </code>
+		/// </example>
+		/// <param name="font"></param>
+		/// <param name="text"></param>
+		/// <param name="w"></param>
+		/// <param name="h"></param>
+		/// <returns></returns>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_SizeUNICODE"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_SizeUTF8(
+			IntPtr font, 
+			[MarshalAs(UnmanagedType.LPWStr)] string text, 
+			out int w, out int h);
+		#endregion int TTF_SizeUTF8(...)
+
+		#region int TTF_SizeUNICODE(...)
+		/// <summary>
+		/// Get size of UNICODE text string as would be rendered 
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int SDLCALL TTF_SizeUNICODE(TTF_Font *font, const Uint16 *text, int *w, int *h)
+		///  </code></p>
+		///  </remarks>
+		///  <example>
+		/// <code>
+		/// 
+		/// </code>
+		/// </example>
+		/// <param name="font"></param>
+		/// <param name="text"></param>
+		/// <param name="w"></param>
+		/// <param name="h"></param>
+		/// <returns></returns>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_SizeUTF8"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_SizeUNICODE(
+			IntPtr font, 
+			[MarshalAs(UnmanagedType.LPWStr)] string text, 
+			out int w, 
+			out int h);
+		#endregion int TTF_SizeUNICODE(...)
+
+		#region IntPtr TTF_RenderText_Solid(...)
+		/// <summary>
+		/// Draw LATIN1 text in solid mode.
+		/// </summary>
+		/// <param name="font">
+		/// Font to render the text with.
+		///  A NULL pointer is not checked.
+		///  </param>
+		/// <param name="text">
+		/// The LATIN1 null terminated string to render.
+		/// </param>
+		/// <param name="fg">
+		/// The color to render the text in. This becomes colormap index 1.
+		/// </param>
+		/// <returns>
+		/// a pointer to a new SDL_Surface. 
+		/// NULL is returned on errors.
+		/// </returns>
+		/// <remarks>
+		/// <p>This function renders text using a TTF_Font.
+		/// This mode of rendering is:</p>
+		///	<p>Solid</p>
+		///	<p>Quick and Dirty</p>
+		///	<p>Create an 8-bit palettized surface and render the given
+		///	text at fast quality with the given font and color. 
+		///	The 0 pixel value is the colorkey, giving a transparent
+		///	background, and the 1 pixel value is set to the text
+		///	color. The colormap is set to have the desired 
+		///	foreground color at index 1, this allows you to 
+		///	change the color without having to render the text 
+		///	again. Colormap index 0 is of course not drawn, 
+		///	since it is the colorkey, and thus transparent, 
+		///	though it's actual color is 255 minus each RGB 
+		///	component of the foreground. This is the fastest 
+		/// rendering speed of all the rendering modes. This results in no box 
+		/// around the text, but the text is not as smooth. 
+		/// The resulting surface should blit faster than the Blended one. 
+		/// Use this mode for FPS and other fast changing updating text displays.</p> 
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * TTF_RenderText_Solid(TTF_Font *font, const char *text, SDL_Color fg)
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // Turn on byte swapping for UNICODE text
+		///		SDL_Surface *text_surface;
+		///		if(!(text_surface=TTF_RenderText_Solid(font,"Hello World!", &color))) 
+		///	{
+		///		//handle error here, perhaps print TTF_GetError at least
+		///	}
+		/// </code>
+		/// </example>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderUTF8_Solid"/>
+		/// <seealso cref="TTF_RenderUNICODE_Solid"/>
+		/// <seealso cref="TTF_RenderGlyph_Solid"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY,
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderText_Solid(
+			IntPtr font, string text, Sdl.SDL_Color fg);
+		#endregion IntPtr TTF_RenderText_Solid(...)
+
+		#region IntPtr TTF_RenderUTF8_Solid(...)
+		/// <summary>
+		/// Draw UTF8 text in solid mode.
+		/// </summary>
+		/// <remarks>
+		/// <p>This function renders text using a TTF_Font.
+		/// This mode of rendering is:</p>
+		///	<p>Solid</p>
+		///	<p>Quick and Dirty</p>
+		///	<p>Create an 8-bit palettized surface and render the given
+		///	text at fast quality with the given font and color. 
+		///	The 0 pixel value is the colorkey, giving a transparent
+		///	background, and the 1 pixel value is set to the text
+		///	color. The colormap is set to have the desired 
+		///	foreground color at index 1, this allows you to 
+		///	change the color without having to render the text 
+		///	again. Colormap index 0 is of course not drawn, 
+		///	since it is the colorkey, and thus transparent, 
+		///	though it's actual color is 255 minus each RGB 
+		///	component of the foreground. This is the fastest 
+		/// rendering speed of all the rendering modes. This results in no box 
+		/// around the text, but the text is not as smooth. 
+		/// The resulting surface should blit faster than the Blended one. 
+		/// Use this mode for FPS and other fast changing updating text displays.</p> 
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * TTF_RenderUTF8_Solid(TTF_Font *font,const char *text, SDL_Color fg)
+		///  </code></p>
+		///  </remarks>
+		/// <param name="font">
+		/// Font to render the text with.
+		///  A NULL pointer is not checked.
+		///  </param>
+		/// <param name="text">
+		/// The UTF8 null terminated string to render.
+		/// </param>
+		/// <param name="fg">
+		/// The color to render the text in. This becomes colormap index 1.
+		/// </param>
+		/// <returns>
+		/// a pointer to a new SDL_Surface. 
+		/// NULL is returned on errors.
+		/// </returns>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		/// <seealso cref="TTF_RenderUNICODE_Solid"/>
+		/// <seealso cref="TTF_RenderGlyph_Solid"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderUTF8_Solid(
+			IntPtr font, 
+			string text, Sdl.SDL_Color fg);
+		#endregion IntPtr TTF_RenderUTF8_Solid(...)
+
+		#region IntPtr TTF_RenderUNICODE_Solid(...)
+		/// <summary>
+		/// Draw UNICODE text in solid mode.
+		/// </summary>
+		/// <remarks>
+		/// <p>This function renders text using a TTF_Font.
+		/// This mode of rendering is:</p>
+		///	<p>Solid</p>
+		///	<p>Quick and Dirty</p>
+		///	<p>Create an 8-bit palettized surface and render the given
+		///	text at fast quality with the given font and color. 
+		///	The 0 pixel value is the colorkey, giving a transparent
+		///	background, and the 1 pixel value is set to the text
+		///	color. The colormap is set to have the desired 
+		///	foreground color at index 1, this allows you to 
+		///	change the color without having to render the text 
+		///	again. Colormap index 0 is of course not drawn, 
+		///	since it is the colorkey, and thus transparent, 
+		///	though it's actual color is 255 minus each RGB 
+		///	component of the foreground. This is the fastest 
+		/// rendering speed of all the rendering modes. This results in no box 
+		/// around the text, but the text is not as smooth. 
+		/// The resulting surface should blit faster than the Blended one. 
+		/// Use this mode for FPS and other fast changing updating text displays.</p> 
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * SDLCALL TTF_RenderUNICODE_Solid(TTF_Font *font, const Uint16 *text, SDL_Color fg)
+		///  </code></p>
+		///  </remarks>
+		/// <param name="font">
+		/// Font to render the text with.
+		///  A NULL pointer is not checked.
+		///  </param>
+		/// <param name="text">
+		/// The UNICODE null terminated string to render.
+		/// </param>
+		/// <param name="fg">
+		/// The color to render the text in. This becomes colormap index 1.
+		/// </param>
+		/// <returns>
+		/// This function returns the new surface, 
+		/// or NULL if there was an error.
+		/// </returns>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		/// <seealso cref="TTF_RenderUTF8_Solid"/>
+		/// <seealso cref="TTF_RenderGlyph_Solid"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderUNICODE_Solid(
+			IntPtr font, 
+			[MarshalAs(UnmanagedType.LPWStr)] 
+			string text, 
+			Sdl.SDL_Color fg);
+		#endregion IntPtr TTF_RenderUNICODE_Solid(...)
+
+		#region IntPtr TTF_RenderGlyph_Solid(...)
+		/// <summary>
+		/// Draw a UNICODE glyph in solid mode.
+		/// </summary>
+		/// <remarks>
+		/// <p>This function renders text using a TTF_Font.
+		/// This mode of rendering is:</p>
+		///	<p>Solid</p>
+		///	<p>Quick and Dirty</p>
+		///	<p>Create an 8-bit palettized surface and render the given
+		///	text at fast quality with the given font and color. 
+		///	The 0 pixel value is the colorkey, giving a transparent
+		///	background, and the 1 pixel value is set to the text
+		///	color. The colormap is set to have the desired 
+		///	foreground color at index 1, this allows you to 
+		///	change the color without having to render the text 
+		///	again. Colormap index 0 is of course not drawn, 
+		///	since it is the colorkey, and thus transparent, 
+		///	though it's actual color is 255 minus each RGB 
+		///	component of the foreground. This is the fastest 
+		/// rendering speed of all the rendering modes. This results in no box 
+		/// around the text, but the text is not as smooth. 
+		/// The glyph is rendered without any padding or
+		/// centering in the X direction, 
+		/// and aligned normally in the Y direction.
+		/// The resulting surface should blit faster than the Blended one. 
+		/// Use this mode for FPS and other fast changing updating text displays.</p> 
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * SDLCALL TTF_RenderGlyph_Solid(TTF_Font *font, Uint16 ch, SDL_Color fg)
+		///  </code></p>
+		///  </remarks>
+		/// <param name="font">Font to render glyph with.
+		///  A NULL pointer is not checked.</param>
+		/// <param name="ch">
+		/// The glyph to render
+		/// </param>
+		/// <param name="fg">
+		/// The color to render the text in. 
+		/// This becomes colormap index 1.
+		/// </param>
+		/// <returns>
+		/// This function returns the new surface, 
+		/// or NULL if there was an error.
+		/// </returns>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		/// <seealso cref="TTF_RenderUTF8_Solid"/>
+		/// <seealso cref="TTF_RenderUNICODE_Solid"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderGlyph_Solid(
+			IntPtr font, 
+			short ch, 
+			Sdl.SDL_Color fg);
+		#endregion IntPtr TTF_RenderGlyph_Solid(...)
+
+		#region IntPtr TTF_RenderText_Shaded(..)	
+		/// <summary>
+		/// Draw LATIN1 text in shaded mode.
+		/// </summary>
+		/// <remarks>
+		/// <p>Shaded</p> 
+		/// <p>Slow and Nice, but with a Solid Box</p>
+		/// <p>Create an 8-bit palettized surface and render the 
+		/// given text at high quality with the given font and colors.
+		///  The 0 pixel value is background, while other pixels have 
+		///  varying degrees of the foreground color from the background
+		///   color. This results in a box of the background color around
+		///    the text in the foreground color. The text is antialiased.
+		///     This will render slower than Solid, but in about the same
+		///      time as Blended mode. The resulting surface should blit 
+		///      as fast as Solid, once it is made. Use this when you need
+		///       nice text, and can live with a box...</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * TTF_RenderText_Shaded(TTF_Font *font, const char *text, SDL_Color fg, SDL_Color bg)
+		///  </code></p>
+		/// </remarks>
+		/// <param name="font">Font to render the text with.
+		///  A NULL pointer is not checked.</param>
+		/// <param name="fg">
+		/// The color to render the text in. 
+		/// This becomes colormap index 1.
+		/// </param>
+		/// <param name="bg">
+		/// The background color to render in.
+		/// </param>
+		/// <param name="text">
+		/// The LATIN1 null terminated string to render.
+		/// </param>
+		/// <returns>
+		/// This function returns the new surface, 
+		/// or NULL if there was an error.
+		/// </returns>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		/// <seealso cref="TTF_RenderUTF8_Shaded"/>
+		/// <seealso cref="TTF_RenderUNICODE_Shaded"/>
+		/// <seealso cref="TTF_RenderGlyph_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderText_Shaded(
+			IntPtr font, string text, 
+			Sdl.SDL_Color fg, Sdl.SDL_Color bg);
+		#endregion IntPtr TTF_RenderText_Shaded(..)
+
+		#region IntPtr TTF_RenderUTF8_Shaded(..)
+		/// <summary>
+		/// Draw UTF8 text in shaded mode.
+		/// </summary>
+		/// <remarks>
+		/// <p>Shaded</p> 
+		/// <p>Slow and Nice, but with a Solid Box</p>
+		/// <p>Create an 8-bit palettized surface and render the 
+		/// given text at high quality with the given font and colors.
+		///  The 0 pixel value is background, while other pixels have 
+		///  varying degrees of the foreground color from the background
+		///   color. This results in a box of the background color around
+		///    the text in the foreground color. The text is antialiased.
+		///     This will render slower than Solid, but in about the same
+		///      time as Blended mode. The resulting surface should blit 
+		///      as fast as Solid, once it is made. Use this when you need
+		///       nice text, and can live with a box...</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * TTF_RenderUTF8_Shaded(TTF_Font *font, const char *text, SDL_Color fg, SDL_Color bg)
+		///  </code></p>
+		/// </remarks>
+		/// <param name="font">Font to render the text with.
+		///  A NULL pointer is not checked.</param>
+		/// <param name="fg">
+		/// The color to render the text in. 
+		/// This becomes colormap index 1.
+		/// </param>
+		/// <param name="bg">
+		/// The background color to render in.
+		/// </param>
+		/// <param name="text">
+		/// The UTF8 null terminated string to render.
+		/// </param>
+		/// <returns>
+		/// This function returns the new surface, 
+		/// or NULL if there was an error.
+		/// </returns>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderUNICODE_Shaded"/>
+		/// <seealso cref="TTF_RenderGlyph_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderUTF8_Shaded(
+			IntPtr font, string text, 
+			Sdl.SDL_Color fg, Sdl.SDL_Color bg);
+		#endregion IntPtr TTF_RenderUTF8_Shaded(..)
+
+		#region IntPtr TTF_RenderUNICODE_Shaded(...)	
+		/// <summary>
+		/// Draw UNICODE text in shaded mode.
+		/// </summary>
+		/// <remarks>
+		/// <p>Shaded</p> 
+		/// <p>Slow and Nice, but with a Solid Box</p>
+		/// <p>Create an 8-bit palettized surface and render the 
+		/// given text at high quality with the given font and colors.
+		///  The 0 pixel value is background, while other pixels have 
+		///  varying degrees of the foreground color from the background
+		///   color. This results in a box of the background color around
+		///    the text in the foreground color. The text is antialiased.
+		///     This will render slower than Solid, but in about the same
+		///      time as Blended mode. The resulting surface should blit 
+		///      as fast as Solid, once it is made. Use this when you need
+		///       nice text, and can live with a box...</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * TTF_RenderUNICODE_Shaded(TTF_Font *font, const Uint16 *text, SDL_Color fg, SDL_Color bg)
+		///  </code></p>
+		/// </remarks>
+		/// <param name="font">Font to render the text with.
+		///  A NULL pointer is not checked.</param>
+		/// <param name="fg">
+		/// The color to render the text in. 
+		/// This becomes colormap index 1.
+		/// </param>
+		/// <param name="bg">
+		/// The background color to render in.
+		/// </param>
+		/// <param name="text">
+		/// The UNICODE string to render.
+		/// </param>
+		/// <returns>
+		/// This function returns the new surface, 
+		/// or NULL if there was an error.
+		/// </returns>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderUTF8_Shaded"/>
+		/// <seealso cref="TTF_RenderGlyph_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderUNICODE_Shaded(
+			IntPtr font, 
+			[MarshalAs(UnmanagedType.LPWStr)] 
+			string text, 
+			Sdl.SDL_Color fg, 
+			Sdl.SDL_Color bg);
+		#endregion IntPtr TTF_RenderUNICODE_Shaded(...)
+
+		#region IntPtr TTF_RenderGlyph_Shaded(...)
+		/// <summary>
+		/// Draw a UNICODE glyph in shaded mode.
+		/// </summary>
+		/// <remarks>
+		/// <p>Shaded</p> 
+		/// <p>Slow and Nice, but with a Solid Box</p>
+		/// <p>Create an 8-bit palettized surface and render the 
+		/// given text at high quality with the given font and colors.
+		///  The 0 pixel value is background, while other pixels have 
+		///  varying degrees of the foreground color from the background
+		///   color. This results in a box of the background color around
+		///    the text in the foreground color. The text is antialiased.
+		///     This will render slower than Solid, but in about the same
+		///      time as Blended mode. The resulting surface should blit 
+		///      as fast as Solid, once it is made. Use this when you need
+		///       nice text, and can live with a box...</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * TTF_RenderGlyph_Shaded(TTF_Font *font, Uint16 ch, SDL_Color fg, SDL_Color bg)
+		///  </code></p>
+		/// </remarks>
+		/// <param name="font">Font to render the text with.
+		///  A NULL pointer is not checked.</param>
+		/// <param name="fg">
+		/// The color to render the text in. 
+		/// This becomes colormap index 1.
+		/// </param>
+		/// <param name="bg">
+		/// The background color to render in.
+		/// </param>
+		/// <param name="ch">
+		/// The glyph to render.
+		/// </param>
+		/// <returns>
+		/// This function returns the new surface, 
+		/// or NULL if there was an error.
+		/// </returns>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderUTF8_Shaded"/>
+		/// <seealso cref="TTF_RenderUNICODE_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderGlyph_Shaded(
+			IntPtr font, short ch, 
+			Sdl.SDL_Color fg, Sdl.SDL_Color bg);
+		#endregion IntPtr TTF_RenderGlyph_Shaded(...)
+
+		#region IntPtr TTF_RenderText_Blended(...)
+		/// <summary>
+		/// Draw LATIN1 text in blended mode.
+		/// </summary>
+		/// <param name="font">
+		/// Font to render the text with.
+		///  A NULL pointer is not checked.
+		///  </param>
+		/// <param name="text">
+		/// The LATIN1 null terminated string to render.
+		/// </param>
+		/// <param name="fg">
+		/// The color to render the text in. This becomes colormap index 1.
+		/// </param>
+		/// <returns>
+		/// a pointer to a new SDL_Surface. 
+		/// NULL is returned on errors.
+		/// </returns>
+		/// <remarks>
+		/// <p>This function renders text using a TTF_Font.
+		/// This mode of rendering is:</p>
+		///	<p>Blended</p>
+		///	<p>Slow Slow Slow, but Ultra Nice over another image</p>
+		///	<p>Create a 32-bit ARGB surface and render the given text at high
+		///	 quality, using alpha blending to dither the font with the given 
+		///	 color. This results in a surface with alpha transparency, so you
+		///	  don't have a solid colored box around the text. The text is 
+		///	  antialiased. This will render slower than Solid, but in about 
+		///	  the same time as Shaded mode. The resulting surface will blit 
+		///	  slower than if you had used Solid or Shaded. Use this when you
+		///	   want high quality, and the text isn't changing too fast.</p> 
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * SDLCALL TTF_RenderText_Blended(TTF_Font *font, const char *text, SDL_Color fg)
+		///  </code></p>
+		/// </remarks>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderUTF8_Blended"/>
+		/// <seealso cref="TTF_RenderUNICODE_Blended"/>
+		/// <seealso cref="TTF_RenderGlyph_Blended"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderText_Blended(
+			IntPtr font, string text, Sdl.SDL_Color fg);
+		#endregion IntPtr TTF_RenderText_Blended(...)
+
+		#region IntPtr TTF_RenderUTF8_Blended(...)
+		/// <summary>
+		/// Draw UTF8 text in blended mode.
+		/// </summary>
+		/// <param name="font">
+		/// Font to render the text with.
+		///  A NULL pointer is not checked.
+		///  </param>
+		/// <param name="text">
+		/// The UTF8 null terminated string to render.
+		/// </param>
+		/// <param name="fg">
+		/// The color to render the text in. This becomes colormap index 1.
+		/// </param>
+		/// <returns>
+		/// a pointer to a new SDL_Surface. 
+		/// NULL is returned on errors.
+		/// </returns>
+		/// <remarks>
+		/// <p>This function renders text using a TTF_Font.
+		/// This mode of rendering is:</p>
+		///	<p>Blended</p>
+		///	<p>Slow Slow Slow, but Ultra Nice over another image</p>
+		///	<p>Create a 32-bit ARGB surface and render the given text at high
+		///	 quality, using alpha blending to dither the font with the given 
+		///	 color. This results in a surface with alpha transparency, so you
+		///	  don't have a solid colored box around the text. The text is 
+		///	  antialiased. This will render slower than Solid, but in about 
+		///	  the same time as Shaded mode. The resulting surface will blit 
+		///	  slower than if you had used Solid or Shaded. Use this when you
+		///	   want high quality, and the text isn't changing too fast.</p> 
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * SDLCALL TTF_RenderUTF8_Blended(TTF_Font *font, const char *text, SDL_Color fg)
+		///  </code></p>
+		/// </remarks>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		/// <seealso cref="TTF_RenderUNICODE_Blended"/>
+		/// <seealso cref="TTF_RenderGlyph_Blended"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderUTF8_Blended(
+			IntPtr font, string text, Sdl.SDL_Color fg);
+		#endregion IntPtr TTF_RenderUTF8_Blended(...)
+
+		#region IntPtr TTF_RenderUNICODE_Blended(...)
+		/// <summary>
+		/// Draw UNICODE text in blended mode.
+		/// </summary>
+		/// <param name="font">
+		/// Font to render the text with.
+		///  A NULL pointer is not checked.
+		///  </param>
+		/// <param name="text">
+		/// The UNICODE string to render.
+		/// </param>
+		/// <param name="fg">
+		/// The color to render the text in. This becomes colormap index 1.
+		/// </param>
+		/// <returns>
+		/// a pointer to a new SDL_Surface. 
+		/// NULL is returned on errors.
+		/// </returns>
+		/// <remarks>
+		/// <p>This function renders text using a TTF_Font.
+		/// This mode of rendering is:</p>
+		///	<p>Blended</p>
+		///	<p>Slow Slow Slow, but Ultra Nice over another image</p>
+		///	<p>Create a 32-bit ARGB surface and render the given text at high
+		///	 quality, using alpha blending to dither the font with the given 
+		///	 color. This results in a surface with alpha transparency, so you
+		///	  don't have a solid colored box around the text. The text is 
+		///	  antialiased. This will render slower than Solid, but in about 
+		///	  the same time as Shaded mode. The resulting surface will blit 
+		///	  slower than if you had used Solid or Shaded. Use this when you
+		///	   want high quality, and the text isn't changing too fast.</p> 
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * TTF_RenderUNICODE_Blended(TTF_Font *font, const Uint16 *text, SDL_Color fg)
+		///  </code></p>
+		/// </remarks>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		/// <seealso cref="TTF_RenderUTF8_Blended"/>
+		/// <seealso cref="TTF_RenderGlyph_Blended"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderUNICODE_Blended(
+			IntPtr font, 
+			[MarshalAs(UnmanagedType.LPWStr)] string text,
+			Sdl.SDL_Color fg);
+		#endregion IntPtr TTF_RenderUNICODE_Blended(...)
+
+		#region IntPtr TTF_RenderGlyph_Blended(...)
+		/// <summary>
+		/// Draw a UNICODE glyph in blended mode.
+		/// </summary>
+		/// <param name="font">
+		/// Font to render the text with.
+		///  A NULL pointer is not checked.
+		///  </param>
+		/// <param name="ch">
+		/// The glyph to render.
+		/// </param>
+		/// <param name="fg">
+		/// The color to render the text in. This becomes colormap index 1.
+		/// </param>
+		/// <returns>
+		/// a pointer to a new SDL_Surface. 
+		/// NULL is returned on errors.
+		/// </returns>
+		/// <remarks>
+		/// <p>This function renders text using a TTF_Font.
+		/// This mode of rendering is:</p>
+		///	<p>Blended</p>
+		///	<p>Slow Slow Slow, but Ultra Nice over another image</p>
+		///	<p>Create a 32-bit ARGB surface and render the given text at high
+		///	 quality, using alpha blending to dither the font with the given 
+		///	 color. This results in a surface with alpha transparency, so you
+		///	  don't have a solid colored box around the text. The text is 
+		///	  antialiased. This will render slower than Solid, but in about 
+		///	  the same time as Shaded mode. The resulting surface will blit 
+		///	  slower than if you had used Solid or Shaded. Use this when you
+		///	   want high quality, and the text isn't changing too fast.</p> 
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  SDL_Surface * TTF_RenderUNICODE_Blended(TTF_Font *font, const Uint16 *text, SDL_Color fg)
+		///  </code></p>
+		/// </remarks>
+		/// <seealso cref="TTF_SizeText"/>
+		/// <seealso cref="TTF_RenderText_Blended"/>
+		/// <seealso cref="TTF_RenderUTF8_Blended"/>
+		/// <seealso cref="TTF_RenderUNICODE_Blended"/>
+		/// <seealso cref="TTF_RenderText_Shaded"/>
+		/// <seealso cref="TTF_RenderText_Solid"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr TTF_RenderGlyph_Blended(
+			IntPtr font, 
+			short ch, 
+			Sdl.SDL_Color fg);
+		#endregion IntPtr TTF_RenderGlyph_Blended(...)
+
+		#region void TTF_CloseFont(IntPtr font)
+		/// <summary>
+		/// Close an opened font file
+		/// </summary>
+		/// <remarks>
+		/// Free the memory used by font, and free font itself as well. 
+		/// Do not use font after this without loading a new font to it.
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  void TTF_CloseFont(TTF_Font *font)
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// // free the font
+		///		// TTF_Font *font;
+		///		TTF_CloseFont(font);
+		///		font=NULL; // to be safe...
+		/// </code>
+		/// </example>
+		/// <param name="font">
+		/// Pointer to the TTF_Font to free.
+		/// </param>
+		/// <seealso cref="TTF_OpenFont"/>
+		/// <seealso cref="TTF_OpenFontIndex"/>
+		/// <seealso cref="TTF_OpenFontRW"/>
+		/// <seealso cref="TTF_CloseFont"/>
+		/// <seealso cref="TTF_OpenFontIndexRW"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void TTF_CloseFont(IntPtr font);
+		#endregion void TTF_CloseFont(IntPtr font)
+
+		#region void TTF_Quit()
+		/// <summary>
+		/// De-initialize the TTF engine
+		/// </summary>
+		/// <remarks>
+		/// Shutdown and cleanup the truetype font API.
+		/// <p>After calling this the SDL_ttf functions should not be used, 
+		/// excepting TTF_WasInit. You may, of course, 
+		/// use TTF_Init to use the functionality again.</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  void TTF_Quit() 
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// TTF_Quit();
+		/// // you could SDL_Quit(); here...or not.
+		/// </code>
+		/// </example>
+		/// <seealso cref="TTF_Init"/>
+		/// <seealso cref="TTF_WasInit"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void TTF_Quit();
+		#endregion void TTF_Quit()
+
+		#region int TTF_WasInit()
+		/// <summary>
+		/// Check if the TTF engine is initialized.
+		/// </summary>
+		/// <remarks>
+		/// Query the initilization status of the truetype font API.
+		/// <p>You may, of course, use this before TTF_Init to avoid 
+		/// initilizing twice in a row. Or use this to determine 
+		/// if you need to call TTF_Quit.</p>
+		/// <p>Binds to C-function in SDL_ttf.h
+		///  <code>
+		///  int TTF_WasInit() 
+		///  </code></p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// if(!TTF_WasInit() && TTF_Init()==-1) {
+		///		printf("TTF_Init: %s\n", TTF_GetError());
+		///		exit(1);
+		///	}
+		/// </code>
+		/// </example>
+		/// <returns></returns>
+		/// <seealso cref="TTF_Init"/>
+		/// <seealso cref="TTF_Quit"/>
+		[DllImport(SDL_TTF_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION),
+		SuppressUnmanagedCodeSecurity]
+		public static extern int TTF_WasInit();
+		#endregion int TTF_WasInit()
+
+		#region void TTF_SetError(string message)
+		/// <summary>
+		/// Set the current error string
+		/// </summary>
+		/// <remarks>
+		/// This is the same as SDL_SetError, which sets the error string
+		/// which may be fetched with TTF_GetError (or SDL_GetError). 
+		/// This functions acts like printf, except that it is limited to
+		///  SDL_ERRBUFIZE(1024) chars in length. It only accepts the 
+		///  following format types: %s, %d, %f, %p. No variations are 
+		///  supported, like %.2f would not work. For any more specifics 
+		///  read the SDL docs.
+		/// <p>Binds to C-function in SDL_image.h
+		/// <code>
+		/// void TTF_SetError(const char *fmt, ...)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <example>
+		/// <code>
+		/// int myfunc(int i) {
+		///		TTF_SetError("myfunc is not implemented! %d was passed in.",i);
+		///		return(-1);
+		///	}
+		/// </code></example>
+		/// <param name="message"></param>
+		/// <seealso cref="TTF_GetError"/>
+		public static void TTF_SetError(string message)
+		{
+			Sdl.SDL_SetError(message);
+		}
+		#endregion void TTF_SetError(string message)
+
+		#region string TTF_GetError()
+		/// <summary>
+		/// Get the current error string
+		/// </summary>
+		/// <remarks>
+		/// This is the same as SDL_GetError, which returns the last error set 
+		/// as a string which you may use to tell the user what happened when 
+		/// an error status has been returned from an SDL_ttf function call.
+		/// <p>Binds to C-function in SDL_ttf.h
+		/// <code>
+		/// char *TTF_GetError() 
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <returns>
+		/// a char pointer (string) containing a humam 
+		/// readable version or the reason for the last error that
+		///  occured.
+		///  </returns>
+		///  <example>
+		///  <code>
+		///  printf("Oh My Goodness, an error : %s", TTF_GetError());
+		///  </code>
+		///  </example>
+		/// <seealso cref="TTF_SetError"/>
+		public static string TTF_GetError()
+		{
+			return Sdl.SDL_GetError();
+		}
+		#endregion string TTF_GetError()
+		#endregion SdlTtfMethods
+	}
+}
diff --git a/src/Tao.Sdl/Smpeg.cs b/src/Tao.Sdl/Smpeg.cs
new file mode 100644
index 0000000..eab5011
--- /dev/null
+++ b/src/Tao.Sdl/Smpeg.cs
@@ -0,0 +1,1072 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl 
+{
+	#region Class Documentation
+	/// <summary>
+	/// SMPEG bindings for .NET. 
+	/// <p></p>
+	/// </summary>
+	/// <remarks>
+	/// </remarks>
+	#endregion Class Documentation
+	[SuppressUnmanagedCodeSecurityAttribute()]
+	public static class Smpeg 
+	{
+		#region Private Constants
+		#region string SMPEG_NATIVE_LIBRARY
+		/// <summary>
+		///     Specifies Smpeg's native library archive.
+		/// </summary>
+		/// <remarks>
+		///     Specifies smpeg.dll everywhere; will be mapped via .config for mono.
+		/// </remarks>
+		private const string SMPEG_NATIVE_LIBRARY = "smpeg.dll";
+		#endregion string SMPEG_NATIVE_LIBRARY
+
+		#region CallingConvention CALLING_CONVENTION
+		/// <summary>
+		///     Specifies the calling convention.
+		/// </summary>
+		/// <remarks>
+		///     Specifies <see cref="CallingConvention.Cdecl" /> 
+		///     for Windows and Linux.
+		/// </remarks>
+		private const CallingConvention CALLING_CONVENTION = 
+			CallingConvention.Cdecl;
+		#endregion CallingConvention CALLING_CONVENTION
+		#endregion Private Constants
+
+		#region Public Constants
+		#region MPEGfilter.h
+		/// <summary>
+		/// Filter info flag
+		/// </summary>
+		public const int SMPEG_FILTER_INFO_MB_ERROR = 1;
+		/// <summary>
+		/// Filter info flag
+		/// </summary>
+		public const int SMPEG_FILTER_INFO_PIXEL_ERROR = 2;
+		#endregion MPEGfilter.h
+
+		#region smpeg.h
+		/// <summary>
+		/// Major Version
+		/// </summary>
+		public const int SMPEG_MAJOR_VERSION = 0;
+		/// <summary>
+		/// Minor Version
+		/// </summary>
+		public const int SMPEG_MINOR_VERSION = 4;
+		/// <summary>
+		/// Patch Version
+		/// </summary>
+		public const int SMPEG_PATCHLEVEL = 5;
+		/// <summary>
+		/// MPEG status code. 
+		/// </summary>
+		/// <remarks>
+		/// Part of SMPEGstatus C-style enum
+		/// </remarks>
+		[CLSCompliant(false)]
+		public const int SMPEG_ERROR = -1;
+		/// <summary>
+		/// MPEG status code. 
+		/// </summary>
+		/// <remarks>
+		/// Part of SMPEGstatus C-style enum
+		/// </remarks>
+		public const int SMPEG_STOPPED = 0;
+		/// <summary>
+		/// MPEG status code. 
+		/// </summary>
+		/// <remarks>
+		/// Part of SMPEGstatus C-style enum
+		/// </remarks>
+		public const int SMPEG_PLAYING = 1;
+		#endregion smpeg.h
+		#endregion Public Constants
+
+		#region Public Structs
+		#region MPEGfilter.h
+		#region SMPEG_FilterInfo
+		/// <summary>
+		/// Filter info from SMPEG
+		/// </summary>
+		/// <remarks>
+		/// <p>Struct in MPEGfilter.h
+		/// <code>
+		/// typedef struct SMPEG_FilterInfo {
+		///		Uint16* yuv_mb_square_error;
+		///		Uint16* yuv_pixel_square_error;
+		///	}
+		/// </code>
+		/// </p>
+		/// </remarks>
+		public struct SMPEG_FilterInfo
+		{
+			/// <summary>
+			/// 
+			/// </summary>
+			public IntPtr yuv_mb_square_error;
+			/// <summary>
+			/// 
+			/// </summary>
+			public IntPtr yuv_pixel_square_error;
+		}
+		#endregion SMPEG_FilterInfo
+
+		#region SMPEG_Filter
+		/// <summary>
+		/// The filter definition itself
+		/// </summary>
+		/// <remarks>
+		/// <p>Struct in MPEGfilter.h
+		/// <code>
+		/// typedef struct SMPEG_Filter {
+		///		Uint32 flags;
+		///		void * data;
+		///		SMPEG_FilterCallback callback;
+		///		SMPEG_FilterDestroy destroy;
+		///	}
+		/// </code></p></remarks>
+		[CLSCompliant(false)]
+			public struct SMPEG_Filter
+		{
+			/// <summary>
+			/// 
+			/// </summary>
+			public int flags;
+			/// <summary>
+			/// 
+			/// </summary>
+			public object data;
+			/// <summary>
+			/// 
+			/// </summary>
+			public SMPEG_FilterCallback callback;
+			/// <summary>
+			/// 
+			/// </summary>
+			public SMPEG_FilterDestroy destroy;
+		}
+		#endregion SMPEG_Filter
+		#endregion MPEGfilter.h
+
+		#region smpeg.h
+		#region SMPEG_version
+		/// <summary>
+		/// Structure to hold version number of the SMPEG library
+		/// </summary>
+		[StructLayout(LayoutKind.Sequential, Pack=4)]
+		public struct SMPEG_version 
+		{
+			/// <summary>
+			/// Major version
+			/// </summary>
+			public byte major;
+			/// <summary>
+			/// Minor version
+			/// </summary>
+			public byte minor;
+			/// <summary>
+			/// Patch version
+			/// </summary>
+			public byte patch;
+			/// <summary>
+			/// 
+			/// </summary>
+			/// <returns></returns>
+			public override string ToString()
+			{
+				return (this.major + "." + this.minor + "." + this.patch);
+			}
+		}
+		#endregion SMPEG_version
+
+		#region SMPEG_Info
+		/// <summary>
+		/// Used to get information about the SMPEG object
+		/// </summary>
+		/// <remarks>
+		/// <p>
+		/// <code>
+		/// typedef struct _SMPEG_Info {
+		///		int has_audio;
+		///		int has_video;
+		///		int width;
+		///		int height;
+		///		int current_frame;
+		///		double current_fps;
+		///		char audio_string[80];
+		///		int  audio_current_frame;
+		///		Uint32 current_offset;
+		///		Uint32 total_size;
+		///		double current_time;
+		///		double total_time;
+		///	} SMPEG_Info;
+		/// </code></p></remarks>
+		public struct SMPEG_Info
+		{
+			/// <summary>
+			/// 
+			/// </summary>
+			public int has_audio;
+			/// <summary>
+			/// 
+			/// </summary>
+			public int has_video;
+			/// <summary>
+			/// Width of movie file
+			/// </summary>
+			public int width;
+			/// <summary>
+			/// Height of movie file
+			/// </summary>
+			public int height;
+			/// <summary>
+			/// 
+			/// </summary>
+			public int current_frame;
+			/// <summary>
+			/// 
+			/// </summary>
+			public double current_fps;
+			/// <summary>
+			/// 
+			/// </summary>
+			[MarshalAs(UnmanagedType.ByValTStr, SizeConst=80)]
+			public string audio_string;
+			/// <summary>
+			/// 
+			/// </summary>
+			public int audio_current_frame;
+			/// <summary>
+			/// 
+			/// </summary>
+			public int current_offset;
+			/// <summary>
+			/// Movie file size in bytes
+			/// </summary>
+			public int total_size;
+			/// <summary>
+			/// 
+			/// </summary>
+			public double current_time;
+			/// <summary>
+			/// Length of movie file in seconds.
+			/// </summary>
+			public double total_time;
+		}
+		#endregion SMPEG_Info
+		#endregion smpeg.h
+		#endregion Public Structs
+
+		#region Public Delegates
+		#region MPEGfilter.h
+		#region void SMPEG_FilterCallback(...)
+		/// <summary>
+		/// Callback function for the filter
+		/// </summary>
+		/// <remarks>
+		/// <p>
+		/// <code>
+		/// typedef void (* SMPEG_FilterCallback)( SDL_Overlay * dest, SDL_Overlay * source, SDL_Rect * region, SMPEG_FilterInfo * filter_info, void * data );
+		/// </code></p></remarks>
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate void SMPEG_FilterCallback(IntPtr dest, IntPtr source, out Sdl.SDL_Rect region, IntPtr filter_info, object data);
+		#endregion void SMPEG_FilterCallback(...)
+
+		#region void SMPEG_FilterDestroy(IntPtr filter)
+		/// <summary>
+		/// Callback function for the filter
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a callback function in MPEGfilter.h
+		/// <code>
+		/// typedef void (* SMPEG_FilterDestroy)( struct SMPEG_Filter * filter )
+		/// </code></p></remarks>
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate void SMPEG_FilterDestroy(IntPtr filter);
+		#endregion void SMPEG_FilterDestroy(IntPtr filter)
+		#endregion MPEGfilter.h
+
+		#region smpeg.h
+		#region void SMPEG_DisplayCallback(...)
+		/// <summary>
+		/// Matches the declaration of SDL_UpdateRect()
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a callback function in smpeg.h
+		/// <code>
+		/// typedef void(*SMPEG_DisplayCallback)(SDL_Surface* dst, int x, int y, unsigned int w, unsigned int h);
+		/// </code>
+		/// </p>
+		/// </remarks>
+		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+		public delegate void SMPEG_DisplayCallback(
+			IntPtr dst, int x, int y, int w, int h);
+		#endregion void SMPEG_DisplayCallback(...)
+		#endregion smpeg.h
+		#endregion Public Delegates
+		
+		#region Smpeg Methods
+		#region MPEGfilter.h
+		#region IntPtr SMPEGfilter_null()
+		/// <summary>
+		/// The null filter (default). 
+		/// It simply copies the source rectangle to the video overlay.
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in MPEGfilter.h
+		/// <code>
+		/// SMPEG_Filter * SMPEGfilter_null(void)
+		/// </code></p></remarks>
+		/// <returns>IntPtr to <see cref="SMPEG_Filter"/></returns>
+		/// <seealso cref="SMPEGfilter_bilinear"/>
+		/// <seealso cref="SMPEGfilter_deblocking"/>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SMPEGfilter_null();
+		#endregion IntPtr SMPEGfilter_null()
+
+		#region IntPtr SMPEGfilter_bilinear()
+		/// <summary>
+		/// The bilinear filter. 
+		/// A basic low-pass filter that will produce a smoother image.
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in MPEGfilter.h
+		/// <code>
+		/// SMPEG_Filter * SMPEGfilter_bilinear(void)
+		/// </code></p></remarks>
+		/// <returns>IntPtr to <see cref="SMPEG_Filter"/></returns>
+		/// <seealso cref="SMPEGfilter_null"/>
+		/// <seealso cref="SMPEGfilter_deblocking"/>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SMPEGfilter_bilinear();
+		#endregion IntPtr SMPEGfilter_bilinear()
+
+		#region IntPtr SMPEGfilter_deblocking()
+		/// <summary>
+		/// The deblocking filter. 
+		/// It filters block borders and non-intra coded blocks 
+		/// to reduce blockiness
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to C-function in MPEGfilter.h
+		/// <code>
+		/// SMPEG_Filter * SMPEGfilter_deblocking(void)
+		/// </code></p></remarks>
+		/// <returns>IntPtr to <see cref="SMPEG_Filter"/></returns>
+		/// <seealso cref="SMPEGfilter_null"/>
+		/// <seealso cref="SMPEGfilter_bilinear"/>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SMPEGfilter_deblocking();
+		#endregion IntPtr SMPEGfilter_deblocking()
+		#endregion MPEGfilter.h
+
+		#region smpeg.h
+		#region SDL_version SMPEG_VERSION() 
+		/// <summary>
+		/// This method can be used to fill a version structure with the compile-time
+		/// version of the SMPEG library.
+		/// </summary>
+		/// <returns>
+		///     This function returns a <see cref="Smpeg.SMPEG_version"/> struct containing the
+		///     compiled version number
+		/// </returns>
+		/// <remarks>
+		///     <p>
+		///     Binds to C-function call in smpeg.h:
+		///     <code>#define SMPEG_VERSION(X)
+		/// {
+		/// (X)->major = SMPEG_MAJOR_VERSION;
+		/// (X)->minor = SMPEG_MINOR_VERSION;
+		/// (X)->patch = SMPEG_PATCHLEVEL;
+		/// }</code>
+		///     </p>
+		/// </remarks>
+		[CLSCompliant(false)]
+		public static Smpeg.SMPEG_version SMPEG_VERSION() 
+		{ 
+			Smpeg.SMPEG_version smpegVersion = new Smpeg.SMPEG_version();
+			smpegVersion.major = SMPEG_MAJOR_VERSION;
+			smpegVersion.minor = SMPEG_MINOR_VERSION;
+			smpegVersion.patch = SMPEG_PATCHLEVEL;
+			return smpegVersion;
+		} 
+		#endregion SDL_version SMPEG_VERSION() 
+
+		#region IntPtr SMPEG_new(string file, out SMPEG_Info info, int sdl_audio)
+		/// <summary>
+		/// Create a new SMPEG object from an MPEG file.
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>SMPEG* SMPEG_new(const char *file, SMPEG_Info* info, int sdl_audio);
+		/// </code></p></remarks>
+		/// <param name="file"></param>
+		/// <param name="info">On return, if 'info' is not NULL, 
+		/// it will be filled with information about the MPEG object.</param>
+		/// <param name="sdl_audio">
+		/// The sdl_audio parameter indicates if SMPEG should 
+		/// initialize the SDL audio
+		/// subsystem. If not, you will have to use the 
+		/// SMPEG_playaudio() function below
+		/// to extract the decoded data. Never set this parameter to false (i.e. 0). 
+		/// This will cause the video playback to run very slowly. 
+		/// To disable audio, 
+		/// use the <see cref="SMPEG_enableaudio"/> function.</param>
+		/// <returns>This function returns a new SMPEG object.  
+		/// Use SMPEG_error() to find out whether or not there 
+		/// was a problem building the MPEG stream.</returns>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SMPEG_new(string file, out SMPEG_Info info, int sdl_audio);
+		#endregion IntPtr SMPEG_new(string file, out SMPEG_Info info, int sdl_audio)
+
+		#region IntPtr SMPEG_new_desrc(int file, out SMPEG_Info info, int sdl_audio)
+		/// <summary>
+		/// Create a new SMPEG object from a file descriptor.
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>SMPEG* SMPEG_new_descr(int file, SMPEG_Info* info, int sdl_audio)
+		/// </code></p></remarks>
+		/// <param name="file"></param>
+		/// <param name="info">On return, if 'info' is not NULL, 
+		/// it will be filled with information about the MPEG object.</param>
+		/// <param name="sdl_audio">
+		/// The sdl_audio parameter indicates if SMPEG should 
+		/// initialize the SDL audio
+		/// subsystem. If not, you will have to use the 
+		/// SMPEG_playaudio() function below
+		/// to extract the decoded data.</param>
+		/// <returns>This function returns a new SMPEG object.  
+		/// Use SMPEG_error() to find out whether or not there 
+		/// was a problem building the MPEG stream.</returns>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SMPEG_new_descr(int file, out SMPEG_Info info, int sdl_audio);
+		#endregion IntPtr SMPEG_new_descr(int file, out SMPEG_Info info, int sdl_audio)
+
+		#region IntPtr SMPEG_new_data(object data, int size, out SMPEG_Info info, int sdl_audio)
+		/// <summary>
+		/// Create a new SMPEG object from for a raw chunk of data.
+		/// </summary>
+		/// <remarks>
+		/// SMPEG makes a copy of the data, so the application is free to 
+		/// delete after a successful call to this function.
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// SMPEG* SMPEG_new_data(void *data, int size, SMPEG_Info* info, int sdl_audio)
+		/// </code></p></remarks>
+		/// <param name="data">Raw chunck of data</param>
+		/// <param name="size">Size of chunk</param>
+		/// <param name="info">On return, if 'info' is not NULL, 
+		/// it will be filled with information about the MPEG object.</param>
+		/// <param name="sdl_audio">
+		/// The sdl_audio parameter indicates if SMPEG should 
+		/// initialize the SDL audio
+		/// subsystem. If not, you will have to use the 
+		/// SMPEG_playaudio() function below
+		/// to extract the decoded data.</param>
+		/// <returns>This function returns a new SMPEG object.  
+		/// Use SMPEG_error() to find out whether or not there 
+		/// was a problem building the MPEG stream.</returns>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SMPEG_new_data(
+			object data, int size, out SMPEG_Info info, int sdl_audio);
+		#endregion IntPtr SMPEG_new_data(object data, int size, out SMPEG_Info info, int sdl_audio)
+
+		#region IntPtr SMPEG_new_rwops(IntPtr src, out SMPEG_Info info, int sdl_audio);
+		/// <summary>
+		/// Create a new SMPEG object from a generic SDL_RWops structure.
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// SMPEG* SMPEG_new_rwops(SDL_RWops *src, SMPEG_Info* info, int sdl_audio);
+		/// </code></p></remarks>
+		/// <param name="src"></param>
+		/// <param name="info">On return, if 'info' is not NULL, 
+		/// it will be filled with information about the MPEG object.</param>
+		/// <param name="sdl_audio">
+		/// The sdl_audio parameter indicates if SMPEG should 
+		/// initialize the SDL audio
+		/// subsystem. If not, you will have to use the 
+		/// SMPEG_playaudio() function below
+		/// to extract the decoded data.</param>
+		/// <returns>This function returns a new SMPEG object.  
+		/// Use SMPEG_error() to find out whether or not there 
+		/// was a problem building the MPEG stream.</returns>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SMPEG_new_rwops(IntPtr src, out SMPEG_Info info, int sdl_audio);
+		#endregion IntPtr SMPEG_new_rwops(IntPtr src, out SMPEG_Info info, int sdl_audio);
+
+		#region void SMPEG_getinfo(IntPtr mpeg, out SMPEG_Info info)
+		/// <summary>
+		/// Get current information about an SMPEG object
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_getinfo( SMPEG* mpeg, SMPEG_Info* info )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="info">On return, if 'info' is not NULL, 
+		/// it will be filled with information about the MPEG object.</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_getinfo(IntPtr mpeg, out SMPEG_Info info);
+		#endregion void SMPEG_getinfo(IntPtr mpeg, out SMPEG_Info info)
+
+		#region void SMPEG_enableaudio(IntPtr mpeg, int enable)
+		/// <summary>
+		/// Enable or disable audio playback in MPEG stream
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_enableaudio( SMPEG* mpeg, int enable )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="enable"></param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_enableaudio(IntPtr mpeg, int enable);
+		#endregion void SMPEG_enableaudio(IntPtr mpeg, int enable)
+
+		#region void SMPEG_enablevideo(IntPtr mpeg, int enable)
+		/// <summary>
+		/// Enable or disable video playback in MPEG stream
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_enablevideo( SMPEG* mpeg, int enable )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="enable"></param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_enablevideo(IntPtr mpeg, int enable);
+		#endregion void SMPEG_enablevideo(IntPtr mpeg, int enable)
+
+		#region void SMPEG_delete( IntPtr mpeg )
+		/// <summary>
+		/// Delete an SMPEG object.
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_delete( SMPEG* mpeg )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_delete( IntPtr mpeg );
+		#endregion void SMPEG_delete( IntPtr mpeg )
+
+		#region int SMPEG_status( IntPtr mpeg )
+		/// <summary>
+		/// Get the current status of an SMPEG object
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// SMPEGstatus SMPEG_status( SMPEG* mpeg )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <returns>
+		/// SMPEG status: SMPEG_ERROR, SMPEG_PLAYING, SMPEG_STOPPED
+		/// </returns>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int SMPEG_status( IntPtr mpeg );
+		#endregion int SMPEG_status( IntPtr mpeg )
+
+		#region void SMPEG_setvolume( IntPtr mpeg, int volume )
+		/// <summary>
+		/// Set the audio volume of an MPEG stream, in the range 0-100
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_setvolume( SMPEG* mpeg, int volume )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="volume">Range from 0 - 100.</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_setvolume( IntPtr mpeg, int volume );
+		#endregion void SMPEG_setvolume( IntPtr mpeg, int volume )
+
+		#region void SMPEG_setdisplay(...)
+		/// <summary>
+		/// Set the destination surface for MPEG video playback
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_setdisplay(SMPEG* mpeg, SDL_Surface* dst, SDL_mutex* surfLock, SMPEG_DisplayCallback callback);
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="dst"></param>
+		/// <param name="surfLock">
+		/// 'surfLock' is a mutex used to synchronize access to 'dst', 
+		/// and can be NULL.
+		/// </param>
+		/// <param name="callback">
+		/// 'callback' is a function called when an area of 'dst' needs 
+		/// to be updated.
+		///  If 'callback' is NULL, the default function (SDL_UpdateRect) 
+		///  will be used.
+		///  </param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_setdisplay(
+			IntPtr mpeg, IntPtr dst, IntPtr surfLock, 
+			SMPEG_DisplayCallback callback);
+		#endregion void SMPEG_setdisplay(...)
+
+		#region void SMPEG_loop( IntPtr mpeg, int repeat )
+		/// <summary>
+		/// Set or clear looping play on an SMPEG object
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_loop( SMPEG* mpeg, int repeat )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="repeat"></param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_loop( IntPtr mpeg, int repeat );
+		#endregion void SMPEG_loop( IntPtr mpeg, int repeat )
+
+		#region void SMPEG_scaleXY( IntPtr mpeg, int width, int height )
+		/// <summary>
+		/// Scale pixel display on an SMPEG object
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_scaleXY( SMPEG* mpeg, int width, int height )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="width"></param>
+		/// <param name="height"></param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_scaleXY( IntPtr mpeg, int width, int height );
+		#endregion void SMPEG_scaleXY( IntPtr mpeg, int width, int height )
+
+		#region void SMPEG_scale( IntPtr mpeg, int scale )
+		/// <summary>
+		/// Scale pixel display on an SMPEG object
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_scale( SMPEG* mpeg, int scale )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="scale"></param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_scale( IntPtr mpeg, int scale );
+		#endregion void SMPEG_scale( IntPtr mpeg, int scale )
+
+		#region void SMPEG_double( IntPtr mpeg, int on )
+		/// <summary>
+		/// Scale pixel display on an SMPEG object
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// #define SMPEG_double(mpeg, on) \
+		///		SMPEG_scale(mpeg, (on) ? 2 : 1)
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="on"></param>
+		public static void SMPEG_double( IntPtr mpeg, int on )
+		{
+			if (on != 0)
+			{
+				Smpeg.SMPEG_scale(mpeg, 2);
+			}
+			else
+			{
+				Smpeg.SMPEG_scale(mpeg, 1);
+			}
+		}
+		#endregion void SMPEG_double( IntPtr mpeg, int on )
+
+		#region void SMPEG_move( IntPtr mpeg, int x, int y )
+		/// <summary>
+		/// Move the video display area within the destination surface
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_move( SMPEG* mpeg, int x, int y )
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_move( IntPtr mpeg, int x, int y );
+		#endregion void SMPEG_move( IntPtr mpeg, int x, int y )
+
+		#region void SMPEG_setdisplayregion(IntPtr mpeg, int x, int y, int w, int h)
+		/// <summary>
+		/// Set the region of the video to be shown
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_setdisplayregion(SMPEG* mpeg, int x, int y, int w, int h)
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="h"></param>
+		/// <param name="w"></param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_setdisplayregion(IntPtr mpeg, int x, int y, int w, int h);
+		#endregion void SMPEG_setdisplayregion(IntPtr mpeg, int x, int y, int w, int h)
+
+		#region void SMPEG_play( IntPtr mpeg )
+		/// <summary>
+		/// Play an SMPEG object
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_play( SMPEG* mpeg )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_play( IntPtr mpeg );
+		#endregion void SMPEG_play( IntPtr mpeg )
+
+		#region void SMPEG_pause( IntPtr mpeg )
+		/// <summary>
+		/// Pause/Resume playback of an SMPEG object
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_pause( IntPtr mpeg )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_pause( IntPtr mpeg );
+		#endregion void SMPEG_pause( IntPtr mpeg )
+
+		#region void SMPEG_stop( IntPtr mpeg )
+		/// <summary>
+		/// Stop playback of an SMPEG object
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_stop( SMPEG* mpeg )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_stop( IntPtr mpeg );
+		#endregion void SMPEG_stop( IntPtr mpeg )
+
+		#region void SMPEG_rewind( IntPtr mpeg )
+		/// <summary>
+		/// Rewind the play position of an SMPEG object 
+		/// to the beginning of the MPEG
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_rewind( SMPEG* mpeg )
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_rewind( IntPtr mpeg );
+		#endregion void SMPEG_rewind( IntPtr mpeg )
+
+		#region void SMPEG_seek( IntPtr mpeg, int bytes)
+		/// <summary>
+		/// Seek 'bytes' bytes in the MPEG stream
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_seek( SMPEG* mpeg, int bytes)
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="bytes">Bytes in the MPEG stream.</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_seek( IntPtr mpeg, int bytes);
+		#endregion void SMPEG_seek( IntPtr mpeg, int bytes)
+
+		#region void SMPEG_skip( IntPtr mpeg, float seconds )
+		/// <summary>
+		/// Skip 'seconds' seconds in the MPEG stream
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_skip( SMPEG* mpeg, float seconds );
+		/// </code></p></remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="seconds">Seconds in the MPEG stream.</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_skip( IntPtr mpeg, float seconds );
+		#endregion void SMPEG_skip( IntPtr mpeg, float seconds )
+
+		#region void SMPEG_renderFrame( IntPtr mpeg, int framenum )
+		/// <summary>
+		/// Render a particular frame in the MPEG video
+		/// </summary>
+		/// <remarks>
+		/// API CHANGE: This function no longer takes a target surface and position.
+		///	Use SMPEG_setdisplay() and SMPEG_move() to set this information.
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_renderFrame( SMPEG* mpeg, int framenum )
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="framenum">Frame number</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_renderFrame( IntPtr mpeg, int framenum );
+		#endregion void SMPEG_renderFrame( IntPtr mpeg, int framenum )
+
+		#region void SMPEG_renderFinal( IntPtr mpeg, IntPtr dst, int x, int y )
+		/// <summary>
+		/// Render the last frame of an MPEG video
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_renderFinal( SMPEG* mpeg, SDL_Surface* dst, int x, int y )
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="dst">SDL_Surface pointer</param>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_renderFinal( IntPtr mpeg, IntPtr dst, int x, int y );
+		#endregion void SMPEG_renderFinal( IntPtr mpeg, IntPtr dst, int x, int y )
+
+		#region IntPtr SMPEG_filter( IntPtr mpeg, IntPtr filter )
+		/// <summary>
+		/// Set video filter
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// SMPEG_Filter * SMPEG_filter( SMPEG* mpeg, SMPEG_Filter * filter )
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="filter">IntPtr to SPEG_Filter</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern IntPtr SMPEG_filter( IntPtr mpeg, IntPtr filter );
+		#endregion IntPtr SMPEG_filter( IntPtr mpeg, IntPtr filter )
+
+		#region string SMPEG_error( IntPtr mpeg )
+		/// <summary>
+		/// SMPEG errors messages.
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// char *SMPEG_error( SMPEG* mpeg );
+		/// </code></p></remarks>
+		/// <param name="mpeg">MPEG file pointer</param>
+		/// <returns>
+		/// Return NULL if there is no error in the MPEG stream, 
+		/// or an error message
+		/// if there was a fatal error in the MPEG stream for the SMPEG object..
+		/// </returns>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern string SMPEG_error( IntPtr mpeg );
+		#endregion string SMPEG_error( IntPtr mpeg )
+
+		#region int SMPEG_playAudio( IntPtr mpeg, byte[] stream, int len )
+		/// <summary>
+		/// Exported callback function for audio playback.
+		/// </summary>
+		/// <remarks>
+		/// The function takes a buffer and the amount of data to fill, and returns
+		///		   the amount of data in bytes that was actually written.  This will be the
+		///		   amount requested unless the MPEG audio has finished.
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// int SMPEG_playAudio( SMPEG *mpeg, Uint8 *stream, int len )
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="mpeg">Handle to MPEG file.</param>
+		/// <param name="stream">Bytestream of data</param>
+		/// <param name="len">Amount of data to fill</param>
+		/// <returns>Amount of data in bytes that was actually written</returns>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int SMPEG_playAudio( IntPtr mpeg, byte[] stream, int len );
+		#endregion int SMPEG_playAudio( IntPtr mpeg, byte[] stream, int len )
+
+		#region void SMPEG_playAudioSDL( object mpeg, byte[] stream, int len )
+		/// <summary>
+		/// Wrapper for SMPEG_playAudio() that can be passed to SDL and SDL_mixer. 
+		/// Exported callback function for audio playback.
+		/// </summary>
+		/// <remarks>
+		/// The function takes a buffer and the amount of data to fill, and returns
+		///		   the amount of data in bytes that was actually written.  This will be the
+		///		   amount requested unless the MPEG audio has finished.
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_playAudioSDL( void *mpeg, Uint8 *stream, int len )
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="mpeg">MPEG object.</param>
+		/// <param name="stream">Bytestream of data</param>
+		/// <param name="len">Amount of data to fill</param>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_playAudioSDL( IntPtr mpeg, byte[] stream, int len );
+		#endregion void SMPEG_playAudioSDL( object mpeg, byte[] stream, int len )
+
+		#region int SMPEG_wantedSpec( IntPtr mpeg, IntPtr wanted )
+		/// <summary>
+		/// Get the best SDL audio spec for the audio stream 
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// int SMPEG_wantedSpec( SMPEG *mpeg, SDL_AudioSpec *wanted )
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="mpeg">MPEG object.</param>
+		/// <param name="wanted">SDL_AudioSpec</param>
+		/// <returns></returns>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern int SMPEG_wantedSpec( IntPtr mpeg, IntPtr wanted );
+		#endregion int SMPEG_wantedSpec( IntPtr mpeg, IntPtr wanted )
+
+		#region void SMPEG_actualSpec( IntPtr mpeg, ref Sdl.SDL_AudioSpec spec )
+		/// <summary>
+		/// Inform SMPEG of the actual SDL audio spec used for sound playback
+		/// </summary>
+		/// <remarks>
+		/// <p>Binds to a C-function call in smpeg.h
+		/// <code>
+		/// void SMPEG_actualSpec( SMPEG *mpeg, SDL_AudioSpec *spec )
+		/// </code>
+		/// </p>
+		/// </remarks>
+		/// <param name="mpeg">MPEG object.</param>
+		/// <param name="spec">SDL_AudioSpec</param>
+		/// <returns></returns>
+		[DllImport(SMPEG_NATIVE_LIBRARY, 
+			 CallingConvention=CALLING_CONVENTION), 
+		SuppressUnmanagedCodeSecurity]
+		public static extern void SMPEG_actualSpec( IntPtr mpeg, ref Sdl.SDL_AudioSpec spec );
+		#endregion void SMPEG_actualSpec( IntPtr mpeg, ref Sdl.SDL_AudioSpec spec )
+		#endregion smpeg.h
+		#endregion Smpeg Methods
+	}
+}
diff --git a/src/Tao.Sdl/Tao.Sdl.csproj b/src/Tao.Sdl/Tao.Sdl.csproj
new file mode 100644
index 0000000..e91c68a
--- /dev/null
+++ b/src/Tao.Sdl/Tao.Sdl.csproj
@@ -0,0 +1,115 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{DD8BE6C6-C237-4C82-B521-754900077769}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.Sdl</AssemblyName>
+    <AssemblyOriginatorKeyFile>Tao.Sdl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.Sdl</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Sdl.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>Tao.Sdl.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Tao.Sdl.dll.config" />
+    <None Include="Tao.Sdl.snk">
+    </None>
+    <Compile Include="Sdl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlGfx.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlImage.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlMixer.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlNet.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlTtf.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Smpeg.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Tao.Sdl/Tao.Sdl.dll.config b/src/Tao.Sdl/Tao.Sdl.dll.config
new file mode 100644
index 0000000..0d49c43
--- /dev/null
+++ b/src/Tao.Sdl/Tao.Sdl.dll.config
@@ -0,0 +1,29 @@
+<configuration>
+    <dllmap dll="SDL.dll" os="windows" target="SDL.dll"/>
+    <dllmap dll="SDL.dll" os="osx" target="/Library/Frameworks/SDL.framework/SDL" />
+    <dllmap dll="SDL.dll" os="!windows,osx" target="libSDL-1.2.so.0"/>
+
+    <dllmap dll="SDL_image.dll" os="windows" target="SDL_image.dll"/>
+    <dllmap dll="SDL_image.dll" os="osx" target="/Library/Frameworks/SDL_image.framework/SDL_image" />
+    <dllmap dll="SDL_image.dll" os="!windows,osx" target="libSDL_image-1.2.so.0" />
+
+    <dllmap dll="SDL_mixer.dll" os="windows" target="SDL_mixer.dll"/>
+    <dllmap dll="SDL_mixer.dll" os="osx" target="/Library/Frameworks/SDL_mixer.framework/SDL_mixer" />
+    <dllmap dll="SDL_mixer.dll" os="!windows,osx" target="libSDL_mixer-1.2.so.0" />
+
+    <dllmap dll="SDL_ttf.dll" os="windows" target="SDL_ttf.dll"/>
+    <dllmap dll="SDL_ttf.dll" os="osx" target="/Library/Frameworks/SDL_ttf.framework/SDL_ttf" />
+    <dllmap dll="SDL_ttf.dll" os="!windows,osx" target="libSDL_ttf-2.0.so.0" />
+
+    <dllmap dll="SDL_net.dll" os="windows" target="SDL_net.dll"/>
+    <dllmap dll="SDL_net.dll" os="osx" target="/Library/Frameworks/SDL_net.framework/SDL_net" />
+    <dllmap dll="SDL_net.dll" os="!windows,osx" target="libSDL_net-1.2.so.0" />
+
+    <dllmap dll="smpeg.dll" os="windows" target="smpeg.dll"/>
+    <dllmap dll="smpeg.dll" os="osx" target="/Library/Frameworks/smpeg.framework/smpeg" />
+    <dllmap dll="smpeg.dll" os="!windows,osx" target="libsmpeg-0.4.so.0" />
+
+    <dllmap dll="SDL_gfx.dll" os="windows" target="SDL_gfx.dll"/>
+    <dllmap dll="SDL_gfx.dll" os="osx" target="/Library/Frameworks/SDL_gfx.framework/SDL_gfx" />
+    <dllmap dll="SDL_gfx.dll" os="!windows,osx" target="libSDL_gfx.so.13" />
+</configuration>
diff --git a/src/Tao.Sdl/Tao.Sdl.snk b/src/Tao.Sdl/Tao.Sdl.snk
new file mode 100644
index 0000000..6446c6a
Binary files /dev/null and b/src/Tao.Sdl/Tao.Sdl.snk differ
diff --git a/src/Tao.Sdl/tao-sdl.pc.in b/src/Tao.Sdl/tao-sdl.pc.in
new file mode 100644
index 0000000..87fa76f
--- /dev/null
+++ b/src/Tao.Sdl/tao-sdl.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.Sdl
+Description: SDL portion of the Tao framework
+Version: @TAOSDL_VERSION@
+Requires:
+Libs: -r:${libdir}/mono/tao-sdl- at TAOSDL_MAJOR@/Tao.Sdl.dll
+
diff --git a/src/Tao.source b/src/Tao.source
new file mode 100644
index 0000000..ed9689d
--- /dev/null
+++ b/src/Tao.source
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<monodoc>
+  <source provider="ecma" basefile="Tao" path="classlib-tao"/>
+</monodoc>
diff --git a/tao.build b/tao.build
new file mode 100644
index 0000000..5510d0b
--- /dev/null
+++ b/tao.build
@@ -0,0 +1,284 @@
+<?xml version="1.0" ?>
+<project name="TaoFramework" default="package">
+    <!--
+    Targets:
+    buildrelease: builds release versions of libraries and examples.
+    package: creates release zip file for .NET and Mono.
+    -->
+    <echo message="Using '${nant.settings.currentframework}' Framework"/>
+
+    <!-- global project settings -->
+    <property name="project.config" value="Release" />
+    <property name="project.version" value="2.1.0" />
+    <property name="src.dir" value="src" />
+    <property name="examples.dir" value="examples" />
+    <property name="tests.dir" value="tests" />
+    <property name="dist.dir" value="dist" />
+    <property name="source.dir" value="source" />
+    <property name="bin.dir" value="bin" />
+    <property name="obj.dir" value="obj" />
+    <property name="lib.dir" value="lib" />
+    <property name="doc.dir" value="doc" />
+    <property name="dmg.dir" value="TaoFramework-${project.version}" />
+    <property name="is-osx" value="false"/>
+    <property name="gacdir" value="" overwrite="false" />
+    <property name="gacutil-package" value="" overwrite="false" />
+    <property name="pkgconfig" value="/usr/lib/pkgconfig" overwrite="false" />
+
+    <target name="net-2.0" description="Sets framework to .NET 2.0">
+	<property name="nant.settings.currentframework" value="net-2.0" />
+    </target>
+
+    <target name="mono-2.0" description="Sets framework to mono 2.0">
+	<call target="check-osx" />
+	<property name="nant.settings.currentframework" value="mono-2.0" />
+    </target>
+
+    <target name="check-osx" description="Checks if running on OSX">
+	<if test="${file::exists('/System/Library/Frameworks/Cocoa.framework/Cocoa')}">
+	    <property name="is-osx" value="true" />
+	</if>
+    </target>
+
+    <target name="clean" description="Clean project">
+	<delete dir="${bin.dir}" failonerror="false" />
+	<delete dir="${obj.dir}" failonerror="false" />
+	<delete dir="${dist.dir}" failonerror="false" />
+	<nant buildfile="${src.dir}/Tao.DevIl/Tao.DevIl.build" target="clean" />
+	<nant buildfile="${src.dir}/Tao.Ode/Tao.Ode.build" target="clean" />
+	<nant buildfile="${src.dir}/Tao.PhysFs/Tao.PhysFs.build" target="clean" />
+	<nant buildfile="${src.dir}/Tao.Sdl/Tao.Sdl.build" target="clean" />
+	<nant buildfile="${src.dir}/Tao.Lua/Tao.Lua.build" target="clean" />
+	<nant buildfile="${src.dir}/Tao.FFmpeg/Tao.FFmpeg.build" target="clean" />
+	<nant buildfile="${src.dir}/Tao.OpenGl/Tao.OpenGl.build" target="clean" />
+    </target>
+
+    <target name="install" description="Build and install into GAC">
+	<property name="tao.base.dir" value="${project::get-base-directory()}" />
+	<nant buildfile="${src.dir}/Tao.OpenGl/Tao.OpenGl.build" target="install" />
+	<nant buildfile="${src.dir}/Tao.DevIl/Tao.DevIl.build" target="install" />
+	<nant buildfile="${src.dir}/Tao.Ode/Tao.Ode.build" target="install" />
+	<nant buildfile="${src.dir}/Tao.PhysFs/Tao.PhysFs.build" target="install" />
+	<nant buildfile="${src.dir}/Tao.Sdl/Tao.Sdl.build" target="install" />
+	<nant buildfile="${src.dir}/Tao.Lua/Tao.Lua.build" target="install" />
+	<nant buildfile="${src.dir}/Tao.FFmpeg/Tao.FFmpeg.build" target="install" />
+    </target>
+
+    <target name="package-no-doc" depends="build-release" description="Package without docs">
+	<call target="copyfiles" />
+	<call target="zip" />
+    </target>
+
+    <target name="build-release" depends="clean" description="Build Assemblies">
+	<nant buildfile="${src.dir}/Tao.DevIl/Tao.DevIl.build" target="${nant.settings.currentframework} build-release" />
+	<nant buildfile="${src.dir}/Tao.Ode/Tao.Ode.build" target="${nant.settings.currentframework} build-release" />
+	<nant buildfile="${src.dir}/Tao.PhysFs/Tao.PhysFs.build" target="${nant.settings.currentframework} build-release" />
+	<nant buildfile="${src.dir}/Tao.Sdl/Tao.Sdl.build" target="${nant.settings.currentframework} build-release" />
+	<nant buildfile="${src.dir}/Tao.Lua/Tao.Lua.build" target="${nant.settings.currentframework} build-release" />
+	<nant buildfile="${src.dir}/Tao.FFmpeg/Tao.FFmpeg.build" target="${nant.settings.currentframework} build-release" />
+	<nant buildfile="${src.dir}/Tao.OpenGl/Tao.OpenGl.build" target="${nant.settings.currentframework} build-release" />
+    </target>
+
+    <target name="package" depends="clean" description="Package">
+	<nant buildfile="${src.dir}/Tao.DevIl/Tao.DevIl.build" target="${nant.settings.currentframework} package" />
+	<nant buildfile="${src.dir}/Tao.Ode/Tao.Ode.build" target="${nant.settings.currentframework} package" />
+	<nant buildfile="${src.dir}/Tao.PhysFs/Tao.PhysFs.build" target="${nant.settings.currentframework} package" />
+	<nant buildfile="${src.dir}/Tao.Sdl/Tao.Sdl.build" target="${nant.settings.currentframework} package" />
+	<nant buildfile="${src.dir}/Tao.Lua/Tao.Lua.build" target="${nant.settings.currentframework} package" />
+	<nant buildfile="${src.dir}/Tao.FFmpeg/Tao.FFmpeg.build" target="${nant.settings.currentframework} package" />
+	<nant buildfile="${src.dir}/Tao.OpenGl/Tao.OpenGl.build" target="${nant.settings.currentframework} package" />
+	<call target="copyfiles" />
+	<call target="zip" />
+    </target>
+
+    <target name="package-debug" description="Package Debug Mode" depends="clean">
+	<property name="project.config" value="Debug" />
+	<nant buildfile="${src.dir}/Tao.DevIl/Tao.DevIl.build" target="${nant.settings.currentframework} clean build-debug" />
+	<nant buildfile="${src.dir}/Tao.Ode/Tao.Ode.build" target="${nant.settings.currentframework} clean build-debug" />
+	<nant buildfile="${src.dir}/Tao.PhysFs/Tao.PhysFs.build" target="${nant.settings.currentframework} clean build-debug" />
+	<nant buildfile="${src.dir}/Tao.Sdl/Tao.Sdl.build" target="${nant.settings.currentframework} clean build-debug" />
+	<nant buildfile="${src.dir}/Tao.Lua/Tao.Lua.build" target="${nant.settings.currentframework} clean build-debug" />
+	<nant buildfile="${src.dir}/Tao.FFmpeg/Tao.FFmpeg.build" target="${nant.settings.currentframework} build-debug" />
+	<nant buildfile="${src.dir}/Tao.OpenGl/Tao.OpenGl.build" target="${nant.settings.currentframework} clean build-debug" />
+	<call target="copyfiles" />
+    </target>
+
+    <!-- copy project files -->
+    <target name="copyfiles">
+	<if test="${project.config=='Release'}">
+	    <copy todir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/${source.dir}">
+		<fileset>
+		    <include name="**" />
+		    <exclude name="**/${obj.dir}/**" />
+		    <exclude name="**/${bin.dir}/**" />
+		    <exclude name="**/*j.user" />
+		    <exclude name="**.suo" />
+		    <exclude name="**/*.mdp" />
+		    <exclude name="**/*.mds" />
+		    <exclude name="**/*.cmbx" />
+		    <exclude name="**/*.old" />
+		    <exclude name="**/*.prjx" />
+		    <exclude name="**/Makefile" />
+		    <exclude name="**/configure" />
+		    <exclude name="**/*.stackdump" />
+		    <exclude name="**/*.lnk" />
+		    <exclude name="**/config.status" />
+		    <exclude name="**/config.log" />
+		    <exclude name="**/aclocal.m4" />
+		    <exclude name="**/doc/**" />
+		    <exclude name="**/dist/**" />
+		    <exclude name="**/autom4te.cache/**" />
+		    <exclude name="**/Debug/**" />
+		    <exclude name="**/Release/**" />
+		    <exclude name="**.swp" />
+		    <exclude name="**.bak" />
+		    <exclude name="**.project" />
+		    <exclude name="**/.auto/**" />
+		</fileset>
+	    </copy>
+	</if>
+
+	<copy todir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/${doc.dir}" flatten="true">
+	    <fileset basedir="${src.dir}">
+		<include name="**/*.chm"/>
+	    </fileset>
+	</copy>
+
+	<if test="${platform::is-unix()}">
+	    <foreach item="Folder" property="foldername">
+		<echo message="${foldername}"/>
+		<in>
+		    <items>
+			<include name="${src.dir}/*"/>
+		    </items>
+		</in>
+		<do>
+		    <copy todir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/${doc.dir}" >
+			<fileset basedir="${foldername}/${bin.dir}/${project.config}/doc">
+			    <include name="**" />
+			    <exclude name="*.chm"/>
+			</fileset>
+		    </copy>
+		</do>
+	    </foreach>
+	</if>
+	<copy todir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/bin" flatten="true">
+	    <fileset basedir="${src.dir}">
+		<include name="**/*.dll"/>
+		<include name="**/*.xml"/>
+		<exclude name="**/prebuild.xml"/>
+		<exclude name="**/nunit.framework.dll"/>
+		<exclude name="**/*Bind*"/>
+	    </fileset>
+	</copy>
+	<if test="${platform::is-unix()}">
+	    <copy todir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/bin" flatten="true">
+		<fileset basedir="${src.dir}">
+		    <include name="**/*.config"/>
+		    <exclude name="**/app.config"/>
+		</fileset>
+	    </copy>
+	</if>
+	<if test="${platform::is-win32()}">
+	    <copy todir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/lib">
+		<fileset basedir="${project::get-base-directory()}/${lib.dir}/win32deps">
+		    <include name="**"/>
+		</fileset>
+	    </copy>
+	</if>
+	<copy todir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/${examples.dir}" flatten="true">
+	    <fileset>
+		<include name="${examples.dir}/**/*.sh" />
+		<include name="${examples.dir}/**/*.exe" />
+		<include name="${src.dir}/**/*.dll" />
+		<exclude name="**/nunit.framework.dll"/>
+		<exclude name="**/app.config"/>
+		<exclude name="**/*Bind*"/>
+	    </fileset>
+	</copy>
+	<if test="${platform::is-unix()}">
+	    <copy todir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/${examples.dir}" flatten="true">
+		<fileset basedir="${src.dir}">
+		    <include name="**/*.config"/>
+		    <exclude name="**/app.config"/>
+		</fileset>
+	    </copy>
+	</if>
+	<copy todir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/${examples.dir}/Data" flatten="true">
+	    <fileset>
+		<include name="${examples.dir}/**/Data/**" />
+	    </fileset>
+	</copy>
+	<if test="${is-osx}">
+	    <property name="examples.path" value="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/${examples.dir}"/>
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.Sdl.dll -r:${examples.path}/Tao.Sdl.dll.config -r:examples/SdlExamples/Data -i:other/Tao_Logos/tao.icns  -n:SdlExamples -a:${examples.path}/SdlExamples.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.OpenGl.dll -r:${examples.path}/Tao.OpenGl.dll.config -r:${examples.path}/Tao.Cg.dll -r:${examples.path}/Tao.Cg.dll.config -r:${examples.path}/Tao.FreeGlut.dll -r:${examples.path}/Tao.FreeGlut.dll.config -r:examples/CgExamples/Data -i:other/Tao_Logos/tao.icns  -n:CgExamples -a:${examples.path}/CgExamples.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.OpenGl.dll -r:${examples.path}/Tao.OpenGl.dll.config -r:${examples.path}/Tao.Platform.Windows.dll -r:${examples.path}/Tao.Platform.Windows.dll.config -r:${examples.path}/Tao.FreeGlut.dll -r:${examples.path}/Tao.FreeGlut.dll.config -r:examples/NeHe/Data -i:other/Tao_Logos/tao.icns  -n:NeHe -a:${examples.path}/NeHe.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.OpenGl.dll -r:${examples.path}/Tao.OpenGl.dll.config -r:${examples.path}/Tao.FreeGlut.dll -r:${examples.path}/Tao.FreeGlut.dll.config -r:examples/FreeGlutExamples/Data -i:other/Tao_Logos/tao.icns  -n:FreeGlutExamples -a:${examples.path}/FreeGlutExamples.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.OpenGl.dll -r:${examples.path}/Tao.OpenGl.dll.config -r:${examples.path}/Tao.FreeGlut.dll -r:${examples.path}/Tao.FreeGlut.dll.config -r:examples/GeWangExamples/Data -i:other/Tao_Logos/tao.icns  -n:GeWangExamples -a:${examples.path}/GeWangExamples.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.OpenGl.dll -r:${examples.path}/Tao.OpenGl.dll.config -r:${examples.path}/Tao.Glfw.dll -r:${examples.path}/Tao.Glfw.dll.config -r:examples/GlfwExamples/Data -i:other/Tao_Logos/tao.icns  -n:GlfwExamples -a:${examples.path}/GlfwExamples.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.OpenGl.dll -r:${examples.path}/Tao.OpenGl.dll.config -r:${examples.path}/Tao.FreeGlut.dll -r:${examples.path}/Tao.FreeGlut.dll.config -r:examples/NateRobins/Data -i:other/Tao_Logos/tao.icns  -n:NateRobins -a:${examples.path}/NateRobins.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.OpenGl.dll -r:${examples.path}/Tao.OpenGl.dll.config -r:${examples.path}/Tao.FreeGlut.dll -r:${examples.path}/Tao.FreeGlut.dll.config -r:${examples.path}/Tao.OpenAl.dll -r:${examples.path}/Tao.OpenAl.dll.config -r:examples/OpenAlExamples/Data -i:other/Tao_Logos/tao.icns  -n:OpenAlExamples -a:${examples.path}/OpenAlExamples.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.OpenGl.dll -r:${examples.path}/Tao.OpenGl.dll.config -r:${examples.path}/Tao.FreeGlut.dll -r:${examples.path}/Tao.FreeGlut.dll.config -r:examples/Redbook/Data -i:other/Tao_Logos/tao.icns  -n:Redbook -a:${examples.path}/Redbook.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.DevIl.dll -r:${examples.path}/Tao.Devil.dll.config -r:examples/DevIlExamples/Data -i:other/Tao_Logos/tao.icns  -n:DevIlExamples -a:${examples.path}/DevIlExamples.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.FFMpeg.dll -r:${examples.path}/Tao.FFmpeg.dll.config -r:examples/FFmpegExamples/Data -i:other/Tao_Logos/tao.icns  -n:FFmpegExamples -a:${examples.path}/FFmpegExamples.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.Lua.dll -r:${examples.path}/Tao.Lua.dll.config -r:examples/LuaFunctions/Data -i:other/Tao_Logos/tao.icns  -n:LuaFunctions -a:${examples.path}/LuaFunctions.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.Lua.dll -r:${examples.path}/Tao.Lua.dll.config -r:examples/LuaSimple/Data -i:other/Tao_Logos/tao.icns  -n:LuaSimple -a:${examples.path}/LuaSimple.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.Ode.dll -r:${examples.path}/Tao.Ode.dll.config -r:examples/OdeExamples/Data -i:other/Tao_Logos/tao.icns  -n:OdeExamples -a:${examples.path}/OdeExamples.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.PhysFs.dll -r:${examples.path}/Tao.PhysFs.dll.config -r:examples/PhyFsExamples/Data -i:other/Tao_Logos/tao.icns  -n:PhysFsExamples -a:${examples.path}/PhysFsExamples.exe" />
+	    <exec program="macpack" commandline="-m:2 -o:${examples.path}  -m cocoa -r:${examples.path}/Tao.FFmpeg.dll -r:${examples.path}/Tao.FFmpeg.dll.config -r:${examples.path}/Tao.OpenAl.dll  -r:${examples.path}/Tao.OpenAl.dll.config -i:other/Tao_Logos/tao.icns  -n:TaoMediaPlayer -a:${examples.path}/TaoMediaPlayer.exe" />
+	    <move todir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/">
+		<fileset basedir="${dist.dir}/${string::to-lower(project::get-name())}-${project.version}/${examples.dir}">
+		    <include name="CgExamples.app/**"/>
+		    <include name="SdlExamples.app/**"/>
+		    <include name="FreeGlutExamples.app/**"/>
+		    <include name="GeWangExamples.app/**"/>
+		    <include name="GlfwExamples.app/**"/>
+		    <include name="NeHe.app/**"/>
+		    <include name="Redbook.app/**"/>
+		    <include name="NateRobins.app/**"/>
+		    <include name="OpenAlExamples.app/**"/>
+		    <include name="DevIlExamples.app/**"/>
+		    <include name="FFmpegExamples.app/**"/>
+		    <include name="LuaFunctions.app/**"/>
+		    <include name="LuaSimple.app/**"/>
+		    <include name="OdeExamples.app/**"/>
+		    <include name="PhysFsExamples.app/**"/>
+		    <include name="TaoMediaPlayer.app/**"/>
+		</fileset>
+	    </move>
+	    <delete dir="${examples.path}"/>
+	</if>
+    </target>
+
+    <!-- create zip file -->
+    <target name="zip" description="zip/gzip files">
+	<property name="project.zip-path" value="${project::get-base-directory()}/${dist.dir}/${string::to-lower(project::get-name())}-${project.version}"/>
+	<if test="${platform::is-unix() and not is-osx}">
+	    <tar destfile="${project.zip-path}.tar.gz" compression="GZip">
+		<fileset basedir="${dist.dir}">
+		    <include name="${project.zip-path}/**" />
+		</fileset>
+	    </tar>
+	</if>
+	<if test="${platform::is-win32()}">
+	    <zip zipfile="${project.zip-path}.zip">
+		<fileset basedir="${dist.dir}">
+		    <include name="${project.zip-path}/**" />
+		</fileset>
+	    </zip>
+	</if>
+	<echo message="Created '${project::get-name()}' packages at ${project.zip-path}" />
+    </target>
+
+    <target name="create-installer" depends="package" description="Create Installer file">
+	<if test="${platform::is-unix() and not is-osx}">
+	</if>
+	<if test="${platform::is-win32()}">
+	    <exec program="C:\Program Files\NSIS\makensis.exe" commandline="other/win32installer/TaoFramework.nsi" />
+	</if>
+	<if test="${is-osx}">
+	    <exec program="hdiutil" commandline="create -srcfolder ${dist.dir}/${string::to-lower(project::get-name())}-${project.version} ${dist.dir}/${dmg.dir}" />
+	</if>
+    </target>
+</project>
diff --git a/taoframework.spec.suse.example b/taoframework.spec.suse.example
new file mode 100644
index 0000000..2d82252
--- /dev/null
+++ b/taoframework.spec.suse.example
@@ -0,0 +1,174 @@
+Name:           taoframework  
+Version:        2.0.0.svn20080420  
+Release:        1  
+License:        GPL  
+BuildRoot:      %{_tmppath}/%{name}-%{version}-build  
+BuildArch:      noarch  
+Group:          Development/Libraries/Mono  
+Summary:        The Tao Framework for Mono  
+Source:         %{name}-%{version}.tar.gz  
+  
+%if 0%{?suse_version} >= 1 || 0%{?sles_version} >= 1  
+BuildRequires:  pkg-config nant mono-core mono-devel  
+%else  
+%if 0%{?mandriva_version} >= 2006  
+BuildRequires:  pkgconfig mono nant  
+%else  
+BuildRequires:  pkgconfig nant mono-core mono-devel  
+%endif  
+%endif  
+  
+%description  
+The Tao Framework for .NET is a collection of bindings to facilitate cross-platform media application development utilizing the .NET and Mono platforms.  
+  
+%package opengl  
+Group:          Development/Libraries/Mono  
+Summary:        The Tao Framework for Mono, OpenGL Bindings  
+  
+%description opengl  
+The Tao Framework for .NET is a collection of bindings to facilitate cross-platform media application development utilizing the .NET and Mono platforms.  
+  
+This package contains OpenGL Bindings  
+  
+%package openal  
+Group:          Development/Libraries/Mono  
+Summary:        The Tao Framework for Mono, OpenAL Bindings  
+  
+%description openal  
+The Tao Framework for .NET is a collection of bindings to facilitate cross-platform media application development utilizing the .NET and Mono platforms.  
+  
+This package contains OpenAL Bindings  
+  
+%package freeglut  
+Group:          Development/Libraries/Mono  
+Summary:        The Tao Framework for Mono, freeglut Bindings  
+  
+%description freeglut  
+The Tao Framework for .NET is a collection of bindings to facilitate cross-platform media application development utilizing the .NET and Mono platforms.  
+  
+This package contains freeglut Bindings  
+  
+%package devil  
+Group:          Development/Libraries/Mono  
+Summary:        The Tao Framework for Mono, DevIL Bindings  
+  
+%description devil  
+The Tao Framework for .NET is a collection of bindings to facilitate cross-platform media application development utilizing the .NET and Mono platforms.  
+  
+This package contains DevIL Bindings  
+  
+%package ffmpeg  
+Group:          Development/Libraries/Mono  
+Summary:        The Tao Framework for Mono, FFmpeg Bindings  
+  
+%description ffmpeg  
+The Tao Framework for .NET is a collection of bindings to facilitate cross-platform media application development utilizing the .NET and Mono platforms.  
+  
+This package contains FFmpeg Bindings  
+  
+%package lua  
+Group:          Development/Libraries/Mono  
+Summary:        The Tao Framework for Mono, Lua Bindings  
+  
+%description lua  
+The Tao Framework for .NET is a collection of bindings to facilitate cross-platform media application development utilizing the .NET and Mono platforms.  
+  
+This package contains Lua Bindings  
+  
+%package ode  
+Group:          Development/Libraries/Mono  
+Summary:        The Tao Framework for Mono, ODE Bindings  
+  
+%description ode  
+The Tao Framework for .NET is a collection of bindings to facilitate cross-platform media application development utilizing the .NET and Mono platforms.  
+  
+This package contains ODE Bindings  
+  
+%package physfs  
+Group:          Development/Libraries/Mono  
+Summary:        The Tao Framework for Mono, PhysicsFS Bindings  
+Requires:       physfs  
+  
+%description physfs  
+The Tao Framework for .NET is a collection of bindings to facilitate cross-platform media application development utilizing the .NET and Mono platforms.  
+  
+This package contains PhysicsFS Bindings  
+  
+%package sdl  
+Group:          Development/Libraries/Mono  
+Summary:        The Tao Framework for Mono, SDL Bindings  
+Requires:       SDL  
+  
+%description sdl  
+The Tao Framework for .NET is a collection of bindings to facilitate cross-platform media application development utilizing the .NET and Mono platforms.  
+  
+This package contains SDL Bindings  
+  
+%prep  
+%setup -c  
+  
+%build  
+nant mono-2.0 build-release  
+  
+%install  
+nant mono-2.0 install -D:gacdir="$RPM_BUILD_ROOT%{_prefix}" -D:pkgconfig="$RPM_BUILD_ROOT%{_prefix}/lib/pkgconfig"  
+  
+%clean  
+rm -rf "$RPM_BUILD_ROOT"  
+  
+%files opengl  
+%defattr(-,root,root)  
+%{_prefix}/lib/mono/tao-opengl/Tao.OpenGl.dll  
+%{_prefix}/lib/mono/tao-platform-x11/Tao.Platform.X11.dll  
+%{_prefix}/lib/mono/gac/Tao.OpenGl  
+%{_prefix}/lib/mono/gac/Tao.Platform.X11  
+%{_prefix}/lib/pkgconfig/tao-opengl.pc  
+%{_prefix}/lib/pkgconfig/tao-platform-x11.pc  
+  
+%files openal  
+%defattr(-,root,root)  
+%{_prefix}/lib/mono/tao-openal/Tao.OpenAl.dll  
+%{_prefix}/lib/mono/gac/Tao.OpenAl  
+%{_prefix}/lib/pkgconfig/tao-openal.pc  
+  
+%files freeglut  
+%defattr(-,root,root)  
+%{_prefix}/lib/mono/tao-freeglut/Tao.FreeGlut.dll  
+%{_prefix}/lib/mono/gac/Tao.FreeGlut  
+%{_prefix}/lib/pkgconfig/tao-freeglut.pc  
+  
+%files devil  
+%defattr(-,root,root)  
+%{_prefix}/lib/mono/tao-devil/Tao.DevIl.dll  
+%{_prefix}/lib/mono/gac/Tao.DevIl  
+%{_prefix}/lib/pkgconfig/tao-devil.pc  
+  
+%files ffmpeg  
+%defattr(-,root,root)  
+%{_prefix}/lib/mono/tao-ffmpeg/Tao.FFmpeg.dll  
+%{_prefix}/lib/mono/gac/Tao.FFmpeg  
+%{_prefix}/lib/pkgconfig/tao-ffmpeg.pc  
+  
+%files lua  
+%defattr(-,root,root)  
+%{_prefix}/lib/mono/tao-lua/Tao.Lua.dll  
+%{_prefix}/lib/mono/gac/Tao.Lua  
+%{_prefix}/lib/pkgconfig/tao-lua.pc  
+  
+%files ode  
+%defattr(-,root,root)  
+%{_prefix}/lib/mono/tao-ode/Tao.Ode.dll  
+%{_prefix}/lib/mono/gac/Tao.Ode  
+%{_prefix}/lib/pkgconfig/tao-ode.pc  
+  
+%files physfs  
+%defattr(-,root,root)  
+%{_prefix}/lib/mono/tao-physfs/Tao.PhysFs.dll  
+%{_prefix}/lib/mono/gac/Tao.PhysFs  
+%{_prefix}/lib/pkgconfig/tao-physfs.pc  
+  
+%files sdl  
+%defattr(-,root,root)  
+%{_prefix}/lib/mono/tao-sdl/Tao.Sdl.dll  
+%{_prefix}/lib/mono/gac/Tao.Sdl  
+%{_prefix}/lib/pkgconfig/tao-sdl.pc  
\ No newline at end of file
diff --git a/template.pc b/template.pc
new file mode 100644
index 0000000..0f2d831
--- /dev/null
+++ b/template.pc
@@ -0,0 +1,8 @@
+prefix=/usr
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: @Name@
+Description: @Description@
+Version: @Version@
+Libs: -r:${libdir}/mono/@Name@/@File@
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..7984818
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,2 @@
+
+SUBDIRS = Ode Sdl
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..db680d5
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,483 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = tests
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = Ode Sdl
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic ctags \
+	ctags-recursive distclean distclean-generic distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
+	tags-recursive uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Ode/COPYING b/tests/Ode/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/tests/Ode/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/tests/Ode/Makefile.am b/tests/Ode/Makefile.am
new file mode 100644
index 0000000..d8393d9
--- /dev/null
+++ b/tests/Ode/Makefile.am
@@ -0,0 +1,18 @@
+
+ASSEMBLY = Tao.Ode.Tests
+SHORTNAME = tao-ode-tests
+VERSION = @TAOODE_VERSION@
+MAJOR = @TAOODE_MAJOR@
+
+PACKAGES = nunit
+BINARY_LIBS = ../../src/Tao.Ode/Tao.Ode.dll
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        Matrix3Marshalling.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.Ode/Tao.Ode.snk
+CONFIGFILE = 
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/tests/Ode/Makefile.in b/tests/Ode/Makefile.in
new file mode 100644
index 0000000..904ac82
--- /dev/null
+++ b/tests/Ode/Makefile.in
@@ -0,0 +1,414 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-ode-tests.pc.in $(top_srcdir)/Assembly.am \
+	COPYING
+subdir = tests/Ode
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-ode-tests.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOODE_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.Ode.Tests
+SHORTNAME = tao-ode-tests
+MAJOR = @TAOODE_MAJOR@
+PACKAGES = nunit
+BINARY_LIBS = ../../src/Tao.Ode/Tao.Ode.dll
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        Matrix3Marshalling.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.Ode/Tao.Ode.snk
+CONFIGFILE = 
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Ode/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/Ode/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-ode-tests.pc: $(top_builddir)/config.status $(srcdir)/tao-ode-tests.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Ode/Matrix3Marshalling.cs b/tests/Ode/Matrix3Marshalling.cs
new file mode 100644
index 0000000..25e563c
--- /dev/null
+++ b/tests/Ode/Matrix3Marshalling.cs
@@ -0,0 +1,155 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using NUnit.Framework;
+using System;
+using Tao.Ode;
+
+namespace Tao.Ode
+{
+	/// <summary>
+	/// This fixture tests marshalling of Tao.Ode functions using dMatrix3 as a parameter.
+	/// dMatrix3 does not marshall correctly itself for some reason, so until this is corrected,
+	/// dMatrix3 is passed to ODE as an array and overloaded functions are provided to retain
+	/// compatibility with the ODE API.
+	///
+	/// Strangely enough, dMatrix3 marshalling in the reverse direction (ie. from ODE) seems to work.
+	/// </summary>
+	[TestFixture]
+	public class Matrix3Marshalling
+	{
+		[SetUp]
+		public void SetUp()
+		{
+			// Nothing to setup right now
+		}
+		
+		[Test]
+		public void dGeomSetRotationTest()
+		{
+    		IntPtr simplespace = Ode.dSimpleSpaceCreate(IntPtr.Zero);
+    		IntPtr box = Ode.dCreateBox(
+      			simplespace, 25.0f, 5.0f, 25.0f
+    		);
+    		Ode.dMatrix3 r = new Ode.dMatrix3(
+      			new float[] {
+        			1.0f, 0.0f, 0.0f, 0.0f,
+        			0.0f, 1.0f, 0.0f, 0.0f,
+        			0.0f, 0.0f, 1.0f, 0.0f
+      			}
+    		);
+			
+			try {
+				Ode.dGeomSetRotation(box, r);
+			}
+			catch (Exception e) {
+				Assert.Fail("dGeomSetRotation failed with exception: " + e.GetType());
+			}
+			
+		}
+		
+		[Test]
+		public void dMassRotateTest()
+		{
+		    Ode.dMass newMass = new Ode.dMass();
+			newMass.c = new Ode.dVector4(); // Just to be safe the dMass
+			newMass.I = new Ode.dMatrix3(); // structure is initialized
+			
+			Ode.dMassSetSphere(ref newMass, 0.2f, 3.5f);
+			Ode.dMatrix3 r = new Ode.dMatrix3(
+				new float[] {
+					1.0f, 0.0f, 0.0f , 0.0f,
+					0.0f, 1.0f, 0.0f, 0.0f,
+					0.0f, 0.0f, 1.0f, 0.0f
+				}
+			);
+			
+			try {
+				Ode.dMassRotate(ref newMass, r);
+			}
+			catch (Exception e) {
+				Assert.Fail("dMassRotate failed with exception: " + e.GetType());
+			}
+			
+		}
+
+		[Test]
+		public void dBodySetRotationTest()
+		{
+    		IntPtr newWorldId = Ode.dWorldCreate();
+    		IntPtr newBodyId = Ode.dBodyCreate(newWorldId);
+    		Ode.dMatrix3 r = new Ode.dMatrix3(
+      			new float[] {
+        			1.0f, 0.0f, 0.0f, 0.0f,
+        			0.0f, 1.0f, 0.0f, 0.0f,
+        			0.0f, 0.0f, 1.0f, 0.0f
+      			}
+    		);
+			try {
+				Ode.dBodySetRotation(newBodyId, r);
+			}
+			catch (Exception e) {
+				Assert.Fail("dBodySetRotation failed with exception: " + e.GetType());
+			}
+			
+		}
+
+		/// <summary>
+		/// Test to verify that dMatrix3 is correctly marshalled when *returning* data
+		/// from an ODE call.
+		/// </summary>
+		[Test]
+		public void dBodyGetRotationTest()
+		{
+    		IntPtr newWorldId = Ode.dWorldCreate();
+    		IntPtr newBodyId = Ode.dBodyCreate(newWorldId);
+    		Ode.dMatrix3 r = new Ode.dMatrix3(
+      			new float[] {
+        			1.0f, 0.0f, 0.0f, 0.0f,
+        			0.0f, 1.0f, 0.0f, 0.0f,
+        			0.0f, 0.0f, 1.0f, 0.0f
+      			}
+    		);
+			
+			Ode.dMatrix3 r2
+			= new Ode.dMatrix3(
+      			new float[] {
+        			0.0f, 0.0f, 0.0f, 0.0f,
+        			0.0f, 0.0f, 0.0f, 0.0f,
+        			0.0f, 0.0f, 0.0f, 0.0f
+      			}
+    		);
+			
+    		Ode.dBodySetRotation(newBodyId, r);
+			
+			r2 = Ode.dBodyGetRotation(newBodyId);
+			
+			Assert.AreEqual(r,r2,"Assigned and returned rotation matrix values are not equal");
+		}
+		
+	}
+}
diff --git a/tests/Ode/Properties/AssemblyInfo.cs b/tests/Ode/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..f11d5f6
--- /dev/null
+++ b/tests/Ode/Properties/AssemblyInfo.cs
@@ -0,0 +1,86 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: CLSCompliant(true)]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyName("")]
diff --git a/tests/Ode/Tao.Ode.Tests.csproj b/tests/Ode/Tao.Ode.Tests.csproj
new file mode 100644
index 0000000..1087b59
--- /dev/null
+++ b/tests/Ode/Tao.Ode.Tests.csproj
@@ -0,0 +1,147 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{BA802E4D-7B42-456A-AD84-8A98B746379C}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.Ode.Tests</AssemblyName>
+    <AssemblyOriginatorKeyFile>../../src/Tao.Ode/Tao.Ode.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.Ode.Tests</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="nunit.framework">
+      <Name>nunit.framework</Name>
+      <HintPath>\nunit.framework.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.FtGl\Tao.FtGl.csproj">
+      <Name>Tao.FtGl</Name>
+      <Project>{AB1A37A9-854C-4C38-BE80-0D2A0502C7A6}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Matrix3Marshalling.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/Ode/tao-ode-tests.pc.in b/tests/Ode/tao-ode-tests.pc.in
new file mode 100644
index 0000000..d2e2f5b
--- /dev/null
+++ b/tests/Ode/tao-ode-tests.pc.in
@@ -0,0 +1,8 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.Ode.Tests
+Description: Unit tests for the Ode portion of the Tao framework
+Version: @TAOODE_VERSION@
+Libs: -r:${libdir}/mono/tao-ode-tests- at TAOODE_MAJOR@/Tao.Ode.Tests.dll
diff --git a/tests/Sdl/COPYING b/tests/Sdl/COPYING
new file mode 100644
index 0000000..c345a28
--- /dev/null
+++ b/tests/Sdl/COPYING
@@ -0,0 +1,22 @@
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/tests/Sdl/Makefile.am b/tests/Sdl/Makefile.am
new file mode 100644
index 0000000..9adc308
--- /dev/null
+++ b/tests/Sdl/Makefile.am
@@ -0,0 +1,24 @@
+
+ASSEMBLY = Tao.Sdl.Tests
+SHORTNAME = tao-sdl-tests
+VERSION = @TAOSDL_VERSION@
+MAJOR = @TAOSDL_MAJOR@
+
+PACKAGES = nunit
+BINARY_LIBS = ../../src/Tao.Sdl/Tao.Sdl.dll
+SYSTEM_LIBS = System
+RESOURCES =
+SOURCES = \
+        SdlTest.cs \
+        SdlTestGfx.cs \
+        SdlTestImage.cs \
+        SdlTestMixer.cs \
+        SdlTestTtf.cs \
+        SdlTestVideo.cs \
+        SmpegTest.cs \
+        Properties/AssemblyInfo.cs
+KEYFILE = ../../src/Tao.Sdl/Tao.Sdl.snk
+CONFIGFILE = 
+
+include $(top_srcdir)/Assembly.am
+
diff --git a/tests/Sdl/Makefile.in b/tests/Sdl/Makefile.in
new file mode 100644
index 0000000..efc4bf6
--- /dev/null
+++ b/tests/Sdl/Makefile.in
@@ -0,0 +1,420 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Generic assembly building automake rules
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/tao-sdl-tests.pc.in $(top_srcdir)/Assembly.am \
+	COPYING
+subdir = tests/Sdl
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = tao-sdl-tests.pc
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(monodir)"
+monoDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mono_DATA) $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+GACUTIL = @GACUTIL@
+GACUTIL1 = @GACUTIL1@
+GMCS = @GMCS@
+GMCS2 = @GMCS2@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_PREFIX = @LIB_PREFIX@
+LIB_SUFFIX = @LIB_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MONODOC = @MONODOC@
+MONODOC_DEPENDENCY_CFLAGS = @MONODOC_DEPENDENCY_CFLAGS@
+MONODOC_DEPENDENCY_LIBS = @MONODOC_DEPENDENCY_LIBS@
+MONODOC_REQUIRED_VERSION = @MONODOC_REQUIRED_VERSION@
+MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@
+MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RESGEN = @RESGEN@
+RESGEN1 = @RESGEN1@
+RUNTIME = @RUNTIME@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAOCG_MAJOR = @TAOCG_MAJOR@
+TAOCG_VERSION = @TAOCG_VERSION@
+TAODEVIL_MAJOR = @TAODEVIL_MAJOR@
+TAODEVIL_VERSION = @TAODEVIL_VERSION@
+TAOFFMPEG_MAJOR = @TAOFFMPEG_MAJOR@
+TAOFFMPEG_VERSION = @TAOFFMPEG_VERSION@
+TAOFREEGLUT_MAJOR = @TAOFREEGLUT_MAJOR@
+TAOFREEGLUT_VERSION = @TAOFREEGLUT_VERSION@
+TAOFREETYPE_MAJOR = @TAOFREETYPE_MAJOR@
+TAOFREETYPE_VERSION = @TAOFREETYPE_VERSION@
+TAOFTGL_MAJOR = @TAOFTGL_MAJOR@
+TAOFTGL_VERSION = @TAOFTGL_VERSION@
+TAOGLFW_MAJOR = @TAOGLFW_MAJOR@
+TAOGLFW_VERSION = @TAOGLFW_VERSION@
+TAOLUA_MAJOR = @TAOLUA_MAJOR@
+TAOLUA_VERSION = @TAOLUA_VERSION@
+TAOODE_MAJOR = @TAOODE_MAJOR@
+TAOODE_VERSION = @TAOODE_VERSION@
+TAOOPENAL_MAJOR = @TAOOPENAL_MAJOR@
+TAOOPENAL_VERSION = @TAOOPENAL_VERSION@
+TAOOPENGL_MAJOR = @TAOOPENGL_MAJOR@
+TAOOPENGL_VERSION = @TAOOPENGL_VERSION@
+TAOPHYSFS_MAJOR = @TAOPHYSFS_MAJOR@
+TAOPHYSFS_VERSION = @TAOPHYSFS_VERSION@
+TAOSDL_MAJOR = @TAOSDL_MAJOR@
+TAOSDL_VERSION = @TAOSDL_VERSION@
+TAOWINDOWS_MAJOR = @TAOWINDOWS_MAJOR@
+TAOWINDOWS_VERSION = @TAOWINDOWS_VERSION@
+TAOX11_MAJOR = @TAOX11_MAJOR@
+TAOX11_VERSION = @TAOX11_VERSION@
+VERSION = @TAOSDL_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Tao.Sdl.Tests
+SHORTNAME = tao-sdl-tests
+MAJOR = @TAOSDL_MAJOR@
+PACKAGES = nunit
+BINARY_LIBS = ../../src/Tao.Sdl/Tao.Sdl.dll
+SYSTEM_LIBS = System
+RESOURCES = 
+SOURCES = \
+        SdlTest.cs \
+        SdlTestGfx.cs \
+        SdlTestImage.cs \
+        SdlTestMixer.cs \
+        SdlTestTtf.cs \
+        SdlTestVideo.cs \
+        SmpegTest.cs \
+        Properties/AssemblyInfo.cs
+
+KEYFILE = ../../src/Tao.Sdl/Tao.Sdl.snk
+CONFIGFILE = 
+pkgconfigdir = $(libdir)/pkgconfig
+
+# We need to install the .config file ourselves because of a gacutil
+# bug (https://bugzilla.novell.com/show_bug.cgi?id=363341)
+monodir = $(libdir)/mono/$(SHORTNAME)-$(MAJOR)
+mono_DATA = $(CONFIGFILE)
+noinst_DATA = $(ASSEMBLY).dll $(SHORTNAME).pc
+EXTRA_DIST = $(SOURCES) $(ASSEMBLY).csproj $(CONFIGFILE) $(KEYFILE)
+CLEANFILES = $(ASSEMBLY).dll $(ASSEMBLY).xml
+DISTCLEANFILES = $(SHORTNAME).pc
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Assembly.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Sdl/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/Sdl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tao-sdl-tests.pc: $(top_builddir)/config.status $(srcdir)/tao-sdl-tests.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(monodir)" || $(MKDIR_P) "$(DESTDIR)$(monodir)"
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(monoDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodir)/$$f'"; \
+	  $(monoDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodir)/$$f"; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(monodir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(monodir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-monoDATA install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-monoDATA
+
+
+# FIXME: doc generation is disabled for Tao.OpenGl because of a gmcs bug
+# (see also src/Makefile.am)
+$(ASSEMBLY).dll: $(RESOURCES) $(SOURCES) $(BINARY_LIBS) $(KEYFILE)
+	$(CSC) -out:$@ -target:library -unsafe \
+	  $(addprefix -pkg:, $(PACKAGES)) \
+	  $(addprefix -r:$(srcdir)/, $(BINARY_LIBS)) \
+	  $(addprefix -r:, $(SYSTEM_LIBS)) \
+	  $(addprefix $(srcdir)/, $(SOURCES)) \
+	  $$([ $(ASSEMBLY) = Tao.OpenGl ] || echo -doc:$(ASSEMBLY).xml) \
+	  $(addprefix -keyfile:$(srcdir)/, $(KEYFILE))
+
+# FIXME: gacutil's -package flag is broken and messes the symlink path so
+# we do not use it yet
+install-data-local: $(ASSEMBLY).dll
+	$(GACUTIL) -i $(ASSEMBLY).dll -package $(SHORTNAME)-$(MAJOR) \
+	  -f -root $(DESTDIR)$(libdir)
+	$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
+	$(INSTALL) -m 644 $(SHORTNAME).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	ln -sf $(SHORTNAME)-$(MAJOR).pc \
+	  $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+
+uninstall-local:
+	$(GACUTIL) -u $(ASSEMBLY), Version=$(VERSION) \
+	  -package $(SHORTNAME)-$(MAJOR) || true
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME)-$(MAJOR).pc
+	rm -f $(DESTDIR)$(pkgconfigdir)/$(SHORTNAME).pc
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Sdl/Properties/AssemblyInfo.cs b/tests/Sdl/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..f11d5f6
--- /dev/null
+++ b/tests/Sdl/Properties/AssemblyInfo.cs
@@ -0,0 +1,86 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: CLSCompliant(true)]
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyName("")]
diff --git a/tests/Sdl/SdlTest.cs b/tests/Sdl/SdlTest.cs
new file mode 100644
index 0000000..b17914d
--- /dev/null
+++ b/tests/Sdl/SdlTest.cs
@@ -0,0 +1,1120 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Threading;
+using NUnit.Framework;
+using Tao.Sdl;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl
+{
+	/// <summary>
+	/// SDL Tests.
+	/// </summary>
+	[TestFixture]
+	public class SdlTest
+	{
+		#region SDL.h
+        //private void InitSdl()
+        //{
+        //    Tao.Sdl.Sdl.SDL_Quit();
+        //}
+		private void Quit()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitVideo()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_VIDEO)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitAudio()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_AUDIO));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_AUDIO)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitTimer()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_TIMER));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_TIMER)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitCDRom()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_CDROM));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_CDROM)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitJoystick()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_JOYSTICK));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_JOYSTICK)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitEverything()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_EVERYTHING)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitSubSystemVideo()
+		{
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_VIDEO));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_VIDEO)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitSubSystemAudio()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_AUDIO));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_AUDIO)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitSubSystemTimer()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_TIMER));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_TIMER)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitSubSystemCDRom()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_CDROM));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_CDROM)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitSubSystemJoystick()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_JOYSTICK));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_JOYSTICK)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void InitSubSystemEverything()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.AreEqual( 0, Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_EVERYTHING));
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_EVERYTHING)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SdlQuit()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_EVERYTHING)== 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void QuitSubSystemVideo()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_VIDEO);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_VIDEO)!= 0);
+			Tao.Sdl.Sdl.SDL_QuitSubSystem(Sdl.SDL_INIT_VIDEO);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_VIDEO)== 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void QuitSubSystemAudio()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_AUDIO);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_AUDIO)!= 0);
+			Tao.Sdl.Sdl.SDL_QuitSubSystem(Sdl.SDL_INIT_AUDIO);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_AUDIO)== 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void QuitSubSystemTimer()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_TIMER);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_TIMER)!= 0);
+			Tao.Sdl.Sdl.SDL_QuitSubSystem(Sdl.SDL_INIT_TIMER);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_TIMER)== 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void QuitSubSystemCDRom()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_CDROM);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_CDROM)!= 0);
+			Tao.Sdl.Sdl.SDL_QuitSubSystem(Sdl.SDL_INIT_CDROM);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_CDROM)== 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void QuitSubSystemJoystick()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_JOYSTICK);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_JOYSTICK)!= 0);
+			Tao.Sdl.Sdl.SDL_QuitSubSystem(Sdl.SDL_INIT_JOYSTICK);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_JOYSTICK)== 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void QuitSubSystemEverything()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_EVERYTHING);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_EVERYTHING)!= 0);
+			Tao.Sdl.Sdl.SDL_QuitSubSystem(Sdl.SDL_INIT_EVERYTHING);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_EVERYTHING)== 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void WasInitEverything()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_EVERYTHING)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void WasInitVideo()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_VIDEO)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void WasInitAudio()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_AUDIO);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_AUDIO)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void WasInitCDRom()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_CDROM);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_CDROM)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void WasInitJoystick()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_JOYSTICK);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_JOYSTICK)!= 0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void WasInitTimer()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_TIMER);
+			Assert.IsTrue(Tao.Sdl.Sdl.SDL_WasInit(Sdl.SDL_INIT_TIMER)!= 0);
+			this.Quit();
+		}
+		#endregion SDL.h
+
+		#region SDL_active.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GetAppState()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			byte state = Sdl.SDL_GetAppState();
+			Console.WriteLine("SDL_GetAppState(): " + state.ToString());
+			Assert.IsTrue(state == 7);
+			this.Quit();
+		}
+		#endregion SDL_active.h
+
+		#region SDL_audio.h
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void AudioDriverName()
+		{
+			Sdl.SDL_Init(Sdl.SDL_INIT_AUDIO);
+			string driver= "";
+			string result = Sdl.SDL_AudioDriverName(driver,20);
+			Assert.IsNotNull(result);
+			
+			Console.WriteLine("audio driver: " + result);
+			this.Quit();
+		}
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [Test]
+        public void GetKeyName()
+        {
+            Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+            //The letter 'a'
+            string result = Sdl.SDL_GetKeyName(97);
+            Assert.AreEqual("a", result);
+
+            Console.WriteLine("key name: " + result);
+            this.Quit();
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [Test]
+        public void GetKeyNameFalse()
+        {
+            Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+            //The letter 'a'
+            string result = Sdl.SDL_GetKeyName(97);
+            Console.WriteLine("key name: " + result);
+            Assert.AreNotEqual("b", result);
+            this.Quit();
+        }
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void OpenAudio()
+		{
+			Sdl.SDL_Init(Sdl.SDL_INIT_AUDIO);
+			//Console.WriteLine("audio driver: " + result);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Causes problems with Mixer tests")]
+		public void LoadWAV()
+		{
+			Sdl.SDL_Init(Sdl.SDL_INIT_AUDIO);
+			IntPtr spec;
+
+			IntPtr audio_buf;
+
+			int audio_len;
+			
+			Sdl.SDL_LoadWAV("test.wav", out spec, out audio_buf, out audio_len);
+				Console.WriteLine("Error: " + Sdl.SDL_GetError());
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Causes problems with Mixer tests")]
+		public void LoadWAV_RW()
+		{
+			Sdl.SDL_Init(Sdl.SDL_INIT_AUDIO);
+			IntPtr spec;
+
+			IntPtr audio_buf;
+
+			int audio_len;
+			
+			Sdl.SDL_LoadWAV_RW(Sdl.SDL_RWFromFile("test.wav", "rb"), 1,  out spec,  out audio_buf, out audio_len);
+			Console.WriteLine("Error: " + Sdl.SDL_GetError());
+			this.Quit();
+		}
+		#endregion SDL_audio.h
+
+		#region SDL_byteorder.h
+
+		/// <summary>
+		/// Endian Test
+		/// </summary>
+		[Test]
+		public void Endian()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+#if WIN32
+			Assert.IsTrue(Sdl.SDL_BYTEORDER == Sdl.SDL_LIL_ENDIAN);
+#endif
+
+			this.Quit();
+		}
+		#endregion SDL_byteorder.h
+
+		#region SDL_cdrom.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void FRAMES_TO_MSF()
+		{
+
+			int frames = 10000;
+			int M;
+			int S;
+			int F;
+
+			Sdl.FRAMES_TO_MSF(frames, out M, out S, out F);
+			Assert.AreEqual(M, 2);
+			Assert.AreEqual(S, 13);
+			Assert.AreEqual(F, 25);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void MSF_TO_FRAMES()
+		{
+			int frames = 10000;
+			int M = 2;
+			int S = 13;
+			int F = 25;
+
+			int result = Sdl.MSF_TO_FRAMES(M, S, F);
+			Assert.AreEqual(result, frames);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDNumDrives()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			//Console.WriteLine("CDNumDrives: " + Sdl.SDL_CDNumDrives());
+			Assert.AreEqual(Sdl.SDL_CDNumDrives(), 1);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDName()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			Assert.AreEqual(Sdl.SDL_CDName(0), "D:\\");
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDOpen()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr resultPtr = Sdl.SDL_CDOpen(0);
+			Sdl.SDL_CD cd = 
+				(Sdl.SDL_CD)Marshal.PtrToStructure(resultPtr, typeof(Sdl.SDL_CD));
+			//Console.WriteLine("CDName: " + Sdl.SDL_CDName(0));
+			Assert.AreEqual(cd.id, 0 );
+			Sdl.SDL_CDClose(resultPtr);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDStatus()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr cd = Sdl.SDL_CDOpen(0);
+			Console.WriteLine("CDStatus: " + Sdl.SDL_CDStatus(cd));
+			//Assert.AreEqual(Sdl.SDL_CDName(0), "D:\\");
+			Sdl.SDL_CDClose(cd);
+			this.Quit();
+		}
+		/// <summary>
+		/// There is a problem with the SDL C-function. 
+		/// Many cds will not start with a low 'start' setting. 
+		/// I will only use SDL_CDPlayTracks.
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDPlay()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr cd = Sdl.SDL_CDOpen(0);
+			Assert.IsFalse(cd == IntPtr.Zero);
+			if ( Sdl.CD_INDRIVE(Sdl.SDL_CDStatus(cd)) == 1 )
+			{
+				Console.WriteLine("CDStatus: " + Sdl.SDL_CDStatus(cd));
+				int result = Sdl.SDL_CDPlay(cd, 300, 1000);
+				if (result == -1)
+				{
+					Console.WriteLine("Error: " + Sdl.SDL_GetError());
+				}
+				Assert.AreEqual(0, result);
+			}
+			Sdl.SDL_CDClose(cd);
+		this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDPlayTracks()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr cd = Sdl.SDL_CDOpen(0);
+			Assert.IsFalse(cd == IntPtr.Zero);
+			//Console.WriteLine("CDStatus: " + Sdl.SDL_CDStatus(cd));
+			if ( Sdl.CD_INDRIVE(Sdl.SDL_CDStatus(cd)) == 1 )
+			{
+				int result = Sdl.SDL_CDPlayTracks(cd, 0, 0, 0, Sdl.CD_FPS*20);
+				if (result == -1)
+				{
+					Console.WriteLine("Error: " + Sdl.SDL_GetError());
+				}
+				Assert.AreEqual(0, result);
+			}
+			Sdl.SDL_CDClose(cd);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDPause()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr cd = Sdl.SDL_CDOpen(0);
+			//Console.WriteLine("CDStatus: " + Sdl.SDL_CDStatus(cd));
+			if ( Sdl.CD_INDRIVE(Sdl.SDL_CDStatus(cd)) == 1 )
+			{
+				int result = Sdl.SDL_CDPlayTracks(cd, 0, 0, 0, Sdl.CD_FPS*20);
+				Assert.AreEqual(result, 0);
+				if (result == -1)
+				{
+					Console.WriteLine("Error: " + Sdl.SDL_GetError());
+				}
+				result = Sdl.SDL_CDPause(cd);
+				Assert.AreEqual(0, result);
+			}
+			Sdl.SDL_CDClose(cd);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDResume()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr cd = Sdl.SDL_CDOpen(0);
+			//Console.WriteLine("CDStatus: " + Sdl.SDL_CDStatus(cd));
+			if ( Sdl.CD_INDRIVE(Sdl.SDL_CDStatus(cd)) == 1 )
+			{
+				int result = Sdl.SDL_CDPlayTracks(cd, 0, 0, 0, Sdl.CD_FPS*20);
+				Assert.AreEqual(result, 0);
+				if (result == -1)
+				{
+					Console.WriteLine("Error: " + Sdl.SDL_GetError());
+				}
+				result = Sdl.SDL_CDPause(cd);
+				Assert.AreEqual(0, result);
+				result = Sdl.SDL_CDResume(cd);
+				Assert.AreEqual(result, 0);
+			}
+			Sdl.SDL_CDClose(cd);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDStop()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr cd = Sdl.SDL_CDOpen(0);
+			//Console.WriteLine("CDStatus: " + Sdl.SDL_CDStatus(cd));
+			if ( Sdl.CD_INDRIVE(Sdl.SDL_CDStatus(cd)) == 1 )
+			{
+				int result = Sdl.SDL_CDPlayTracks(cd, 0, 0, 0, Sdl.CD_FPS*20);
+				Assert.AreEqual(result, 0);
+				if (result == -1)
+				{
+					Console.WriteLine("Error: " + Sdl.SDL_GetError());
+				}
+				result = Sdl.SDL_CDStop(cd);
+				Assert.AreEqual(result, 0);
+			}
+			Sdl.SDL_CDClose(cd);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CD_INDRIVE()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr cd = Sdl.SDL_CDOpen(0);
+			//Console.WriteLine("CD_INDRIVE: " + Sdl.CD_INDRIVE(Sdl.SDL_CDStatus(cd)));
+			//Make sure there is a CD in the drive
+			Assert.AreEqual(Sdl.CD_INDRIVE(Sdl.SDL_CDStatus(cd)), 1);
+			Sdl.SDL_CDClose(cd);
+			Sdl.SDL_Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void TrackAudio()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr intPtr = Sdl.SDL_CDOpen(0);
+			Console.WriteLine("CD_INDRIVE: " + Sdl.CD_INDRIVE(Sdl.SDL_CDStatus(intPtr)));
+			//Make sure there is a CD in the drive
+			Assert.AreEqual(Sdl.CD_INDRIVE(Sdl.SDL_CDStatus(intPtr)), 1);
+			
+			Sdl.SDL_CD cd = 
+				(Sdl.SDL_CD)Marshal.PtrToStructure(
+				intPtr, typeof(Sdl.SDL_CD));
+			//Sdl.SDL_CDtrack[] cdTrack = new Sdl.SDL_CDtrack[cd.numtracks];
+			//IntPtr current;
+			Console.WriteLine(cd.numtracks);
+			Console.WriteLine(cd.cur_frame);
+			Console.WriteLine(cd.cur_track);
+			Console.WriteLine(cd.id);
+			Console.WriteLine(cd.status);
+			int minutes;
+			int seconds;
+			int frames;
+			
+			for (int i = 0; i < cd.numtracks; i++ )
+			{
+				Console.WriteLine("Type: " + cd.track[i].type);
+				Sdl.FRAMES_TO_MSF(cd.track[i].length, out minutes, out seconds, out frames);
+				Console.WriteLine("Length: " + minutes + ":" + seconds);
+				Console.WriteLine("Id: " + cd.track[i].id);
+				//Console.WriteLine(cd.track.ToInt32());
+				//cdTrack[ i ] = (Sdl.SDL_CDtrack)Marshal.PtrToStructure( cd.track, typeof(Sdl.SDL_CDtrack));
+				
+//				
+//         
+//				//Marshal.FreeCoTaskMem( (IntPtr)Marshal.ReadInt32( current ));
+//				//Marshal.DestroyStructure( current, typeof(Sdl.SDL_CDtrack) );
+//				current = (IntPtr)((int)current + 
+					//Marshal.SizeOf( cdTrack[ i ] ));
+         
+				//current = Marshal.ReadIntPtr(intPtr, Marshal.SizeOf(typeof(Sdl.SDL_CDtrack)));
+				//current = new IntPtr(intPtr.ToInt32() + i * Marshal.SizeOf(typeof(Sdl.SDL_CDtrack)));
+				//Marshal.Copy(current, j, 0, Marshal.SizeOf(typeof(Sdl.SDL_CDtrack)));
+				//Marshal.Copy(j, 0, structPtr, Marshal.SizeOf(typeof(Sdl.SDL_CDtrack)));
+				//Marshal.WriteIntPtr(intPtr, structPtr[i]);
+
+				//Console.WriteLine("SDL_CDtrack: " + Marshal.SizeOf(typeof(Sdl.SDL_CDtrack)));
+				//Assert.IsFalse(intPtr == IntPtr.Zero);
+				//Assert.IsFalse(current == IntPtr.Zero);
+				//Assert.IsFalse(structPtr[i] == IntPtr.Zero);
+				//Console.WriteLine(intPtr.ToString());
+				//Console.WriteLine(current.ToString());
+				//Console.WriteLine(structPtr[i].ToString());
+				//cdTrack[ i ] = (Sdl.SDL_CDtrack)Marshal.PtrToStructure( structPtr[i], typeof(Sdl.SDL_CDtrack));
+
+				//Console.WriteLine( "Track Id: " + cdTrack[ i ].id );
+				//Console.WriteLine( "Track Type: " + cdTrack[i].type );
+
+				//Assert.AreEqual(cdTrack[i].type,(byte) Sdl.SDL_AUDIO_TRACK);
+			}
+			Sdl.SDL_CDClose(intPtr);
+			Sdl.SDL_Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDEject()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr cd = Sdl.SDL_CDOpen(0);
+			Sdl.SDL_CDEject(cd);
+			Sdl.SDL_CDClose(cd);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CDROM")]
+		public void CDClose()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			IntPtr cd = Sdl.SDL_CDOpen(0);
+			Sdl.SDL_CDClose(cd);
+
+			this.Quit();
+		}
+		#endregion SDL_cdrom.h
+		
+		#region SDL_cpuinfo.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CPUInfo")]
+		public void HasMMX()
+		{
+
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			Assert.IsTrue(Sdl.SDL_HasMMX() == Sdl.SDL_TRUE);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CPUInfo")]
+		public void HasMMXExt()
+		{
+
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			Assert.IsFalse(Sdl.SDL_HasMMXExt() == Sdl.SDL_TRUE);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CPUInfo")]
+		public void Has3DNow()
+		{
+
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			Assert.IsFalse(Sdl.SDL_Has3DNow() == Sdl.SDL_TRUE);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CPUInfo")]
+		public void HasAltiVec()
+		{
+
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			Assert.IsFalse(Sdl.SDL_HasAltiVec() == Sdl.SDL_TRUE);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CPUInfo")]
+		public void HasRDTSC()
+		{
+
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			Assert.IsTrue(Sdl.SDL_HasRDTSC() == Sdl.SDL_TRUE);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CPUInfo")]
+		public void HasSSE()
+		{
+
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			Assert.IsTrue(Sdl.SDL_HasSSE() == Sdl.SDL_TRUE);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Category("CPUInfo")]
+		public void HasSSE2()
+		{
+
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			Assert.IsTrue(Sdl.SDL_HasSSE2() == Sdl.SDL_TRUE);
+			this.Quit();
+		}
+		#endregion SDL_cpuinfo.h
+		
+		#region SDL_error.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetGetError()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_SetError("Nunit test");
+			Assert.AreEqual("Nunit test", Tao.Sdl.Sdl.SDL_GetError());
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void ClearError()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_SetError("Nunit test");
+			Assert.AreEqual("Nunit test", Tao.Sdl.Sdl.SDL_GetError());
+			Tao.Sdl.Sdl.SDL_ClearError();
+			Assert.AreEqual("", Tao.Sdl.Sdl.SDL_GetError());
+			this.Quit();
+		}
+
+		#endregion SDL_error.h
+
+		// SDL_events.h -- TODO
+
+		#region SDL_getenv.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+#if WIN32
+		[ExpectedException(typeof(System.EntryPointNotFoundException))]
+#endif
+		public void PutEnv()
+		{
+			Assert.AreEqual(0, Tao.Sdl.Sdl.SDL_putenv("SDLTest"));
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+#if WIN32
+		[ExpectedException(typeof(System.EntryPointNotFoundException))]
+#endif
+		public void GetEnv()
+		{
+			Tao.Sdl.Sdl.SDL_getenv("HOME");
+			this.Quit();
+		}
+		#endregion SDL_getenv.h
+
+		// SDL_joystick.h
+		// SDL_keyboard.h
+		// SDL_mouse.h
+		// SDL_rwops.h
+
+		#region SDL_timer.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GetTicks()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			int beforeGetTicks = Tao.Sdl.Sdl.SDL_GetTicks();
+			Thread.Sleep(100);
+			int afterGetTicks = Tao.Sdl.Sdl.SDL_GetTicks();
+			//Console.WriteLine("GetTicks(): " + Tao.Sdl.Sdl.SDL_GetTicks().ToString());
+			Assert.IsTrue(afterGetTicks - beforeGetTicks >= 100);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void Delay()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			int beforeDelay = Sdl.SDL_GetTicks();
+			//Console.WriteLine("Before Delay(): " + beforeDelay.ToString());
+			Sdl.SDL_Delay(100);
+			int afterDelay = Sdl.SDL_GetTicks();
+			//Console.WriteLine("After Delay(): " + afterDelay.ToString());
+			Assert.IsTrue(afterDelay - beforeDelay >= 100);
+		}
+
+		private int PrintTimerInterval(int interval)
+		{
+			int currentSetTimer = Tao.Sdl.Sdl.SDL_GetTicks();
+			Console.WriteLine("Current SetTimer(): " + currentSetTimer.ToString());
+			return interval;
+		}
+
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("This test crashes the nunit gui. The problem is with the delay")]
+		public void SetTimer()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+			Tao.Sdl.Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_TIMER);
+			int interval = 10;
+			Tao.Sdl.Sdl.SDL_TimerCallback testDelegate;
+			testDelegate = new Tao.Sdl.Sdl.SDL_TimerCallback(PrintTimerInterval);
+			int beforeSetTimer = Tao.Sdl.Sdl.SDL_GetTicks();
+			Console.WriteLine("Before SetTimer(): " + beforeSetTimer.ToString());
+			Tao.Sdl.Sdl.SDL_SetTimer(interval, testDelegate);
+			//Assert.IsTrue(interval < testDelegate(interval));
+			//Thread.Sleep(9);
+			//Tao.Sdl.Sdl.SDL_Delay(20);
+			int afterSetTimer = Tao.Sdl.Sdl.SDL_GetTicks();
+			Console.WriteLine("After SetTimer(): " + afterSetTimer.ToString());
+			while (afterSetTimer - beforeSetTimer < 20)
+			{
+				afterSetTimer = Tao.Sdl.Sdl.SDL_GetTicks();
+			}
+			this.Quit();
+
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Must finish SetTimer test")]
+		public void SetTimerCancel()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_InitSubSystem(Sdl.SDL_INIT_TIMER);
+			Sdl.SDL_TimerCallback testDelegate;
+			testDelegate = new Sdl.SDL_TimerCallback(PrintTimerInterval);
+			int interval = 10;
+			Sdl.SDL_SetTimer(interval, testDelegate);
+			Sdl.SDL_SetTimer(0, null);
+			this.Quit();
+
+		}
+		#endregion SDL_timer.h
+
+		#region SDL_version.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LinkedVersion()
+		{
+			Sdl.SDL_version version = Sdl.SDL_Linked_Version();
+			Assert.AreEqual(version.major.ToString() 
+				+ "." + version.minor.ToString() 
+				+ "." + version.patch.ToString(), "1.2.10");
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void CompiledVersion()
+		{
+			Assert.AreEqual(Sdl.SDL_COMPILEDVERSION, 1210);
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void VersionAtLeast1210()
+		{
+			Assert.IsTrue(Sdl.SDL_VERSION_ATLEAST(1,2,10));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void VersionAtLeast1211()
+		{
+			Assert.IsFalse(Sdl.SDL_VERSION_ATLEAST(1,2,11));
+		}
+		#endregion SDL_version.h
+	}
+}
diff --git a/tests/Sdl/SdlTestGfx.cs b/tests/Sdl/SdlTestGfx.cs
new file mode 100644
index 0000000..3bf868f
--- /dev/null
+++ b/tests/Sdl/SdlTestGfx.cs
@@ -0,0 +1,913 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Threading;
+using NUnit.Framework;
+using Tao.Sdl;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl
+{
+	#region SDL_gfx.h
+	/// <summary>
+	/// SDL Tests.
+	/// </summary>
+	[TestFixture]
+	public class SdlTestGfx
+	{
+		int flags = (Sdl.SDL_HWSURFACE|Sdl.SDL_DOUBLEBUF|Sdl.SDL_ANYFORMAT);
+		int bpp = 16;
+		int width = 640;
+		int height = 480;
+		IntPtr surfacePtr;
+		Sdl.SDL_Rect rect2;
+		int sleepTime = 1000;
+		short[] vx = {40, 80, 130, 80, 40};
+		short[] vy = {80, 40, 80, 130, 130};
+		byte[] src1 = {1,2,3,4};
+		byte[] src2 = {2,10,20,40};
+		byte[] dest = new byte[4];
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		[SetUp]
+		public void Init()
+		{
+			Sdl.SDL_Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		private void InitSdl()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			this.GfxSetup();
+			
+		}
+		private void GfxSetup()
+		{
+			surfacePtr = Sdl.SDL_SetVideoMode(
+				width, 
+				height, 
+				bpp, 
+				flags);
+			rect2 = new Sdl.SDL_Rect(
+				0,
+				0,
+				(short) width,
+				(short) height);
+			Sdl.SDL_SetClipRect(surfacePtr, ref rect2);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		private void Quit()
+		{
+			Sdl.SDL_Quit();
+		}
+
+		#region SDL_gfxPrimitives.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void pixelColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.pixelColor(surfacePtr, 100,100,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void pixelRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.pixelRGBA(surfacePtr, 100,100, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void hlineColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.hlineColor(surfacePtr, 100, 200,100,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void hlineRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.hlineRGBA(surfacePtr, 100,200,100, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void vlineColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.vlineColor(surfacePtr, 100, 200,100,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void vlineRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.vlineRGBA(surfacePtr, 100,200,100, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void rectangleColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.rectangleColor(surfacePtr, 100, 200,300, 300,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void rectangleRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.rectangleRGBA(surfacePtr, 100,200,300,300, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void boxColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.boxColor(surfacePtr, 100, 200,300, 300,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void boxRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.boxRGBA(surfacePtr, 100,200,300,300, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void lineColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.lineColor(surfacePtr, 100, 200,300, 300,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void lineRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.lineRGBA(surfacePtr, 100,200,300,300, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void aalineColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.aalineColor(surfacePtr, 100, 200,300, 300,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void aalineRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.aalineRGBA(surfacePtr, 100,200,300,300, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void CircleRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.circleRGBA(surfacePtr, 100,100, 50,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void CircleColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.circleColor(surfacePtr, 100,100, 50,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void aaCircleRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.aacircleRGBA(surfacePtr, 100,100, 50,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void aaCircleColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.aacircleColor(surfacePtr, 100,100, 50,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void filledCircleColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.filledCircleColor(surfacePtr, 100,100, 50,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void filledCircleRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.filledCircleRGBA(surfacePtr, 100,100, 50,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void EllipseColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.ellipseColor(surfacePtr, 200,100, 100, 50,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void EllipseRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.ellipseRGBA(surfacePtr, 200,100,100, 50,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void aaEllipseColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.aaellipseColor(surfacePtr, 200,100, 100, 50,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void aaEllipseRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.aaellipseRGBA(surfacePtr, 200,100,100, 50,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FilledEllipseColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.filledEllipseColor(surfacePtr, 200,100, 100, 50,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FilledEllipseRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.filledEllipseRGBA(surfacePtr, 200,100,100, 50,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void PieColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.pieColor(surfacePtr, 200,100, 100, 50, 100,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void PieRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.pieRGBA(surfacePtr, 200,100,100, 50, 100,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FilledPieColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.filledPieColor(surfacePtr, 200,100, 100, 50, 100,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FilledPieRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.filledPieRGBA(surfacePtr, 200,100,100, 50, 100,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void TrigonColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.trigonColor(surfacePtr, 100,100, 250,400, 100, 300,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void TrigonPieRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.trigonRGBA(surfacePtr, 100,100, 250,400, 100, 300,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void aaTrigonColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.aatrigonColor(surfacePtr, 100,100, 250,400, 100, 300,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void aaTrigonPieRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.aatrigonRGBA(surfacePtr, 100,100, 250,400, 100, 300,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FilledTrigonColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.filledTrigonColor(surfacePtr, 100,100, 250,400, 100, 300,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FilledTrigonPieRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.filledTrigonRGBA(surfacePtr, 100,100, 250,400, 100, 300,200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void polygonColor()
+		{
+			this.InitSdl();
+			//Random rand = new Random();
+			int result = SdlGfx.polygonColor(surfacePtr,vx, vy,vx.Length,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void polygonRGBA()
+		{
+			this.InitSdl();
+			//Random rand = new Random();
+			int result = 
+				SdlGfx.polygonRGBA(surfacePtr,vx, vy,vx.Length, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void aapolygonColor()
+		{
+			this.InitSdl();
+			//Random rand = new Random();
+			int result = SdlGfx.aapolygonColor(surfacePtr,vx, vy,vx.Length,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void aapolygonRGBA()
+		{
+			this.InitSdl();
+			//Random rand = new Random();
+			int result = 
+				SdlGfx.aapolygonRGBA(surfacePtr,vx, vy,vx.Length, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FilledPolygonColor()
+		{
+			this.InitSdl();
+			//Random rand = new Random();
+			int result = SdlGfx.filledPolygonColor(surfacePtr,vx, vy,vx.Length,7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FilledPolygonRGBA()
+		{
+			this.InitSdl();
+			//Random rand = new Random();
+			int result = 
+				SdlGfx.filledPolygonRGBA(surfacePtr,vx, vy,vx.Length, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void bezierColor()
+		{
+			this.InitSdl();
+			//Random rand = new Random();
+			int result = SdlGfx.bezierColor(surfacePtr,vx, vy,vx.Length,4, 7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void bezierRGBA()
+		{
+			this.InitSdl();
+			//Random rand = new Random();
+			int result = 
+				SdlGfx.bezierRGBA(surfacePtr,vx, vy,vx.Length, 4, 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void charColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.characterColor(
+				surfacePtr, 100,100, 'X',7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void charRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.characterRGBA(
+				surfacePtr, 100,100, 'X', 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void stringColor()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.stringColor(
+				surfacePtr, 100,100, "SDL.NET",7777777);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void stringRGBA()
+		{
+			this.InitSdl();
+			
+			//Random rand = new Random();
+			int result = SdlGfx.stringRGBA(
+				surfacePtr, 100,100, "SDL.NET", 200, 0,(byte)0, 254);
+			result = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result,0);
+			this.Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("not finished")]
+		public void gfxPrimitivesFont()
+		{
+		}
+		#endregion SDL_gfxPrimitives.h
+
+		#region SDL_rotozoom.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void rotozoomSurface()
+		{
+			this.InitSdl();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr bmpImagePtr = Sdl.SDL_LoadBMP("test.bmp");
+			IntPtr rotoSurfacePtr = SdlGfx.rotozoomSurface(bmpImagePtr, 90, 2, SdlGfx.SMOOTHING_OFF);
+			Sdl.SDL_BlitSurface(rotoSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.IsNotNull(rotoSurfacePtr);
+			Assert.IsFalse(rotoSurfacePtr==IntPtr.Zero);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			
+			//int results = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void rotozoomSurfaceSize()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void zoomSurface()
+		{
+			this.InitSdl();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr bmpImagePtr = Sdl.SDL_LoadBMP("test.bmp");
+			IntPtr zoomSurfacePtr = SdlGfx.zoomSurface(bmpImagePtr, 5, 2, SdlGfx.SMOOTHING_OFF);
+			Sdl.SDL_BlitSurface(zoomSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.IsNotNull(zoomSurfacePtr);
+			Assert.IsFalse(zoomSurfacePtr==IntPtr.Zero);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			
+			//int results = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void zoomSurfaceSize()
+		{
+			int dstwidth;
+			int dstheight;
+			SdlGfx.zoomSurfaceSize(100, 33, 2, 4, out dstwidth, out dstheight);
+			Assert.AreEqual(200, dstwidth);
+			Assert.AreEqual(132, dstheight);
+
+				
+		}
+		#endregion SDL_rotozoom.h
+
+		#region SDL_imageFilter.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void ImageFilterAdd()
+		{
+			SdlGfx.SDL_imageFilterAdd(src1, src2, dest, src1.Length);
+			//Console.WriteLine("result: " + result.ToString());
+			//Console.WriteLine(
+			//	"dest: " + dest[0].ToString() + 
+			//	", " + dest[1].ToString() + ", " + dest[2].ToString() + 
+			//	", " + dest[3].ToString());
+			Assert.AreEqual(src1[0] + src2[0], dest[0]);
+			Assert.AreEqual(src1[1] + src2[1], dest[1]);
+			Assert.AreEqual(src1[2] + src2[2], dest[2]);
+			Assert.AreEqual(src1[3] + src2[3], dest[3]);
+		}
+		#endregion SDL_imageFilter.h
+	}
+	#endregion SDL_gfx.h
+}
diff --git a/tests/Sdl/SdlTestImage.cs b/tests/Sdl/SdlTestImage.cs
new file mode 100644
index 0000000..d7b0f3d
--- /dev/null
+++ b/tests/Sdl/SdlTestImage.cs
@@ -0,0 +1,476 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Threading;
+using NUnit.Framework;
+using Tao.Sdl;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl
+{
+	#region SDL_image.h
+	/// <summary>
+	/// SDL Tests.
+	/// </summary>
+	[TestFixture]
+	public class SdlTestImage
+	{
+		int flags;
+		int bpp;
+		int width;
+		int height;
+		//IntPtr surfacePtr;
+		int sleepTime;
+
+		private void Quit()
+		{
+			Tao.Sdl.Sdl.SDL_Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[SetUp]
+		public void Init()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+			flags = (Sdl.SDL_HWSURFACE|Sdl.SDL_DOUBLEBUF|Sdl.SDL_ANYFORMAT);
+			bpp = 16;
+			width = 640;
+			height = 480;
+			sleepTime = 500;
+			//surfacePtr = IntPtr.Zero;
+			//Sdl.SDL_FreeSurfaceInternal(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		private IntPtr VideoSetup()
+		{
+			this.Init();
+			IntPtr surfacePtr;
+			//Assert.IsNotNull(surfacePtr);
+			//Sdl.SDL_FreeSurface(surfacePtr);
+			surfacePtr = Sdl.SDL_SetVideoMode(
+				width, 
+				height, 
+				bpp, 
+				flags);
+			Assert.IsNotNull(surfacePtr);
+			return surfacePtr;
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LinkedVersion()
+		{
+			Sdl.SDL_version version = SdlImage.IMG_Linked_Version();
+			Console.WriteLine("IMG version: " + version.ToString());
+			Assert.AreEqual("1.2.5", version.major.ToString() 
+				+ "." + version.minor.ToString() 
+				+ "." + version.patch.ToString());
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void isBMP()
+		{
+			string file = "test.bmp";
+			Assert.IsFalse(SdlImage.IMG_isBMP(Sdl.SDL_RWFromFile(file, "rb")) == IntPtr.Zero);
+			Assert.AreEqual(SdlImage.IMG_isBMP(Sdl.SDL_RWFromFile("test.jpg", "rb")), IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void isJPG()
+		{
+			string file = "test.jpg";
+			Assert.IsFalse(SdlImage.IMG_isJPG(Sdl.SDL_RWFromFile(file, "rb")) == IntPtr.Zero);
+			Assert.AreEqual(SdlImage.IMG_isJPG(Sdl.SDL_RWFromFile("test.bmp", "rb")), IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void isGIF()
+		{
+			string file = "test.gif";
+			Assert.IsFalse(SdlImage.IMG_isGIF(Sdl.SDL_RWFromFile(file, "rb")) == IntPtr.Zero);
+			Assert.AreEqual(SdlImage.IMG_isGIF(Sdl.SDL_RWFromFile("test.bmp", "rb")), IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void isPNG()
+		{
+			string file = "test.png";
+			Assert.IsFalse(SdlImage.IMG_isPNG(Sdl.SDL_RWFromFile(file, "rb")) == IntPtr.Zero);
+			Assert.AreEqual(SdlImage.IMG_isPNG(Sdl.SDL_RWFromFile("test.bmp", "rb")), IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void isPNM()
+		{
+			string file = "test.pnm";
+			Assert.IsFalse(SdlImage.IMG_isPNM(Sdl.SDL_RWFromFile(file, "rb")) == IntPtr.Zero);
+			Assert.AreEqual(SdlImage.IMG_isPNM(Sdl.SDL_RWFromFile("test.bmp", "rb")), IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void isPCX()
+		{
+			string file = "test.pcx";
+			Assert.IsFalse(SdlImage.IMG_isPCX(Sdl.SDL_RWFromFile(file, "rb")) == IntPtr.Zero);
+			Assert.AreEqual(SdlImage.IMG_isPCX(Sdl.SDL_RWFromFile("test.bmp", "rb")), IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void isXPM()
+		{
+			string file = "test.xpm";
+			Assert.IsFalse(SdlImage.IMG_isXPM(Sdl.SDL_RWFromFile(file, "rb")) == IntPtr.Zero);
+			Assert.AreEqual(SdlImage.IMG_isXPM(Sdl.SDL_RWFromFile("test.bmp", "rb")), IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Have not created XCF test file.")]
+		public void isXCF()
+		{
+			string file = "test.xcf";
+			Assert.IsFalse(SdlImage.IMG_isXCF(Sdl.SDL_RWFromFile(file, "rb")) == IntPtr.Zero);
+			Assert.AreEqual(SdlImage.IMG_isXCF(Sdl.SDL_RWFromFile("test.bmp", "rb")), IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void isTIF()
+		{
+			string file = "test.tif";
+			Assert.IsFalse(SdlImage.IMG_isTIF(Sdl.SDL_RWFromFile(file, "rb")) == IntPtr.Zero);
+			Assert.AreEqual(SdlImage.IMG_isTIF(Sdl.SDL_RWFromFile("test.bmp", "rb")), IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadGIF()
+		{
+			string file = "test.gif";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadGIF_RW(Sdl.SDL_RWFromFile(file, "rb"));
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadJPG()
+		{
+			string file = "test.jpg";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadJPG_RW(Sdl.SDL_RWFromFile(file, "rb"));
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadPNG()
+		{
+			string file = "test.png";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadPNG_RW(Sdl.SDL_RWFromFile(file, "rb"));
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadPCX()
+		{
+			string file = "test.pcx";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadPCX_RW(Sdl.SDL_RWFromFile(file, "rb"));
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadTGA()
+		{
+			string file = "test.tga";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadTGA_RW(Sdl.SDL_RWFromFile(file, "rb"));
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadPNM()
+		{
+			string file = "test.pnm";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadPNM_RW(Sdl.SDL_RWFromFile(file, "rb"));
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadBMP()
+		{
+			string file = "test.bmp";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadBMP_RW(Sdl.SDL_RWFromFile(file, "rb"));
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadXPM()
+		{
+			string file = "test.xpm";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadXPM_RW(Sdl.SDL_RWFromFile(file, "rb"));
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Have not created XCF test file.")]
+		public void LoadXCF()
+		{
+			string file = "test.xcf";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadXCF_RW(Sdl.SDL_RWFromFile(file, "rb"));
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadTIF()
+		{
+			string file = "test.tif";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadTIF_RW(Sdl.SDL_RWFromFile(file, "rb"));
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("TODO.")]
+		public void ReadXPMFromArray()
+		{
+			//string file = "test.xpm";
+			VideoSetup();
+			//IntPtr imagePtr = SdlImage.IMG_ReadXPMFromArray();
+			//Assert.IsFalse(imagePtr == IntPtr.Zero);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetGetError()
+		{
+			string error = "Hi there";
+			SdlImage.IMG_SetError(error);
+			Assert.AreEqual(SdlImage.IMG_GetError(), error);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void Load()
+		{
+			string file = "test.bmp";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_Load(file);
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void Load_RW()
+		{
+			string file = "test.bmp";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_Load_RW(Sdl.SDL_RWFromFile(file, "rb"),1 );
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			file = "test.jpg";
+			surfacePtr = VideoSetup();
+			imagePtr = SdlImage.IMG_Load_RW(Sdl.SDL_RWFromFile(file, "rb"), 1);
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadTyped_RW()
+		{
+			string file = "test.gif";
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr imagePtr = SdlImage.IMG_LoadTyped_RW(Sdl.SDL_RWFromFile(file, "rb"),1, "gif" );
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,200,200);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,200,200);
+			int result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			file = "test.png";
+			surfacePtr = VideoSetup();
+			imagePtr = SdlImage.IMG_LoadTyped_RW(Sdl.SDL_RWFromFile(file, "rb"), 1, "png");
+			Assert.IsFalse(imagePtr == IntPtr.Zero);
+			result = Sdl.SDL_BlitSurface(imagePtr, ref rect1, surfacePtr, ref rect2);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,200,200);
+			Thread.Sleep(sleepTime);
+			Assert.AreEqual(result, 0);
+			this.Quit();
+		}
+	}
+	#endregion SDL_image.h
+}
diff --git a/tests/Sdl/SdlTestMixer.cs b/tests/Sdl/SdlTestMixer.cs
new file mode 100644
index 0000000..3e175a0
--- /dev/null
+++ b/tests/Sdl/SdlTestMixer.cs
@@ -0,0 +1,968 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Threading;
+using NUnit.Framework;
+using Tao.Sdl;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl
+{
+	#region SDL_mixer.h
+	/// <summary>
+	/// SDL Tests.
+	/// </summary>
+	[TestFixture]
+	public class SdlTestMixer
+	{
+		/// <summary>
+		/// 
+		/// </summary>
+		[SetUp]
+		public void Init()
+		{
+			Sdl.SDL_Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LinkedVersion()
+		{
+			Sdl.SDL_version version = SdlMixer.Mix_Linked_Version();
+			Console.WriteLine("Mixer version: " + version.ToString());
+			Assert.AreEqual(version.major.ToString() 
+				+ "." + version.minor.ToString() 
+				+ "." + version.patch.ToString(), "1.2.7");
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		private void InitAudio()
+		{
+			QuitAudio();
+			Sdl.SDL_Init(Sdl.SDL_INIT_AUDIO);
+			SdlMixer.Mix_OpenAudio(
+				SdlMixer.MIX_DEFAULT_FREQUENCY, 
+				(short) SdlMixer.MIX_DEFAULT_FORMAT, 
+				2, 
+				1024);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		private void QuitAudio()
+		{
+			//SdlMixer.Mix_CloseAudio();
+			Sdl.SDL_Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void OpenAudio()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_AUDIO);
+			int results = SdlMixer.Mix_OpenAudio(
+				SdlMixer.MIX_DEFAULT_FREQUENCY, 
+				(short) SdlMixer.MIX_DEFAULT_FORMAT, 
+				2, 
+				1024);
+			Assert.AreEqual(results,0);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void AllocateChannels()
+		{
+			InitAudio();	
+			//Console.WriteLine("channels allocated: " );
+			int results = SdlMixer.Mix_AllocateChannels(16);
+			Console.WriteLine("Channels Allocated: " + results.ToString());
+			Assert.AreEqual(results, 16);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void QuerySpec()
+		{
+			InitAudio();
+			int frequency;
+			short format;
+			int channels;
+			SdlMixer.Mix_QuerySpec(out frequency, out format, out channels);
+//			Console.WriteLine("freq: " + frequency.ToString());
+//			Console.WriteLine("format: " + format.ToString());
+//			Console.WriteLine("chan: " + channels.ToString());
+//			Console.WriteLine("results: " + results.ToString());
+			Assert.AreEqual(frequency, SdlMixer.MIX_DEFAULT_FREQUENCY);
+			Assert.AreEqual(format, (short) SdlMixer.MIX_DEFAULT_FORMAT);
+			Assert.AreEqual(channels, 2);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadWAV_RW()
+		{
+			InitAudio();		
+			IntPtr resultPtr = SdlMixer.Mix_LoadWAV_RW(Sdl.SDL_RWFromFile("../../test.wav", "rb"), 1);
+			Assert.IsFalse(resultPtr == IntPtr.Zero);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadWAV()
+		{
+			InitAudio();		
+			IntPtr resultPtr = SdlMixer.Mix_LoadWAV("../../test.wav");
+			Assert.IsFalse(resultPtr == IntPtr.Zero);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadMUSwav()
+		{
+			InitAudio();		
+			IntPtr resultPtr = SdlMixer.Mix_LoadMUS("../../test.wav");
+			Assert.IsFalse(resultPtr == IntPtr.Zero);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadMUSmp3()
+		{
+			InitAudio();		
+			IntPtr resultPtr = SdlMixer.Mix_LoadMUS("../../test.mp3");
+			Assert.IsFalse(resultPtr == IntPtr.Zero);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadMUSOGG()
+		{
+			InitAudio();		
+			IntPtr resultPtr = SdlMixer.Mix_LoadMUS("../../test.ogg");
+			Assert.IsFalse(resultPtr == IntPtr.Zero);
+			QuitAudio();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetGetError()
+		{
+			string error = "Hi there";
+			SdlMixer.Mix_SetError(error);
+			Assert.AreEqual(SdlMixer.Mix_GetError(), error);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void QuickLoad_WAV()
+		{
+			InitAudio();		
+			IntPtr resultPtr = SdlMixer.Mix_QuickLoad_WAV(Sdl.SDL_RWFromFile("../../test.wav", "rb"));
+			Assert.IsFalse(resultPtr == IntPtr.Zero);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void QuickLoad_RAW()
+		{
+			InitAudio();		
+			IntPtr resultPtr = SdlMixer.Mix_QuickLoad_RAW(Sdl.SDL_RWFromFile("../../test.wav", "rb"), 1000);
+			Assert.IsFalse(resultPtr == IntPtr.Zero);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FreeChunk()
+		{
+			InitAudio();		
+			IntPtr wavPtr = Sdl.SDL_RWFromFile("../../test.wav", "rb");
+			SdlMixer.Mix_FreeChunk(wavPtr);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FreeMusic()
+		{
+			InitAudio();		
+			IntPtr wavPtr = Sdl.SDL_RWFromFile("../../test.wav", "rb");
+			SdlMixer.Mix_FreeMusic(wavPtr);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GetMusicType()
+		{
+			InitAudio();	
+			IntPtr resultPtr = SdlMixer.Mix_LoadMUS("../../test.wav");
+			int musicType = SdlMixer.Mix_GetMusicType(resultPtr);
+			Console.WriteLine("musictype:" + musicType);
+			//Assert.IsFalse(resultPtr == IntPtr.Zero);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void SetPostMix()
+		{
+
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void HookMusic()
+		{
+
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void HookMusicFinished()
+		{
+
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void GetMusicHookData()
+		{
+
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void ChannelFinished()
+		{
+
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void RegisterEffect()
+		{
+
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void UnregisterEffect()
+		{
+
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void UnregisterAllEffects()
+		{
+
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetPanning()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_SetPanning(1, 255,127);
+			Assert.IsTrue(result != 0);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetPosition()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_SetPosition(1, 90, 100);
+			Assert.IsTrue(result != 0);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetDistance()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_SetDistance(1, 140);
+			Assert.IsTrue(result != 0);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetReverseStereo()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_SetReverseStereo(SdlMixer.MIX_CHANNEL_POST, 1);
+			Assert.IsTrue(result != 0);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void ReserveChannels()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_ReserveChannels(1);
+			//Console.WriteLine("ReserveChannels: " + result.ToString());
+			Assert.IsTrue(result == 1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GroupChannel()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannel(1, 1);
+			//Console.WriteLine("ReserveChannels: " + result.ToString());
+			Assert.IsTrue(result == 1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GroupChannels()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			//Console.WriteLine("ReserveChannels: " + result.ToString());
+			Assert.IsTrue(result == 8);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GroupAvailable()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannel(1, 1);
+			result = SdlMixer.Mix_GroupAvailable(1);
+			//Console.WriteLine("ReserveChannels: " + result.ToString());
+			Assert.IsTrue(result != -1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GroupCount()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannel(1, 1);
+			result = SdlMixer.Mix_GroupCount(1);
+			//Console.WriteLine("ReserveChannels: " + result.ToString());
+			Assert.IsTrue(result == 1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GroupOldest()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			result = SdlMixer.Mix_GroupOldest(1);
+			//Console.WriteLine("GroupOldest: " + result.ToString());
+			Assert.IsTrue(result == -1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GroupNewer()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			result = SdlMixer.Mix_GroupOldest(1);
+			//Console.WriteLine("GroupOldest: " + result.ToString());
+			Assert.IsTrue(result == -1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void PlayChannelTimed()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			IntPtr chunkPtr = SdlMixer.Mix_LoadWAV("test.wav");
+			result = SdlMixer.Mix_PlayChannelTimed(-1, chunkPtr, -1, 500);
+			Thread.Sleep(500);
+			Console.WriteLine("PlayChannelTimed: " + result.ToString());
+			Assert.IsTrue(result != -1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void PlayChannel()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			IntPtr chunkPtr = SdlMixer.Mix_LoadWAV("test.wav");
+			result = SdlMixer.Mix_PlayChannel(-1, chunkPtr, -1);
+			Thread.Sleep(500);
+			Console.WriteLine("PlayChannel: " + result.ToString());
+			Assert.IsTrue(result != -1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void PlayMusic()
+		{
+			InitAudio();	
+			int result;
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_PlayMusic( chunkPtr, -1);
+			Console.WriteLine("PlayMusic: " + result.ToString());
+			Assert.IsTrue(result != -1);
+			Thread.Sleep(1000);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FadeInMusic()
+		{
+			InitAudio();	
+			int result;
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_FadeInMusic( chunkPtr, -1, 2);
+			Console.WriteLine("PlayMusic: " + result.ToString());
+			Assert.IsTrue(result != -1);
+			Thread.Sleep(5000);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void FadeInMusicPos()
+		{
+			InitAudio();	
+			int result;
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_FadeInMusicPos( chunkPtr, -1, 2, 1);
+			Console.WriteLine("PlayMusic: " + result.ToString());
+			Assert.IsTrue(result != -1);
+			Thread.Sleep(5000);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void FadeInChannelTimed()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			IntPtr chunkPtr = SdlMixer.Mix_LoadWAV("test.wav");
+			result = SdlMixer.Mix_FadeInChannelTimed(1, chunkPtr, -1, 0,-1);
+			Thread.Sleep(500);
+			Console.WriteLine("PlayChannel: " + result.ToString());
+			Assert.IsTrue(result != -1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void FadeInChannel()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			IntPtr chunkPtr = SdlMixer.Mix_LoadWAV("test.wav");
+			result = SdlMixer.Mix_FadeInChannel(1, chunkPtr, -1, 0);
+			Thread.Sleep(500);
+			Console.WriteLine("PlayChannel: " + result.ToString());
+			Assert.IsTrue(result != -1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void Volume()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			SdlMixer.Mix_LoadWAV("test.wav");
+			result = SdlMixer.Mix_Volume(1, SdlMixer.MIX_MAX_VOLUME);
+			Console.WriteLine("Volume: " + result.ToString());
+			Assert.IsTrue(result == SdlMixer.MIX_MAX_VOLUME);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void VolumeChunk()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			IntPtr chunkPtr = SdlMixer.Mix_LoadWAV("test.wav");
+			result = SdlMixer.Mix_VolumeChunk(chunkPtr, SdlMixer.MIX_MAX_VOLUME);
+			Console.WriteLine("Volume: " + result.ToString());
+			Assert.IsTrue(result == SdlMixer.MIX_MAX_VOLUME);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void VolumeMusic()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_VolumeMusic(SdlMixer.MIX_MAX_VOLUME);
+			Console.WriteLine("Volume: " + result.ToString());
+			Assert.IsTrue(result == SdlMixer.MIX_MAX_VOLUME);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void HaltChannel()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			result = SdlMixer.Mix_HaltChannel(1);
+			//Console.WriteLine("HaltChannel: " + result.ToString());
+			Assert.IsTrue(result == 0);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void HaltGroup()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			result = SdlMixer.Mix_HaltGroup(1);
+			//Console.WriteLine("HaltChannel: " + result.ToString());
+			Assert.IsTrue(result == 0);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void HaltMusic()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_HaltMusic();
+			Assert.IsTrue(result == 0);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void ExpireChannel()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			result = SdlMixer.Mix_ExpireChannel(1, 100);
+			//Console.WriteLine("HaltChannel: " + result.ToString());
+			Assert.IsTrue(result == 1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void FadeOutChannel()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			SdlMixer.Mix_LoadWAV("test.wav");
+			result = SdlMixer.Mix_FadeOutChannel(1, 100);
+			Thread.Sleep(500);
+			Console.WriteLine("PlayChannel: " + result.ToString());
+			Assert.IsTrue(result != -1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void  FadeOutGroup()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannel(1, 1);
+			result = SdlMixer.Mix_FadeOutGroup(1, 100);
+			Thread.Sleep(100);
+			//Console.WriteLine("ReserveChannels: " + result.ToString());
+			Assert.IsTrue(result == 1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FadeOutMusic()
+		{
+			InitAudio();	
+			int result;
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_PlayMusic( chunkPtr, -1);
+			result = SdlMixer.Mix_FadeOutMusic(1000);
+			Thread.Sleep(2000);
+			Console.WriteLine("PlayMusic: " + result.ToString());
+			Assert.IsTrue(result == 1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Works fine on its own, but something wrong when it runs as a test suite")]
+		public void FadingMusic()
+		{
+			InitAudio();	
+			int result;
+			int resultFading;
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_PlayMusic( chunkPtr, -1);
+			resultFading = SdlMixer.Mix_FadingMusic();
+			//Console.WriteLine("FadingMusic1: " + resultFading.ToString());
+			Assert.AreEqual(resultFading, SdlMixer.MIX_NO_FADING);
+			result = SdlMixer.Mix_FadeOutMusic(1000);
+			resultFading = SdlMixer.Mix_FadingMusic();
+			Assert.AreEqual(resultFading, SdlMixer.MIX_FADING_OUT);
+			//Console.WriteLine("FadingMusic2: " + resultFading.ToString());
+			Thread.Sleep(2000);
+			resultFading = SdlMixer.Mix_FadingMusic();
+			Assert.AreEqual(resultFading, SdlMixer.MIX_NO_FADING);
+			//Console.WriteLine("FadingMusic: " + resultFading.ToString());
+			Assert.IsTrue(result == 1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Something wrong.")]
+		public void FadingChannel()
+		{
+			InitAudio();	
+			int result;
+			int resultFading;
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_PlayChannel(1, chunkPtr, -1);
+			resultFading = SdlMixer.Mix_FadingChannel(1);
+			//Console.WriteLine("FadingMusic1: " + resultFading.ToString());
+			Assert.AreEqual(resultFading, SdlMixer.MIX_NO_FADING);
+			result = SdlMixer.Mix_FadeOutChannel(1, 1000);
+			resultFading = SdlMixer.Mix_FadingChannel(1);
+			Assert.AreEqual(resultFading, SdlMixer.MIX_FADING_OUT);
+			//Console.WriteLine("FadingMusic2: " + resultFading.ToString());
+			Thread.Sleep(2000);
+			resultFading = SdlMixer.Mix_FadingChannel(1);
+			Assert.AreEqual(resultFading, SdlMixer.MIX_NO_FADING);
+			//Console.WriteLine("FadingMusic: " + resultFading.ToString());
+			Assert.IsTrue(result == 1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void Pause()
+		{
+			InitAudio();	
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			SdlMixer.Mix_PlayChannel(1, chunkPtr, -1);
+			SdlMixer.Mix_Pause(-1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void Resume()
+		{
+			InitAudio();	
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			SdlMixer.Mix_PlayChannel(1, chunkPtr, -1);
+			SdlMixer.Mix_Pause(-1);
+			SdlMixer.Mix_Resume(-1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not Finished")]
+		public void Paused()
+		{
+			InitAudio();	
+			int result;
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_PlayChannel(1, chunkPtr, -1);
+			SdlMixer.Mix_Pause(1);
+			result = SdlMixer.Mix_Paused(-1);
+			Assert.AreEqual(result, 1);
+			result = SdlMixer.Mix_Paused(-1);
+			Assert.AreEqual(result, 1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void PauseMusic()
+		{
+			InitAudio();	
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			SdlMixer.Mix_PlayMusic( chunkPtr, -1);
+			SdlMixer.Mix_PauseMusic();
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void ResumeMusic()
+		{
+			InitAudio();	
+
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			SdlMixer.Mix_PlayMusic( chunkPtr, -1);
+			SdlMixer.Mix_PauseMusic();
+			SdlMixer.Mix_ResumeMusic();
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RewindMusic()
+		{
+			InitAudio();	
+
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.ogg");
+			SdlMixer.Mix_PlayMusic( chunkPtr, -1);
+			SdlMixer.Mix_RewindMusic();
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void PausedMusic()
+		{
+			InitAudio();	
+
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			SdlMixer.Mix_PlayMusic( chunkPtr, -1);
+			SdlMixer.Mix_PauseMusic();
+			SdlMixer.Mix_PausedMusic();
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void SetMusicPosition()
+		{
+			InitAudio();	
+			int result;
+			SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_SetMusicPosition(1000);
+			//Console.WriteLine("PlayMusic: " + result.ToString());
+			Assert.IsTrue(result != -1);
+			Thread.Sleep(5000);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void Playing()
+		{
+			InitAudio();	
+			int result = SdlMixer.Mix_GroupChannels(0, 7, 1);
+			IntPtr chunkPtr = SdlMixer.Mix_LoadWAV("test.wav");
+			result = SdlMixer.Mix_PlayChannel(-1, chunkPtr, -1);
+			Thread.Sleep(500);
+			//Console.WriteLine("PlayChannel: " + result.ToString());
+			result = SdlMixer.Mix_Playing(1);
+			Assert.IsTrue(result != -1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void PlayingMusic()
+		{
+			InitAudio();	
+			int result;
+			IntPtr chunkPtr = SdlMixer.Mix_LoadMUS("test.wav");
+			result = SdlMixer.Mix_PlayMusic( chunkPtr, -1);
+			Console.WriteLine("PlayMusic: " + result.ToString());
+			result = SdlMixer.Mix_PlayingMusic();
+			Assert.IsTrue(result == 1);
+			Thread.Sleep(1000);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not Finished")]
+		public void SetPlayingCMD()
+		{
+			InitAudio();	
+			//result = SdlMixer.Mix_PlayMusic( chunkPtr, -1);
+			SdlMixer.Mix_SetMusicCMD("test");
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not Finished")]
+		public void GetChunk()
+		{
+			InitAudio();	
+			
+			//result = SdlMixer.Mix_PlayMusic( chunkPtr, -1);
+			SdlMixer.Mix_GetChunk(1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not Finished")]
+		public void SetSynchroValue()
+		{
+			InitAudio();	
+			SdlMixer.Mix_SetSynchroValue(1);
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not Finished")]
+		public void GetSynchroValue()
+		{
+			InitAudio();	
+			SdlMixer.Mix_GetSynchroValue();
+			QuitAudio();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void CloseAudio()
+		{
+			InitAudio();	
+			SdlMixer.Mix_CloseAudio();
+			Sdl.SDL_Quit();
+		}
+	}
+	#endregion SDL_mixer.h
+}
diff --git a/tests/Sdl/SdlTestTtf.cs b/tests/Sdl/SdlTestTtf.cs
new file mode 100644
index 0000000..bf121ff
--- /dev/null
+++ b/tests/Sdl/SdlTestTtf.cs
@@ -0,0 +1,647 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Threading;
+using NUnit.Framework;
+using Tao.Sdl;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl
+{
+	#region SDL_ttf.h
+	/// <summary>
+	/// SDL Tests.
+	/// </summary>
+	[TestFixture]
+	public class SdlTestTtf
+	{
+		int flags;
+		int bpp;
+		int width;
+		int height;
+		//IntPtr surfacePtr;
+		int sleepTime;
+
+		private void Quit()
+		{
+			SdlTtf.TTF_Quit();
+			Tao.Sdl.Sdl.SDL_Quit();
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[SetUp]
+		public void Init()
+		{
+			this.Quit();
+			SdlTtf.TTF_Init();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			flags = (Sdl.SDL_HWSURFACE|Sdl.SDL_DOUBLEBUF|Sdl.SDL_ANYFORMAT);
+			bpp = 16;
+			width = 640;
+			height = 480;
+			sleepTime = 500;
+			//surfacePtr = IntPtr.Zero;
+			//Sdl.SDL_FreeSurfaceInternal(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		private IntPtr VideoSetup()
+		{
+			this.Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+			IntPtr surfacePtr;
+			//Assert.IsNotNull(surfacePtr);
+			//Sdl.SDL_FreeSurface(surfacePtr);
+			surfacePtr = Sdl.SDL_SetVideoMode(
+				width, 
+				height, 
+				bpp, 
+				flags);
+			Assert.IsNotNull(surfacePtr);
+			return surfacePtr;
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LinkedVersion()
+		{
+			Sdl.SDL_version version = SdlTtf.TTF_Linked_Version();
+			//Console.WriteLine("Ttf version: " + version.ToString());
+			Assert.AreEqual("2.0.8", version.major.ToString() 
+				+ "." + version.minor.ToString() 
+				+ "." + version.patch.ToString());
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void TTF_Init()
+		{
+			this.Quit();
+			Assert.AreEqual( 0, Tao.Sdl.SdlTtf.TTF_Init());
+			Assert.IsTrue(Tao.Sdl.SdlTtf.TTF_WasInit()!= 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void TTF_Quit()
+		{
+			this.Quit();
+			Assert.AreEqual(SdlTtf.TTF_WasInit(), 0);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void OpenFont()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			Assert.IsFalse(fontPtr == IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void OpenFontIndex()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFontIndex("../../FreeSans.ttf", 10, 0);
+			Assert.IsFalse(fontPtr == IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void OpenFontRW()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFontRW(Sdl.SDL_RWFromFile("../../FreeSans.ttf", "rb"), 1, 12);
+			Assert.IsFalse(fontPtr == IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void OpenFontIndexRW()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFontIndexRW(Sdl.SDL_RWFromFile("../../FreeSans.ttf", "rb"), 1, 12, 0);
+			Assert.IsFalse(fontPtr == IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void CloseFont()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFontIndexRW(Sdl.SDL_RWFromFile("../../FreeSans.ttf", "rb"), 1, 12, 0);
+			SdlTtf.TTF_CloseFont(fontPtr);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetGetFontStyle()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			SdlTtf.TTF_SetFontStyle(fontPtr, SdlTtf.TTF_STYLE_BOLD|SdlTtf.TTF_STYLE_ITALIC);
+			Assert.AreEqual(SdlTtf.TTF_STYLE_BOLD|SdlTtf.TTF_STYLE_ITALIC, SdlTtf.TTF_GetFontStyle(fontPtr));
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("For some reason, the FontHeight returns back 3pt higher that what was passed by OpenFont")]
+		public void FontHeight()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 9);
+			Assert.AreEqual(SdlTtf.TTF_FontHeight(fontPtr), 12);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FontAscent()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			Assert.AreEqual(12, SdlTtf.TTF_FontAscent(fontPtr));
+			//Console.WriteLine("FontAscent:" + result.ToString());
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FontDescent()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			Assert.AreEqual(-4, SdlTtf.TTF_FontDescent(fontPtr));
+			//Console.WriteLine("FontDescent:" + SdlTtf.TTF_FontDescent(fontPtr).ToString());
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FontLineSkip()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			Assert.AreEqual(17, SdlTtf.TTF_FontLineSkip(fontPtr));
+			//Console.WriteLine("FontLineSkip:" + SdlTtf.TTF_FontLineSkip(fontPtr).ToString());
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FontFaces()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			Assert.AreEqual(SdlTtf.TTF_FontFaces(fontPtr), 4294967297);
+			//Console.WriteLine("FontFaces:" + SdlTtf.TTF_FontFaces(fontPtr).ToString());
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FontFaceIsFixedWidth()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 12);
+			Assert.AreEqual(SdlTtf.TTF_FontFaceIsFixedWidth(fontPtr), 0);
+			IntPtr fontPtrMono = SdlTtf.TTF_OpenFont("../../FreeMono.ttf", 12);
+			Assert.IsTrue(SdlTtf.TTF_FontFaceIsFixedWidth(fontPtrMono) != 0);
+			//Console.WriteLine("FontFaceIsFixedWidth:" + 
+			//	SdlTtf.TTF_FontFaceIsFixedWidth(fontPtrMono).ToString());
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Works fine when run alone. When run as part of the suite is messes up several other tests.")]
+		public void FontFaceFamilyName()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			//Console.WriteLine("FontFaceFamily:" + SdlTtf.TTF_FontFaceFamilyName(fontPtr).ToString());
+			Assert.AreEqual(SdlTtf.TTF_FontFaceFamilyName(fontPtr).ToString(), "FreeSans");
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Works fine when run alone. When run as part of the suite is messes up several other tests.")]
+		public void FontFaceStyleName()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			//Console.WriteLine("FontFaceStyleName:" + SdlTtf.TTF_FontFaceStyleName(fontPtr).ToString());
+			Assert.AreEqual(SdlTtf.TTF_FontFaceStyleName(fontPtr).ToString(), "Roman");
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GlyphMetrics()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 12);
+			int minx;
+			int miny;
+			int maxx;
+			int maxy;
+			int advance;
+
+			SdlTtf.TTF_GlyphMetrics(fontPtr, 1 , out minx, out maxx,out  miny, out maxy, out advance);
+			Assert.AreEqual(-1, minx);
+			Assert.AreEqual(4, maxx);
+			Assert.AreEqual(0, miny);
+			Assert.AreEqual(8, maxy);
+			Assert.AreEqual(5, advance);
+//			Console.WriteLine("minx: " + minx.ToString());
+//			Console.WriteLine("maxx: " + maxx.ToString());
+//			Console.WriteLine("miny: " + miny.ToString());
+//			Console.WriteLine("maxy: " + maxy.ToString());
+//			Console.WriteLine("advance: " + advance.ToString());
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SizeText()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			int w; 
+			int h;
+			SdlTtf.TTF_SizeText(fontPtr, "hello", out w, out h);
+//			Console.WriteLine("w: " + w.ToString());
+//			Console.WriteLine("h: " + h.ToString());
+			Assert.AreEqual(w, 6);
+			Assert.AreEqual(17, h);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SizeUTF8()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			int w; 
+			int h;
+			SdlTtf.TTF_SizeUTF8(fontPtr, "hello", out w, out h);
+						Console.WriteLine("w: " + w.ToString());
+						Console.WriteLine("h: " + h.ToString());
+			Assert.AreEqual(w, 6);
+			Assert.AreEqual(17, h);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SizeUNICODE()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 10);
+			int w; 
+			int h;
+			SdlTtf.TTF_SizeUNICODE(fontPtr, "hello", out w, out h);
+						Console.WriteLine("w: " + w.ToString());
+						Console.WriteLine("h: " + h.ToString());
+			Assert.AreEqual(w, 22);
+			Assert.AreEqual(17, h);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderText_Solid()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color color = new Sdl.SDL_Color(254, 0, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderText_Solid(fontPtr, "hello", color);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderUTF8_Solid()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color color = new Sdl.SDL_Color(254, 0, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderUTF8_Solid(fontPtr, "hello", color);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderUNICODE_Solid()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color color = new Sdl.SDL_Color(254, 0, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderUNICODE_Solid(fontPtr, "hello", color);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderGlyph_Solid()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color color = new Sdl.SDL_Color(254, 0, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderGlyph_Solid(fontPtr, 1000, color);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderText_Shaded()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color colorfg = new Sdl.SDL_Color(254, 0, 0);
+			Sdl.SDL_Color colorbg = new Sdl.SDL_Color(0, 254, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderText_Shaded(fontPtr, "hello", colorfg, colorbg);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderUTF8_Shaded()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color colorfg = new Sdl.SDL_Color(254, 0, 0);
+			Sdl.SDL_Color colorbg = new Sdl.SDL_Color(0, 254, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderUTF8_Shaded(fontPtr, "hello", colorfg, colorbg);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderUNICODE_Shaded()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color colorfg = new Sdl.SDL_Color(254, 0, 0);
+			Sdl.SDL_Color colorbg = new Sdl.SDL_Color(0, 254, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderUNICODE_Shaded(fontPtr, "hello", colorfg, colorbg);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderGlyph_Shaded()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color colorfg = new Sdl.SDL_Color(254, 0, 0);
+			Sdl.SDL_Color colorbg = new Sdl.SDL_Color(0, 254, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderGlyph_Shaded(fontPtr, 1000, colorfg, colorbg);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderText_Blended()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color colorfg = new Sdl.SDL_Color(254, 0, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderText_Blended(fontPtr, "hello", colorfg);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderUTF8_Blended()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color colorfg = new Sdl.SDL_Color(254, 0, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderUTF8_Blended(fontPtr, "hello", colorfg);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderUNICODE_Blended()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 24);
+			Sdl.SDL_Color colorfg = new Sdl.SDL_Color(254, 0, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderUNICODE_Blended(fontPtr, "hello", colorfg);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void RenderGlyph_Blended()
+		{
+			this.Quit();
+			this.Init();
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr fontPtr = SdlTtf.TTF_OpenFont("../../FreeSans.ttf", 12);
+			Sdl.SDL_Color colorfg = new Sdl.SDL_Color(254, 0, 0);
+			IntPtr fontSurfacePtr = SdlTtf.TTF_RenderGlyph_Blended(fontPtr, 1000, colorfg);
+			Assert.IsFalse(fontSurfacePtr == IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(fontSurfacePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			this.Quit();
+		}
+	}
+	#endregion SDL_ttf.h
+}
diff --git a/tests/Sdl/SdlTestVideo.cs b/tests/Sdl/SdlTestVideo.cs
new file mode 100644
index 0000000..5853db8
--- /dev/null
+++ b/tests/Sdl/SdlTestVideo.cs
@@ -0,0 +1,773 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Threading;
+using NUnit.Framework;
+using Tao.Sdl;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl
+{
+	#region SDL_syswm.h
+
+	#endregion SDL_syswm.h
+
+    /// <summary>
+	/// SDL Tests.
+	/// </summary>
+    [TestFixture]
+    public class SdlTestOverlay
+    {
+        int flags;
+        int bpp;
+        int width;
+        int height;        
+        int pix_fmt = Sdl.SDL_YV12_OVERLAY;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [SetUp]
+        public void Init()
+        {
+            Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+            flags = (Sdl.SDL_DOUBLEBUF | Sdl.SDL_ANYFORMAT);
+            bpp = 16;
+            width = 640;
+            height = 480;
+            
+            //surfacePtr = IntPtr.Zero;
+            //Sdl.SDL_FreeSurfaceInternal(surfacePtr);
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        private IntPtr VideoSetup(bool hardware)
+        {
+            Sdl.SDL_Quit();
+            Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+            IntPtr surfacePtr;
+            //Assert.IsNotNull(surfacePtr);
+            //Sdl.SDL_FreeSurface(surfacePtr);
+            if (hardware)
+            {
+                flags = flags | Sdl.SDL_HWSURFACE;
+            }
+            surfacePtr = Sdl.SDL_SetVideoMode(
+                width,
+                height,
+                bpp,
+                flags);
+            Assert.IsNotNull(surfacePtr);
+            return surfacePtr;
+        }
+        ///// <summary>
+        ///// 
+        ///// </summary>
+        //private IntPtr VideoSetupOpenGl()
+        //{
+        //    flags |= Sdl.SDL_OPENGL;
+        //    return this.VideoSetup(false);
+        //}
+        /// <summary>
+        /// 
+        /// </summary>
+        [Test]
+        public void SetOverlay()
+        {            
+            IntPtr surfacePtr = VideoSetup(false);
+            IntPtr ptrBmp = Sdl.SDL_CreateYUVOverlay(width, height, pix_fmt, surfacePtr);
+            Assert.IsNotNull(ptrBmp);
+            Sdl.SDL_FreeSurface(surfacePtr);
+        }
+
+        /// <summary>
+        /// Tests to see if video can support 800x600 8bit.
+        /// </summary>
+        [Test]
+        public void BasicMarshal()
+        {
+            IntPtr surfacePtr = VideoSetup(false);
+            IntPtr ptrBmp = Sdl.SDL_CreateYUVOverlay(width, height, pix_fmt, surfacePtr);
+
+            Sdl.SDL_Overlay bmp = new Sdl.SDL_Overlay();
+            Sdl.SDL_LockYUVOverlay(ptrBmp);
+
+            bmp = (Sdl.SDL_Overlay)Marshal.PtrToStructure(ptrBmp,
+                    typeof(Sdl.SDL_Overlay));
+            Assert.IsNotNull(bmp);
+            Sdl.SDL_FreeSurface(surfacePtr);
+        }
+
+        /// <summary>
+        /// Tests to see if video can support 800x600 8bit.
+        /// </summary>
+        [Test]
+        public void hw_overlayTrue()
+        {
+            IntPtr surfacePtr = VideoSetup(true);
+            IntPtr ptrBmp = Sdl.SDL_CreateYUVOverlay(width, height, pix_fmt, surfacePtr);
+
+            Sdl.SDL_Overlay bmp = new Sdl.SDL_Overlay();
+            Sdl.SDL_LockYUVOverlay(ptrBmp);
+
+            bmp = (Sdl.SDL_Overlay)Marshal.PtrToStructure(ptrBmp,
+                    typeof(Sdl.SDL_Overlay));
+            Assert.IsTrue(bmp.hw_overlay == 1);
+            Sdl.SDL_FreeSurface(surfacePtr);
+        }
+        /// <summary>
+        /// Tests to see if video can support 800x600 8bit.
+        /// </summary>
+        [Test]
+        public void hw_overlayFalse()
+        {
+            IntPtr surfacePtr = VideoSetup(false);
+            IntPtr ptrBmp = Sdl.SDL_CreateYUVOverlay(width, height, pix_fmt, surfacePtr);
+
+            Sdl.SDL_Overlay bmp = new Sdl.SDL_Overlay();
+            Sdl.SDL_LockYUVOverlay(ptrBmp);
+
+            bmp = (Sdl.SDL_Overlay)Marshal.PtrToStructure(ptrBmp,
+                    typeof(Sdl.SDL_Overlay));
+            Assert.IsTrue(bmp.hw_overlay == 0);
+            Sdl.SDL_FreeSurface(surfacePtr);
+        }
+    }
+
+	#region SDL_video.h
+	/// <summary>
+	/// SDL Tests.
+	/// </summary>
+	[TestFixture]
+	public class SdlTestVideo
+	{
+		int flags;
+		int bpp;
+		int width;
+		int height;
+		//IntPtr surfacePtr;
+		IntPtr surfaceFormatPtr;
+		int sleepTime;
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[SetUp]
+		public void Init()
+		{
+			Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+			flags = (Sdl.SDL_HWSURFACE|Sdl.SDL_DOUBLEBUF|Sdl.SDL_ANYFORMAT);
+			bpp = 16;
+			width = 640;
+			height = 480;
+			sleepTime = 500;
+			//surfacePtr = IntPtr.Zero;
+			//Sdl.SDL_FreeSurfaceInternal(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		private IntPtr VideoSetup()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+			IntPtr surfacePtr;
+			//Assert.IsNotNull(surfacePtr);
+			//Sdl.SDL_FreeSurface(surfacePtr);
+			surfacePtr = Sdl.SDL_SetVideoMode(
+				width, 
+				height, 
+				bpp, 
+				flags);
+			Assert.IsNotNull(surfacePtr);
+			return surfacePtr;
+		}
+        ///// <summary>
+        ///// 
+        ///// </summary>
+        //private IntPtr VideoSetupOpenGl()
+        //{
+        //    flags |= Sdl.SDL_OPENGL;
+        //    return this.VideoSetup();
+        //}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetVideoWindow()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+			IntPtr surfacePtr = Sdl.SDL_SetVideoMode(
+				width, 
+				height, 
+				bpp, 
+				flags);
+			Assert.IsNotNull(surfacePtr);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+
+		/// <summary>
+		/// Tests to see if video can support 800x600 8bit.
+		/// </summary>
+		[Test]
+		public void VideoModeOk()
+		{
+			Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+			int result = Sdl.SDL_VideoModeOK(
+				width, 
+				height, 
+				bpp, 
+				flags);
+			Assert.IsTrue(result == bpp);
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void DriverName()
+		{
+			string buffer="";
+			string driverName = Sdl.SDL_VideoDriverName(buffer, 100);
+			Console.WriteLine("Video: "+ driverName);
+			Assert.IsNotNull(driverName);
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void CreateRGBSurfaceAndFree()
+		{
+			int rmask = 0x00000000;
+			int gmask = 0x00ff0000;
+			int bmask = 0x0000ff00;
+			int amask = 0x000000ff;
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr rgbSurfacePtr = Sdl.SDL_CreateRGBSurface(
+				flags, 
+				width, 
+				height, 
+				bpp, 
+				rmask,
+				gmask, 
+				bmask, 
+				amask);
+			Sdl.SDL_Surface rgbSurface = 
+				(Sdl.SDL_Surface)Marshal.PtrToStructure(rgbSurfacePtr, typeof(Sdl.SDL_Surface));
+			Assert.IsTrue(rgbSurface.w == width);
+			Assert.IsTrue(rgbSurface.h == height);
+			//Sdl.SDL_FreeSurface(surfacePtr);
+			Sdl.SDL_FreeSurface(rgbSurfacePtr);
+			//Sdl.SDL_FreeSurfaceInternal(rgbSurfacePtr);
+			Assert.AreEqual(IntPtr.Zero, rgbSurfacePtr);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void FillRectAndFlip()
+		{
+			IntPtr surfacePtr = VideoSetup();
+			Assert.IsNotNull(surfacePtr);
+			Sdl.SDL_Rect rect = new Sdl.SDL_Rect(100,100,100,100);
+			Sdl.SDL_FillRect(surfacePtr, ref rect, 10000);
+			int resultFlip = Sdl.SDL_Flip(surfacePtr);
+			Thread.Sleep(sleepTime);
+
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(150,150,150,150);
+			int result2 = Sdl.SDL_FillRect(surfacePtr, ref rect2, 1000);
+			Assert.AreEqual(result2, 0); 
+			resultFlip = Sdl.SDL_Flip(surfacePtr);
+			Assert.AreEqual(resultFlip, 0); 
+			Thread.Sleep(sleepTime);
+
+			int result3 = Sdl.SDL_FillRect(surfacePtr, ref rect, 5000);
+			Assert.AreEqual(result3, 0); 
+			resultFlip = Sdl.SDL_Flip(surfacePtr);
+			
+			Assert.AreEqual(resultFlip, 0); 
+			Thread.Sleep(sleepTime);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void MustLock()
+		{
+			IntPtr surfacePtr = VideoSetup();
+			int status = Sdl.SDL_MUSTLOCK(surfacePtr);
+			//Console.WriteLine("MUSTLOCK: " + status.ToString());
+			Assert.IsTrue(status == 0);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GetVideoSurface()
+		{
+			IntPtr surfacePtr = VideoSetup();
+			IntPtr videoPtr = Sdl.SDL_GetVideoSurface();
+			Assert.IsNotNull(videoPtr);
+			Sdl.SDL_FreeSurface(videoPtr);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		 }
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GetVideoInfo()
+		{
+			IntPtr videoInfoPtr = Sdl.SDL_GetVideoInfo();
+			Assert.IsNotNull(videoInfoPtr);
+
+			Sdl.SDL_VideoInfo videoInfo = (Sdl.SDL_VideoInfo)
+				Marshal.PtrToStructure(videoInfoPtr, 
+				typeof(Sdl.SDL_VideoInfo));
+			Console.WriteLine(videoInfo.hw_available);
+			Console.WriteLine(videoInfo.wm_available);
+			Console.WriteLine(videoInfo.video_mem);
+			Console.WriteLine(videoInfo.current_h);
+			Console.WriteLine(videoInfo.current_w);
+
+			Sdl.SDL_FreeSurface(videoInfoPtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void UpdateRect()
+		{
+			//TODO: Must figure out a real test for this method.
+			IntPtr surfacePtr = VideoSetup();
+			Sdl.SDL_UpdateRect(surfacePtr, 0, 0, 0, 0);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void UpdateRects()
+		{
+			//TODO: Must figure out a real test for this method.
+			IntPtr surfacePtr = VideoSetup();
+			//Sdl.SDL_Rect rect = new Sdl.SDL_Rect(100,100,100,100);
+			
+			Sdl.SDL_Rect[] rects = {
+									   new Sdl.SDL_Rect(100,100,100,100), 
+									   new Sdl.SDL_Rect(150,150,150,150)
+								   };
+			Sdl.SDL_UpdateRects(surfacePtr, rects.Length, rects);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetGamma()
+		{
+			IntPtr surfacePtr = VideoSetup();
+			int resultSetGamma = Sdl.SDL_SetGamma(2,2,2);
+			Assert.AreEqual(resultSetGamma, 0); 
+			Thread.Sleep(sleepTime);
+			resultSetGamma = Sdl.SDL_SetGamma(1,1,1);
+			Assert.AreEqual(resultSetGamma, 0); 
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void WM_SetGetCaption()
+		{
+			IntPtr surfacePtr = VideoSetup();
+			string title;
+			string iconText;
+			Sdl.SDL_WM_SetCaption("Hi There", "Hello");
+			Sdl.SDL_WM_GetCaption(out title, out iconText);
+			Assert.AreEqual(title, "Hi There");
+			Assert.AreEqual(iconText, "Hello");
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void WM_IconifyWindow()
+		{
+			IntPtr surfacePtr = VideoSetup();
+			int result = Sdl.SDL_WM_IconifyWindow();
+			Assert.AreEqual(result, 1);
+			Thread.Sleep(sleepTime);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void WM_ToggleFullScreen()
+		{
+			IntPtr surfacePtr = VideoSetup();
+			int result = Sdl.SDL_WM_ToggleFullScreen(surfacePtr);
+#if WIN32
+			Assert.AreEqual(result, 0);
+#else
+			Assert.AreEqual(result, 1);
+#endif
+			Thread.Sleep(sleepTime);
+			result = Sdl.SDL_WM_ToggleFullScreen(surfacePtr);
+#if WIN32
+			Assert.AreEqual(result, 0);
+#else
+			Assert.AreEqual(result, 1);
+#endif
+			Sdl.SDL_FreeSurface(surfacePtr);
+			
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void GetGammaRamp()
+		{
+			VideoSetup();
+			short[] red = new short[256];
+			short[] blue = new short[256];
+			short[] green = new short[256];
+			int resultGetGammaRamp= Sdl.SDL_GetGammaRamp( red, green, blue);
+			Assert.AreEqual(resultGetGammaRamp, 0); 
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetGammaRamp()
+		{
+			int resultSetGammaRamp= Sdl.SDL_SetGammaRamp( null, null, null);
+			Assert.AreEqual(resultSetGammaRamp, 0); 
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetColors()
+		{
+			Sdl.SDL_Color[] colors = new Sdl.SDL_Color[255];
+			for(byte i=0;i<=254;i++)
+			{
+				colors[i].r=i;
+				colors[i].g=i;
+				colors[i].b=i;
+			}
+			IntPtr surfacePtr = VideoSetup();
+			int resultSetColors = Sdl.SDL_SetColors(surfacePtr, colors, 0, 255);
+			Assert.AreEqual(resultSetColors, 0); 
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SetPalette()
+		{
+			Sdl.SDL_Color[] colors = new Sdl.SDL_Color[255];
+			for(byte i=0;i<=254;i++)
+			{
+				colors[i].r=i;
+				colors[i].g=i;
+				colors[i].b=i;
+			}
+			IntPtr surfacePtr = VideoSetup();
+			int resultSetPalette = Sdl.SDL_SetPalette(surfacePtr, Sdl.SDL_LOGPAL|Sdl.SDL_PHYSPAL,  colors, 0, 255);
+			Assert.AreEqual(resultSetPalette, 0); 
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void ListModes()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO);
+			IntPtr format = IntPtr.Zero;
+			Sdl.SDL_Rect[] rects = Sdl.SDL_ListModes(format, Sdl.SDL_FULLSCREEN|Sdl.SDL_HWSURFACE);
+			Console.WriteLine("ListModes: " + rects.Length);
+			for (int i=0; i<rects.Length; i++)
+			{
+				Console.WriteLine("Mode(" + i + "): " + rects[ i ].ToString());
+			}
+			Assert.IsTrue(rects.Length > 5);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SDL_MapRGB()
+		{
+			IntPtr surfacePtr = VideoSetup();
+
+			Sdl.SDL_Surface surface = 
+				(Sdl.SDL_Surface)Marshal.PtrToStructure(surfacePtr, typeof(Sdl.SDL_Surface));
+			surfaceFormatPtr = surface.format;
+			Sdl.SDL_PixelFormat surfaceFormat = 
+				(Sdl.SDL_PixelFormat)Marshal.PtrToStructure(surfaceFormatPtr, typeof(Sdl.SDL_PixelFormat));
+			int result = Sdl.SDL_MapRGB(surfaceFormatPtr, 255, 255, 0);
+			Assert.AreEqual(surfaceFormat.BitsPerPixel, 16);
+			Assert.AreEqual(result, 65504);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SDL_MapRGBA()
+		{
+			IntPtr surfacePtr = VideoSetup();
+
+			Sdl.SDL_Surface surface = 
+				(Sdl.SDL_Surface)Marshal.PtrToStructure(surfacePtr, typeof(Sdl.SDL_Surface));
+			surfaceFormatPtr = surface.format;
+			Sdl.SDL_PixelFormat surfaceFormat = 
+				(Sdl.SDL_PixelFormat)Marshal.PtrToStructure(surfaceFormatPtr, typeof(Sdl.SDL_PixelFormat));
+			int result = Sdl.SDL_MapRGBA(surfaceFormatPtr, 255, 255, 0, 0);
+			Assert.AreEqual(surfaceFormat.BitsPerPixel, 16);
+			Assert.AreEqual(result, 65504);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SDL_GetRGB()
+		{
+			int pixel = 65504;
+			IntPtr surfacePtr = VideoSetup();
+			byte r;
+			byte g;
+			byte b;
+
+			Sdl.SDL_Surface surface = 
+				(Sdl.SDL_Surface)Marshal.PtrToStructure(surfacePtr, typeof(Sdl.SDL_Surface));
+			surfaceFormatPtr = surface.format;
+            //Sdl.SDL_PixelFormat surfaceFormat = 
+            //    (Sdl.SDL_PixelFormat)Marshal.PtrToStructure(surfaceFormatPtr, typeof(Sdl.SDL_PixelFormat));
+			Sdl.SDL_GetRGB(pixel, surfaceFormatPtr, out r, out g, out b);
+			Assert.AreEqual(r, 255);
+			Assert.AreEqual(g, 255);
+			Assert.AreEqual(b, 0);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SDL_GetRGBA()
+		{
+			int pixel = 65504;
+			IntPtr surfacePtr = VideoSetup();
+			byte r;
+			byte g;
+			byte b;
+			byte a;
+
+			Sdl.SDL_Surface surface = 
+				(Sdl.SDL_Surface)Marshal.PtrToStructure(surfacePtr, typeof(Sdl.SDL_Surface));
+			surfaceFormatPtr = surface.format;
+            //Sdl.SDL_PixelFormat surfaceFormat = 
+            //    (Sdl.SDL_PixelFormat)Marshal.PtrToStructure(surfaceFormatPtr, typeof(Sdl.SDL_PixelFormat));
+			Sdl.SDL_GetRGBA(pixel, surfaceFormatPtr, out r, out g, out b, out a);
+			Assert.AreEqual(r, 255);
+			Assert.AreEqual(g, 255);
+			Assert.AreEqual(b, 0);
+			Assert.AreEqual(a, 255);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SDL_GrabInput()
+		{
+			IntPtr surfacePtr = VideoSetup();
+			int result = Sdl.SDL_WM_GrabInput(Sdl.SDL_GRAB_ON);
+			Assert.AreEqual(result, (int)Sdl.SDL_GRAB_ON);
+			result = Sdl.SDL_WM_GrabInput(Sdl.SDL_GRAB_QUERY);
+			Assert.AreEqual(result, (int)Sdl.SDL_GRAB_ON);
+			result = Sdl.SDL_WM_GrabInput(Sdl.SDL_GRAB_OFF);
+			Assert.AreEqual(result, (int)Sdl.SDL_GRAB_OFF);
+			result = Sdl.SDL_WM_GrabInput(Sdl.SDL_GRAB_QUERY);
+			Assert.AreEqual(result, (int)Sdl.SDL_GRAB_OFF);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void CreateRGBSurfaceFrom()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void LockUnlockSurface()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void LoadBMPSaveBMPBlit()
+		{
+			IntPtr surfacePtr = VideoSetup();
+			Assert.IsNotNull(surfacePtr);
+			Sdl.SDL_Rect rect1 = new Sdl.SDL_Rect(0,0,400,400);
+			Sdl.SDL_Rect rect2 = new Sdl.SDL_Rect(0,0,400,400);
+			IntPtr bmpImagePtr = Sdl.SDL_LoadBMP("test.bmp");
+			Assert.IsNotNull(bmpImagePtr);
+			Assert.IsFalse(bmpImagePtr==IntPtr.Zero);
+			int result = Sdl.SDL_BlitSurface(bmpImagePtr, ref rect1, surfacePtr, ref rect2);
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_UpdateRect(surfacePtr, 0,0,400,400);
+			Thread.Sleep(sleepTime);
+			result = Sdl.SDL_SaveBMP(surfacePtr, "testScreen.bmp");
+			Assert.AreEqual(result, 0);
+			Sdl.SDL_FreeSurface(surfacePtr);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void SetColorKey()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void SetAlpha()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void SetClipRect()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void ConvertSurface()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void DisplayFormat()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void DisplayFormatAlpha()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void SDL_CreateLockUnlockFreeYUVOverlay()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void SDL_DisplayYUVOverlay()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		[Ignore("Not finished")]
+		public void SDL_GL()
+		{
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void WM_SetIcon()
+		{
+			VideoSetup();
+			Sdl.SDL_WM_SetIcon(Sdl.SDL_LoadBMP("testicon.bmp"), null);
+			Thread.Sleep(sleepTime);
+		}
+		/// <summary>
+		/// Tests to ensure that WindowManager correctly returns the info struct.
+		/// </summary>
+		[Test] 
+		public void GetWMinfo()
+		{
+			VideoSetup();
+			Sdl.SDL_SysWMinfo_Windows info;
+			int result = Sdl.SDL_GetWMInfo(out info);
+			Console.WriteLine("result: " + result);
+			System.Console.WriteLine("{0} {1} {2}", info.version.ToString(), info.window, info.hglrc);
+
+//			IntPtr info = IntPtr.Zero;
+//			int result = Sdl.SDL_GetWMInfo(out info);
+//			Console.WriteLine("result: " + result);
+//			Sdl.SDL_SysWMinfo_Windows infoStruct = (Sdl.SDL_SysWMinfo_Windows)Marshal.PtrToStructure(info, typeof(Sdl.SDL_SysWMinfo_Windows));
+//			System.Console.WriteLine("{0}", infoStruct);
+		}
+	}
+	#endregion SDL_video.h
+}
diff --git a/tests/Sdl/SmpegTest.cs b/tests/Sdl/SmpegTest.cs
new file mode 100644
index 0000000..28a18fd
--- /dev/null
+++ b/tests/Sdl/SmpegTest.cs
@@ -0,0 +1,160 @@
+#region License
+/*
+MIT License
+Copyright �2003-2006 Tao Framework Team
+http://www.taoframework.com
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+#endregion License
+
+using System;
+using System.Threading;
+using NUnit.Framework;
+using Tao.Sdl;
+using System.Runtime.InteropServices;
+
+namespace Tao.Sdl
+{
+	#region Smpeg
+	/// <summary>
+	/// SDL Tests.
+	/// </summary>
+	[TestFixture]
+	public class SmpegTest
+	{
+		int flags = (Sdl.SDL_HWSURFACE|Sdl.SDL_DOUBLEBUF|Sdl.SDL_ANYFORMAT);
+		int bpp = 16;
+		int width = 640;
+		int height = 480;
+		IntPtr surfacePtr;
+		//Sdl.SDL_Rect rect2;
+		int sleepTime = 1000;
+		//short[] vx = {40, 80, 130, 80, 40};
+		//short[] vy = {80, 40, 80, 130, 130};
+		//byte[] src1 = {1,2,3,4};
+		//byte[] src2 = {2,10,20,40};
+		//byte[] dest = new byte[4];
+		Smpeg.SMPEG_Info info = new Smpeg.SMPEG_Info();
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		[SetUp]
+		public void Init()
+		{
+			Sdl.SDL_Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		private void InitSdl()
+		{
+			Sdl.SDL_Quit();
+			Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
+			this.SmpegSetup();
+			
+		}
+		private void SmpegSetup()
+		{
+			surfacePtr = Sdl.SDL_SetVideoMode(
+				width, 
+				height, 
+				bpp, 
+				flags);
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		private void Quit()
+		{
+			Sdl.SDL_Quit();
+		}
+
+		#region smpeg.h
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SMPEG_new()
+		{
+			this.InitSdl();
+
+			//IntPtr intPtr = Smpeg.SMPEG_new("test.mpg", out info, 0); 
+			//IntPtr intPtr = Sdl.SDL_RWFromFile("test.mpg", "rb");
+			IntPtr intPtr = Smpeg.SMPEG_new("../../test.mpg", out info, 0); 
+			Console.WriteLine("Smpeg_error: " + Smpeg.SMPEG_error(intPtr));
+			Assert.IsFalse(intPtr == IntPtr.Zero);
+			this.Quit();
+		}
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SMPEG_new_rwops()
+		{
+			this.InitSdl();
+
+			//IntPtr intPtr = Smpeg.SMPEG_new("test.mpg", out info, 0); 
+			//IntPtr intPtr = Sdl.SDL_RWFromFile("test.mpg", "rb");
+			IntPtr intPtr = Smpeg.SMPEG_new_rwops(Sdl.SDL_RWFromFile("../../test.mpg", "rb"), out info, 0); 
+			Console.WriteLine("Smpeg_error: " + Smpeg.SMPEG_error(intPtr));
+			Assert.IsFalse(intPtr == IntPtr.Zero);
+			this.Quit();
+		}
+//		public event Smpeg.SMPEG_DisplayCallback callbackEvent;
+//		callbackEvent += new Smpeg.SMPEG_DisplayCallback(
+//		private void Update(IntPtr surfacePtr, int x, int y, int w, int h)
+//		{
+//			Sdl.SDL_Flip(surfacePtr);
+//		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Test]
+		public void SMPEG_play()
+		{
+			this.InitSdl();
+
+			//IntPtr intPtr = Smpeg.SMPEG_new("test.mpg", out info, 0); 
+			//IntPtr intPtr = Sdl.SDL_RWFromFile("test.mpg", "rb");
+			IntPtr intPtr = Smpeg.SMPEG_new("../../test.mpg", out info, 0); 
+			Console.WriteLine("Smpeg_error: " + Smpeg.SMPEG_error(intPtr));
+			Assert.IsFalse(intPtr == IntPtr.Zero);
+			Smpeg.SMPEG_enableaudio(intPtr, 1);
+			Smpeg.SMPEG_enablevideo(intPtr, 1);
+			Smpeg.SMPEG_setvolume(intPtr, 100);
+			Smpeg.SMPEG_setdisplay(intPtr, surfacePtr, IntPtr.Zero, null);
+
+			Smpeg.SMPEG_play(intPtr);
+			//while (Smpeg.SMPEG_status(intPtr) == Smpeg.SMPEG_PLAYING){}
+			Thread.Sleep(sleepTime);
+			Smpeg.SMPEG_stop(intPtr);
+			Smpeg.SMPEG_delete(intPtr);
+			this.Quit();
+		}
+		#endregion smpeg.h
+
+		#region MPEGfilter.h
+		#endregion MPEGfilter.h
+	}
+	#endregion SDL_gfx.h
+}
diff --git a/tests/Sdl/Tao.Sdl.Tests.csproj b/tests/Sdl/Tao.Sdl.Tests.csproj
new file mode 100644
index 0000000..ff5a182
--- /dev/null
+++ b/tests/Sdl/Tao.Sdl.Tests.csproj
@@ -0,0 +1,123 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{FCDF610D-8D0C-41E1-AE18-4915FC461560}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>Tao.Sdl.Tests</AssemblyName>
+    <AssemblyOriginatorKeyFile>../../src/Tao.Sdl/Tao.Sdl.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Tao.Sdl.Tests</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>
+    </NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>\System.dll</HintPath>
+    </Reference>
+    <Reference Include="nunit.framework">
+      <Name>nunit.framework</Name>
+      <HintPath>\nunit.framework.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Tao.Sdl\Tao.Sdl.csproj">
+      <Name>Tao.Sdl</Name>
+      <Project>{DD8BE6C6-C237-4C82-B521-754900077769}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="SdlTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlTestGfx.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlTestImage.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlTestMixer.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlTestTtf.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SdlTestVideo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SmpegTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/Sdl/tao-sdl-tests.pc.in b/tests/Sdl/tao-sdl-tests.pc.in
new file mode 100644
index 0000000..9d0a250
--- /dev/null
+++ b/tests/Sdl/tao-sdl-tests.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+
+Name: Tao.Sdl.Tests
+Description: Unit tests for the SDL portion of the Tao framework
+Version: @TAOSDL_VERSION@
+Requires:
+Libs: -r:${libdir}/mono/tao-sdl-tests- at TAOSDL_MAJOR@/Tao.Sdl.Tests.dll
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-cli-libs/packages/taoframework.git



More information about the Pkg-cli-libs-commits mailing list